[ROOT] 2.25.03: TChain::Process + user defined TSelector sticks on first TFile and gets real slow

From: Matthew D. Langston (langston@SLAC.stanford.edu)
Date: Thu Sep 21 2000 - 07:40:43 MEST


A call to TChain::Process on a user defined TSelector erroneously
iterates over and over again on the first TFile of a TChain.  In
addition, this second and subsequent erroneous iterations over the first
TFile is at least an order of magnitude slower than the first iteration,
if not more.

I have attached the small, simple file named MySelector.cxx which
demonstrates this problem.  Notice that I defined MySelector::ProcessCut
as follows:

  Bool_t ProcessCut( Int_t entry )
  {
     fTree->GetEntry( entry );
     return kTRUE;
  }

Is this not the correct way to simply read in all of a TTree's
TBranches?  I also tried the following with the same result:

  Bool_t ProcessCut( Int_t entry )
  {
     b_foo->GetEntry( entry );
     return kTRUE;
  }


I followed the example in the files h1analysis.h and h1analysis.C in the
tutorials subdirectory, which seem to do it as I describe as well.

The nature of the problem suggests that the user is required to call
TChain::LoadTree during the call to TSelector::Notify, in a manner
similar to the case with the code generated by TTree::MakeClass.
However, it didn't seem like I should have to do this with a TSelector.
Could somebody help me please?  Thank you :-)

Regards, Matt

--
Matthew D. Langston
SLD, Stanford Linear Accelerator Center
langston@SLAC.Stanford.EDU


#include <TString.h>            // sigh...
#include <TSelector.h>
#include <TFile.h>
#include <TChain.h>
#include <iostream>


class MySelector
   : public TSelector
{
   public:

      MySelector() {}
      virtual ~MySelector() {}

      virtual void Begin( TTree* tree )
      {
         if ( tree == 0 ) { return; }
         fTree = tree;
         fTree->SetBranchAddress( "foo", &f_foo );
      }

      virtual Bool_t Notify()
      {
         b_foo = fTree->GetBranch( "foo" );
         return kTRUE;
      }

      virtual Bool_t ProcessCut( Int_t entry )
      {
         fTree->GetEntry( entry );
         return kTRUE;
      }

      virtual void ProcessFill( Int_t entry )
      {
         cerr << "entry " << entry << ", foo " << f_foo << endl;
      }
      

   private:

      TTree*   fTree;
      Int_t    f_foo;
      TBranch* b_foo;
};


// Local variables:
//  compile-command: "g++ -Wall `root-config --cflags` -c MySelector.cxx"
// End:



This archive was generated by hypermail 2b29 : Tue Jan 02 2001 - 11:50:33 MET