Re: [ROOT] TTreeFormula within TSelector::ProcessCut

From: Rene Brun (Rene.Brun@cern.ch)
Date: Fri Jan 04 2002 - 14:52:34 MET


Hi Chris,
Assuming a TTreeFormula* formula;
In your TSelector you can use it in two ways:
  1- call double* val = formula->EvalInstance(); This will automatically
     read in  the necessary leaves referenced by the formula and return
     the value of the expression that you can use as a cut.

  2-Loop yourself on the list of leaves referenced by formula
   Int_t nleaves = formula->GetNcodes();
   for (Int_t l=0;l<nleaves;l++) {
      TLeaf *leaf = formula->GetLeaf(l);
      leaf->GetEntry(i); 
   }

Rene Brun

On Sat, 22 Dec 2001, Chris Roat wrote:

> I'm using TTreeFormula to get around the problem of parsing a set of cuts
> sent to my TSelector via the outside world.  See, I don't want to hard
> code in my cuts, which can be complicated expressions, in my TSelector.  I
> want a generic TSelector which can be changed from my main program.
> 
> Chris
> 
> 
> *** Yesterday, you (Rene Brun) wrote ***
> 
> >Hi Chris,
> >
> >I do not think that it is a good idea to use TTreeFormula within a TSelector.
> >If you already have a TSelector derived class, you should implement
> >the function MySelector::ProcessCut. In this function, you should call
> >the TBranch::GetEntry (not TTree::GetEntry) in the order where you eliminate
> >as many candidates as possible and minimizing the I/O.
> >You can see an example in $ROOTSYS/tutorials/h1analysis.C
> >
> >Use TBranch::GetEntry as shown in this example instead of the mechanism
> >via TTree::SetBranchStatus. The pointers to the branches are already declared
> >and precomputed for you in mySelector.h
> >
> >Rene Brun
> >
> >
> >Chris Roat wrote:
> >>
> >> Hi Philipe,
> >>
> >> Thanks so much for your solution.  It worked great and I'm now back up and
> >> running.  I have another question on a related note.
> >>
> >> I need to be sure that my TSelector reads in the branches necessary (and
> >> *only* those branches, since I have 100s) for the TTreeFormulas I am
> >> using.  But I don't see the need to add/change SetBranchStatus lines in my
> >> TSelector::Init method everytime I add/change my TTreeFormulas.
> >>
> >> Is there a way to do this more easily, like by looping over the leaves a
> >> TTreeFormula needs?
> >>
> >> Cheers,
> >> Chris
> >>
> >> *** Today, you (Philippe Canal) wrote ***
> >>
> >> >Hi Chris,
> >> >
> >> >The problem was that the TTreeFormula were not informed properly that
> >> >the chain loaded a need TTree.  To fix that you need to add at the end of
> >> >generic::Notify the following:
> >> >
> >> >  // fChain->LoadTree(fChain->GetReadEntry());
> >> >  // Also update the formulas:
> >> >  for (Int_t cut=0; cut<_cs->nCuts(); cut++) {
> >> >     ttform[cut]->UpdateFormulaLeaves();
> >> >  }
> >> >
> >> >Now in your sample case (only one file), it should not have been loading
> >> >any new file in the first place.  The reason why it was, is that you have
> >> >in all your selector's Notify method (like generic::Notify) calls like:
> >> >
> >> >       fChain->SetBranchStatus("*",kFALSE);
> >> >
> >> >This forces a reload of the current file.  The SetBranchStatus actually
> >> >belongs in the generic::Init method because they only need to be once
> >> >by chain.  The chain (at least in newer ROOT) keeps track of the
> >> >info and pass it to each TTree.  If for some reasons (very old ROOT
> >> >version) this does not work, then uncomment the first like in my
> >> >first code fragment.
> >> >
> >> >Cheers,
> >> >Philipe.
> >> >
> >> >
> >> >-----Original Message-----
> >> >From: owner-roottalk@pcroot.cern.ch
> >> >[mailto:owner-roottalk@pcroot.cern.ch]On Behalf Of Chris Roat
> >> >Sent: Wednesday, December 19, 2001 1:03 PM
> >> >To: roottalk@pcroot.cern.ch
> >> >Subject: [ROOT] TTreeFormula within TSelector::ProcessCut
> >> >
> >> >
> >> >Hi ROOT,
> >> >
> >> >I'm having problems finding out if a particular entry in a tree passes a
> >> >cut.  I'm using a TSelector which takes recieves a list of strings (which
> >> >are cuts, of the form "p>3" or "myBool" from the outside world).  During
> >> >ProcessCut/ProcessFill, I would like to see if the entry I'm on passes any
> >> >of the strings.
> >> >
> >> >I am trying to use TTreeFormula to tackle this, but without prolonged
> >> >luck.  It works fine on the first entry - EvalInstance(0) returns the
> >> >correct answer, so I'm on the right track.  However, EvalInstance(0) seg
> >> >faults on subsequent entries.
> >> >
> >> >Could there be a problem with ProcessCut() and EvalInstance() both getting
> >> >info from the tree?
> >> >
> >> >Thanks for any insight,
> >> >Chris
> >> >
> >> >
> >> >
> >
> 
> 



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