Re: Trouble with trees

From: Rene Brun <Rene.Brun_at_cern.ch>
Date: Wed, 8 Jul 2009 09:40:21 +0200


Hi Mario,

It is likely an alignment problem within a struct when using data types of different lengths. I cannot reproduce it on my machines. Could you run the attached script on your machine and let me know if it works?
It is better to pass the struct pointer instead that the description of the individual members, ie replace    

tree->Branch("cutvars",&cutvars.s,"s/I:mRel/D:sumpt:pt1:pt2:pt3:pt4:dRp:dRn:met:nTau/I"); by

   tree->Branch("cutvars",&cutvars);
Rene

Mario Kadastik wrote:
> Hello,
>
> I'm confused with my TTree right now. Inside the CMS software I write
> the tree like this:
>
> struct cutvars_t {
> Int_t s;
> Double_t mRel;
> Double_t sumpt;
> Double_t pt1;
> Double_t pt2;
> Double_t pt3;
> Double_t pt4;
> Double_t dRp;
> Double_t dRn;
> Double_t met;
> Int_t nTau;
> };
> cutvars_t cutvars;
>
> treeFile = new TFile(treeFileName.c_str(),"RECREATE");
> tree = new TTree("Tree","Tree of cut variables for later
> optimization");
>
> tree->Branch("cutvars",&cutvars.s,"s/I:mRel/D:sumpt:pt1:pt2:pt3:pt4:dRp:dRn:met:nTau/I");
>
> In the event loop I fill the cutvars and fill the tree.
>
> When I then look at it in root afterwards:
>
> root [0] TTree *t = (TTree*)_file0->Get("Tree")
> root [1] t->Show(10)
> ======> EVENT:10
> s = 1
> mRel = 0.954773
> sumpt = 447.262
> pt1 = 44.2483
> pt2 = 88.4943
> pt3 = 126.326
> pt4 = 201.498
> dRp = 0.967189
> dRn = 1.10596
> met = 22.8287
> nTau = 1
>
>
> Then it looks just fine. However when I try to read the tree with the
> following script:
> {
> struct cutvars_t {
> Int_t s;
> Double_t mRel;
> Double_t sumpt;
> Double_t pt1;
> Double_t pt2;
> Double_t pt3;
> Double_t pt4;
> Double_t dRp;
> Double_t dRn;
> Double_t met;
> Int_t nTau;
> };
> cutvars_t cutvars;
>
> TTree *t = (TTree*)_file0->Get("Tree");
> t->SetBranchAddress("cutvars",&cutvars.s);
>
>
> for (Int_t i = 10; i < 11; i++) {
> t->GetEntry(i);
> cout << "s:" << cutvars.s << " mRel: " << cutvars.mRel << " pt1: " <<
> cutvars.pt1 << endl;
> }
> }
>
>
> then the output is:
> Processing printTree.C...
> s:1 mRel: -1.49167e-154 pt1: 2.68156e+154
>
> As you can see the double variables are over/underflown and don't make
> sense. I've been trying to figure out what I'm doing wrong, but don't
> seem to be able to.... The Branch itself is of structure:
>
> root [10] t->GetBranch("cutvars")->Print()
> *Br 0 :cutvars :
> s/I:mRel/D:sumpt:pt1:pt2:pt3:pt4:dRp:dRn:met:nTau/I *
> *Entries : 1402 : Total Size= 145921 bytes File Size =
> 27545 *
> *Baskets : 3 : Basket Size= 32000 bytes Compression=
> 3.48 *
> *............................................................................*
>
> root [11] t->GetListOfLeaves()->Print()
> OBJ: TLeafI s s
> OBJ: TLeafD mRel mRel
> OBJ: TLeafD sumpt sumpt
> OBJ: TLeafD pt1 pt1
> OBJ: TLeafD pt2 pt2
> OBJ: TLeafD pt3 pt3
> OBJ: TLeafD pt4 pt4
> OBJ: TLeafD dRp dRp
> OBJ: TLeafD dRn dRn
> OBJ: TLeafD met met
> OBJ: TLeafI nTau nTau
>
> Thanks in advance,
>
> Mario
>
> PS! the root used is:
> /opt/software/cms/slc4_ia32_gcc345/lcg/root/5.18.00a-cms21/bin/root
>
> and this should be the one used for both the reading and writing of
> the root file so I'd guess no version change related issues either...

Received on Wed Jul 08 2009 - 09:39:43 CEST

This archive was generated by hypermail 2.2.0 : Wed Jul 08 2009 - 11:50:03 CEST