3 * @author Christian Holm Christensen <cholm@nbi.dk>
4 * @date Wed Sep 24 15:02:00 2014
6 * @brief Master script for AOD production.
8 * @note Do not modify this script.
10 * This script reads in 4 other scripts
12 * - GRP.C to load the global run parameters for the selected run,
13 * such as collision system, energy, etc.
15 * - AODConfig.C which defines a number of functions that return
16 * either true or false. The tasks added depends on these functions
18 * - BaseConfig.C which defines some base classes
20 * - DetConfig.C which defines which detectors are active and on.
22 * Users can customize QAConfig.C and DetConfig.C according to their
26 const char *cdbPath = "raw://";
29 * Interface (pure virtual) that all configuration classes must
36 * @name Plug-in settings
37 * Settings that make sense when using the Alien plugin
39 /** @return Connect to CDB */
40 virtual Bool_t UseCDBconnect() const = 0;
41 /** @return use physics selection */
42 virtual Bool_t UsePhysicsSelection() const = 0;
43 /** @return use tender wagon */
44 virtual Bool_t UseTender() const = 0;
45 /** @return centrality */
46 virtual Bool_t UseCentrality() const = 0;
47 /** @return use V0 correction in tender */
48 virtual Bool_t UseV0tender() const = 0;
49 /** @return activate debugging */
50 virtual Bool_t UseDBG() const = 0;
51 /** @return use MC info */
52 virtual Bool_t UseMC() const = 0;
53 /** @return use Kinematics filter */
54 virtual Bool_t UseKFILTER() const = 0;
55 /** @return use track references */
56 virtual Bool_t UseTR() const = 0;
57 /** @return do not change */
58 virtual Bool_t UseCORRFW() const = 0;
59 /** @return use AOD tags */
60 virtual Bool_t UseAODTAGS() const = 0;
61 /** @return use sys info */
62 virtual Bool_t UseSysInfo() const = 0;
68 * Analysis modules to be included. Some may not be yet fully implemented.
70 /** @return Analysis produces an AOD or dAOD's */
71 virtual Bool_t UseAODhandler() const = 0;
72 /** @return ESD to AOD filter (barrel + muon tracks) */
73 virtual Bool_t UseESDfilter() const = 0;
74 /** @return Use Muon train */
75 virtual Bool_t UsePWGMuonTrain() const = 0;
76 /** @return Task that copies only muon events */
77 virtual Bool_t UseMUONcopyAOD() const = 0;
78 /** @return Jet analysis (PWG4) */
79 virtual Bool_t UseJETAN() const = 0;
80 /** @return Jet delta AODs */
81 virtual Bool_t UseJETANdelta() const = 0;
82 /** @return Vertexing HF task (PWG3) */
83 virtual Bool_t UsePWGHFvertexing() const = 0;
84 /** @return JPSI filtering (PWG3) */
85 virtual Bool_t UsePWGDQJPSIfilter() const = 0;
86 /** @return D0->2 hadrons (PWG3) */
87 virtual Bool_t UsePWGHFd2h() const = 0;
88 /** @return PID response */
89 virtual Bool_t UsePIDResponse() const = 0;
90 /** @return Forward mult task (PWGLF) */
91 virtual Bool_t UsePWGLFForward() const = 0;
97 * @param use Use or not
99 virtual void PrintOne(const char* title, Bool_t use) const
101 Printf("%-30s : %3s", title, use ? "yes" : "no");
107 virtual void Print() const {
108 PrintOne("Connect to CDB", UseCDBconnect());
109 PrintOne("Use physics selection", UsePhysicsSelection());
110 PrintOne("Use tender wagon", UseTender());
111 PrintOne("Use centrality", UseCentrality());
112 PrintOne("Use V0 correction in tender", UseV0tender());
113 PrintOne("Activate debugging", UseDBG());
114 PrintOne("Use MC info", UseMC());
115 PrintOne("Use Kinematics filter", UseKFILTER());
116 PrintOne("Use track references", UseTR());
117 PrintOne("Use correction framework", UseCORRFW());
118 PrintOne("Use AOD tags", UseAODTAGS());
119 PrintOne("Use sys info", UseSysInfo());
120 PrintOne("Produces an AOD or dAOD's", UseAODhandler());
121 PrintOne("ESD to AOD filter", UseESDfilter());
122 PrintOne("Use Muon train ", UsePWGMuonTrain());
123 PrintOne("Copy muon events", UseMUONcopyAOD());
124 PrintOne("Jet analysis (PWG4)", UseJETAN());
125 PrintOne("Jet delta AODs", UseJETANdelta());
126 PrintOne("Vertexing HF task (PWG3)", UsePWGHFvertexing());
127 PrintOne("JPSI filtering (PWG3)", UsePWGDQJPSIfilter());
128 PrintOne("D0->2 hadrons (PWG3)", UsePWGHFd2h());
129 PrintOne("PID response", UsePIDResponse());
130 PrintOne("Forward mult task (PWGLF)", UsePWGLFForward());
134 VirtualAODCfg* aodCfg = 0;
136 //====================================================================
138 * Load a library/module
140 * @param module Library/module name
142 * @return true on success
144 Bool_t LoadLibrary(const char *module)
146 // Load a module library in a given mode. Reports success.
149 ::Info("LoadLibrary", "Loading %s", module);
150 gROOT->IncreaseDirLevel();
153 ::Error("AnalysisTrainNew.C::LoadLibrary", "Empty module name");
154 gROOT->DecreaseDirLevel();
158 // If a library is specified, just load it
159 if (mod.EndsWith(".so")) {
160 mod.Remove(mod.Index(".so"));
161 ::Info("LoadLibrary", "Loading .so: %s", mod.Data());
162 result = gSystem->Load(mod);
164 ::Error("AnalysisTrainNew.C::LoadLibrary",
165 "Could not load library %s", module);
167 gROOT->DecreaseDirLevel();
168 return (result >= 0);
170 // Check if the library is already loaded
171 if (strlen(gSystem->GetLibraries(Form("%s.so", module), "", kFALSE)) > 0) {
172 ::Info("LoadLibrary", "Module %s.so already loaded", module);
173 gROOT->DecreaseDirLevel();
177 ::Info("LoadLibrary", "Trying to load lib%s.so", module);
178 result = gSystem->Load(Form("lib%s.so", module));
180 ::Error("AnalysisTrainNew.C::LoadLibrary",
181 "Could not load module %s", module);
182 ::Info("LoadLibrary", "Module %s, successfully loaded", module);
183 gROOT->DecreaseDirLevel();
184 return (result >= 0);
187 //====================================================================
189 * Load common libraries
191 * @return true on sucess
193 Bool_t LoadCommonLibraries()
195 // Load common analysis libraries.
196 if (!gSystem->Getenv("ALICE_ROOT")) {
197 ::Error("AnalysisTrainNew.C::LoadCommonLibraries",
198 "Analysis train requires that analysis libraries are "
199 "compiled with a local AliRoot");
203 Bool_t success = kTRUE;
204 // Load framework classes. Par option ignored here.
205 success &= LoadLibrary("libSTEERBase.so");
206 success &= LoadLibrary("libESD.so");
207 success &= LoadLibrary("libAOD.so");
208 success &= LoadLibrary("libANALYSIS.so");
209 success &= LoadLibrary("libOADB.so");
210 success &= LoadLibrary("libANALYSISalice.so");
211 success &= LoadLibrary("libESDfilter.so");
212 success &= LoadLibrary("libCORRFW.so");
213 gROOT->ProcessLine(".include $ALICE_ROOT/include");
215 ::Info("AnalysisTrainNew.C::LoadCommodLibraries",
216 "Load common libraries: SUCCESS");
217 ::Info("AnalysisTrainNew.C::LoadCommodLibraries",
218 "Include path for Aclic compilation:\n%s",
219 gSystem->GetIncludePath());
221 ::Info("AnalysisTrainNew.C::LoadCommodLibraries",
222 "Load common libraries: FAILED");
227 //====================================================================
229 * Load libraries needed by the train
232 * @param doCDBconnect
234 * @param iPWGMuonTrain
237 * @param iPWGHFvertexing
239 * @param iPWGDQJPSIfilter
241 * @return true on success
243 Bool_t LoadAnalysisLibraries()
245 // Load common analysis libraries.
246 if (aodCfg->UseTender() || aodCfg->UseCDBconnect()) {
247 if (!LoadLibrary("TENDER") ||!LoadLibrary("TENDERSupplies")) return kFALSE;
250 if ((aodCfg->UseCDBconnect() && !aodCfg->UseTender())
251 && !LoadLibrary("PWGPP")) return false;
252 if ((aodCfg->UseESDfilter() ||
253 (aodCfg->UsePWGMuonTrain() && detCfg->UseMUON())))
254 if (!LoadLibrary("PWGmuon")) return kFALSE;
256 if ((aodCfg->UseJETAN() || aodCfg->UseJETANdelta()))
257 if (!LoadLibrary("JETAN")) return kFALSE;
258 if (aodCfg->UseJETANdelta()) { // CINT doesn't like long '||' chains
259 if (!LoadLibrary("CGAL")) return false;
260 if (!LoadLibrary("fastjet")) return false;
261 if (!LoadLibrary("siscone")) return false;
262 if (!LoadLibrary("SISConePlugin")) return false;
263 if (!LoadLibrary("FASTJETAN")) return false;
267 if (aodCfg->UsePWGHFvertexing() || aodCfg->UsePWGHFd2h())) {
268 // CINT doesn't like long '||' chains
269 if (!LoadLibrary("PWGflowBase")) return false;
270 if (!LoadLibrary("PWGflowTasks")) return false;
271 if (cholm) if (!LoadLibrary("PWGTRD")) return false;
272 if (!LoadLibrary("PWGHFvertexingHF")) return false;
276 if (aodCfg->UsePWGDQJPSIfilter() &&
277 !LoadLibrary("PWGDQdielectron")) return kFALSE;
279 ::Info("AnalysisTrainNew.C::LoadAnalysisLibraries",
280 "Load other libraries: SUCCESS");
284 //====================================================================
286 * Add tasks to the train
288 * @param cdb_location
290 void AddAnalysisTasks(const char *cdb_location)
292 // === Add all analysis task wagons to the train ===================
294 // --- Some constants ----------------------------------------------
295 TString ali = "$(ALICE_ROOT)";
296 TString ana = ali + "/ANALYSIS";
297 TString pwghf = ali + "/PWGHF";
298 TString pwglf = ali + "/PWGLF";
299 TString pwgje = ali + "/PWGJE";
300 TString pwgdq = ali + "/PWGDQ";
301 TString pwgpp = ali + "/PWGPP";
303 // --- Get the analysis manager ------------------------------------
304 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
305 AliAnalysisManager::SetCommonFileName("AODQA.root");
307 // --- PIDResponse(JENS) -------------------------------------------
308 if (aodCfg->UsePIDResponse()) {
309 gROOT->LoadMacro(ana+"/macros/AddTaskPIDResponse.C");
310 AliAnalysisTaskPIDResponse *PIDResponse = AddTaskPIDResponse(kTRUE);
313 // --- CDB connection ----------------------------------------------
314 if (aodCfg->UseCDBconnect() && !aodCfg->UseTender()) {
315 gROOT->LoadMacro(pwgpp+"/PilotTrain/AddTaskCDBconnect.C");
316 AliTaskCDBconnect *taskCDB = AddTaskCDBconnect(cdb_location, grp->run);
317 if (!taskCDB) return;
319 AliCDBManager *cdb = AliCDBManager::Instance();
320 // cdb->SetDefaultStorage(cdb_location);
321 cdb->SetDefaultStorageFromRun(grp->run);
323 if (aodCfg->UseTender()) {
324 gROOT->LoadMacro(ana+"/TenderSupplies/AddTaskTender.C");
325 AliAnalysisTaskSE *tender = AddTaskTender(aodCfg->UseV0tender());
328 // --- Physics selection -------------------------------------------
329 if (aodCfg->UsePhysicsSelection()) {
330 // Physics selection task
331 gROOT->LoadMacro(ana+"/macros/AddTaskPhysicsSelection.C");
332 mgr->RegisterExtraFile("event_stat.root");
333 AliPhysicsSelectionTask *physSelTask =
334 AddTaskPhysicsSelection(aodCfg->UseMC());
337 // --- Centrality (only Pb-Pb) -------------------------------------
338 if (aodCfg->UseCentrality()) {
339 gROOT->LoadMacro(ana+"/macros/AddTaskCentrality.C");
340 AliCentralitySelectionTask *taskCentrality = AddTaskCentrality();
341 taskCentrality->SetMCInput();
344 // --- PWGLF - Forward (cholm@nbi.dk) -----------------------------
345 if (aodCfg->UsePWGLFForward() &&
346 aodCfg->UsePhysicsSelection() &&
348 gROOT->LoadMacro(pwglf+"/FORWARD/analysis2/AddTaskForwardMult.C");
350 // mc Assume MC input
351 // runNo Run number to do local initialization - not used
352 // sys Collision system (1:pp,2:PbPb,3:pPb/Pbp) - not used
353 // sNN Collision energy in GeV - not used
354 // field L3 magnetic field strength - not used
355 // config Configuration script
356 // corrdir Possible directory containing custom OADB corrections
357 // HACK load custom corrections
358 Info("", "Adding forward AOD task with mc=%d",
359 aodCfg->UseMC() && aodCfg->UseTR());
360 AddTaskForwardMult(aodCfg->UseMC() && aodCfg->UseTR(),0,0,0,0,
361 "ForwardAODConfig.C",".");
362 gROOT->LoadMacro(pwglf+"/FORWARD/analysis2/AddTaskCentralMult.C");
363 AddTaskCentralMult(aodCfg->UseMC() && aodCfg->UseTR(),0,0,0,0,
364 "CentralAODConfig.C");
365 const char* hack2="AliForwardCorrectionManager::Instance().Print(\"R\")";
366 gROOT->ProcessLine(hack2);
370 // --- ESD filter --------------------------------------------------
371 if (aodCfg->UseESDfilter()) {
372 // ESD filter task configuration.
373 gROOT->LoadMacro(ana+"/ESDfilter/macros/AddTaskESDFilter.C");
374 if (aodCfg->UseMUONcopyAOD() && detCfg->UseMUON()) {
375 printf("Registering delta AOD file\n");
376 mgr->RegisterExtraFile("AliAOD.Muons.root");
377 mgr->RegisterExtraFile("AliAOD.Dimuons.root");
379 UInt_t runFlag = (grp->Year()%100)*100;
380 AliAnalysisTaskESDfilter *taskesdfilter =
381 AddTaskESDFilter(aodCfg->UseKFILTER(),
382 aodCfg->UseMUONcopyAOD(), // write Muon AOD
383 kFALSE, // write dimuon AOD
384 kFALSE, // usePhysicsSelection
385 kFALSE, // centrality OBSOLETE
386 kTRUE, // enable TPS only tracks
387 kFALSE, // disable cascades
388 kFALSE, // disable kinks
389 runFlag); // run flag (YY00)
392 TString configPWGHFd2h =
394 pwghf+"/vertexingHF/ConfigVertexingHF.C" :
395 pwghf+"/vertexingHF/ConfigVertexingHF_Pb_AllCent.C");
397 // --- PWG3 vertexing ----------------------------------------------
398 if (aodCfg->UsePWGHFvertexing()) {
399 gROOT->LoadMacro(pwghf+"/vertexingHF/macros/AddTaskVertexingHF.C");
401 if (!aodCfg->UsePWGHFd2h())
402 TFile::Cp(gSystem->ExpandPathName(configPWG3d2h.Data()),
403 "file:ConfigVertexingHF.C");
405 AliAnalysisTaskSEVertexingHF *taskvertexingHF = AddTaskVertexingHF();
406 if (!taskvertexingHF)
407 ::Warning("AnalysisTrainNew",
408 "AliAnalysisTaskSEVertexingHF cannot run for this train "
409 "conditions - EXCLUDED");
411 mgr->RegisterExtraFile("AliAOD.VertexingHF.root");
413 taskvertexingHF->SelectCollisionCandidates(0);
416 // ---- PWG3 JPSI filtering (only pp) ------------------------------
417 if (aodCfg->UsePWGDQJPSIfilter()) {
418 gROOT->LoadMacro(pwgdq+"/dielectron/macros/AddTaskJPSIFilter.C");
419 AliAnalysisTaskSE *taskJPSIfilter = AddTaskJPSIFilter();
422 ::Warning("AnalysisTrainNew",
423 "AliAnalysisTaskDielectronFilter cannot run for this train "
424 "conditions - EXCLUDED");
426 mgr->RegisterExtraFile("AliAOD.Dielectron.root");
428 taskJPSIfilter->SelectCollisionCandidates(0);
431 // --- PWG3 D2h ----------------------------------------------------
432 if (aodCfg->UsePWGHFd2h() && aodCfg->UsePWGHFvertexing()) {
433 gROOT->LoadMacro(pwghf+"/vertexingHF/AddD2HTrain.C");
434 TFile::Cp(gSystem->ExpandPathName(configPWGHFd2h.Data()),
435 "file:ConfigVertexingHF.C");
436 AddD2HTrain(kFALSE, 1,0,0,0,0,0,0,0,0,0,0);
439 // --- Jet analysis ------------------------------------------------
441 // Configurations flags, move up?
442 if (aodCfg->UseJETAN()) {
444 Warning("", "JET analysis disabled - major restructuring ofg JETAN");
446 TString jetAOD = "AliAOD.Jets.root";
447 UInt_t highPtMask = 768;// from esd filter
448 TString subtractBranches = "";
451 Info("", "Loading macro %s/macros/AddTaskJets.C", pwgje.Data());
452 gROOT->LoadMacro(pwgje+"/macros/AddTaskJets.C");
453 // Default jet reconstructor running on ESD's
454 // no background subtraction
455 AliAnalysisTask* task = AddTaskJets("AOD","UA1",0.4F,highPtMask,1.F,0);
457 ::Fatal("AnalysisTrainNew",
458 "AliAnalysisTaskJets cannot run for this train "
459 "conditions - EXCLUDED");
461 AliAnalysisTaskJets* taskjets = static_cast<AliAnalysisTaskJets*>(task);
462 if(!jetAOD.IsNull()) taskjets->SetNonStdOutputFile(jetAOD);
464 if (aodCfg->UseJETANdelta()) {
465 // need to modify this accordingly in the add task jets
466 // AddTaskJetsDelta("AliAOD.Jets.root");
467 mgr->RegisterExtraFile(jetAOD);
471 // UA1 intrinsic background subtraction
472 // background subtraction
473 taskjets = AddTaskJets("AOD","UA1",0.4,highPtMask,1.,2);
474 if(!jetAOD.IsNull()) taskjets->SetNonStdOutputFile(jetAOD);
477 //no background subtration to be done later....
478 taskjets = AddTaskJets("AOD","SISCONE",0.4,highPtMask,0.15,0);
479 if(!jetAOD.IsNull()) taskjets->SetNonStdOutputFile(jetAOD.Data());
480 cTmp = taskjets->GetNonStdBranch();
481 if(!cTmp.IsNull()) subtractBranches += Form("%s ",cTmp.Data());
483 // Add the clusters..
484 gROOT->LoadMacro(pwgje+"/macros/AddTaskJetCluster.C");
485 AliAnalysisTaskJetCluster *taskCl = 0;
488 Float_t fTrackEtaWindow = 0.9;
489 // this one is for the background and random jets, random cones
491 taskCl = AddTaskJetCluster("AOD","",highPtMask,
495 taskCl->SetBackgroundCalc(kTRUE);
496 taskCl->SetNRandomCones(10);
497 taskCl->SetCentralityCut(fCenLo,fCenUp);
498 taskCl->SetGhostEtamax(fTrackEtaWindow);
499 TString bkgBranch = Form("%s_%s",
500 AliAODJetEventBackground::StdBranchName(),
501 taskCl->GetJetOutputBranch());
503 taskCl = AddTaskJetCluster("AOD", "", highPtMask, psFlag, "ANTIKT",
504 0.4, 2, 1, jetAOD, 0.15);
505 taskCl->SetCentralityCut(fCenLo,fCenUp);
506 if(grp->IsAA()) taskCl->SetBackgroundBranch(bkgBranch.Data());
508 taskCl->SetNRandomCones(10);
509 subtractBranches += Form("%s ",taskCl->GetJetOutputBranch());
511 taskCl = AddTaskJetCluster("AOD", "", highPtMask, psFlag, "ANTIKT",
512 0.2, 0 , 1, jetAOD, 0.15);
513 taskCl->SetCentralityCut(fCenLo,fCenUp);
514 if(grp->IsAA())taskCl->SetBackgroundBranch(bkgBranch);
516 subtractBranches += Form("%s ",taskCl->GetJetOutputBranch());
518 // DO THE BACKGROUND SUBTRACTION
519 if(grp->IsAA() && !subtractBranches.IsNull()) {
520 gROOT->LoadMacro(pwgje+"/macros/AddTaskJetBackgroundSubtract.C");
521 AliAnalysisTaskJetBackgroundSubtract *taskSubtract = 0;
522 taskSubtract = AddTaskJetBackgroundSubtract(subtractBranches,1,
524 taskSubtract->SetBackgroundBranch(bkgBranch);
525 if(!jetAOD.IsNull()) taskSubtract->SetNonStdOutputFile(jetAOD.Data());
534 //====================================================================
536 * Create the input chain
539 * @return Pointer to newly allocated train
541 TChain *CreateChain()
543 // Create the input chain
544 chain = new TChain("esdTree");
545 if (gSystem->AccessPathName("AliESDs.root"))
546 ::Error("AnalysisTrainNew.C::CreateChain",
547 "File: AliESDs.root not in ./data dir");
549 chain->Add("AliESDs.root");
550 if (chain->GetNtrees()) return chain;
555 * Helper function to make @c outputs_valid file
558 void ValidateOutput()
561 out.open("outputs_valid", ios::out);
564 //====================================================================
568 * @param dir Directory
569 * @param stage The merging stage
571 void AODMerge(const char* dir, Int_t stage)
573 // Merging method. No staging and no terminate phase.
574 TStopwatch timer; timer.Start();
575 TString outputDir = dir;
576 TObjArray outputFiles;
577 // outputFiles.Add(new TObjString("EventStat_temp.root"));
578 outputFiles.Add(new TObjString("AODQA.root"));
579 outputFiles.Add(new TObjString("pyxsec_hists.root"));
581 Bool_t mergeTrees = stage <= 1;
583 outputFiles.Add(new TObjString("AliAOD.root"));
584 if (aodCfg->UsePWGHFvertexing())
585 outputFiles.Add(new TObjString("AliAOD.VertexingHF.root"));
586 if (aodCfg->UseESDfilter() &&
587 aodCfg->UseMUONcopyAOD() &&
589 outputFiles.Add(new TObjString("AliAOD.Muons.root"));
590 if (aodCfg->UseJETAN())
591 outputFiles.Add(new TObjString("AliAOD.Jets.root"));
592 if (aodCfg->UsePWGDQJPSIfilter())
593 outputFiles.Add(new TObjString("AliAOD.Dielectron.root"));
596 TString mergeExcludes = "";
597 TIter iter(&outputFiles);
599 Bool_t merged = kTRUE;
600 while ((str = static_cast<TObjString*>(iter()))) {
601 TString& outputFile = str->GetString();
602 // Skip already merged outputs
603 if (!gSystem->AccessPathName(outputFile)) {
604 ::Warning("Merge","Output file <%s> found. Not merging again.",
608 if (mergeExcludes.Contains(outputFile.Data())) continue;
609 merged = AliAnalysisAlien::MergeOutput(outputFile,
614 ::Error("Merge", "Cannot merge %s\n", outputFile.Data());
619 // all outputs merged, validate
620 if (!outputDir.Contains("stage")) {
626 // --- set up to run terminate -------------------------------------
627 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
628 mgr->SetSkipTerminate(kFALSE);
629 if (!mgr->InitAnalysis()) return;
632 mgr->SetGridHandler(new AliAnalysisAlien);
633 mgr->StartAnalysis("gridterminate",0);
639 //====================================================================
641 * Set-up and run AOD train
643 * @param run Run number
644 * @param xmlfile Collection
647 void AOD(UInt_t run, const char* xmlfile=0, Int_t stage=0)
649 TString host(gSystem->HostName());
650 cholm = host.BeginsWith("hehi");
651 if (cholm) TGrid::Connect("alien:");
653 // -----------------------------------------------------------------
655 // Get GRP parameters. Defines global "grp" as a pointer to GRPData
657 gROOT->Macro(Form("GRP.C(%d)", run));
658 gROOT->Macro("AODConfig.C");
659 gROOT->Macro("BaseConfig.C");
660 gROOT->Macro("DetConfig.C");
662 // --- Some settings -----------------------------------------------
663 // Set temporary merging directory to current one
664 gSystem->Setenv("TMPDIR", gSystem->pwd());
665 // Set temporary compilation directory to current one
666 gSystem->SetBuildDir(gSystem->pwd(), kTRUE);
668 // --- Friendly message --------------------------------------------
669 printf("===================================================\n");
670 printf("=========== RUNNING FILTERING TRAIN ==========\n");
671 printf("===================================================\n");
672 printf("= Configuring analysis train for:\n");
675 // Load common libraries and set include path
676 if (!LoadCommonLibraries()) {
677 ::Error("AnalysisTrain", "Could not load common libraries");
681 // === Make the analysis manager and connect event handlers ========
683 // --- Analysis manager and load libraries -------------------------
684 AliAnalysisManager *mgr = new AliAnalysisManager("Filter","Production train");
685 mgr->SetRunFromPath(grp->run);
686 if (aodCfg->UseSysInfo()) mgr->SetNSysInfo(100);
687 if (!LoadAnalysisLibraries()) {
688 ::Error("AnalysisTrain", "Could not load analysis libraries");
692 // --- Create ESD input handler ------------------------------------
693 AliESDInputHandler *esdHandler = new AliESDInputHandler();
694 mgr->SetInputEventHandler(esdHandler);
696 // --- Monte Carlo handler -----------------------------------------
697 if (aodCfg->UseMC()) {
698 AliMCEventHandler* mcHandler = new AliMCEventHandler();
699 mgr->SetMCtruthEventHandler(mcHandler);
700 mcHandler->SetPreReadMode(1);
701 mcHandler->SetReadTR(aodCfg->UseTR());
704 // --- AOD output handler ------------------------------------------
705 if (aodCfg->UseAODhandler()) {
706 AliAODHandler* aodHandler = new AliAODHandler();
707 aodHandler->SetOutputFileName("AliAOD.root");
708 mgr->SetOutputEventHandler(aodHandler);
711 // === Set up tasks ================================================
713 // --- Create tasks ------------------------------------------------
714 AddAnalysisTasks(cdbPath);
716 // --- Debugging if needed -----------------------------------------
717 if (aodCfg->UseDBG()) mgr->SetDebugLevel(3);
720 // --- If merging, do so here and exit -----------------------------
722 AODMerge(xmlfile, stage);
725 // === Run the analysis ============================================
727 // --- Make our chain ----------------------------------------------
728 TChain *chain = CreateChain();
731 // --- Run the thing -----------------------------------------------
734 if (!mgr->InitAnalysis()) return;
738 mgr->SetSkipTerminate(kTRUE);
739 mgr->StartAnalysis("local", chain);