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
28TFriendProxy::TFriendProxy() : fDirector(nullptr,-1), fIndex(-1)
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
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) {
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
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 main()
Definition Prototype.cxx:12
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t index
Long64_t GetReadEntry() const
Return the current 'local' entry number; i.e.
void SetReadEntry(Long64_t entry)
Move to a new entry to read entry is the 'local' entry number; i.e.
TTree * SetTree(TTree *newtree)
Set the BranchProxy to be looking at a new tree.
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.
A TTree represents a columnar dataset.
Definition TTree.h:89
virtual TTree * GetTree() const
Definition TTree.h:596