I take this opportunity to mention again a complete and more
realistic example illustrating how to create a Tree using
a variable length list of TClonesArray objects.
See URL: http://root.cern.ch/root/Atlfast.html
Rene Brun
Dirk Meier wrote:
>
> Hello,
>
> reading two events from a TTree I find the following behaviour
>
> root [0] .x anal.C // this is my analysis macro
> EventNumber : 1 // print the event counter, and now do Dump()
> fHeader.fEventNumber 256
> fHeader.fRunNumber 288
> fHeader.fDate 970723
> fHeader.fTime 133445
> fHeader.fMTime 2036085
> fHeader.fType 1
> fNentry 15
> *fData ->4046b198
> fUniqueID 0 object unique identifier
> fBits 50331648 bit field status word
>
> // now I dump a second event
>
> fHeader.fEventNumber 257
> fHeader.fRunNumber 288
> fHeader.fDate 970723
> fHeader.fTime 133445
> fHeader.fMTime 2036085
> fHeader.fType 1
> fNentry 19
> *fData ->4046b198
> fUniqueID 0 object unique identifier
> fBits 50331648 bit field status word
>
> this is fine, but as soon as I fprint() e.g. a counting variable
> in between reading both events I receive segmentation fault,
> here the macro
>
> {
> //////////////////////////////////////////////////////////
> // This file has been automatically generated
> // (Sun Mar 1 13:07:33 1998 by ROOT version 1.03/09)
> // from TTree T/RD42/DIME/July97/Preliminary
> // found on file: /online/vsrd04/user/diamond/data/DSF288_980228.root
> //////////////////////////////////////////////////////////
>
> //Reset ROOT and connect tree file
> gROOT->Reset();
> TFile *f = new
> TFile("/online/vsrd04/user/diamond/data/DSF288_980228.root");
> TTree *T = (TTree*)f->Get("T");
>
> //Declaration of leaves types
> DEvent *fEvent = 0;
> Int_t fHeader_fEventNumber;
> Int_t fHeader_fRunNumber;
> Int_t fHeader_fDate;
> Int_t fHeader_fTime;
> Int_t fHeader_fMTime;
> Int_t fHeader_fType;
> Int_t fNentry;
> Int_t fData_;
> Int_t fData_fPlaneNumber[24];
> Int_t fData_fNhits[24];
> Int_t fData_fHitNumber[24];
> // ... and so on
> UInt_t fUniqueID;
> UInt_t fBits;
>
> //Set branch addresses
> T->SetBranchAddress("fEvent",&fEvent);
> T->SetBranchAddress("fHeader.fEventNumber",&fHeader_fEventNumber);
> T->SetBranchAddress("fHeader.fRunNumber",&fHeader_fRunNumber);
> T->SetBranchAddress("fHeader.fDate",&fHeader_fDate);
> T->SetBranchAddress("fHeader.fTime",&fHeader_fTime);
> T->SetBranchAddress("fHeader.fMTime",&fHeader_fMTime);
> T->SetBranchAddress("fHeader.fType",&fHeader_fType);
> T->SetBranchAddress("fNentry",&fNentry);
> T->SetBranchAddress("fData_",&fData_);
> T->SetBranchAddress("fData.fPlaneNumber",fData_fPlaneNumber);
> T->SetBranchAddress("fData.fNhits",fData_fNhits);
> T->SetBranchAddress("fData.fHitNumber",fData_fHitNumber);
> // and so on
> T->SetBranchAddress("fData.fBits",fData_fBits);
> T->SetBranchAddress("fUniqueID",&fUniqueID);
> T->SetBranchAddress("fBits",&fBits);
>
> // This is the loop skeleton
> // To read only selected branches, Insert statements like:
> //T->SetBranchStatus("*",0);
> //T->SetBranchStatus("fHeader",1);
> //T->SetBranchStatus("fData",1);
>
> DEvent *fEvent = new DEvent(); // declare and create like
> // in Event example
>
> TClonesArray *fData = fEvent->GetData(); // like in Event::GetTracks()
>
> TBranch *branch = T->GetBranch("fEvent");
>
> branch->SetAddress(&fEvent);
>
> Int_t nentries = T->GetEntries();
>
> Int_t n = 1;
> Int_t m = 2;
>
> printf("EventNumber : %d\n",n); // accessing n still works
>
> T->GetEvent(n); // after this GetEvent(),
> // I can not access n or
> // any other variable any more
> fEvent->Dump(); // this works and Dumps as shown
>
> //printf("EventNumber : %d\n",m);// <-- this print causes seg. fault
> // also looping over events causes seg.fault
> T->GetEvent(2); // <-- also T->GetEvent(m) would cause
> // seg.fault!!!, but T->GetEvent(2)
> // works instead.
> fEvent->Dump();
>
> }
>
> At the end I need to access values in the TClonesArray* fData
> (analog to the TClonesArray* track examples in the tutorial)
>
> thank you for any help
>
> Dirk