X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=ANALYSIS%2FAliAnalysisTaskCfg.cxx;h=bba0499eab18aa07c8ff841306f99441cec913d2;hb=e17f27a2b694b8b46bd22e31836e4e128b1d0b17;hp=76100b17dd0c432bf440edb342f9bafd7acc485d;hpb=4579e0706465707343c08d868c41199a6c83ae19;p=u%2Fmrichter%2FAliRoot.git diff --git a/ANALYSIS/AliAnalysisTaskCfg.cxx b/ANALYSIS/AliAnalysisTaskCfg.cxx index 76100b17dd0..bba0499eab1 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 @@ -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(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; } //______________________________________________________________________________ @@ -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 (indmaxExec(); + 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); }