**************************************************************************/
#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
// 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)
//______________________________________________________________________________
fLibs(),
fDeps(),
fDataTypes(),
+ fOutputFile(),
+ fTerminateFile(),
fMacro(0),
- fConfigDeps(0)
+ fConfigDeps(0),
+ fRAddTask(0)
{
// I/O constructor.
}
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.
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);
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;
}
}
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;
// 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;
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) {
+ 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;
}
{
// 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;
}
// 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","");
for (Int_t i=0; i<nlibs; i++) {
library = GetLibrary(i);
library.Prepend("lib");
- Int_t loaded = strlen(gSystem->GetLibraries(library,"",kFALSE));
+ TString libext = library;
+ libext.Append(".");
+ Int_t loaded = strlen(gSystem->GetLibraries(libext,"",kFALSE));
if (!loaded) loaded = gSystem->Load(library);
if (loaded < 0) {
Error("CheckLoadLibraries", "Cannot load library %s", library.Data());
// 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(" ","");
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;
}
//______________________________________________________________________________
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;
}
//______________________________________________________________________________
if (full) {
if (fMacro) fMacro->Print();
else {
- TMacro macro(gSystem->ExpandPathName(fMacroName));
+ TMacro macro(gSystem->ExpandPathName(fMacroName.Data()));
macro.Print();
}
}
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) {
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();
// 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);
} 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")) {
} 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 {
}
// 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);
}