Re: [ROOT] Evaluating complicated expressions from the Tree

From: helbich@mail.desy.de
Date: Mon Nov 03 2003 - 15:57:29 MET


 Hi Rene,
 
  this is not what I want. I use SetBranchAddress etc. a lot. 

 The exact application I need now is for the cross-section making class.
This class allows user to set the Trees containing processed data and
Monte Carlo information. User can set the data selection, kinematical
range, variable according to which the cross-section is made
(e.g. dsigma/d cos(Thetah) in the example below. The class contains a
customized Fitter to get the number of signal events as well as
Reweighting class that takes care of MC reweighting etc.

 The usage could be like:

TChain* tdat = new TChain("OutputTree_");
tdat->AddFile("data9899rec.root",-1);

TChain* tmc = new TChain("OutputTree_");
tmc->AddFile("mc00rec.root",-1);
xm = new XsecMaker();
xm->SetDataTree(tdat)
xm->SetDataTree(tmc);

xm->SetVariable("cos(Thetah)");
xm->SetDataSelection("(goodevent&&EIslesmax<0.2&&dis05&&HBoxCut2&&EmPz>45&&EmPz<65&&abs(vz)<50.&&sqrt(vx^2+vy^2)<0.4&&!elErr)&&KPosPt>0.2&&KNegPt>0.2");
xm->SetKinematicRange("Q2>2&&Q2<3&&t<1");
double bins1[] = {32,40,60,80,100};
xm->SetBins(4,bins1);
xm->MakeXsec();
xm->Save("xsec.dat");

 At the end the cross-sections + info on Acceptances, purities,
#events + other related quantities will be calculated and saved to
ascii file. 

 What I want is to avoid the parsing of the strings and evaluating it.
For example the reweighting formula finalizes to: 
root [3] cout << rw->GetReweightFormula()     
(1)*(pow((0.593+mc_Q2)/(1.04+mc_Q2),2.3)*1e4*(1+0.84*mc_Q2/(1.0+0.123*mc_Q2))/(1+mc_Q2/0.8938)^2.779)/(1e4*(1+0.84*mc_Q2/(1.0+0.123*mc_Q2))/(1+mc_Q2/0.8938)^2.779)*(1.5/(1+mc_eps*0.462963*(mc_Q2)^0.750000 )*(sin(mc_Thetah)^2*(1+mc_eps*cos(2*mc_Psi)) + 2*mc_eps*0.462963*(mc_Q2)^0.750000*cos(mc_Thetah)^2 - sqrt(2*mc_eps*(1+mc_eps)*0.462963*(mc_Q2)^0.750000)*cos(mc_Psi)*sin(2*mc_Thetah))-3*mc_eps*cos(2*mc_Phi)*0.2*mc_t/(2.500000)*(0.500000*sin(mc_Thetah)^2+cos(mc_Thetah)^2))/(1.)

 and I can get the value for each event easily by
tmc->Draw(rw->GetReweightFormula);
tmc->GetV1();

 So the parsing and evaluating even such a complicated monster must
be already implemented and used by the TTree::Draw().

What I want is to know wheter this feature is available for the users
so that not just 3 (tmc->GetV1-3()) but any number of expression could
be obtained for a given event.

Note that all the cuts, variables, reweighting should be able to be
modified at will by the user - e.g cannot be hard coded.


Of course I could program it myself and evaluate this expression by
parsing the string and replacing all the operands by the <cmath>
functions and all the variables by the ones I obtain from the tree.
However this would lead to a monster code and I think the repetition
of the already written and tested code.

 I had to deal with other applications for which such a functionality
would be useful.

  I hope this explanation would work much better. 

				Cheers,
						Miro

Simple example:
 Assume a class AA containing TTree fTree would have a method for calulating
average of some expression after a given cut. The implementation would
be simple:

double AA::GetMean(const char* expression,const char* selection) {
  int nevents = fTree->Draw(expression,selection);
  double sum = 0.;
  for (int i=0;i<nevents;i++) {
    sum += fTree->GetV1()[i];
  }
  return sum/ntot;
}

 instead of getting single branches for the variables and trying to
figure out what the value of the expression would be.

 Now imagine you want to calculate mean of 10 such expressions for
different cuts at one pass through the Tree. How could this be done?






On Mon, 3 Nov 2003, Rene Brun wrote:

> 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