ROOT logo
// @(#)root/treeplayer:$Id: TSelectorEntries.cxx 20882 2007-11-19 11:31:26Z rdm $
// Author: Philippe Canal 09/06/2006

/*************************************************************************
 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TSelectorEntries                                                     //
//                                                                      //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

// The class is derived from the ROOT class TSelector. For more
// information on the TSelector framework see
// $ROOTSYS/README/README.SELECTOR or the ROOT User Manual.

// The following methods are defined in this file:
//    Begin():        called everytime a loop on the tree starts,
//                    a convenient place to create your histograms.
//    SlaveBegin():   called after Begin(), when on PROOF called only on the
//                    slave servers.
//    Process():      called for each event, in this function you decide what
//                    to read and fill your histograms.
//    SlaveTerminate: called at the end of the loop on the tree, when on PROOF
//                    called only on the slave servers.
//    Terminate():    called at the end of the loop on the tree,
//                    a convenient place to draw/fit your histograms.
//
// To use this file, try the following session on your Tree T:
//
// Root > T->Process("TSelectorEntries.C")
// Root > T->Process("TSelectorEntries.C","some options")
// Root > T->Process("TSelectorEntries.C+")
//

#include "TSelectorEntries.h"
#include "TTree.h"
#include "TTreeFormula.h"
#include "TSelectorScalar.h"

//______________________________________________________________________________
TSelectorEntries::TSelectorEntries(TTree *tree, const char *selection) : 
   fChain(tree), fSelect(0), fSelectedRows(0), fSelectMultiple(kFALSE) 
{ 
   // Default, constructor.   

   if (selection && selection[0]) {
      TSelectorEntries::SetSelection(selection);
   }
}

//______________________________________________________________________________
TSelectorEntries::TSelectorEntries(const char *selection) : 
   fSelect(0), fSelectedRows(0), fSelectMultiple(kFALSE) 
{ 
   // Constructor.

   TSelectorEntries::SetSelection(selection);
}

//______________________________________________________________________________
TSelectorEntries::~TSelectorEntries() 
{
   // Destructor.

   delete fSelect; fSelect = 0;
}

//______________________________________________________________________________
void TSelectorEntries::Begin(TTree *tree)
{
   // The Begin() function is called at the start of the query.
   // When running with PROOF Begin() is only called on the client.
   // The tree argument is deprecated (on PROOF 0 is passed).

   TString option = GetOption();
   fChain = tree;
}

//______________________________________________________________________________
void TSelectorEntries::SlaveBegin(TTree *tree)
{
   // The SlaveBegin() function is called after the Begin() function.
   // When running with PROOF SlaveBegin() is called on each slave server.
   // The tree argument is deprecated (on PROOF 0 is passed).

   fChain = tree;
   TString option = GetOption();

   SetStatus(0);
   fSelectedRows   = 0;
   const char *selection = fInput->FindObject("selection")->GetTitle();

   if (strlen(selection)) {
      fSelect = new TTreeFormula("Selection",selection,fChain);
      fSelect->SetQuickLoad(kTRUE);
      if (!fSelect->GetNdim()) {delete fSelect; fSelect = 0; return; }
   }
   if (fSelect && fSelect->GetMultiplicity()) fSelectMultiple = kTRUE;

   fChain->ResetBit(TTree::kForceRead);
}

//______________________________________________________________________________
Int_t TSelectorEntries::GetEntry(Long64_t entry, Int_t getall)
{
   //read entry
   return fChain ? fChain->GetTree()->GetEntry(entry, getall) : 0; 
}

//______________________________________________________________________________
void TSelectorEntries::Init(TTree * /* tree */)
{
   // The Init() function is called when the selector needs to initialize
   // a new tree or chain. Typically here the branch addresses and branch
   // pointers of the tree will be set.
   // It is normaly not necessary to make changes to the generated
   // code, but the routine can be extended by the user if needed.
   // Init() will be called many times when running on PROOF
   // (once per file to be processed).

}

//______________________________________________________________________________
Bool_t TSelectorEntries::Notify()
{
   // This function is called at the first entry of a new tree in a chain.

   if (fSelect) fSelect->UpdateFormulaLeaves();
   return kTRUE;
}

//______________________________________________________________________________
Bool_t TSelectorEntries::Process(Long64_t /* entry */)
{
   // The Process() function is called for each entry in the tree (or possibly
   // keyed object in the case of PROOF) to be processed. The entry argument
   // specifies which entry in the currently loaded tree is to be processed.
   // It can be passed to either TSelectorEntries::GetEntry() or TBranch::GetEntry()
   // to read either all or the required parts of the data. When processing
   // keyed objects with PROOF, the object is already loaded and is available
   // via the fObject pointer.
   //
   // This function should contain the "body" of the analysis. It can contain
   // simple or elaborate selection criteria, run algorithms on the data
   // of the event and typically fill histograms.
   //
   // The processing can be stopped by calling Abort().
   //
   // Use fStatus to set the return value of TTree::Process().
   //
   // The return value is currently not used.

   if (!fSelectMultiple) {
      if (fSelect) {
         if ( fSelect->EvalInstance(0) ) {
            ++fSelectedRows;
         }
      } else {
         ++fSelectedRows;
      }
   } else {
      // Grab the array size of the formulas for this entry
      Int_t ndata = fSelect->GetNdata();

      // No data at all, let's move on to the next entry.
      if (!ndata) return kTRUE;

      // Calculate the first values
      if (fSelect) {
         // Always call EvalInstance(0) to insure the loading
         // of the branches.
         if (fSelect->EvalInstance(0)) {
            ++fSelectedRows;
         } else {
            for (Int_t i=1;i<ndata;i++) {
               if (fSelect->EvalInstance(i)) {
                  ++fSelectedRows;
                  break;
               }
            }
         }
      }
   }
   return kTRUE;
}

//______________________________________________________________________________
void TSelectorEntries::SetSelection(const char *selection)
{
   //set the selection expression
   if (!fInput) {
      fInput = new TList;
   }
   TNamed *cselection = (TNamed*)fInput->FindObject("selection");
   if (!cselection) {
      cselection = new TNamed("selection","");
      fInput->Add(cselection);
   }
   cselection->SetTitle(selection);
}

//______________________________________________________________________________
void TSelectorEntries::SlaveTerminate()
{
   // The SlaveTerminate() function is called after all entries or objects
   // have been processed. When running with PROOF SlaveTerminate() is called
   // on each slave server.

   fOutput->Add(new TSelectorScalar("fSelectedRows",fSelectedRows));
}

//______________________________________________________________________________
void TSelectorEntries::Terminate()
{
   // The Terminate() function is the last function to be called during
   // a query. It always runs on the client, it can be used to present
   // the results graphically or save the results to file.

   TSelectorScalar* rows = (TSelectorScalar*)fOutput->FindObject("fSelectedRows");
   if (rows)
   {
      fSelectedRows = rows->GetVal();
   } else {
      Error("Terminate","fSelectedRows is missing in fOutput");
   }
}
 TSelectorEntries.cxx:1
 TSelectorEntries.cxx:2
 TSelectorEntries.cxx:3
 TSelectorEntries.cxx:4
 TSelectorEntries.cxx:5
 TSelectorEntries.cxx:6
 TSelectorEntries.cxx:7
 TSelectorEntries.cxx:8
 TSelectorEntries.cxx:9
 TSelectorEntries.cxx:10
 TSelectorEntries.cxx:11
 TSelectorEntries.cxx:12
 TSelectorEntries.cxx:13
 TSelectorEntries.cxx:14
 TSelectorEntries.cxx:15
 TSelectorEntries.cxx:16
 TSelectorEntries.cxx:17
 TSelectorEntries.cxx:18
 TSelectorEntries.cxx:19
 TSelectorEntries.cxx:20
 TSelectorEntries.cxx:21
 TSelectorEntries.cxx:22
 TSelectorEntries.cxx:23
 TSelectorEntries.cxx:24
 TSelectorEntries.cxx:25
 TSelectorEntries.cxx:26
 TSelectorEntries.cxx:27
 TSelectorEntries.cxx:28
 TSelectorEntries.cxx:29
 TSelectorEntries.cxx:30
 TSelectorEntries.cxx:31
 TSelectorEntries.cxx:32
 TSelectorEntries.cxx:33
 TSelectorEntries.cxx:34
 TSelectorEntries.cxx:35
 TSelectorEntries.cxx:36
 TSelectorEntries.cxx:37
 TSelectorEntries.cxx:38
 TSelectorEntries.cxx:39
 TSelectorEntries.cxx:40
 TSelectorEntries.cxx:41
 TSelectorEntries.cxx:42
 TSelectorEntries.cxx:43
 TSelectorEntries.cxx:44
 TSelectorEntries.cxx:45
 TSelectorEntries.cxx:46
 TSelectorEntries.cxx:47
 TSelectorEntries.cxx:48
 TSelectorEntries.cxx:49
 TSelectorEntries.cxx:50
 TSelectorEntries.cxx:51
 TSelectorEntries.cxx:52
 TSelectorEntries.cxx:53
 TSelectorEntries.cxx:54
 TSelectorEntries.cxx:55
 TSelectorEntries.cxx:56
 TSelectorEntries.cxx:57
 TSelectorEntries.cxx:58
 TSelectorEntries.cxx:59
 TSelectorEntries.cxx:60
 TSelectorEntries.cxx:61
 TSelectorEntries.cxx:62
 TSelectorEntries.cxx:63
 TSelectorEntries.cxx:64
 TSelectorEntries.cxx:65
 TSelectorEntries.cxx:66
 TSelectorEntries.cxx:67
 TSelectorEntries.cxx:68
 TSelectorEntries.cxx:69
 TSelectorEntries.cxx:70
 TSelectorEntries.cxx:71
 TSelectorEntries.cxx:72
 TSelectorEntries.cxx:73
 TSelectorEntries.cxx:74
 TSelectorEntries.cxx:75
 TSelectorEntries.cxx:76
 TSelectorEntries.cxx:77
 TSelectorEntries.cxx:78
 TSelectorEntries.cxx:79
 TSelectorEntries.cxx:80
 TSelectorEntries.cxx:81
 TSelectorEntries.cxx:82
 TSelectorEntries.cxx:83
 TSelectorEntries.cxx:84
 TSelectorEntries.cxx:85
 TSelectorEntries.cxx:86
 TSelectorEntries.cxx:87
 TSelectorEntries.cxx:88
 TSelectorEntries.cxx:89
 TSelectorEntries.cxx:90
 TSelectorEntries.cxx:91
 TSelectorEntries.cxx:92
 TSelectorEntries.cxx:93
 TSelectorEntries.cxx:94
 TSelectorEntries.cxx:95
 TSelectorEntries.cxx:96
 TSelectorEntries.cxx:97
 TSelectorEntries.cxx:98
 TSelectorEntries.cxx:99
 TSelectorEntries.cxx:100
 TSelectorEntries.cxx:101
 TSelectorEntries.cxx:102
 TSelectorEntries.cxx:103
 TSelectorEntries.cxx:104
 TSelectorEntries.cxx:105
 TSelectorEntries.cxx:106
 TSelectorEntries.cxx:107
 TSelectorEntries.cxx:108
 TSelectorEntries.cxx:109
 TSelectorEntries.cxx:110
 TSelectorEntries.cxx:111
 TSelectorEntries.cxx:112
 TSelectorEntries.cxx:113
 TSelectorEntries.cxx:114
 TSelectorEntries.cxx:115
 TSelectorEntries.cxx:116
 TSelectorEntries.cxx:117
 TSelectorEntries.cxx:118
 TSelectorEntries.cxx:119
 TSelectorEntries.cxx:120
 TSelectorEntries.cxx:121
 TSelectorEntries.cxx:122
 TSelectorEntries.cxx:123
 TSelectorEntries.cxx:124
 TSelectorEntries.cxx:125
 TSelectorEntries.cxx:126
 TSelectorEntries.cxx:127
 TSelectorEntries.cxx:128
 TSelectorEntries.cxx:129
 TSelectorEntries.cxx:130
 TSelectorEntries.cxx:131
 TSelectorEntries.cxx:132
 TSelectorEntries.cxx:133
 TSelectorEntries.cxx:134
 TSelectorEntries.cxx:135
 TSelectorEntries.cxx:136
 TSelectorEntries.cxx:137
 TSelectorEntries.cxx:138
 TSelectorEntries.cxx:139
 TSelectorEntries.cxx:140
 TSelectorEntries.cxx:141
 TSelectorEntries.cxx:142
 TSelectorEntries.cxx:143
 TSelectorEntries.cxx:144
 TSelectorEntries.cxx:145
 TSelectorEntries.cxx:146
 TSelectorEntries.cxx:147
 TSelectorEntries.cxx:148
 TSelectorEntries.cxx:149
 TSelectorEntries.cxx:150
 TSelectorEntries.cxx:151
 TSelectorEntries.cxx:152
 TSelectorEntries.cxx:153
 TSelectorEntries.cxx:154
 TSelectorEntries.cxx:155
 TSelectorEntries.cxx:156
 TSelectorEntries.cxx:157
 TSelectorEntries.cxx:158
 TSelectorEntries.cxx:159
 TSelectorEntries.cxx:160
 TSelectorEntries.cxx:161
 TSelectorEntries.cxx:162
 TSelectorEntries.cxx:163
 TSelectorEntries.cxx:164
 TSelectorEntries.cxx:165
 TSelectorEntries.cxx:166
 TSelectorEntries.cxx:167
 TSelectorEntries.cxx:168
 TSelectorEntries.cxx:169
 TSelectorEntries.cxx:170
 TSelectorEntries.cxx:171
 TSelectorEntries.cxx:172
 TSelectorEntries.cxx:173
 TSelectorEntries.cxx:174
 TSelectorEntries.cxx:175
 TSelectorEntries.cxx:176
 TSelectorEntries.cxx:177
 TSelectorEntries.cxx:178
 TSelectorEntries.cxx:179
 TSelectorEntries.cxx:180
 TSelectorEntries.cxx:181
 TSelectorEntries.cxx:182
 TSelectorEntries.cxx:183
 TSelectorEntries.cxx:184
 TSelectorEntries.cxx:185
 TSelectorEntries.cxx:186
 TSelectorEntries.cxx:187
 TSelectorEntries.cxx:188
 TSelectorEntries.cxx:189
 TSelectorEntries.cxx:190
 TSelectorEntries.cxx:191
 TSelectorEntries.cxx:192
 TSelectorEntries.cxx:193
 TSelectorEntries.cxx:194
 TSelectorEntries.cxx:195
 TSelectorEntries.cxx:196
 TSelectorEntries.cxx:197
 TSelectorEntries.cxx:198
 TSelectorEntries.cxx:199
 TSelectorEntries.cxx:200
 TSelectorEntries.cxx:201
 TSelectorEntries.cxx:202
 TSelectorEntries.cxx:203
 TSelectorEntries.cxx:204
 TSelectorEntries.cxx:205
 TSelectorEntries.cxx:206
 TSelectorEntries.cxx:207
 TSelectorEntries.cxx:208
 TSelectorEntries.cxx:209
 TSelectorEntries.cxx:210
 TSelectorEntries.cxx:211
 TSelectorEntries.cxx:212
 TSelectorEntries.cxx:213
 TSelectorEntries.cxx:214
 TSelectorEntries.cxx:215
 TSelectorEntries.cxx:216
 TSelectorEntries.cxx:217
 TSelectorEntries.cxx:218
 TSelectorEntries.cxx:219
 TSelectorEntries.cxx:220
 TSelectorEntries.cxx:221
 TSelectorEntries.cxx:222
 TSelectorEntries.cxx:223
 TSelectorEntries.cxx:224
 TSelectorEntries.cxx:225
 TSelectorEntries.cxx:226
 TSelectorEntries.cxx:227
 TSelectorEntries.cxx:228
 TSelectorEntries.cxx:229
 TSelectorEntries.cxx:230
 TSelectorEntries.cxx:231
 TSelectorEntries.cxx:232
 TSelectorEntries.cxx:233