Re: [ROOT] How to read individual leafes from one or more trees?

From: cstrato (cstrato@aon.at)
Date: Mon Sep 09 2002 - 21:00:36 MEST


Dear Rene

Thank you for this explanation. Maybe, it could be mentioned
in the class reference for TLeaf, that the argument should only
be used in case of an array.

Best regards
Christian


Rene Brun wrote:

> Hi Christian,
> 
> The basic I/O transaction is at the branch level, not the leaf level.
> One branch has one buffer only for all leaves. Reading one leaf
> implies reading the complete branch.
> If, in your code, you replace:
>        output << name->GetValue(i) << sep
>               << num->GetValue(i)  << endl;
> by
>        output << name->GetValue(0) << sep
>               << num->GetValue(0)  << endl;
> or simply
>        output << name->GetValue() << sep
>               << num->GetValue()  << endl;
> you will get the right answer. You should use the argument
> only in case the leaf is an array and you want to retrieve
> the jth element of the array.
> 
> why not TBranch::GetLeafEntry(entry, leafname)?
> It would be very inefficient to do string manipulation
> at each entry.
> 
> Rene Brun
> 
> 
> 
> On Sun, 8 Sep 2002, cstrato wrote:
> 
> 
>>Dear Rooters
>>
>>Suppose, that I have filled tree(s) with one branch for:
>>class MyClass: public TObject {
>>    TString   fName;
>>    Int__t    fNum
>>    Double_t  fValue1
>>    Double_t  fValue2
>>}
>>
>>The following example exports all leafes from one tree:
>>void Export(const char *treename, const char *outname)
>>{
>>    output << "Name" << "\t" << "Number" << "\t"
>>           << "Value1" << "\t" << "Value2" << endl;
>>
>>    MyClass *myclass = 0;
>>    TTree *tree = (TTree*)gDirectory->Get(treename);
>>    tree->SetBranchAddress("MyBranch", &myclass);
>>
>>    ofstream output(outname, ios::out);
>>    Int_t entries = (Int_t)(tree->GetEntries());
>>    for (Int_t i=0; i<entries; i++) {
>>       tree->GetEntry(i);
>>       output << myclass->GetName()   << "\t"
>>              << myclass->GetNumber() << "\t"
>>              << myclass->GetValue1() << "\t"
>>              << myclass->GetValue2() << endl;
>>    }
>>    output.close();
>>}
>>
>>Now I would like to expand this function in two ways:
>>1, I want to export selected leafes only, e.g.
>>    Export("mytree", "outname", "fNum:fValue2")
>>2, I want to export selected leaves from all trees in a file, e.g.
>>    Export("*", "outname", "fValue1")
>>
>>ad 1) Export selected leafes:
>>I could simply do: if("fNum") myclass->GetNumber(), but:
>>analogously to be able to read selected branches, is there
>>a similar way to read selected leafes?
>>I have tried the following but got a bus error:
>>    MyClass *myclass = 0;
>>    TTree *tree = (TTree*)gDirectory->Get(treename);
>>    TBranch *branch = 0;
>>    branch = tree->GetBranch("MyBranch");
>>    if (branch) branch->SetAddress(&myclass);
>>
>>    TLeaf *name = branch->GetLeaf("fName");
>>    TLeaf *num  = branch->GetLeaf("fNum");
>>    Int_t entries = (Int_t)(tree->GetEntries());
>>    for (Int_t i=0; i<entries; i++) {
>>       branch->GetEntry(i);
>>       output << name->GetValue(i) << sep
>>              << num->GetValue(i)  << endl;
>>    }
>>What is wrong with this code, and how can I read selected leafes?
>>It would be great if there would be a function such as
>>TBranch::GetLeafEntry(entry, leafname)?
>>
>>ad 2) Export chains of trees
>>I could try to loop over all trees in TFile, but the question
>>is if there is a simpler and more elegant way to do it, where
>>I could take advantage of TChain or of tree friends?
>>
>>Thank you in advance for your help.
>>
>>Best regards
>>Christian
>>_._._._._._._._._._._._._._._._
>>C.h.i.s.t.i.a.n S.t.r.a.t.o.w.a
>>V.i.e.n.n.a       A.u.s.t.r.i.a
>>_._._._._._._._._._._._._._._._
>>
>>
>>
>>
>>
>>
>>
> 
> 
> 



This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:51:09 MET