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();
561 AliAODInputHandler* input =
new AliAODInputHandler();
566 while ((ofr = nfr())) input->AddFriend(const_cast<char*>(ofr->GetName()));
586 AliMCEventHandler* mcHandler =
new AliMCEventHandler();
587 mcHandler->SetReadTR(
true);
599 AliAODHandler* ret =
new AliAODHandler();
602 ret->SetOutputFileName(
"AliAOD.root");
605 ret->SetOutputFileName(
"AliAOD.pass2.root");
699 if (opt.EqualTo(
"NONE",TString::kIgnoreCase))
return;
704 AliPhysicsSelection* ps = 0;
705 AliInputEventHandler* input =
706 dynamic_cast<AliInputEventHandler*
> (mgr->GetInputEventHandler());
710 if (opt.Contains(
"BARE",TString::kIgnoreCase)) {
712 ps =
new AliPhysicsSelection();
713 if (mc) ps->SetAnalyzeMC();
715 input->SetEventSelection(ps);
719 CoupleSECar(
"AddTaskPhysicsSelection.C", Form(
"%d", mc), AliVEvent::kAny);
720 mgr->RegisterExtraFile(
"event_stat.root");
724 ps =
dynamic_cast<AliPhysicsSelection*
>(input->GetEventSelection());
726 if (opt.Contains(
"CUSTOM",TString::kIgnoreCase)) {
729 Int_t eq = opt.Index(
"custom=",7,0,TString::kIgnoreCase);
731 Int_t end = opt.Index(
".C",2,eq+7,TString::kIgnoreCase);
733 macro = opt(eq+7,end+2-eq-7);
738 if (rmacro.IsNull()) {
739 Error(
"CreatePhysicsSelection",
"Custom PS script %s not found",
743 Info(
"CreatePhysicsSelection",
"Loading custom PS from %s",rmacro.Data());
745 gROOT->Macro(Form(
"%s((AliPhysicsSelection*)%p)", base.Data(), ps));
748 if (opt.Contains(
"ALL",TString::kIgnoreCase)) {
751 Info(
"CreatePhysicsSelection",
"Skipping trigger selection");
752 ps->SetSkipTriggerClassSelection(
true);
763 AliVEventHandler* inp = mgr->GetInputEventHandler();
768 Bool_t isAOD = inp->IsA()->InheritsFrom(AliAODInputHandler::Class());
774 gROOT->SetMacroPath(Form(
"$ALICE_PHYSICS/OADB/COMMON/MULTIPLICITY/macros"
775 ":%s", gROOT->GetMacroPath()));
777 FromOption(task,
"AlternateOADBforEstimators",
"cent-oadb",
"");
780 if (centOADB.EndsWith(
".root")) {
783 per.ReplaceAll(
"OADB-",
"");
784 per.ReplaceAll(
".root",
"");
785 SetOnTask(task,
"AlternateOADBforEstimators", per);
788 SetOnTask(task,
"AlternateOADBFullManualBypassMC", base);
790 SetOnTask(task,
"AlternateOADBFullManualBypas", base);
793 if (!task->HasBranches()) {
796 task->SetBranches(
"ESD:AliESDRun.,AliESDHeader.,AliESDZDC.,"
797 "AliESDVZERO.,AliESDTZERO.,TPCVertex.,"
798 "SPDVertex.,PrimaryVertex.,AliMultiplicity."
799 "SPDPileupVertices,TrkPileupVertices,"
801 "AOD:header,vertices,AliAODTZERO,AliAODVZERO,"
802 "AliAODZDC,AliAODAD");
808 Form(
"true,%s", isAOD ?
"true" :
"false"));
809 AliCentralitySelectionTask* ctask =
810 dynamic_cast<AliCentralitySelectionTask*
>(task);
812 if (mc) ctask->SetMCInput();
839 Error(
"CoupleCar",
"Macro %s not found", macro.Data());
844 cmd.Append(TString::Format(
"(%s)", args.Data()));
845 Info(
"CoupleCar",
"Execute %s", cmd.Data());
847 Long_t ret = gROOT->Macro(cmd.Data(), &err,
false);
849 Error(
"CoupleCar",
"Failed to execute %s (%ld)", cmd.Data(), ret);
883 if (mask > 0) task->SelectCollisionCandidates(mask);
910 Bool_t verbose=
true)
const
914 ::Warning(
"FindCar",
"No manager defined");
918 if (!task && verbose)
919 ::Warning(
"FindCar",
"Task \"%s\" not found in train",
943 Long_t ret = gROOT->ProcessLine(
"new AliTaskCDBconnect(\"cdb\")");
945 Fatal(
"AddOCDBConnect",
"Failed to add OCDB connection task");
949 if (!task->HasBranches()) task->SetBranches(
"ESD:AliESDRun. AOD:header");
953 mgr->ConnectInput(task, 0, mgr->GetCommonInputContainer());
984 if (flag == 0)
return 0;
989 case kTenderV0: n =
"VZERO"; c =
"VZERO";
break;
991 case kTenderPtFix: n =
"TrackFix"; c =
"PtInvFix";
break;
992 case kTenderT0: n =
"T0"; c =
"TZERO";
break;
1001 Warning(
"AddTenderSupply",
"Unknown tender flag: 0x%08x", flag);
1006 case kTenderV0: m = Form(
"s->SetDebug(%d);", debug);
break;
1011 case kTenderTRD: m = Form(
"s->SetDebugLevel(%d);", debug);
break;
1014 TString cls(Form(
"Ali%sTenderSupply", c.Data()));
1016 gROOT->ProcessLine(Form(
"{ %s* s = new %s(\"%s\");"
1017 "((AliTender*)%p)->AddSupply(s);%s"
1024 void* ptr =
reinterpret_cast<void*
>(ret);
1025 Info(
"AddTenderSupply",
"Adding supply %s (an %s object): %p",
1026 n.Data(), cls.Data(), ptr);
1039 if (supplies.Contains(
"V0") ||
1040 supplies.Contains(
"VZERO")) which |=
kTenderV0 ;
1041 if (supplies.Contains(
"TPC")) which |=
kTenderTPC ;
1042 if (supplies.Contains(
"PTFIX")) which |=
kTenderPtFix ;
1043 if (supplies.Contains(
"T0")) which |=
kTenderT0 ;
1044 if (supplies.Contains(
"TOF")) which |=
kTenderTOF ;
1045 if (supplies.Contains(
"TRD")) which |=
kTenderTRD ;
1046 if (supplies.Contains(
"VTX")) which |=
kTenderVTX ;
1047 if (supplies.Contains(
"EMCAL")) which |=
kTenderEMCAL ;
1048 if (supplies.Contains(
"PID")) which |=
kTenderPID ;
1059 if (which == 0)
return;
1066 Long_t ret = gROOT->ProcessLine(
"new AliTender(\"Tender\")");
1068 Warning(
"AddTender",
"Failed to make tender");
1071 void* tender =
reinterpret_cast<void*
>(ret);
1072 gROOT->ProcessLine(Form(
"((AliTender*)%p)->SetCheckEventSelection(%d)",
1074 gROOT->ProcessLine(Form(
"((AliTender*)%p)->SetDebugLevel(%d)",
1081 else if (ocdb.EndsWith(
".root")) {
1084 gROOT->ProcessLine(Form(
"AliCDBManager::Instance()->"
1085 "SetSnapshotMode(\"%s\");",
1089 gROOT->ProcessLine(Form(
"((AliTender*)%p)->SetDefaultCDBStorage(\"%s\")",
1090 tender, ocdb.Data()));
1102 gROOT->ProcessLine(Form(
"((AliTender*)%p)->GetSupplies()->Print()",tender));
1107 AliAnalysisDataContainer* cnt =
1108 mgr->CreateContainer(
"tender_event",
1109 AliESDEvent::Class(),
1110 AliAnalysisManager::kExchangeContainer,
1112 mgr->ConnectInput (tsk, 0, mgr->GetCommonInputContainer());
1113 mgr->ConnectOutput(tsk, 1, cnt);
1211 const char* cls = task->ClassName();
1213 gROOT->ProcessLine(Form(
"((%s*)%p)->Set%s(%s)",cls,task,what,val));
1321 if (!mgr)
return false;
1322 return mgr->GetMCtruthEventHandler() != 0;
1337 Warning(
"CreateMonitors",
"Monitoring not supported yet (%s)", name.Data());
1363 char c[] = {
' ',
'/',
'@', 0 };
1366 char tmp[] = { *p,
'\0' };
1367 escaped.ReplaceAll(tmp,
"_");
1370 if (!datimeStr.IsNull() &&
1371 !datimeStr.EqualTo(
"none", TString::kIgnoreCase)) {
1373 if (datimeStr.EqualTo(
"now", TString::kIgnoreCase))
1378 const char* formats[] = {
"%Ec",
1385 const char** f = formats;
1387 while (*f && !found) {
1395 if (strptime(datimeStr.Data(), *f, &t) != 0) found =
true;
1400 datime.Set(t.tm_year, t.tm_mon, t.tm_mday, t.tm_hour, t.tm_min, 0);
1403 if (datime.GetYear() <= 1995 ||
1404 datime.GetMonth() == 0 ||
1405 datime.GetDay() == 0)
return escaped;
1406 datimeStr = Form(
"%04d%02d%02d_%02d%02d",
1411 datime.GetMinute());
1412 escaped.Append(Form(
"_%s", datimeStr.Data()));
1429 Error(
"SetupWorkingDirectory",
"File/directory %s does not exists",
1436 if (!overwrite && exists) {
1437 Error(
"SetupWorkingDirectory",
"File/directory %s already exists",
1444 if (
gSystem->MakeDirectory(nam.Data())) {
1445 Error(
"SetupWorkingDirectory",
"Failed to make directory '%s'",
1452 if (!
gSystem->ChangeDirectory(nam.Data())) {
1453 Error(
"SetupWorkingDirectory",
"Failed to change directory to %s",
1476 if (tmp.
Find(
"overwrite")) tmp.
Set(
"overwrite");
1500 std::ofstream o(Form(
"%s.sh", out.Data()));
1503 tmp.
Set(
"url",
"${url}");
1504 o <<
"#!/bin/bash\n\n"
1505 <<
"class=\"" << cls <<
"\"\n"
1506 <<
"name=\"" << name <<
"\"\n"
1507 <<
"url=\"" << url <<
"\"\n\n"
1508 <<
"# Available options\n"
1510 tmp.
Help(o,
"# --");
1513 <<
"# Available URI options\n"
1515 uopts->
Help(o,
"# ");
1518 <<
"opts=(--class=$class \\\n"
1520 tmp.
Store(o,
" \\\n --",
"",
true);
1522 <<
"echo \"Running runTrain ${opts[@]} $@\"\n"
1523 <<
"runTrain \"${opts[@]}\" $@\n\n"
1524 <<
"# EOF" << std::endl;
1526 gSystem->Exec(Form(
"chmod a+x %s.sh", out.Data()));
1544 std::ofstream o(Form(
"%s.C", out.Data()));
1545 o <<
"// Available options:\n"
1550 <<
"// Available URI options\n";
1551 uopts->
Help(o,
"// ");
1554 <<
"Bool_t " << out <<
"()\n"
1556 <<
" TString name(\"" << name <<
"\");\n"
1557 <<
" TString cls(\"" << cls <<
"\");\n"
1558 <<
" TUrl uri(\"" << opts.
Get(
"url") <<
"\");\n"
1560 <<
" TString opts(";
1561 tmp.
Store(o,
"\"",
",\"\n ",
false);
1563 <<
" TString path(";
1564 TString path(gROOT->GetMacroPath());
1565 TObjArray* elements = path.Tokenize(
":");
1566 TObjString* element = 0;
1567 TIter next(elements);
1568 while ((element = static_cast<TObjString*>(next()))) {
1569 if (element->String().IsNull())
continue;
1570 o <<
"\n \"" << element->GetName() <<
":\"";
1574 <<
" path.Append(\"$ALICE_PHYSICS/PWGLF/FORWARD/trains\");\n"
1575 <<
" gROOT->SetMacroPath(path);\n\n"
1576 <<
" gROOT->LoadMacro(\"RunTrain.C\");\n\n"
1577 <<
" return RunTrain(name, cls, uri, opts);\n"
1581 <<
"//" << std::endl;
1599 o <<
" echo \"Nothing to do for " <<
ClassName()
1600 <<
" train\"" << std::endl;
1620 std::ofstream f(
"post.sh");
1622 Error(
"SavePostAll",
"Failed to open post.sh script");
1625 f <<
"#!/bin/bash\n"
1626 <<
"# Generated by " <<
ClassName() <<
"\n"
1637 <<
"if test ! -f Download.C ;then\n"
1642 <<
"if test ! -f .download ; then\n"
1643 <<
" aliroot -l -b -q Download.C\\(1\\)\n"
1644 <<
" touch .download\n"
1648 <<
"for i in root_archive_*.zip ; do\n"
1649 <<
" d=`basename $i .zip` \n"
1650 <<
" if test ! -d $d ; then\n"
1651 <<
" echo \"Directory $d missing\"\n"
1655 <<
" (cd $d && doall)\n"
1660 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)
Double_t nEvents
plot quality messages
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)