X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=ANALYSIS%2FAliAnalysisTaskCfg.cxx;h=48b598c19d6efb6615c687d4b01bba4fa4d1ea19;hb=59e8caf183fb658b0230e0b7cb2eb3eda6ddfe93;hp=d94df77ae79df9fe967f222d70c54eb7c7a9e762;hpb=3e40fd4cfe5b7746c76115ef3c3528fd525370f6;p=u%2Fmrichter%2FAliRoot.git diff --git a/ANALYSIS/AliAnalysisTaskCfg.cxx b/ANALYSIS/AliAnalysisTaskCfg.cxx index d94df77ae79..48b598c19d6 100644 --- a/ANALYSIS/AliAnalysisTaskCfg.cxx +++ b/ANALYSIS/AliAnalysisTaskCfg.cxx @@ -14,12 +14,16 @@ **************************************************************************/ #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 @@ -45,11 +49,13 @@ # 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 @@ -77,8 +83,11 @@ AliAnalysisTaskCfg::AliAnalysisTaskCfg() fLibs(), fDeps(), fDataTypes(), + fOutputFile(), + fTerminateFile(), fMacro(0), - fConfigDeps(0) + fConfigDeps(0), + fRAddTask(0) { // I/O constructor. } @@ -91,8 +100,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 +118,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 +148,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; } @@ -180,6 +198,7 @@ Long64_t AliAnalysisTaskCfg::ExecuteMacro(const char *newargs) // done. Checks if the requested libraries are loaded, else loads them. Executes // 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; @@ -189,10 +208,43 @@ 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; - Long64_t retval = fMacro->Exec(args); - if (retval >=0) SetBit(AliAnalysisTaskCfg::kLoaded, kTRUE); + 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(retval); + if (fConfigDeps && dynamic_cast(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; } @@ -201,7 +253,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; } @@ -211,7 +265,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",""); @@ -266,7 +320,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(" ",""); @@ -389,6 +443,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) { @@ -401,7 +457,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(); @@ -455,6 +512,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); @@ -492,6 +557,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 { @@ -505,8 +572,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); }