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);
97 fOptions.
Add(
"aod-cent",
"Recalculate centrality in AODs",
false);
122 if (&o ==
this)
return *
this;
149 Info(
"Init",
"Running with TrainSetup version %d",
kVersion);
157 Error(
"Init",
"Failed to make the worker for URL %s", url.Data());
166 if (it.EqualTo(
"ESD",TString::kIgnoreCase)) type =
Railway::kESD;
167 else if (it.EqualTo(
"AOD",TString::kIgnoreCase)) type =
Railway::kAOD;
168 else if (it.EqualTo(
"user",TString::kIgnoreCase))
199 if (verbose > 0) mgr->SetDebugLevel(verbose);
200 mgr->SetAutoBranchLoading(!
fOptions.
Has(
"branches"));
202 mgr->SetUseProgressBar(kTRUE, 100);
206 if (inputHandler) mgr->SetInputEventHandler(inputHandler);
210 if (mcHandler) mgr->SetMCtruthEventHandler(mcHandler);
214 if (outputHandler) mgr->SetOutputEventHandler(outputHandler);
217 gROOT->SetMacroPath(Form(
"%s:%s:$ALICE_ROOT/ANALYSIS/macros:"
218 "$ALICE_PHYSICS/OADB/macros",
219 cwd.Data(), gROOT->GetMacroPath()));
224 if (!supplies.IsNull()) {
249 TIter next(mgr->GetTasks());
251 while ((sub = static_cast<AliAnalysisTask*>(next()))) {
254 se->SetDebugLevel(verbose);
262 if (!mgr->InitAnalysis()) {
263 gSystem->ChangeDirectory(cwd.Data());
264 Error(
"Init",
"Failed to initialise train");
270 mgr->SetUseProgressBar(
true, 100);
278 TIter next(mgr->GetTasks());
280 while ((sub = static_cast<AliAnalysisTask*>(next()))) {
299 Info(where,
"took %4d:%02d:%06.3f", h, m, t);
313 if (!
Init())
throw TString(
"Failed to intialize the train");
320 throw TString(
"Only did setup, no running");
331 gSystem->ChangeDirectory(cwd.Data());
334 if (ret < 0)
throw TString(
"Analysis failed");
339 if (status) Warning(
"Run",
"%s", e.Data());
340 else Error(
"Run",
"%s", e.Data());
347 gSystem->Exec(Form(
"rm -f last_%s", escaped.Data()));
348 gSystem->Exec(Form(
"ln -sf %s last_%s",
384 o <<
"TrainSetup version " <<
kVersion << std::endl;
400 o <<
"Usage: RunTrain(NAME, CLASS, OPTIONS)";
402 o <<
"\n\nTrain Options:\n";
418 o <<
"Possible URL forms:\n\n";
451 throw TString(
"No class name specified");
453 throw TString(
"No train name specified");
455 mkLib.ReplaceAll(
"-std=c++14",
"-std=c++98");
457 gSystem->SetMakeSharedLib(mkLib);
459 gROOT->ProcessLine(
"gSystem->RedirectOutput(\"build.log\",\"w\");");
461 Int_t r1 = gROOT->LoadMacro(Form(
"%s.C+g", cls.Data()), &error);
462 gROOT->ProcessLine(
"gSystem->RedirectOutput(0);");
464 throw TString::Format(
"Failed to load setup %s: %d - see build.log",
468 TString create = TString::Format(
"new %s(\"%s\")",
469 cls.Data(), name.Data());
470 gROOT->ProcessLine(
"gSystem->RedirectOutput(\"build.log\",\"a\");");
471 Long_t retP = gROOT->ProcessLine(create, &error);
472 gROOT->ProcessLine(
"gSystem->RedirectOutput(0);");
474 throw TString::Format(
"Failed to make object of class %s "
475 "(see build.log): 0x%08lx/%d\n\t%s",
476 cls.Data(), retP, error, create.Data());
481 if (!train->Options().Parse(opts))
482 throw TString(
"Failed to parse options");
487 if (!train->Help(std::cout, asProg)) {
492 if (!train->Version(std::cout)) {
501 if (!e.IsNull()) Error(
"Main",
"%s", e.Data());
505 if (gApplication && asProg) {
508 gApplication->Terminate(ret ? 0 : 1);
540 Bool_t esdRecPoints=
false)
542 Info(
"CreateInputHandler",
"Making handler for %d (%d)",
544 AliVEventHandler* ret = 0;
547 AliESDInputHandler* input = 0;
548 if (!esdRecPoints) input =
new AliESDInputHandler();
550 Info(
"CreateInputHandler",
"Special handler for rec-points");
551 AliESDInputHandlerRP* esd =
new AliESDInputHandlerRP();
560 AliAODInputHandler* input =
new AliAODInputHandler();
565 while ((ofr = nfr())) input->AddFriend(const_cast<char*>(ofr->GetName()));
585 AliMCEventHandler* mcHandler =
new AliMCEventHandler();
586 mcHandler->SetReadTR(
true);
598 AliAODHandler* ret =
new AliAODHandler();
601 ret->SetOutputFileName(
"AliAOD.root");
604 ret->SetOutputFileName(
"AliAOD.pass2.root");
698 if (opt.EqualTo(
"NONE",TString::kIgnoreCase))
return;
703 AliPhysicsSelection* ps = 0;
704 AliInputEventHandler* input =
705 dynamic_cast<AliInputEventHandler*
> (mgr->GetInputEventHandler());
709 if (opt.Contains(
"BARE",TString::kIgnoreCase)) {
711 ps =
new AliPhysicsSelection();
712 if (mc) ps->SetAnalyzeMC();
714 input->SetEventSelection(ps);
718 CoupleSECar(
"AddTaskPhysicsSelection.C", Form(
"%d", mc), AliVEvent::kAny);
719 mgr->RegisterExtraFile(
"event_stat.root");
723 ps =
dynamic_cast<AliPhysicsSelection*
>(input->GetEventSelection());
725 if (opt.Contains(
"CUSTOM",TString::kIgnoreCase)) {
728 Int_t eq = opt.Index(
"custom=",7,0,TString::kIgnoreCase);
730 Int_t end = opt.Index(
".C",2,eq+7,TString::kIgnoreCase);
732 macro = opt(eq+7,end+2-eq-7);
737 if (rmacro.IsNull()) {
738 Error(
"CreatePhysicsSelection",
"Custom PS script %s not found",
742 Info(
"CreatePhysicsSelection",
"Loading custom PS from %s",rmacro.Data());
744 gROOT->Macro(Form(
"%s((AliPhysicsSelection*)%p)", base.Data(), ps));
747 if (opt.Contains(
"ALL",TString::kIgnoreCase)) {
750 Info(
"CreatePhysicsSelection",
"Skipping trigger selection");
751 ps->SetSkipTriggerClassSelection(
true);
762 AliVEventHandler* inp = mgr->GetInputEventHandler();
767 Bool_t isAOD = inp->IsA()->InheritsFrom(AliAODInputHandler::Class());
773 gROOT->SetMacroPath(Form(
"$ALICE_PHYSICS/OADB/COMMON/MULTIPLICITY/macros"
774 ":%s", gROOT->GetMacroPath()));
776 FromOption(task,
"AlternateOADBforEstimators",
"cent-oadb",
"");
779 if (centOADB.EndsWith(
".root")) {
782 per.ReplaceAll(
"OADB-",
"");
783 per.ReplaceAll(
".root",
"");
784 SetOnTask(task,
"AlternateOADBforEstimators", per);
787 SetOnTask(task,
"AlternateOADBFullManualBypassMC", base);
789 SetOnTask(task,
"AlternateOADBFullManualBypas", base);
792 if (!task->HasBranches()) {
795 task->SetBranches(
"ESD:AliESDRun.,AliESDHeader.,AliESDZDC.,"
796 "AliESDVZERO.,AliESDTZERO.,TPCVertex.,"
797 "SPDVertex.,PrimaryVertex.,AliMultiplicity."
798 "SPDPileupVertices,TrkPileupVertices,"
800 "AOD:header,vertices,AliAODTZERO,AliAODVZERO,"
801 "AliAODZDC,AliAODAD");
807 Form(
"true,%s", isAOD ?
"true" :
"false"));
808 AliCentralitySelectionTask* ctask =
809 dynamic_cast<AliCentralitySelectionTask*
>(task);
811 if (mc) ctask->SetMCInput();
838 Error(
"CoupleCar",
"Macro %s not found", macro.Data());
843 cmd.Append(TString::Format(
"(%s)", args.Data()));
844 Info(
"CoupleCar",
"Execute %s", cmd.Data());
846 Long_t ret = gROOT->Macro(cmd.Data(), &err,
false);
848 Error(
"CoupleCar",
"Failed to execute %s (%ld)", cmd.Data(), ret);
882 if (mask > 0) task->SelectCollisionCandidates(mask);
909 Bool_t verbose=
true)
const
913 ::Warning(
"FindCar",
"No manager defined");
917 if (!task && verbose)
918 ::Warning(
"FindCar",
"Task \"%s\" not found in train",
942 Long_t ret = gROOT->ProcessLine(
"new AliTaskCDBconnect(\"cdb\")");
944 Fatal(
"AddOCDBConnect",
"Failed to add OCDB connection task");
948 if (!task->HasBranches()) task->SetBranches(
"ESD:AliESDRun. AOD:header");
952 mgr->ConnectInput(task, 0, mgr->GetCommonInputContainer());
983 if (flag == 0)
return 0;
988 case kTenderV0: n =
"VZERO"; c =
"VZERO";
break;
990 case kTenderPtFix: n =
"TrackFix"; c =
"PtInvFix";
break;
991 case kTenderT0: n =
"T0"; c =
"TZERO";
break;
1000 Warning(
"AddTenderSupply",
"Unknown tender flag: 0x%08x", flag);
1005 case kTenderV0: m = Form(
"s->SetDebug(%d);", debug);
break;
1010 case kTenderTRD: m = Form(
"s->SetDebugLevel(%d);", debug);
break;
1013 TString cls(Form(
"Ali%sTenderSupply", c.Data()));
1015 gROOT->ProcessLine(Form(
"{ %s* s = new %s(\"%s\");"
1016 "((AliTender*)%p)->AddSupply(s);%s"
1023 void* ptr =
reinterpret_cast<void*
>(ret);
1024 Info(
"AddTenderSupply",
"Adding supply %s (an %s object): %p",
1025 n.Data(), cls.Data(), ptr);
1038 if (supplies.Contains(
"V0") ||
1039 supplies.Contains(
"VZERO")) which |=
kTenderV0 ;
1040 if (supplies.Contains(
"TPC")) which |=
kTenderTPC ;
1041 if (supplies.Contains(
"PTFIX")) which |=
kTenderPtFix ;
1042 if (supplies.Contains(
"T0")) which |=
kTenderT0 ;
1043 if (supplies.Contains(
"TOF")) which |=
kTenderTOF ;
1044 if (supplies.Contains(
"TRD")) which |=
kTenderTRD ;
1045 if (supplies.Contains(
"VTX")) which |=
kTenderVTX ;
1046 if (supplies.Contains(
"EMCAL")) which |=
kTenderEMCAL ;
1047 if (supplies.Contains(
"PID")) which |=
kTenderPID ;
1058 if (which == 0)
return;
1065 Long_t ret = gROOT->ProcessLine(
"new AliTender(\"Tender\")");
1067 Warning(
"AddTender",
"Failed to make tender");
1070 void* tender =
reinterpret_cast<void*
>(ret);
1071 gROOT->ProcessLine(Form(
"((AliTender*)%p)->SetCheckEventSelection(%d)",
1073 gROOT->ProcessLine(Form(
"((AliTender*)%p)->SetDebugLevel(%d)",
1080 else if (ocdb.EndsWith(
".root")) {
1083 gROOT->ProcessLine(Form(
"AliCDBManager::Instance()->"
1084 "SetSnapshotMode(\"%s\");",
1088 gROOT->ProcessLine(Form(
"((AliTender*)%p)->SetDefaultCDBStorage(\"%s\")",
1089 tender, ocdb.Data()));
1101 gROOT->ProcessLine(Form(
"((AliTender*)%p)->GetSupplies()->Print()",tender));
1106 AliAnalysisDataContainer* cnt =
1107 mgr->CreateContainer(
"tender_event",
1108 AliESDEvent::Class(),
1109 AliAnalysisManager::kExchangeContainer,
1111 mgr->ConnectInput (tsk, 0, mgr->GetCommonInputContainer());
1112 mgr->ConnectOutput(tsk, 1, cnt);
1210 const char* cls = task->ClassName();
1212 gROOT->ProcessLine(Form(
"((%s*)%p)->Set%s(%s)",cls,task,what,val));
1320 if (!mgr)
return false;
1321 return mgr->GetMCtruthEventHandler() != 0;
1336 Warning(
"CreateMonitors",
"Monitoring not supported yet (%s)", name.Data());
1362 char c[] = {
' ',
'/',
'@', 0 };
1365 char tmp[] = { *p,
'\0' };
1366 escaped.ReplaceAll(tmp,
"_");
1369 if (!datimeStr.IsNull() &&
1370 !datimeStr.EqualTo(
"none", TString::kIgnoreCase)) {
1372 if (datimeStr.EqualTo(
"now", TString::kIgnoreCase))
1377 const char* formats[] = {
"%Ec",
1384 const char** f = formats;
1386 while (*f && !found) {
1394 if (strptime(datimeStr.Data(), *f, &t) != 0) found =
true;
1399 datime.Set(t.tm_year, t.tm_mon, t.tm_mday, t.tm_hour, t.tm_min, 0);
1402 if (datime.GetYear() <= 1995 ||
1403 datime.GetMonth() == 0 ||
1404 datime.GetDay() == 0)
return escaped;
1405 datimeStr = Form(
"%04d%02d%02d_%02d%02d",
1410 datime.GetMinute());
1411 escaped.Append(Form(
"_%s", datimeStr.Data()));
1428 Error(
"SetupWorkingDirectory",
"File/directory %s does not exists",
1435 if (!overwrite && exists) {
1436 Error(
"SetupWorkingDirectory",
"File/directory %s already exists",
1443 if (
gSystem->MakeDirectory(nam.Data())) {
1444 Error(
"SetupWorkingDirectory",
"Failed to make directory '%s'",
1451 if (!
gSystem->ChangeDirectory(nam.Data())) {
1452 Error(
"SetupWorkingDirectory",
"Failed to change directory to %s",
1475 if (tmp.
Find(
"overwrite")) tmp.
Set(
"overwrite");
1499 std::ofstream o(Form(
"%s.sh", out.Data()));
1502 tmp.
Set(
"url",
"${url}");
1503 o <<
"#!/bin/bash\n\n"
1504 <<
"class=\"" << cls <<
"\"\n"
1505 <<
"name=\"" << name <<
"\"\n"
1506 <<
"url=\"" << url <<
"\"\n\n"
1507 <<
"# Available options\n"
1509 tmp.
Help(o,
"# --");
1512 <<
"# Available URI options\n"
1514 uopts->
Help(o,
"# ");
1517 <<
"opts=(--class=$class \\\n"
1519 tmp.
Store(o,
" \\\n --",
"",
true);
1521 <<
"echo \"Running runTrain ${opts[@]} $@\"\n"
1522 <<
"runTrain \"${opts[@]}\" $@\n\n"
1523 <<
"# EOF" << std::endl;
1525 gSystem->Exec(Form(
"chmod a+x %s.sh", out.Data()));
1543 std::ofstream o(Form(
"%s.C", out.Data()));
1544 o <<
"// Available options:\n"
1549 <<
"// Available URI options\n";
1550 uopts->
Help(o,
"// ");
1553 <<
"Bool_t " << out <<
"()\n"
1555 <<
" TString name(\"" << name <<
"\");\n"
1556 <<
" TString cls(\"" << cls <<
"\");\n"
1557 <<
" TUrl uri(\"" << opts.
Get(
"url") <<
"\");\n"
1559 <<
" TString opts(";
1560 tmp.
Store(o,
"\"",
",\"\n ",
false);
1562 <<
" TString path(";
1563 TString path(gROOT->GetMacroPath());
1564 TObjArray* elements = path.Tokenize(
":");
1565 TObjString* element = 0;
1566 TIter next(elements);
1567 while ((element = static_cast<TObjString*>(next()))) {
1568 if (element->String().IsNull())
continue;
1569 o <<
"\n \"" << element->GetName() <<
":\"";
1573 <<
" path.Append(\"$ALICE_PHYSICS/PWGLF/FORWARD/trains\");\n"
1574 <<
" gROOT->SetMacroPath(path);\n\n"
1575 <<
" gROOT->LoadMacro(\"RunTrain.C\");\n\n"
1576 <<
" return RunTrain(name, cls, uri, opts);\n"
1580 <<
"//" << std::endl;
1598 o <<
" echo \"Nothing to do for " <<
ClassName()
1599 <<
" train\"" << std::endl;
1619 std::ofstream f(
"post.sh");
1621 Error(
"SavePostAll",
"Failed to open post.sh script");
1624 f <<
"#!/bin/bash\n"
1625 <<
"# Generated by " <<
ClassName() <<
"\n"
1636 <<
"if test ! -f Download.C ;then\n"
1641 <<
"if test ! -f .download ; then\n"
1642 <<
" aliroot -l -b -q Download.C\\(1\\)\n"
1643 <<
" touch .download\n"
1647 <<
"for i in root_archive_*.zip ; do\n"
1648 <<
" d=`basename $i .zip` \n"
1649 <<
" if test ! -d $d ; then\n"
1650 <<
" echo \"Directory $d missing\"\n"
1654 <<
" (cd $d && doall)\n"
1659 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)