ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

/* $Id$ */
// Author: Andrei Gheata, 31/05/2006

//==============================================================================
//   AliAnalysisSelector - A transparent selector to be created by 
// AliAnalysisManager to handle analysis.
//==============================================================================

#include <Riostream.h>
#include <TProcessID.h>
#include <TROOT.h>

#include "AliAnalysisManager.h"
#include "AliAnalysisTask.h"
#include "AliAnalysisDataContainer.h"
#include "AliAnalysisSelector.h"

using std::cout;
using std::endl;
ClassImp(AliAnalysisSelector)

//______________________________________________________________________________
AliAnalysisSelector::AliAnalysisSelector()
                    :TSelector(), 
                     fInitialized(kFALSE), 
                     fAnalysis(NULL)
{
// Dummy ctor.
   fAnalysis = AliAnalysisManager::GetAnalysisManager();
   if (fAnalysis) fAnalysis->SetSelector(this);
}   

//______________________________________________________________________________
AliAnalysisSelector::AliAnalysisSelector(AliAnalysisManager *mgr)
                    :TSelector(),
                     fInitialized(kFALSE),
                     fAnalysis(mgr)
{
// Constructor. Called by AliAnalysisManager which registers itself on the
// selector running on the master.
   mgr->SetSelector(this);
}

//______________________________________________________________________________
AliAnalysisSelector::~AliAnalysisSelector()
{
// Dtor. The analysis manager object is sent in the input list and duplicated
// on the workers - it needs to be deleted (?)
//   if (fAnalysis) delete fAnalysis;
}

//______________________________________________________________________________
void AliAnalysisSelector::Init(TTree *tree)
{
// Called after Begin/SlaveBegin, assumes that fAnalysis is already initialized.
// Is Init called on workers in case of PROOF.
   if (!fAnalysis) {
      Error("Init", "Analysis manager NULL !");
      Abort("Cannot initialize without analysis manager. Aborting.");
      SetStatus(-1);
      return;
   }
   if (fAnalysis->GetDebugLevel()>1) {
      cout << "->AliAnalysisSelector->Init()" << endl;
   }   
   if (!tree) {
      Error("Init", "Input tree is NULL !");
      Abort("Cannot initialize without tree. Aborting.");
      SetStatus(-1);
      return;
   }
   fInitialized = fAnalysis->Init(tree);
   if (!fInitialized) {
      Error("Init", "Some error occured during analysis manager initialization. Aborting.");
      Abort("Error during AliAnalysisManager::Init()");
      SetStatus(-1);
      return;
   }   
   if (fAnalysis->GetDebugLevel()>1) {
      cout << "<-AliAnalysisSelector->Init()" << endl;
   }   
}

//______________________________________________________________________________
void AliAnalysisSelector::Begin(TTree *)
{
// Assembly the input list.
   RestoreAnalysisManager();
   if (fAnalysis && fAnalysis->GetDebugLevel()>1) {
      cout << "->AliAnalysisSelector->Begin: Analysis manager restored" << endl;
      gROOT->SetMustClean(fAnalysis->MustClean());
   }
}

//______________________________________________________________________________
void AliAnalysisSelector::SlaveBegin(TTree *tree)
{
// Called on each worker. We "unpack" analysis manager here and call InitAnalysis.
   RestoreAnalysisManager();
   if (fAnalysis) {
      gROOT->SetMustClean(fAnalysis->MustClean());
      if (fAnalysis->GetDebugLevel()>1) {
         cout << "->AliAnalysisSelector->SlaveBegin() after Restore" << endl;
      }   
      fAnalysis->SlaveBegin(tree);   
      if (fAnalysis->GetDebugLevel()>1) {
         cout << "<-AliAnalysisSelector->SlaveBegin()" << endl;
      }   
   }   
}

//______________________________________________________________________________
Bool_t AliAnalysisSelector::Notify()
{
   // The Notify() function is called when a new file is opened. This
   // can be either for a new TTree in a TChain or when when a new TTree
   // is started when using PROOF. It is normaly not necessary to make changes
   // to the generated code, but the routine can be extended by the
   // user if needed. The return value is currently not used.
   if (fAnalysis) return fAnalysis->Notify();
   return kFALSE;
}

//______________________________________________________________________________
Bool_t AliAnalysisSelector::Process(Long64_t entry)
{
// Event loop.
   static Int_t count = 0;
   count++;
   if (fAnalysis->GetDebugLevel() > 1) {
      cout << "->AliAnalysisSelector::Process()" << endl;
   }
   static Bool_t init=kTRUE;
   static Int_t nobjCount = 0;
   if(init) {
     nobjCount = TProcessID::GetObjectCount();
     init=kFALSE;
   }
   TProcessID::SetObjectCount(nobjCount);
   Int_t returnCode = fAnalysis->GetEntry(entry);
   if (returnCode <= 0) {
      cout << "Error retrieving event:" << entry << " Skipping ..." << endl;
      fAnalysis->CountEvent(1,0,1,0);
      // Try to skip file
      Abort("Bad stream to file. Trying next image.", kAbortFile);
      return kFALSE;
   } else {
      fAnalysis->ExecAnalysis();
      fAnalysis->CountEvent(1,1,0,0);
   }   
   if (fAnalysis->GetDebugLevel() > 1) {
      cout << "<-AliAnalysisSelector::Process()" << endl;
   }   
   return kTRUE;
}   

//______________________________________________________________________________
void AliAnalysisSelector::RestoreAnalysisManager()
{
// Restores analysis manager from the input list.
   if (!fAnalysis) {
      TIter next(fInput);
      TObject *obj;
      while ((obj=next())) {
         if (obj->IsA() == AliAnalysisManager::Class()) {
            fAnalysis = (AliAnalysisManager*)obj;
            fAnalysis->SetSelector(this);
            if (fAnalysis->GetDebugLevel()>1) {
               cout << "->AliAnalysisSelector->RestoreAnalysisManager: Analysis manager restored" << endl;
	     }
            break;
         }
      }
      if (!fAnalysis) {
         Error("SlaveBegin", "Analysis manager not found in the input list");
         return;
      }   
   }
}

//______________________________________________________________________________
void AliAnalysisSelector::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.
   gROOT->SetMustClean(kTRUE);
   if (fStatus == -1) return;  // TSelector won't abort...
   if (fAnalysis->GetAnalysisType() == AliAnalysisManager::kMixingAnalysis) return;
   if (fAnalysis->GetDebugLevel() > 1) {
      cout << "->AliAnalysisSelector::SlaveTerminate()" << endl;
   }   
   fAnalysis->PackOutput(fOutput);
   if (fAnalysis->GetDebugLevel() > 1) {
      cout << "<-AliAnalysisSelector::SlaveTerminate()" << endl;
   }   
}  

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