24 # include <TApplication.h>
25 # include <TStopwatch.h>
26 # include <AliAnalysisManager.h>
27 # include <AliVEvent.h>
28 # include <AliVEventHandler.h>
29 # include <AliPhysicsSelection.h>
30 # include <AliPhysicsSelectionTask.h>
31 # include <AliCentralitySelectionTask.h>
32 # include <AliESDInputHandler.h>
33 # include <AliESDInputHandlerRP.h>
34 # include <AliAODInputHandler.h>
35 # include <AliAODHandler.h>
36 # include <AliMCEventHandler.h>
45 class AliVEventHandler;
47 class AliInputEventHandler;
81 fOptions.
Add(
"date",
"YYYY-MM-DD HH:MM",
"Set date",
"now");
82 fOptions.
Add(
"ps",
"MODE",
"Physics selection mode",
"");
83 fOptions.
Add(
"verbose",
"LEVEL",
"Set verbosity level", 0);
84 fOptions.
Add(
"url",
"URL",
"Job location & input URL",
"");
86 fOptions.
Add(
"events",
"N",
"Number of events to analyse",-1);
87 fOptions.
Add(
"type",
"ESD|AOD|USER",
"Input data stype",
"");
89 fOptions.
Add(
"branches",
"Load only requested branches",
false);
90 fOptions.
Add(
"version",
"Print version and exit",
false);
91 fOptions.
Add(
"tender",
"WHICH",
"Specify tender supplies",
"");
92 fOptions.
Add(
"ocdb",
"(TENDER_SNAPSHOT)",
"Enable OCDB",
"");
93 fOptions.
Add(
"friends",
"(AOD_FRIENDS)",
"Enable friends (list of files)",
"");
94 fOptions.
Add(
"cent-oadb",
"PERIOD",
"Alternative OADB for centrality",
"");
95 fOptions.
Add(
"no-link",
"Do not make symlink to output",
false);
96 fOptions.
Add(
"old-cent",
"Add old centrality task to train",
false);
121 if (&o ==
this)
return *
this;
148 Info(
"Init",
"Running with TrainSetup version %d",
kVersion);
156 Error(
"Init",
"Failed to make the worker for URL %s", url.Data());
165 if (it.EqualTo(
"ESD",TString::kIgnoreCase)) type =
Railway::kESD;
166 else if (it.EqualTo(
"AOD",TString::kIgnoreCase)) type =
Railway::kAOD;
167 else if (it.EqualTo(
"user",TString::kIgnoreCase))
198 if (verbose > 0) mgr->SetDebugLevel(verbose);
199 mgr->SetAutoBranchLoading(!
fOptions.
Has(
"branches"));
201 mgr->SetUseProgressBar(kTRUE, 100);
205 if (inputHandler) mgr->SetInputEventHandler(inputHandler);
209 if (mcHandler) mgr->SetMCtruthEventHandler(mcHandler);
213 if (outputHandler) mgr->SetOutputEventHandler(outputHandler);
216 gROOT->SetMacroPath(Form(
"%s:%s:$ALICE_ROOT/ANALYSIS/macros:"
217 "$ALICE_PHYSICS/OADB/macros",
218 cwd.Data(), gROOT->GetMacroPath()));
223 if (!supplies.IsNull()) {
248 TIter next(mgr->GetTasks());
250 while ((sub = static_cast<AliAnalysisTask*>(next()))) {
253 se->SetDebugLevel(verbose);
261 if (!mgr->InitAnalysis()) {
262 gSystem->ChangeDirectory(cwd.Data());
263 Error(
"Init",
"Failed to initialise train");
269 mgr->SetUseProgressBar(
true, 100);
277 TIter next(mgr->GetTasks());
279 while ((sub = static_cast<AliAnalysisTask*>(next()))) {
298 Info(where,
"took %4d:%02d:%06.3f", h, m, t);
312 if (!
Init())
throw TString(
"Failed to intialize the train");
319 throw TString(
"Only did setup, no running");
330 gSystem->ChangeDirectory(cwd.Data());
333 if (ret < 0)
throw TString(
"Analysis failed");
338 if (status) Warning(
"Run",
"%s", e.Data());
339 else Error(
"Run",
"%s", e.Data());
346 gSystem->Exec(Form(
"rm -f last_%s", escaped.Data()));
347 gSystem->Exec(Form(
"ln -sf %s last_%s",
383 o <<
"TrainSetup version " <<
kVersion << std::endl;
399 o <<
"Usage: RunTrain(NAME, CLASS, OPTIONS)";
401 o <<
"\n\nTrain Options:\n";
417 o <<
"Possible URL forms:\n\n";
450 throw TString(
"No class name specified");
452 throw TString(
"No train name specified");
454 mkLib.ReplaceAll(
"-std=c++14",
"-std=c++98");
456 gSystem->SetMakeSharedLib(mkLib);
458 gROOT->ProcessLine(
"gSystem->RedirectOutput(\"build.log\",\"w\");");
460 Int_t r1 = gROOT->LoadMacro(Form(
"%s.C+g", cls.Data()), &error);
461 gROOT->ProcessLine(
"gSystem->RedirectOutput(0);");
463 throw TString::Format(
"Failed to load setup %s: %d - see build.log",
467 TString create = TString::Format(
"new %s(\"%s\")",
468 cls.Data(), name.Data());
469 gROOT->ProcessLine(
"gSystem->RedirectOutput(\"build.log\",\"a\");");
470 Long_t retP = gROOT->ProcessLine(create, &error);
471 gROOT->ProcessLine(
"gSystem->RedirectOutput(0);");
473 throw TString::Format(
"Failed to make object of class %s "
474 "(see build.log): 0x%08lx/%d\n\t%s",
475 cls.Data(), retP, error, create.Data());
480 if (!train->Options().Parse(opts))
481 throw TString(
"Failed to parse options");
486 if (!train->Help(std::cout, asProg)) {
491 if (!train->Version(std::cout)) {
500 if (!e.IsNull()) Error(
"Main",
"%s", e.Data());
504 if (gApplication && asProg) {
507 gApplication->Terminate(ret ? 0 : 1);
539 Bool_t esdRecPoints=
false)
541 Info(
"CreateInputHandler",
"Making handler for %d (%d)",
543 AliVEventHandler* ret = 0;
546 AliESDInputHandler* input = 0;
547 if (!esdRecPoints) input =
new AliESDInputHandler();
549 Info(
"CreateInputHandler",
"Special handler for rec-points");
550 AliESDInputHandlerRP* esd =
new AliESDInputHandlerRP();
559 AliAODInputHandler* input =
new AliAODInputHandler();
564 while ((ofr = nfr())) input->AddFriend(const_cast<char*>(ofr->GetName()));
584 AliMCEventHandler* mcHandler =
new AliMCEventHandler();
585 mcHandler->SetReadTR(
true);
597 AliAODHandler* ret =
new AliAODHandler();
600 ret->SetOutputFileName(
"AliAOD.root");
603 ret->SetOutputFileName(
"AliAOD.pass2.root");
697 if (opt.EqualTo(
"NONE",TString::kIgnoreCase))
return;
702 AliPhysicsSelection* ps = 0;
703 AliInputEventHandler* input =
704 dynamic_cast<AliInputEventHandler*
> (mgr->GetInputEventHandler());
708 if (opt.Contains(
"BARE",TString::kIgnoreCase)) {
710 ps =
new AliPhysicsSelection();
711 if (mc) ps->SetAnalyzeMC();
713 input->SetEventSelection(ps);
717 CoupleSECar(
"AddTaskPhysicsSelection.C", Form(
"%d", mc), AliVEvent::kAny);
718 mgr->RegisterExtraFile(
"event_stat.root");
722 ps =
dynamic_cast<AliPhysicsSelection*
>(input->GetEventSelection());
724 if (opt.Contains(
"CUSTOM",TString::kIgnoreCase)) {
727 Int_t eq = opt.Index(
"custom=",7,0,TString::kIgnoreCase);
729 Int_t end = opt.Index(
".C",2,eq+7,TString::kIgnoreCase);
731 macro = opt(eq+7,end+2-eq-7);
736 if (rmacro.IsNull()) {
737 Error(
"CreatePhysicsSelection",
"Custom PS script %s not found",
741 Info(
"CreatePhysicsSelection",
"Loading custom PS from %s",rmacro.Data());
743 gROOT->Macro(Form(
"%s((AliPhysicsSelection*)%p)", base.Data(), ps));
746 if (opt.Contains(
"ALL",TString::kIgnoreCase)) {
749 Info(
"CreatePhysicsSelection",
"Skipping trigger selection");
750 ps->SetSkipTriggerClassSelection(
true);
761 AliVEventHandler* inp = mgr->GetInputEventHandler();
767 gROOT->SetMacroPath(Form(
"$ALICE_PHYSICS/OADB/COMMON/MULTIPLICITY/macros"
768 ":%s", gROOT->GetMacroPath()));
770 FromOption(task,
"AlternateOADBforEstimators",
"cent-oadb",
"");
773 if (centOADB.EndsWith(
".root")) {
776 per.ReplaceAll(
"OADB-",
"");
777 per.ReplaceAll(
".root",
"");
778 SetOnTask(task,
"AlternateOADBforEstimators", per);
781 SetOnTask(task,
"AlternateOADBFullManualBypassMC", base);
783 SetOnTask(task,
"AlternateOADBFullManualBypas", base);
786 if (!task->HasBranches()) {
789 task->SetBranches(
"ESD:AliESDRun.,AliESDHeader.,AliESDZDC.,"
790 "AliESDVZERO.,AliESDTZERO.,TPCVertex.,"
791 "SPDVertex.,PrimaryVertex.,AliMultiplicity."
792 "SPDPileupVertices,TrkPileupVertices,"
794 "AOD:header,vertices,AliAODTZERO,AliAODVZERO,"
795 "AliAODZDC,AliAODAD");
801 Bool_t isAOD = inp->IsA()->InheritsFrom(AliAODInputHandler::Class());
805 Form(
"true,%s", isAOD ?
"true" :
"false"));
806 AliCentralitySelectionTask* ctask =
807 dynamic_cast<AliCentralitySelectionTask*
>(task);
809 if (mc) ctask->SetMCInput();
836 Error(
"CoupleCar",
"Macro %s not found", macro.Data());
841 cmd.Append(TString::Format(
"(%s)", args.Data()));
842 Info(
"CoupleCar",
"Execute %s", cmd.Data());
844 Long_t ret = gROOT->Macro(cmd.Data(), &err,
false);
846 Error(
"CoupleCar",
"Failed to execute %s (%ld)", cmd.Data(), ret);
880 if (mask > 0) task->SelectCollisionCandidates(mask);
907 Bool_t verbose=
true)
const
911 ::Warning(
"FindCar",
"No manager defined");
915 if (!task && verbose)
916 ::Warning(
"FindCar",
"Task \"%s\" not found in train",
940 Long_t ret = gROOT->ProcessLine(
"new AliTaskCDBconnect(\"cdb\")");
942 Fatal(
"AddOCDBConnect",
"Failed to add OCDB connection task");
946 if (!task->HasBranches()) task->SetBranches(
"ESD:AliESDRun. AOD:header");
950 mgr->ConnectInput(task, 0, mgr->GetCommonInputContainer());
981 if (flag == 0)
return 0;
986 case kTenderV0: n =
"VZERO"; c =
"VZERO";
break;
988 case kTenderPtFix: n =
"TrackFix"; c =
"PtInvFix";
break;
989 case kTenderT0: n =
"T0"; c =
"TZERO";
break;
998 Warning(
"AddTenderSupply",
"Unknown tender flag: 0x%08x", flag);
1003 case kTenderV0: m = Form(
"s->SetDebug(%d);", debug);
break;
1008 case kTenderTRD: m = Form(
"s->SetDebugLevel(%d);", debug);
break;
1011 TString cls(Form(
"Ali%sTenderSupply", c.Data()));
1013 gROOT->ProcessLine(Form(
"{ %s* s = new %s(\"%s\");"
1014 "((AliTender*)%p)->AddSupply(s);%s"
1021 void* ptr =
reinterpret_cast<void*
>(ret);
1022 Info(
"AddTenderSupply",
"Adding supply %s (an %s object): %p",
1023 n.Data(), cls.Data(), ptr);
1036 if (supplies.Contains(
"V0") ||
1037 supplies.Contains(
"VZERO")) which |=
kTenderV0 ;
1038 if (supplies.Contains(
"TPC")) which |=
kTenderTPC ;
1039 if (supplies.Contains(
"PTFIX")) which |=
kTenderPtFix ;
1040 if (supplies.Contains(
"T0")) which |=
kTenderT0 ;
1041 if (supplies.Contains(
"TOF")) which |=
kTenderTOF ;
1042 if (supplies.Contains(
"TRD")) which |=
kTenderTRD ;
1043 if (supplies.Contains(
"VTX")) which |=
kTenderVTX ;
1044 if (supplies.Contains(
"EMCAL")) which |=
kTenderEMCAL ;
1045 if (supplies.Contains(
"PID")) which |=
kTenderPID ;
1056 if (which == 0)
return;
1063 Long_t ret = gROOT->ProcessLine(
"new AliTender(\"Tender\")");
1065 Warning(
"AddTender",
"Failed to make tender");
1068 void* tender =
reinterpret_cast<void*
>(ret);
1069 gROOT->ProcessLine(Form(
"((AliTender*)%p)->SetCheckEventSelection(%d)",
1071 gROOT->ProcessLine(Form(
"((AliTender*)%p)->SetDebugLevel(%d)",
1078 else if (ocdb.EndsWith(
".root")) {
1081 gROOT->ProcessLine(Form(
"AliCDBManager::Instance()->"
1082 "SetSnapshotMode(\"%s\");",
1086 gROOT->ProcessLine(Form(
"((AliTender*)%p)->SetDefaultCDBStorage(\"%s\")",
1087 tender, ocdb.Data()));
1099 gROOT->ProcessLine(Form(
"((AliTender*)%p)->GetSupplies()->Print()",tender));
1104 AliAnalysisDataContainer* cnt =
1105 mgr->CreateContainer(
"tender_event",
1106 AliESDEvent::Class(),
1107 AliAnalysisManager::kExchangeContainer,
1109 mgr->ConnectInput (tsk, 0, mgr->GetCommonInputContainer());
1110 mgr->ConnectOutput(tsk, 1, cnt);
1208 const char* cls = task->ClassName();
1210 gROOT->ProcessLine(Form(
"((%s*)%p)->Set%s(%s)",cls,task,what,val));
1318 if (!mgr)
return false;
1319 return mgr->GetMCtruthEventHandler() != 0;
1334 Warning(
"CreateMonitors",
"Monitoring not supported yet (%s)", name.Data());
1360 char c[] = {
' ',
'/',
'@', 0 };
1363 char tmp[] = { *p,
'\0' };
1364 escaped.ReplaceAll(tmp,
"_");
1367 if (!datimeStr.IsNull() &&
1368 !datimeStr.EqualTo(
"none", TString::kIgnoreCase)) {
1370 if (datimeStr.EqualTo(
"now", TString::kIgnoreCase))
1375 const char* formats[] = {
"%Ec",
1382 const char** f = formats;
1384 while (*f && !found) {
1392 if (strptime(datimeStr.Data(), *f, &t) != 0) found =
true;
1397 datime.Set(t.tm_year, t.tm_mon, t.tm_mday, t.tm_hour, t.tm_min, 0);
1400 if (datime.GetYear() <= 1995 ||
1401 datime.GetMonth() == 0 ||
1402 datime.GetDay() == 0)
return escaped;
1403 datimeStr = Form(
"%04d%02d%02d_%02d%02d",
1408 datime.GetMinute());
1409 escaped.Append(Form(
"_%s", datimeStr.Data()));
1426 Error(
"SetupWorkingDirectory",
"File/directory %s does not exists",
1433 if (!overwrite && exists) {
1434 Error(
"SetupWorkingDirectory",
"File/directory %s already exists",
1441 if (
gSystem->MakeDirectory(nam.Data())) {
1442 Error(
"SetupWorkingDirectory",
"Failed to make directory '%s'",
1449 if (!
gSystem->ChangeDirectory(nam.Data())) {
1450 Error(
"SetupWorkingDirectory",
"Failed to change directory to %s",
1473 if (tmp.
Find(
"overwrite")) tmp.
Set(
"overwrite");
1497 std::ofstream o(Form(
"%s.sh", out.Data()));
1500 tmp.
Set(
"url",
"${url}");
1501 o <<
"#!/bin/bash\n\n"
1502 <<
"class=\"" << cls <<
"\"\n"
1503 <<
"name=\"" << name <<
"\"\n"
1504 <<
"url=\"" << url <<
"\"\n\n"
1505 <<
"# Available options\n"
1507 tmp.
Help(o,
"# --");
1510 <<
"# Available URI options\n"
1512 uopts->
Help(o,
"# ");
1515 <<
"opts=(--class=$class \\\n"
1517 tmp.
Store(o,
" \\\n --",
"",
true);
1519 <<
"echo \"Running runTrain ${opts[@]} $@\"\n"
1520 <<
"runTrain \"${opts[@]}\" $@\n\n"
1521 <<
"# EOF" << std::endl;
1523 gSystem->Exec(Form(
"chmod a+x %s.sh", out.Data()));
1541 std::ofstream o(Form(
"%s.C", out.Data()));
1542 o <<
"// Available options:\n"
1547 <<
"// Available URI options\n";
1548 uopts->
Help(o,
"// ");
1551 <<
"Bool_t " << out <<
"()\n"
1553 <<
" TString name(\"" << name <<
"\");\n"
1554 <<
" TString cls(\"" << cls <<
"\");\n"
1555 <<
" TUrl uri(\"" << opts.
Get(
"url") <<
"\");\n"
1557 <<
" TString opts(";
1558 tmp.
Store(o,
"\"",
",\"\n ",
false);
1560 <<
" TString path(";
1561 TString path(gROOT->GetMacroPath());
1562 TObjArray* elements = path.Tokenize(
":");
1563 TObjString* element = 0;
1564 TIter next(elements);
1565 while ((element = static_cast<TObjString*>(next()))) {
1566 if (element->String().IsNull())
continue;
1567 o <<
"\n \"" << element->GetName() <<
":\"";
1571 <<
" path.Append(\"$ALICE_PHYSICS/PWGLF/FORWARD/trains\");\n"
1572 <<
" gROOT->SetMacroPath(path);\n\n"
1573 <<
" gROOT->LoadMacro(\"RunTrain.C\");\n\n"
1574 <<
" return RunTrain(name, cls, uri, opts);\n"
1578 <<
"//" << std::endl;
1596 o <<
" echo \"Nothing to do for " <<
ClassName()
1597 <<
" train\"" << std::endl;
1617 std::ofstream f(
"post.sh");
1619 Error(
"SavePostAll",
"Failed to open post.sh script");
1622 f <<
"#!/bin/bash\n"
1623 <<
"# Generated by " <<
ClassName() <<
"\n"
1634 <<
"if test ! -f Download.C ;then\n"
1639 <<
"if test ! -f .download ; then\n"
1640 <<
" aliroot -l -b -q Download.C\\(1\\)\n"
1641 <<
" touch .download\n"
1645 <<
"for i in root_archive_*.zip ; do\n"
1646 <<
" d=`basename $i .zip` \n"
1647 <<
" if test ! -d $d ; then\n"
1648 <<
" echo \"Directory $d missing\"\n"
1652 <<
" (cd $d && doall)\n"
1657 gSystem->Exec(
"chmod a+x post.sh");
Double_t AsDouble(const TString &name, Double_t def=0) const
virtual void CreateCentralitySelection(Bool_t mc)
virtual void CreateMonitors()
void SetOnTaskGeneric(AliAnalysisTaskSE *task, const char *what, const char *val)
virtual AliVEventHandler * CreateInputHandler(UShort_t type, Bool_t esdRecPoints=false)
void Help(std::ostream &o, const char *prefix=" ") const
void SavePostShellScript()
void FromOption(AliAnalysisTaskSE *task, const char *what, const char *opt, Bool_t)
static Railway * Create(const TUrl &url, Int_t verbose=0)
Bool_t Help(std::ostream &o=std::cout, bool asProg=false)
Option * Find(const TString &name) const
virtual void AddOCDBConnect()
void FromOption(AliAnalysisTaskSE *task, const char *what, const char *opt, const char *defval)
Bool_t AsBool(const TString &name) const
virtual Bool_t LoadAliPhysics()
virtual Long64_t Run(Long64_t nEvents=-1)=0
virtual AliAnalysisTask * FindCar(const TString &name, Bool_t verbose=true) const
virtual void Print(Option_t *="") const
void SetOnTask(AliAnalysisTaskSE *task, const char *what, const char *val)
virtual const Char_t * UrlHelp() const =0
void Store(std::ostream &o, const char *prefix="", const char *delim=",", bool quote=true, bool onlySet=false) const
virtual void AddTender(UShort_t which)
virtual AliVEventHandler * CreateMCHandler(UShort_t, bool mc)
Int_t AsInt(const TString &name, Int_t def=0) const
virtual void AuxSave(const TString &, Bool_t)
const char * AsString(const TString &name, const TString &def="") const
virtual Bool_t LoadAliROOT()
static void SaveSetupShell(const TString &out, const TString &cls, const TString &name, const OptionList &opts, const OptionList *uopts)
static TString EscapeName(const char *name, TString &datimeStr)
virtual const char * Desc() const =0
void SetOnTask(AliAnalysisTaskSE *task, const char *what, Bool_t val)
virtual AliAnalysisTaskSE * CoupleSECar(const TString ¯o, UInt_t mask=0)
void FromOption(AliAnalysisTaskSE *task, const char *what, const char *opt, Int_t defval)
virtual AliVEventHandler * CreateOutputHandler(UShort_t type)
virtual Bool_t LoadROOT()
Long64_t AsLong(const TString &name, Long64_t def=0) const
const TString & Get(const TString &name) const
virtual Bool_t PreSetup()=0
virtual AliAnalysisTask * CoupleCar(const TString ¯o)
static void ShowUrlHelp(const TString &cl)
virtual UShort_t Mode() const =0
Bool_t Has(const TString &name) const
void Print(Option_t *="") const
virtual void CreateTasks(AliAnalysisManager *mgr)=0
TrainSetup(const TrainSetup &o)
virtual Bool_t PostSetup()=0
const OptionList & Options() const
virtual AliAnalysisManager * CreateAnalysisManager(const char *name)
void Set(const TString &name, const TString &value)
void PrintTimer(TStopwatch &timer, const char *where)
virtual Bool_t IsMC() const
TrainSetup & operator=(const TrainSetup &o)
virtual Short_t InputType() const
void SetOnTask(AliAnalysisTaskSE *task, const char *what, Int_t val)
void LoadOADB(Bool_t asPar=false)
void FromOption(AliAnalysisTaskSE *task, const char *what, const char *opt, Long64_t defval)
Option * Add(const TString &name, const TString &arg, const TString &desc, const TString &val="")
TrainSetup(const TString &name)
void SetOnTask(AliAnalysisTaskSE *task, const char *what, Double_t val)
virtual void SaveSetup(Bool_t asShellScript)
virtual Bool_t LoadAux(const TString &name, Bool_t copy=false)
Bool_t SetupWorkingDirectory()
Base class for analysis helpers.
void FromOption(AliAnalysisTaskSE *task, const char *what, const char *opt, Double_t defval)
virtual void * AddTenderSupply(void *tender, UShort_t flag, Int_t debug)
virtual Bool_t HasMCHandler() const
virtual UShort_t Operation() const
void Show(std::ostream &o, const char *prefix=" ") const
virtual const Char_t * ClassName() const =0
virtual void UsePar(Bool_t &use)
static Bool_t Main(const TString &name, const TString &cls, const TCollection *opts, Bool_t asProg=true, Bool_t spawn=false)
void SetOnTask(AliAnalysisTaskSE *task, const char *what, Long64_t val)
virtual AliAnalysisTask * CoupleCar(const TString ¯o, const TString &args)
virtual void AddMonitor(const TString &name)
Bool_t Version(std::ostream &o=std::cout)
virtual void AddTender(const TString &sup)
virtual void PostShellCode(std::ostream &o)
virtual void CreatePhysicsSelection(Bool_t mc, AliAnalysisManager *mgr)
virtual AliAnalysisTaskSE * CoupleSECar(const TString ¯o, const TString &args, UInt_t mask=0)
virtual Bool_t LoadLibrary(const TString &name, Bool_t slave=true, Bool_t forcePar=false)=0
void Remove(const TString &name)
static void SaveSetupROOT(const TString &out, const TString &cls, const TString &name, const OptionList &opts, const OptionList *uopts)
void SetOnTask(AliAnalysisTaskSE *task, const char *what, UInt_t val)