reading events from a TTree

Dirk Meier (Dirk.Meier@cern.ch)
Sun, 1 Mar 1998 17:00:38 +0100 (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