reading events from a TTree

From: Dirk Meier (Dirk.Meier@cern.ch)
Date: Sun Mar 01 1998 - 17:00:38 MET


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



This archive was generated by hypermail 2b29 : Tue Jan 04 2000 - 00:34:30 MET