Re: reading events from a TTree

From: Rene Brun (Rene.Brun@cern.ch)
Date: Mon Mar 02 1998 - 09:23:28 MET


Root supports two techniques to read a TTree:
 1- you do not have access to the code containing the classes,
    (in your example Event, Header, etc). You can use the function
      TTree::MakeCode to generate the skeleton code for an analysis
      function. This case, however, has some restrictions. If you
      have pointers to objects in a class, MakeCode will generate
      dummy (commented) code for the corresponding branch that it cannot
      process. You are using this case in your example below.
      Unfortunately, in case your class contains arrays, there is
      a bug in Root version 1.03/09 that very likely explains
      your problem below. This bug has been fixed in our development
      version.
 2- You have access to the class used to generate the TTree. This is
    obviously the prefered solution because you can use the same
    navigation technique in the analysis code than in the program
    generating/filling the Tree. That is what you show in your
    second mail. Pasha Murat has already answered your question
    how to access the elements of a TClonesArray in an analysis job.

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



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