Logo ROOT  
Reference Guide
TFriendElement.cxx
Go to the documentation of this file.
1 // @(#)root/tree:$Id$
2 // Author: Rene Brun 07/04/2001
3 
4 /*************************************************************************
5  * Copyright (C) 1995-2001, Rene Brun and Fons Rademakers. *
6  * All rights reserved. *
7  * *
8  * For the licensing terms see $ROOTSYS/LICENSE. *
9  * For the list of contributors see $ROOTSYS/README/CREDITS. *
10  *************************************************************************/
11 
12 /** \class TFriendElement
13 \ingroup tree
14 
15 A TFriendElement TF describes a TTree object TF in a file.
16 When a TFriendElement TF is added to the the list of friends of an
17 existing TTree T, any variable from TF can be referenced in a query
18 to T.
19 
20 To add a TFriendElement to an existing TTree T, do:
21 ~~~ {.cpp}
22  T.AddFriend("friendTreename","friendTreeFile");
23 ~~~
24 See TTree::AddFriend for more information.
25 */
26 
27 #include "TFriendElement.h"
28 #include "TTree.h"
29 #include "TFile.h"
30 #include "TROOT.h"
31 #include "TChain.h"
32 
34 
35 ////////////////////////////////////////////////////////////////////////////////
36 /// Default constructor for a friend element.
37 
39 {
40  fFile = 0;
41  fTree = 0;
42  fOwnFile = kFALSE;
43  fParentTree = 0;
44 }
45 
46 ////////////////////////////////////////////////////////////////////////////////
47 /// Create a friend element.
48 ///
49 /// If treename is of the form "a=b", an alias called "a" is created for
50 /// treename = "b" by default the alias name is the name of the tree.
51 
52 TFriendElement::TFriendElement(TTree *tree, const char *treename, const char *filename)
53  :TNamed(treename,filename)
54 {
55  fFile = 0;
56  fTree = 0;
57  fOwnFile = kTRUE;
58  fParentTree = tree;
59  fTreeName = treename;
60  if (treename && strchr(treename,'=')) {
61  char *temp = Compress(treename);
62  char *equal = strchr(temp,'=');
63  if (!equal) return;;
64  *equal=0;
65  fTreeName = equal+1;
66  SetName(temp);
67  delete [] temp;
68  }
69 
70  Connect();
71 }
72 
73 ////////////////////////////////////////////////////////////////////////////////
74 /// Create a friend element.
75 ///
76 /// If treename is of the form "a=b", an alias called "a" is created for
77 /// treename = "b" by default the alias name is the name of the tree.
78 /// The passed TFile is managed by the user (i.e. user must delete the TFile).
79 
81  :TNamed(treename,file?file->GetName():"")
82 {
83  fFile = file;
84  fTree = 0;
85  fOwnFile = kFALSE;
86  fParentTree = tree;
87  fTreeName = treename;
89  && fParentTree->GetDirectory()->GetFile() == fFile) {
90  // The friend and the TTree are in the same file, let's not record
91  // the filename.
92  SetTitle("");
93  }
94  if (treename && strchr(treename,'=')) {
95  char *temp = Compress(treename);
96  char *equal = strchr(temp,'=');
97  if (!equal) return;;
98  *equal=0;
99  fTreeName = equal+1;
100  SetName(temp);
101  delete [] temp;
102  }
103 
104  Connect();
105 }
106 
107 ////////////////////////////////////////////////////////////////////////////////
108 /// Create a friend element.
109 
110 TFriendElement::TFriendElement(TTree *tree, TTree* friendtree, const char *alias)
111  : TNamed(friendtree?friendtree->GetName():"",
112  friendtree
113  ? ( friendtree->GetDirectory()
114  ? ( friendtree->GetDirectory()->GetFile()
115  ? friendtree->GetDirectory()->GetFile()->GetName()
116  : "")
117  : "")
118  : "")
119 {
120  fTree = friendtree;
121  fTreeName = "";
122  fFile = 0;
123  fOwnFile = kFALSE;
124  fParentTree = tree;
125  if (fTree) {
126  fTreeName = fTree->GetName();
129  && fParentTree->GetDirectory()->GetFile() == fFile) {
130  // The friend and the TTree are in the same file, let's not record
131  // the filename.
132  SetTitle("");
133  }
134  } else {
135  MakeZombie(); // ROOT-7007
136  }
137  if (alias && strlen(alias)) {
138  char *temp = Compress(alias);
139  SetName(temp);
140  delete [] temp;
141  }
142 
143  // No need to Connect.
144 }
145 
146 ////////////////////////////////////////////////////////////////////////////////
147 /// Destructor. Disconnect from the owning tree if needed.
148 
150 {
151  DisConnect();
152 }
153 
154 ////////////////////////////////////////////////////////////////////////////////
155 /// Connect file and return TTree.
156 
158 {
159  GetFile();
160  auto treePtr = GetTree();
161  if (!treePtr) MakeZombie(); // ROOT-7007
162  return treePtr;
163 }
164 
165 ////////////////////////////////////////////////////////////////////////////////
166 /// DisConnect file and TTree.
167 
169 {
170  // At this point, if the condition is not meant, fTree is usually already
171  // deleted (hence the need for a local bit describing fTree)
172  if (fTree)
174  if (fOwnFile) delete fFile;
175  fFile = 0;
176  fTree = 0;
177  return 0;
178 }
179 
180 ////////////////////////////////////////////////////////////////////////////////
181 /// Return pointer to TFile containing this friend TTree.
182 
184 {
185  if (fFile || IsZombie()) return fFile;
186 
187  if (strlen(GetTitle())) {
190  fOwnFile = kTRUE;
191  } else {
193  if (dir) {
194  fFile = dir->GetFile();
195  fOwnFile = kFALSE;
196  }
197  }
198  if (fFile && fFile->IsZombie()) {
199  MakeZombie();
200  delete fFile;
201  fFile = 0;
202  }
203  return fFile;
204 }
205 
206 ////////////////////////////////////////////////////////////////////////////////
207 /// Return pointer to friend TTree.
208 
210 {
211  if (fTree) {
212  // In cases where the friend was added by the owning chain and the friend is
213  // a chain we recorded the address of the chain but we need to return the address
214  // of the underlying current TTree.
215  if (TestBit(kFromChain))
216  return fTree->GetTree();
217  else
218  return fTree;
219  }
220 
221  if (GetFile()) {
223  if (fTree) return fTree;
224  }
225 
226  // This could be a memory tree or chain
227  fTree = dynamic_cast<TTree*>( gROOT->FindObject(GetTreeName()) );
228 
229  if (fTree)
231 
232  return fTree;
233 }
234 
235 ////////////////////////////////////////////////////////////////////////////////
236 /// List this friend element.
237 
239 {
240  printf(" Friend Tree: %s in file: %s\n",GetName(),GetTitle());
241 }
TFriendElement::DisConnect
virtual TTree * DisConnect()
DisConnect file and TTree.
Definition: TFriendElement.cxx:168
kTRUE
const Bool_t kTRUE
Definition: RtypesCore.h:91
TObject::TestBit
R__ALWAYS_INLINE Bool_t TestBit(UInt_t f) const
Definition: TObject.h:172
TNamed::SetName
virtual void SetName(const char *name)
Set the name of the TNamed.
Definition: TNamed.cxx:140
Option_t
const char Option_t
Definition: RtypesCore.h:66
TDirectory::GetObject
void GetObject(const char *namecycle, T *&ptr)
Get an object with proper type checking.
Definition: TDirectory.h:166
tree
Definition: tree.py:1
ClassImp
#define ClassImp(name)
Definition: Rtypes.h:364
TNamed::GetTitle
virtual const char * GetTitle() const
Returns title of object.
Definition: TNamed.h:48
TFriendElement::TFriendElement
TFriendElement()
Default constructor for a friend element.
Definition: TFriendElement.cxx:38
TTree
A TTree represents a columnar dataset.
Definition: TTree.h:79
TFile::Open
static TFile * Open(const char *name, Option_t *option="", const char *ftitle="", Int_t compress=ROOT::RCompressionSetting::EDefaults::kUseCompiledDefault, Int_t netopt=0)
Create / open a file.
Definition: TFile.cxx:3997
TDirectory::TContext
Small helper to keep current directory context.
Definition: TDirectory.h:52
TFriendElement
A TFriendElement TF describes a TTree object TF in a file.
Definition: TFriendElement.h:33
TFriendElement.h
TTree.h
TFile.h
TROOT.h
TTree::GetTree
virtual TTree * GetTree() const
Definition: TTree.h:512
TFriendElement::fOwnFile
Bool_t fOwnFile
true if file is managed by this class
Definition: TFriendElement.h:40
TChain.h
TFriendElement::Connect
virtual TTree * Connect()
Connect file and return TTree.
Definition: TFriendElement.cxx:157
TTree::RegisterExternalFriend
virtual void RegisterExternalFriend(TFriendElement *)
Record a TFriendElement that we need to warn when the chain switches to a new file (typically this is...
Definition: TTree.cxx:7837
TFriendElement::GetTree
virtual TTree * GetTree()
Return pointer to friend TTree.
Definition: TFriendElement.cxx:209
TFriendElement::ls
virtual void ls(Option_t *option="") const
List this friend element.
Definition: TFriendElement.cxx:238
TFriendElement::~TFriendElement
virtual ~TFriendElement()
Destructor. Disconnect from the owning tree if needed.
Definition: TFriendElement.cxx:149
TNamed
The TNamed class is the base class for all named ROOT classes.
Definition: TNamed.h:29
kFALSE
const Bool_t kFALSE
Definition: RtypesCore.h:92
TFriendElement::kFromChain
@ kFromChain
Definition: TFriendElement.h:49
TObject::MakeZombie
void MakeZombie()
Definition: TObject.h:49
TFriendElement::fFile
TFile * fFile
! pointer to the file containing the friend TTree
Definition: TFriendElement.h:38
TFriendElement::fTreeName
TString fTreeName
name of the friend TTree
Definition: TFriendElement.h:39
TNamed::SetTitle
virtual void SetTitle(const char *title="")
Set the title of the TNamed.
Definition: TNamed.cxx:164
TFile
A ROOT file is a suite of consecutive data records (TKey instances) with a well defined format.
Definition: TFile.h:54
TTree::GetDirectory
TDirectory * GetDirectory() const
Definition: TTree.h:457
TObject::IsZombie
R__ALWAYS_INLINE Bool_t IsZombie() const
Definition: TObject.h:134
TFriendElement::GetFile
virtual TFile * GetFile()
Return pointer to TFile containing this friend TTree.
Definition: TFriendElement.cxx:183
file
Definition: file.py:1
TDirectory::GetFile
virtual TFile * GetFile() const
Definition: TDirectory.h:174
TDirectory
Describe directory structure in memory.
Definition: TDirectory.h:45
Compress
char * Compress(const char *str)
Remove all blanks from the string str.
Definition: TString.cxx:2504
TFriendElement::fParentTree
TTree * fParentTree
! pointer to the parent TTree
Definition: TFriendElement.h:36
TFriendElement::fTree
TTree * fTree
! pointer to the TTree described by this element
Definition: TFriendElement.h:37
TFriendElement::GetTreeName
virtual const char * GetTreeName() const
Definition: TFriendElement.h:62
TNamed::GetName
virtual const char * GetName() const
Returns name of object.
Definition: TNamed.h:47
gROOT
#define gROOT
Definition: TROOT.h:406
TTree::RemoveExternalFriend
virtual void RemoveExternalFriend(TFriendElement *)
Removes external friend.
Definition: TTree.cxx:7848