changing mc generator handler in such a way that the generator is created in Init...
authorjgrosseo <jgrosseo@cern.ch>
Mon, 1 Dec 2014 16:43:09 +0000 (17:43 +0100)
committerjgrosseo <jgrosseo@cern.ch>
Mon, 1 Dec 2014 16:43:09 +0000 (17:43 +0100)
ANALYSIS/macros/train/AddMCGeneratorHandler.C
STEER/STEER/AliMCGenHandler.cxx
STEER/STEER/AliMCGenHandler.h

index 9e1a889..cc7efea 100644 (file)
@@ -7,30 +7,14 @@ AliInputEventHandler* AddMCGeneratorHandler()
   mgr->SetInputEventHandler(new AliDummyHandler());
   AliMCGenHandler* mcInputHandler = new AliMCGenHandler();
 
-  TString macroPath;
-  macroPath.Form("$ALICE_ROOT/%s", gSystem->Getenv("GEN_MACRO_PATH"));
-  macroPath = gSystem->ExpandPathName(macroPath.Data());
-
-  TString macroParameters(gSystem->Getenv("GEN_PARAMETERS"));
-
-  TString newlibs;
-  Long64_t retval = AliAnalysisAlien::RunMacroAndExtractLibs(macroPath, macroParameters, newlibs);
-  if (retval<0) {
-    ::Error(Form("The macro %s did not return a valid generator", macroPath.Data()));
-    return;
-  }
-  AliGenerator *gener = reinterpret_cast<AliGenerator*>(retval);
-
-  // customization from LEGO train
-  gROOT->LoadMacro("generator_customization.C");
-  generator_customization(gener);
-
-  mcInputHandler->SetGenerator(gener);
+  mcInputHandler->SetGeneratorMacroPath(gSystem->Getenv("GEN_MACRO_PATH"));
+  mcInputHandler->SetGeneratorMacroParameters(gSystem->Getenv("GEN_PARAMETERS"));
+  
+  TMacro* macro = new TMacro("generator_customization.C");
+  mcInputHandler->SetGeneratorCustomizatoin(macro);
+  
   mcInputHandler->SetSeedMode(3);
 
-  newlibs += " ";
-  newlibs += gSystem->Getenv("GEN_LIBRARIES");
-  plugin->SetGeneratorLibs(newlibs);
   mgr->SetMCtruthEventHandler(mcInputHandler);
   
   return mcInputHandler;
index c645abe..fcab1b5 100644 (file)
@@ -34,6 +34,9 @@
 #include "AliRun.h"
 #include "AliAnalysisManager.h"
 
+#include "TMacro.h"
+#include "TInterpreter.h"
+
 ClassImp(AliMCGenHandler)
 
 AliMCGenHandler::AliMCGenHandler() :
@@ -44,7 +47,10 @@ AliMCGenHandler::AliMCGenHandler() :
     fHeader(0),
     fGenerator(0),
     fSeedMode(0),
-    fSeed(0)
+    fSeed(0),
+    fGeneratorMacroPath(),
+    fGeneratorMacroParameters(),
+    fGeneratorCustomization(0)
 {
   //
   // Default constructor
@@ -61,7 +67,10 @@ AliMCGenHandler::AliMCGenHandler(const char* name, const char* title) :
     fHeader(0),
     fGenerator(0),
     fSeedMode(0),
-    fSeed(0)
+    fSeed(0),
+    fGeneratorMacroPath(),
+    fGeneratorMacroParameters(),
+    fGeneratorCustomization(0)
 {
   //
   // Constructor
@@ -82,8 +91,37 @@ Bool_t AliMCGenHandler::Init(Option_t* /*opt*/)
   // Initialize input
     //
     
-    if (!fGenerator)
-      AliFatal("fGenerator needs to be set before");
+    if (!fGenerator) {
+      if (fGeneratorMacroPath.Length() == 0)
+       AliFatal("fGeneratorMacroPath empty!");
+      
+      TString macroPath;
+      macroPath.Form("$ALICE_ROOT/%s", fGeneratorMacroPath.Data());
+      macroPath = gSystem->ExpandPathName(macroPath.Data());
+
+      if (gSystem->AccessPathName(macroPath))
+         AliFatal(Form("Cannot find macro %s", macroPath.Data()));
+
+      TMacro m(macroPath);
+      Int_t error = 0;
+      Long64_t retval = m.Exec(fGeneratorMacroParameters, &error);
+      if (error != TInterpreter::kNoError)
+         AliFatal(Form("Macro interpretation %s failed", macroPath.Data()));
+
+      if (retval<0)
+       AliFatal(Form("The macro %s did not return a valid generator (1)", macroPath.Data()));
+
+      fGenerator = reinterpret_cast<AliGenerator*>(retval);
+      if (!fGenerator)
+       AliFatal(Form("The macro %s did not return a valid generator (2)", macroPath.Data()));
+
+      // customization from LEGO train
+      if (fGeneratorCustomization) {
+       fGeneratorCustomization->Exec(Form("(AliGenerator*) %p", fGenerator), &error);
+       if (error != TInterpreter::kNoError)
+         AliFatal("Execution of generator customization failed");
+      }
+    }
     
     if (fSeedMode == 0)
       Printf("AliMCGenHandler::Init: Not setting any seed. Seed needs to be set externally!");
index 274bbc5..199890a 100644 (file)
@@ -23,6 +23,7 @@ class AliGenerator;
 class AliRunLoader;
 class AliStack;
 class AliHeader;
+class TMacro;
 
 class AliMCGenHandler : public AliInputEventHandler
 {
@@ -40,9 +41,14 @@ public:
     AliMCEvent* MCEvent() const {return fMCEvent;}
     
     void                SetGenerator(AliGenerator* generator) { fGenerator = generator; }
+    
     void                SetSeedMode(Int_t mode) { fSeedMode = mode; }
     void                SetSeed(UInt_t seed) { fSeed = seed; }
     UInt_t              GetSeed() { return fSeed; }
+    
+    void                SetGeneratorMacroPath(const char* macroPath) { fGeneratorMacroPath = macroPath; }
+    void                SetGeneratorMacroParameters(const char* params) { fGeneratorMacroParameters = params; }
+    void                SetGeneratorCustomization(TMacro* macro) { fGeneratorCustomization = macro; }
 
 private:
     AliMCGenHandler(const AliMCGenHandler& handler);             
@@ -56,7 +62,11 @@ private:
     AliGenerator         *fGenerator;          // generator
     Int_t                 fSeedMode;           // which seed is to be used: 0 (default): nothing/set externally; 1: use fSeed; 2: current time; 3: AliEn job id
     UInt_t                fSeed;               // can be used to set seed manually (fSeedMode == 1); contains last used seed (fSeedMode == 2 || 3)
+    
+    TString               fGeneratorMacroPath; // path to macro creating the generator object
+    TString               fGeneratorMacroParameters; // parameters passed to the creating macro
+    TMacro               *fGeneratorCustomization; // customization macro for generator object
 
-    ClassDef(AliMCGenHandler,1)  // MC Gen Handler
+    ClassDef(AliMCGenHandler, 2)  // MC Gen Handler
 };
 #endif