Logo ROOT  
Reference Guide
Loading...
Searching...
No Matches
TFriendProxy.cxx
Go to the documentation of this file.
1// @(#)root/base:$Id$
2// Author: Philippe Canal 13/05/2003
3
4/*************************************************************************
5 * Copyright (C) 1995-2000, Rene Brun, Fons Rademakers and al. *
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 TFriendProxy
13Concrete implementation of the proxy around a Friend Tree.
14*/
15
16#include "TChain.h"
17#include "TFriendProxy.h"
18#include "TTree.h"
19#include "TList.h"
20#include "TFriendElement.h"
21
22
23namespace ROOT {
24namespace Internal {
25
26/////////////////////////////////////////////////////////////////////////////
27
29{
30}
31
32 /////////////////////////////////////////////////////////////////////////////
33 /// Constructor.
34
36 fDirector(nullptr,-1), fIndex(index)
37 {
38
39 auto getFriendAtIdx = [](TTree *dataset, Int_t frIdx) -> TTree * {
40 if (!dataset)
41 return nullptr;
42
43 auto *friends = dataset->GetListOfFriends();
44 if (!friends)
45 return nullptr;
46
47 auto *friendAtIdx = friends->At(frIdx);
48 if (!friendAtIdx)
49 return nullptr;
50
51 auto *frEl = dynamic_cast<TFriendElement *>(friendAtIdx);
52 if (!frEl)
53 return nullptr;
54
55 return frEl->GetTree();
56 };
57
58 // The list of friends needs to be accessed via GetTree()->GetListOfFriends()
59 // (and not directly GetListOfFriends()), otherwise when `main` is a TChain we
60 // might not recover the list correctly (see #6993 for the TTreeReader issue
61 // and #6741 for a more complete discussion/explanation).
62 if (main) {
63 // But, we do need to get the top-level friend from the dataset (TTree or TChain)
64 // to check if it has an index
65 auto *topLevelFriendTree = getFriendAtIdx(main, fIndex);
66 if (topLevelFriendTree) {
67 fHasIndex = (topLevelFriendTree->GetTreeIndex() != nullptr);
68 }
69
70 // Then, point the director to the current tree from the friend that is being read
71 auto *localFriendTree = getFriendAtIdx(main->GetTree(), fIndex);
72 if (localFriendTree) {
73 fDirector.SetTree(localFriendTree);
74 // If we still do not think the friend has a TTreeIndex, retry for good measure
75 if (!fHasIndex)
76 fHasIndex = (localFriendTree->GetTreeIndex() != nullptr);
77 }
78 }
79
80 director->Attach(this);
81 }
82
83 /////////////////////////////////////////////////////////////////////////////
84 /// Return the entry number currently being looked at.
85
87 {
88 return fDirector.GetReadEntry();
89 }
90
91 /////////////////////////////////////////////////////////////////////////////
92 /// Refresh the cached read entry number from the original tree.
93
95 {
96 // The 2nd call to GetTree is to insure we get the 'local' tree's entry in the case of a
97 // chain.
98 if (fDirector.GetTree()) fDirector.SetReadEntry(fDirector.GetTree()->GetTree()->GetReadEntry());
99 }
100
101 //////////////////////////////////////////////////////////////////////////////
102 /// Update the address of the underlying tree.
103
105 {
106 if (!newmain)
107 return;
108
109 if (auto friends = newmain->GetTree()->GetListOfFriends()) {
110 auto *element = dynamic_cast<TFriendElement *>(friends->At(fIndex));
111 fDirector.SetTree(element ? element->GetTree() : nullptr);
112 } else {
113 fDirector.SetTree(nullptr);
114 }
115 }
116
117} // namespace Internal
118} // namespace ROOT
int Int_t
Signed integer 4 bytes (int).
Definition RtypesCore.h:59
long long Long64_t
Portable signed long integer 8 bytes.
Definition RtypesCore.h:83
void Attach(Detail::TBranchProxy *p)
Attach a TBranchProxy object to this director.
Int_t fIndex
Index of this tree in the list of friends.
TBranchProxyDirector fDirector
Contain pointer to TTree and entry to be read.
Long64_t GetReadEntry() const
Return the entry number currently being looked at.
void ResetReadEntry()
Refresh the cached read entry number from the original tree.
void Update(TTree *newmain)
Update the address of the underlying tree.
bool fHasIndex
Whether this friend has a TTreeIndex attached.
A TFriendElement TF describes a TTree object TF in a file.
virtual TTree * GetTree()
Return pointer to friend TTree.
TObject * At(Int_t idx) const override
Returns the object at position idx. Returns 0 if idx is out of range.
Definition TList.cxx:487
A TTree represents a columnar dataset.
Definition TTree.h:89
virtual TTree * GetTree() const
Definition TTree.h:604
virtual TList * GetListOfFriends() const
Definition TTree.h:577
int main(int argc, char **argv)
Definition hadd.cxx:631