Re: [ROOT] Evaluating complicated expressions from the Tree

From: Rene Brun (Rene.Brun@cern.ch)
Date: Mon Nov 03 2003 - 14:33:32 MET


Hi Miro,

You should use TTree::MakeClass (or better MakeSelector) to generate a skeleton
code for your analysis.
In the Loop function (if using MakeClass), you are free to use directly
the class members directly in C++ with as many expressions as you like. In this
way you read the entries only once and for each entry you can
select what to read (via TBranch::SetBranchStatus) or calling TBranch::GetEntry
directly.
I suggest to have a look at $ROOTSYS/tutorials/h1analysis.C tutorial
with the corresponding explanations in the Users Guide.

Rene Brun

@mail.desy.de wrote:
> 
>  Hi all,
> 
>  I have the following problem:
> 
>  For the purpose of my analysis I have root trees with Branches containing
> many leafs (all are simple floats/integers).
> 
>  In order to get the cross-sections a number of (combinations of
> ) variables have to be extracted for different selections. These variables
> and cuts are passed to the class as character strings.
> 
>  e.g. I need to evaluate
> 
>  cos(Thetah), cos(mc_Thetah),(Q2+0.59)^2.2/(Q2+1.02)^0.2,
> goodevent&&BoxCut, Q2>2&&Q2<5&&t<1 etc...
> 
>  There is a way to get it
> tree->Draw("cos(Thetah):cos(mc_Thetah)",cut1)
> double* var1 = tree->GetV1() // contains cos(Thetah)
> double* var2 = tree->GetV2() // contains cos(mc_Thetah)
> 
>  However for more than 3 variables and few cuts one has to loop MANY times
> over the tree to get it. The I/O is the slowest operation and this is the
> main limit on the speed of my calculations. For this reason I would like
> to know if there is other way to do this
> 
>  if there would be a method like  double TTree::Eval(const char*
> variable) or something more efficient so that one doesn't have to parse
> the string by every call.
> 
> This would mean that after
> tree->GetEntry(10)
> var = tree->Eval("cos(Thetah)")
> the var would contain the value of cos(Thetah) for entry 10
> 
>  This way I could do all my calculation in one loop through the data.
> 
> Well, there is a way to do it if the variable is just a simple Leaf but is
> there anything I could use to evaluate more complicated strings?
> 
> I think it must be already implemented somehow since the TTree::Draw()
> uses it extensively but I couldn't find it anywhere and many people around
> would be interested in this feature.
> 
>                                 Best regards,
> 
>                                         Miro
> 
> Version   3.05/05       5 June 2003 for linuxsuse6



This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:16 MET