Hi Robert,
Use a "." in case members in sub-branches have identical names.
See doc of TTree::Branch that says:
//
// IMPORTANT NOTE about branch names
// In case two or more master branches contain subbranches with
// identical names, one must add a "." (dot) character at the end
// of the master branch name. This will force the name of the
subbranch
// to be master.subbranch instead of simply subbranch.
// This situation happens when the top level object (say event)
// has two or more members referencing the same class.
// For example, if a Tree has two branches B1 and B2 corresponding
// to objects of the same class MyClass, one can do:
// tree.Branch("B1.","MyClass",&b1,8000,1);
// tree.Branch("B2.","MyClass",&b2,8000,1);
// if MyClass has 3 members a,b,c, the two instructions above will
generate
// subbranches called B1.a, B1.b ,B1.c, B2.a, B2.b, B2.c
Rene Brun
On
Tue,
20
May 2003, Robert Feuerbach wrote:
>
> Hi ROOT-Team,
>
> I'm noticing some odd/incorrect behavior out of
> TTree::MakeSelector, where the automatically generated code
> does not have unique names for the variables to hold the data
> for each branch and leaf. I'm currently testing this with
> ROOT 3.05-04, but similar results are from 3.02-07 as well. This
> was run on a Linux RH7.3 machine.
>
>
> A simple test example is (do_1 and then do_2):
>
> //------------------------------
> void do_1 ()
> {
> gSystem.Load("libPhysics");
> TFile *testf = new TFile("test.root","RECREATE");
> TTree *myT = new TTree("myT","test tree");
>
> TVector3 *dirAp = new TVector3(0.,0.,1);
> TVector3 *dirBp = new TVector3(0.,0.,2);
>
> myT->Branch("dirA","TVector3",&dirAp);
> myT->Branch("dirB","TVector3",&dirBp);
>
> myT->Fill();
>
> dirAp->SetXYZ(1.,0.,0.);
> dirBp->SetXYZ(2.,0.,0.);
> myT->Fill();
> myT->Write();
> testf->Close();
> }
>
> void do_2 ()
> {
> TFile *testf = new TFile("test.root");
> TTree *myT = (TTree*)gDirectory->Get("myT");
> myT->Print();
> myT->MakeSelector("my_test");
> }
> //------------------------------
>
> The resulting TSelector class looks something like:
>
> // part of my_test.h, created by TTree::MakeSelector
> --------------------------------------------
> class my_test : public TSelector {
> public :
> TTree *fChain; //!pointer to the analyzed TTree or
> TChain
> //Declaration of leaves types
> TVector3 *dirA;
> UInt_t fUniqueID; // <-- NOT UNIQUE
> UInt_t fBits;
> Double_t fX;
> Double_t fY;
> Double_t fZ;
> TVector3 *dirB;
> UInt_t fUniqueID;
> UInt_t fBits;
> Double_t fX;
> Double_t fY;
> Double_t fZ;
>
> //List of branches
> TBranch *b_TObject_fUniqueID; //!
> TBranch *b_TObject_fBits; //!
> TBranch *b_dirA_fX; //!
> TBranch *b_dirA_fY; //!
> TBranch *b_dirA_fZ; //!
> TBranch *b_TObject_fUniqueID; //!
> TBranch *b_TObject_fBits; //!
> TBranch *b_dirB_fX; //!
> TBranch *b_dirB_fY; //!
> TBranch *b_dirB_fZ; //!
> ...
> ---------------------------------------------
>
>
> So, this is different from what I expected. What I would expect
> to happen is:
>
> BEST CASE: The dirA and dirB branches are directly
> connected to TVector3 objects.
>
> WORKABLE: The TBranch's are read into unique variables
> dirA_fX, dirA_fY, dirB_fX, etc...
>
>
> While I can generate the correct code for a small case like this,
> the automatic code generation is invaluable for processing large
> trees. Am I doing something wrong?
>
> I think the problem is in the name generation in
> TTree::MakeClass, but the code seems to build the names for
> TBranch's and the temporary variables in many places. Perhaps
> one should use a single 'MakeUniqueLeafName' method, and then
> just stick a 'b_' in front for a TBranch?
>
> Thanks for your help,
> Rob
>
>
This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:11 MET