]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ANALYSIS/AliAnalysisTaskCfg.cxx
add pyquen quenching strength
[u/mrichter/AliRoot.git] / ANALYSIS / AliAnalysisTaskCfg.cxx
index 76100b17dd0c432bf440edb342f9bafd7acc485d..bba0499eab18aa07c8ff841306f99441cec913d2 100644 (file)
  **************************************************************************/
 
 #include "AliAnalysisTaskCfg.h"
+#include "AliAnalysisManager.h"
 
 #include "Riostream.h"
 #include "TError.h"
 #include "TMacro.h"
+#include "TInterpreter.h"
 #include "TSystem.h"
 #include "TObjArray.h"
+#include "TObjString.h"
+#include "TList.h"
 
 // Author: Andrei Gheata, 12/08/2011
 
 # Lines that do not start with #Module are ignored, except those in embedded
   macro blocks
 #Module.Begin        QAsym
-#Module.Libs         PWG1
+#Module.Libs         PWGPP
 #Module.Deps         PhysicsSelection
 #Module.DataTypes    ESD, AOD, MC
-#Module.MacroName    $ALICE_ROOT/PWG1/PilotTrain/AddTaskQAsym.C
+#Module.MacroName    $ALICE_ROOT/PWGPP/PilotTrain/AddTaskQAsym.C
 #Module.MacroArgs    0, AliVEvent::kAnyINT, AliVEvent::kHighMult, AliVEvent::kEMC7, AliVEvent::kMUU7
+#Module.OutputFile   
+#Module.TerminateFile
 #Module.StartConfig  
 __R_ADDTASK__->SelectCollisionCandidates();
 #Module.EndConfig
@@ -67,6 +73,11 @@ __R_ADDTASK__->SelectCollisionCandidates();
 // the right order in the grid handler to generate train macros.
 
 
+using std::cout;
+using std::endl;
+using std::ios;
+using std::ofstream;
+using std::ifstream;
 ClassImp(AliAnalysisTaskCfg)
 
 //______________________________________________________________________________
@@ -77,8 +88,11 @@ AliAnalysisTaskCfg::AliAnalysisTaskCfg()
                     fLibs(),
                     fDeps(),
                     fDataTypes(),
+                    fOutputFile(),
+                    fTerminateFile(),
                     fMacro(0),
-                    fConfigDeps(0)
+                    fConfigDeps(0),
+                    fRAddTask(0)
 {
 // I/O constructor.
 }
@@ -91,8 +105,11 @@ AliAnalysisTaskCfg::AliAnalysisTaskCfg(const char *name)
                     fLibs(),
                     fDeps(),
                     fDataTypes(),
+                    fOutputFile(),
+                    fTerminateFile(),
                     fMacro(0),
-                    fConfigDeps(0)
+                    fConfigDeps(0),
+                    fRAddTask(0)
 {
 // Constructor. All configuration objects need to be named since they are looked
 // for by name.
@@ -106,8 +123,11 @@ AliAnalysisTaskCfg::AliAnalysisTaskCfg(const AliAnalysisTaskCfg &other)
                     fLibs(other.fLibs),
                     fDeps(other.fDeps),
                     fDataTypes(other.fDataTypes),
+                    fOutputFile(other.fOutputFile),
+                    fTerminateFile(other.fTerminateFile),
                     fMacro(0),
-                    fConfigDeps(0)
+                    fConfigDeps(0),
+                    fRAddTask(0)
 {
 // Copy constructor.
    if (other.fMacro) fMacro = new TMacro(*other.fMacro);
@@ -133,8 +153,11 @@ AliAnalysisTaskCfg& AliAnalysisTaskCfg::operator=(const AliAnalysisTaskCfg &othe
    fLibs      = other.fLibs;
    fDeps      = other.fDeps;
    fDataTypes = other.fDataTypes;
+   fOutputFile = other.fOutputFile;
+   fTerminateFile = other.fTerminateFile;
    if (other.fMacro) fMacro = new TMacro(*other.fMacro);
    if (other.fConfigDeps) fConfigDeps = new TMacro(*other.fConfigDeps);
+   fRAddTask  = other.fRAddTask;
    return *this;
 }
    
@@ -150,7 +173,7 @@ TMacro *AliAnalysisTaskCfg::OpenMacro(const char *name)
    }   
    TString expname;
    if (strlen(name)) expname = gSystem->ExpandPathName(name);
-   else              expname = gSystem->ExpandPathName(fMacroName);
+   else              expname = gSystem->ExpandPathName(fMacroName.Data());
    if (expname.IsNull()) {
       Error("OpenMacro", "Macro name not provided and not previously set");
       return 0;
@@ -178,7 +201,9 @@ Long64_t AliAnalysisTaskCfg::ExecuteMacro(const char *newargs)
 {
 // Execute AddTask macro. Opens first the macro pointed by fMacroName if not yet
 // done. Checks if the requested libraries are loaded, else loads them. Executes 
-// with stored fMacroArgs unless new arguments are provided.
+// with stored fMacroArgs unless new arguments are provided. The flag IsLoaded
+// is set once the macro was successfully executed.
+   if (IsLoaded()) return kTRUE;
    if (!fMacro && !OpenMacro()) {
       Error("ExecuteMacro", "Cannot execute this macro");
       return -1;
@@ -188,9 +213,44 @@ Long64_t AliAnalysisTaskCfg::ExecuteMacro(const char *newargs)
       return -1;
    }
    
+   AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
+   if (!mgr) {
+      Error("ExecuteMacro", "Analysis manager not defined yet");
+      return -1;
+   }
+   Int_t ntasks0 = mgr->GetTasks()->GetEntriesFast();
    TString args = newargs;
    if (args.IsNull()) args = fMacroArgs;
-   return fMacro->Exec(args);
+   Int_t error = 0;
+   Long64_t retval = fMacro->Exec(args, &error);
+   if (error != TInterpreter::kNoError)
+   {
+      Error("ExecuteMacro", "Macro interpretation failed");
+      return -1;
+   }
+   Int_t ntasks = mgr->GetTasks()->GetEntriesFast();
+   if (ntasks<=ntasks0)
+   {
+      Error("ExecuteMacro", "The macro did not add any tasks to the manager");
+      return -1;
+   }
+   Long64_t ptrTask = (Long64_t)mgr->GetTasks()->At(ntasks0);
+   if (retval >= ptrTask) {
+      TObject::SetBit(AliAnalysisTaskCfg::kLoaded, kTRUE);
+      fRAddTask = reinterpret_cast<TObject*>(retval);
+      if (fConfigDeps && dynamic_cast<TObject*>(fRAddTask)) {
+         TString classname = fRAddTask->ClassName();
+         classname += Form("* __R_ADDTASK__ = (%s*)0x%lx;", classname.Data(),(ULong_t)retval);
+         classname.Prepend("  ");
+         TObjString *line = fConfigDeps->GetLineWith("__R_ADDTASK__");
+         if (line) {
+            TList *lines = fConfigDeps->GetListOfLines();
+            lines->AddBefore(line, new TObjString(classname));
+         }
+      }   
+   }
+   Info("ExecuteMacro", "Macro %s added %d tasks to the manager", fMacro->GetName(), ntasks-ntasks0);
+   return retval;
 }
 
 //______________________________________________________________________________
@@ -198,7 +258,9 @@ Int_t AliAnalysisTaskCfg::GetNlibs() const
 {
 // Returns number of requested libraries.
    if (fLibs.IsNull()) return 0;
-   Int_t nlibs = fLibs.CountChar(',')+1;
+   TObjArray *list  = fLibs.Tokenize(",");
+   Int_t nlibs = list->GetEntriesFast();
+   delete list;
    return nlibs;
 }
 
@@ -208,7 +270,7 @@ const char *AliAnalysisTaskCfg::GetLibrary(Int_t i) const
 // Returns library name for the i-th library.
    Int_t nlibs = GetNlibs();
    if (i>=nlibs) return 0;
-   TString libname;
+   static TString libname;
    TObjArray *list  = fLibs.Tokenize(",");
    libname = list->At(i)->GetName();
    libname.ReplaceAll(".so","");
@@ -263,7 +325,7 @@ const char *AliAnalysisTaskCfg::GetDependency(Int_t i) const
 // Returns library name for the i-th library.
    Int_t ndeps = GetNdeps();
    if (i>=ndeps) return 0;
-   TString depname;
+   static TString depname;
    TObjArray *list  = fDeps.Tokenize(",");
    depname = list->At(i)->GetName();
    depname.ReplaceAll(" ","");
@@ -275,7 +337,19 @@ const char *AliAnalysisTaskCfg::GetDependency(Int_t i) const
 Bool_t AliAnalysisTaskCfg::NeedsDependency(const char *dep) const
 {
 // Check if a given library is needed by the module.
-   return fDeps.Contains(dep);
+   Int_t indmin = 0;
+   Int_t indmax = 0;
+   Int_t len = fDeps.Length();
+   TString crt;
+   while (indmax<len) {
+      indmax = fDeps.Index(",",indmin);
+      if (indmax < 0) indmax = len;
+      // indmin points to the beginning of the string while indmax to the end+1
+      crt = fDeps(indmin, indmax-indmin);
+      if (crt==dep) return kTRUE;
+      indmin = indmax+1;
+   }
+   return kFALSE;
 }
 
 //______________________________________________________________________________
@@ -321,7 +395,14 @@ Long64_t AliAnalysisTaskCfg::ExecuteConfigMacro()
       Error("ExecuteConfigMacro", "Cannot load requested libraries: %s", fLibs.Data());
       return -1;
    }
-   return fConfigDeps->Exec();
+   Int_t error = 0;
+   Long64_t retval = fConfigDeps->Exec("", &error);
+   if (error != TInterpreter::kNoError)
+   {
+      Error("ExecuteMacro", "Macro interpretation failed");
+      return -1;
+   }
+   return retval;
 }
 
 //______________________________________________________________________________
@@ -361,7 +442,7 @@ void AliAnalysisTaskCfg::Print(Option_t * option) const
    if (full) {
       if (fMacro) fMacro->Print();
       else {
-         TMacro macro(gSystem->ExpandPathName(fMacroName));
+         TMacro macro(gSystem->ExpandPathName(fMacroName.Data()));
          macro.Print();
       }   
    }   
@@ -386,6 +467,8 @@ void AliAnalysisTaskCfg::SaveAs(const char *filename, Option_t *option) const
    out << "#Module.Libs " << fLibs << endl;
    out << "#Module.Deps " << fDeps << endl;
    out << "#Module.DataTypes " << fDataTypes << endl;
+   out << "#Module.OutputFile " << fOutputFile << endl;
+   out << "#Module.TerminateFile " << fTerminateFile << endl;
    out << "#Module.MacroName " << fMacroName << endl;
    out << "#Module.MacroArgs " << fMacroArgs << endl;
    if (fConfigDeps) {
@@ -398,7 +481,8 @@ void AliAnalysisTaskCfg::SaveAs(const char *filename, Option_t *option) const
 const char *AliAnalysisTaskCfg::DecodeValue(TString &line)
 {
 // Decode the value string from the line
-   TString value = line(line.Index(' '),line.Length());
+   static TString value;
+   value = line(line.Index(' '),line.Length());
    value = value.Strip(TString::kLeading,' ');
    value = value.Strip(TString::kTrailing,' ');
    return value.Data();
@@ -452,6 +536,14 @@ TObjArray *AliAnalysisTaskCfg::ExtractModulesFrom(const char *filename)
          // Data types
          decode = AliAnalysisTaskCfg::DecodeValue(line);
          cfg->SetDataTypes(decode);
+      } else if (cfg && line.BeginsWith("#Module.OutputFile")) {
+         // Desired output file name (via SetCommonOutput)
+         decode = AliAnalysisTaskCfg::DecodeValue(line);
+         cfg->SetOutputFileName(decode);
+      } else if (cfg && line.BeginsWith("#Module.TerminateFile")) {
+         // Custom file name produced in Terminate if any
+         decode = AliAnalysisTaskCfg::DecodeValue(line);
+         cfg->SetTerminateFileName(decode);
       } else if (cfg && line.BeginsWith("#Module.MacroName")) {
          // Name of the add task macro (including path)
          decode = AliAnalysisTaskCfg::DecodeValue(line);
@@ -470,12 +562,13 @@ TObjArray *AliAnalysisTaskCfg::ExtractModulesFrom(const char *filename)
       } else if (cfg && line.BeginsWith("#Module.StartConfig")) {
          // Marker for start of the configuration macro
          addConfig = new TMacro();
-         TString shortName = gSystem->BaseName(cfg->GetMacroName());
-         shortName = shortName(0,shortName.Index("."));
-         shortName += "Config";
+//         TString shortName = gSystem->BaseName(cfg->GetMacroName());
+//         shortName = shortName(0,shortName.Index("."));
+         TString shortName = cfg->GetName();
+         shortName += "_Config";
          addConfig->SetName(shortName);
-         shortName.Prepend("/");
-         shortName.Prepend(gSystem->DirName(cfg->GetMacroName()));
+//         shortName.Prepend("/");
+//         shortName.Prepend(gSystem->DirName(cfg->GetMacroName()));
          shortName += ".C";
          addConfig->SetTitle(shortName);
       } else if (cfg && line.BeginsWith("#Module.EndMacro")) {
@@ -489,6 +582,8 @@ TObjArray *AliAnalysisTaskCfg::ExtractModulesFrom(const char *filename)
       } else if (cfg && line.BeginsWith("#Module.EndConfig")) {
          // Marker for the end of the config macro. EndConfig block is mandatory
          if (cfg && addConfig) {
+            addConfig->GetListOfLines()->AddFirst(new TObjString(Form("%s() {",gSystem->BaseName(addConfig->GetName()))));
+            addConfig->GetListOfLines()->AddLast(new TObjString("}"));
             cfg->SetConfigMacro(addConfig);
             addConfig = 0;
          } else {
@@ -502,8 +597,8 @@ TObjArray *AliAnalysisTaskCfg::ExtractModulesFrom(const char *filename)
    }
    // Add last found object to the list
    if (cfg) {
-      if (addMacro) cfg->SetMacro(addMacro);
-      if (addConfig) cfg->SetConfigMacro(addConfig);
+      if (addMacro) ::Error("ExtractModulesFrom", "#Module.EndMacro block not found");         
+      if (addConfig) ::Error("ExtractModulesFrom", "#Module.EndConfig block not found");
       if (!array) array = new TObjArray();
       array->Add(cfg);
    }