Re: [ROOT] TTreeFormula within TSelector::ProcessCut

From: Chris Roat (croat@SLAC.stanford.edu)
Date: Sat Dec 22 2001 - 17:27:23 MET


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 : Tue Jan 01 2002 - 17:51:13 MET