Patch for task#23160 + bug-fix from Ruben.
authorcvetan <cvetan@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 2 Nov 2011 15:48:32 +0000 (15:48 +0000)
committercvetan <cvetan@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 2 Nov 2011 15:48:32 +0000 (15:48 +0000)
RAW/AliRawReader.cxx
STEER/STEER/AliReconstruction.cxx
STEER/STEER/AliReconstruction.h

index 1cdf94c..8caccf8 100644 (file)
@@ -41,6 +41,7 @@
 #include <TROOT.h>
 #include <TInterpreter.h>
 #include <TSystem.h>
+#include <TPRegexp.h>
 
 #include <Riostream.h>
 #include "AliRawReader.h"
@@ -420,7 +421,10 @@ void AliRawReader::LoadTriggerClass(const char* name, Int_t index)
 
   if (fSelectTriggerExpr.IsNull()) return;
 
-  fSelectTriggerExpr.ReplaceAll(name,Form("[%d]",index));
+  if (index >= 0)
+    fSelectTriggerExpr.ReplaceAll(name,Form("[%d]",index));
+  else
+    fSelectTriggerExpr.ReplaceAll(name,"0");
 }
 
 Bool_t AliRawReader::IsSelected() const
@@ -475,7 +479,7 @@ Bool_t AliRawReader::IsEventSelected() const
       }
     }
     // Possibility to introduce downscaling
-    expr.ReplaceAll("%",Form("&& !%d %%",GetEventIndex()));
+    TPRegexp("(%\\s*\\d+)").Substitute(expr,Form("&& !(%d$1)",GetEventIndex()),"g");
     Int_t error;
     if ((gROOT->ProcessLineFast(expr.Data(),&error) == 0) &&
        (error == TInterpreter::kNoError)) {
index b10a138..48b4ea0 100644 (file)
@@ -313,7 +313,8 @@ AliReconstruction::AliReconstruction(const char* gAliceFilename) :
   fUpgradeModule(""),
   fAnalysisMacro(),
   fAnalysis(0),
-  fRecoHandler(0) 
+  fRecoHandler(0),
+  fDeclTriggerClasses("")
 {
 // create reconstruction object with default parameters
   gGeoManager = NULL;
@@ -433,7 +434,8 @@ AliReconstruction::AliReconstruction(const AliReconstruction& rec) :
   fUpgradeModule(""),
   fAnalysisMacro(rec.fAnalysisMacro),
   fAnalysis(0),
-  fRecoHandler(0)
+  fRecoHandler(0),
+  fDeclTriggerClasses(rec.fDeclTriggerClasses)
 {
 // copy constructor
 
@@ -602,6 +604,7 @@ AliReconstruction& AliReconstruction::operator = (const AliReconstruction& rec)
   fAnalysisMacro = rec.fAnalysisMacro;
   fAnalysis = 0;
   fRecoHandler = 0;
+  fDeclTriggerClasses = rec.fDeclTriggerClasses;
 
   return *this;
 }
@@ -3931,6 +3934,16 @@ Bool_t AliReconstruction::GetEventInfo()
     }
   }
   fEventInfo.SetTriggerClasses(trclasses);
+  // Now put the declared trigger classes (not present in the run)
+  // to 0/false in the event selection
+  if (!fDeclTriggerClasses.IsNull()) {
+    TObjArray *tokens = fDeclTriggerClasses.Tokenize(" ");
+    Int_t ntokens = tokens->GetEntriesFast();
+    for (Int_t itoken = 0; itoken < ntokens; ++itoken) {
+      if (fRawReader) fRawReader->LoadTriggerClass((((TObjString*)tokens->At(itoken))->String()).Data(),-1);
+    }
+    delete tokens;
+  }
 
   // Write names of active trigger inputs in ESD Header
   const TObjArray& inputsArray = config->GetInputs(); 
index 03f7e86..bc37864 100644 (file)
@@ -185,6 +185,10 @@ public:
   void        SetAnalysisManager(AliAnalysisManager *mgr) {fAnalysis = mgr;}
   AliAnalysisManager *GetAnalysisManager() const {return fAnalysis;}
 
+  // A method to declare defined trigger classes even if they are not
+  // present in the run, needed for proper event selection based on trigger
+  void        DeclareTriggerClasses(const char *trClasses) {fDeclTriggerClasses = trClasses;}
+
 protected:
   virtual Bool_t ProcessEvent(void* event);
   void           InitRun(const char* input);
@@ -366,7 +370,8 @@ private:
   TString              fAnalysisMacro; // Full path to a macro creating an analysis manager train
   AliAnalysisManager  *fAnalysis;      //! Analysis manager
   AliRecoInputHandler *fRecoHandler;   //! Input handler adapted for reconstruction
-  ClassDef(AliReconstruction, 41)      // class for running the reconstruction
+  TString              fDeclTriggerClasses; // Declared defined trigger classes
+  ClassDef(AliReconstruction, 42)      // class for running the reconstruction
 };
 
 #endif