]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ANALYSIS/AliAnalysisSelector.cxx
Fix for savannah bug report 87728 (Laurent) + fix invalid read found with valgrind...
[u/mrichter/AliRoot.git] / ANALYSIS / AliAnalysisSelector.cxx
index 580c322940ad53bfd19aecd9f652f1f09b7d1142..a77bc4353ffc4ddca92b8d71aaeaec0d5d97997f 100644 (file)
 
 ClassImp(AliAnalysisSelector)
 
+//______________________________________________________________________________
+AliAnalysisSelector::AliAnalysisSelector()
+                    :TSelector(), 
+                     fInitialized(kFALSE), 
+                     fAnalysis(NULL)
+{
+// Dummy ctor.
+   fAnalysis = AliAnalysisManager::GetAnalysisManager();
+   if (fAnalysis) fAnalysis->SetSelector(this);
+}   
+
 //______________________________________________________________________________
 AliAnalysisSelector::AliAnalysisSelector(AliAnalysisManager *mgr)
                     :TSelector(),
@@ -39,6 +50,7 @@ AliAnalysisSelector::AliAnalysisSelector(AliAnalysisManager *mgr)
 {
 // Constructor. Called by AliAnalysisManager which registers itself on the
 // selector running on the master.
+   mgr->SetSelector(this);
 }
 
 //______________________________________________________________________________
@@ -60,7 +72,7 @@ void AliAnalysisSelector::Init(TTree *tree)
       SetStatus(-1);
       return;
    }
-   if (fAnalysis->GetDebugLevel()>0) {
+   if (fAnalysis->GetDebugLevel()>1) {
       cout << "->AliAnalysisSelector->Init()" << endl;
    }   
    if (!tree) {
@@ -76,7 +88,7 @@ void AliAnalysisSelector::Init(TTree *tree)
       SetStatus(-1);
       return;
    }   
-   if (fAnalysis->GetDebugLevel()>0) {
+   if (fAnalysis->GetDebugLevel()>1) {
       cout << "<-AliAnalysisSelector->Init()" << endl;
    }   
 }
@@ -86,7 +98,7 @@ void AliAnalysisSelector::Begin(TTree *)
 {
 // Assembly the input list.
    RestoreAnalysisManager();
-   if (fAnalysis && fAnalysis->GetDebugLevel()>0) {
+   if (fAnalysis && fAnalysis->GetDebugLevel()>1) {
       cout << "->AliAnalysisSelector->Begin: Analysis manager restored" << endl;
    }
 }
@@ -97,11 +109,11 @@ void AliAnalysisSelector::SlaveBegin(TTree *tree)
 // Called on each worker. We "unpack" analysis manager here and call InitAnalysis.
    RestoreAnalysisManager();
    if (fAnalysis) {
-      if (fAnalysis->GetDebugLevel()>0) {
+      if (fAnalysis->GetDebugLevel()>1) {
          cout << "->AliAnalysisSelector->SlaveBegin() after Restore" << endl;
       }   
       fAnalysis->SlaveBegin(tree);   
-      if (fAnalysis->GetDebugLevel()>0) {
+      if (fAnalysis->GetDebugLevel()>1) {
          cout << "<-AliAnalysisSelector->SlaveBegin()" << endl;
       }   
    }   
@@ -123,14 +135,30 @@ Bool_t AliAnalysisSelector::Notify()
 Bool_t AliAnalysisSelector::Process(Long64_t entry)
 {
 // Event loop.
-   if (fAnalysis->GetDebugLevel() > 0) {
+   static Int_t count = 0;
+   count++;
+   if (fAnalysis->GetDebugLevel() > 1) {
       cout << "->AliAnalysisSelector::Process()" << endl;
    }
-   Int_t nobjCount = TProcessID::GetObjectCount();
-   fAnalysis->GetEntry(entry);
-   fAnalysis->ExecAnalysis();
+   static Bool_t init=kTRUE;
+   static Int_t nobjCount = 0;
+   if(init) {
+     nobjCount = TProcessID::GetObjectCount();
+     init=kFALSE;
+   }
    TProcessID::SetObjectCount(nobjCount);
-   if (fAnalysis->GetDebugLevel() > 0) {
+   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();
+      if (returnCode<100000000) fAnalysis->CountEvent(1,1,0,0);
+   }   
+   if (fAnalysis->GetDebugLevel() > 1) {
       cout << "<-AliAnalysisSelector::Process()" << endl;
    }   
    return kTRUE;
@@ -147,7 +175,7 @@ void AliAnalysisSelector::RestoreAnalysisManager()
          if (obj->IsA() == AliAnalysisManager::Class()) {
             fAnalysis = (AliAnalysisManager*)obj;
             fAnalysis->SetSelector(this);
-            if (fAnalysis->GetDebugLevel()>0) {
+            if (fAnalysis->GetDebugLevel()>1) {
                cout << "->AliAnalysisSelector->RestoreAnalysisManager: Analysis manager restored" << endl;
             }   
             break;
@@ -168,11 +196,11 @@ void AliAnalysisSelector::SlaveTerminate()
   // on each slave server.
    if (fStatus == -1) return;  // TSelector won't abort...
    if (fAnalysis->GetAnalysisType() == AliAnalysisManager::kMixingAnalysis) return;
-   if (fAnalysis->GetDebugLevel() > 0) {
+   if (fAnalysis->GetDebugLevel() > 1) {
       cout << "->AliAnalysisSelector::SlaveTerminate()" << endl;
    }   
    fAnalysis->PackOutput(fOutput);
-   if (fAnalysis->GetDebugLevel() > 0) {
+   if (fAnalysis->GetDebugLevel() > 1) {
       cout << "<-AliAnalysisSelector::SlaveTerminate()" << endl;
    }   
 }  
@@ -190,12 +218,12 @@ void AliAnalysisSelector::Terminate()
    }   
    // No Terminate() in case of event mixing
    if (fAnalysis->GetAnalysisType() == AliAnalysisManager::kMixingAnalysis) return;
-   if (fAnalysis->GetDebugLevel() > 0) {
+   if (fAnalysis->GetDebugLevel() > 1) {
       cout << "->AliAnalysisSelector::Terminate()" << endl;
    }   
    fAnalysis->UnpackOutput(fOutput);
    fAnalysis->Terminate();   
-   if (fAnalysis->GetDebugLevel() > 0) {
+   if (fAnalysis->GetDebugLevel() > 1) {
       cout << "<-AliAnalysisSelector::Terminate()" << endl;
    }   
 }