3 * @author Christian Holm Christensen <cholm@nbi.dk>
4 * @date Wed Sep 24 15:04:38 2014
6 * @brief Master script for QA train
8 * @note Do not modify this script.
11 * This script reads in 4 other scripts
13 * - GRP.C to load the global run parameters for the selected run,
14 * such as collision system, energy, etc.
16 * - AODConfig.C which defines a number of functions that return
17 * either true or false. The tasks added depends on these functions
19 * - BaseConfig.C which defines some base classes
21 * - DetConfig.C which defines which detectors are active and on.
23 * Users can customize QAConfig.C and DetConfig.C according to their
27 UInt_t kTriggerInt = AliVEvent::kAnyINT;
28 UInt_t kTriggerMuonAll = (AliVEvent::kMUL7 |
34 AliVEvent::kMuonLikePB |
35 AliVEvent::kMuonUnlikePB);
36 UInt_t kTriggerMuonBarell = AliVEvent::kMUU7;
37 UInt_t kTriggerEMC = (AliVEvent::kEMC7 |
41 UInt_t kTriggerHM = AliVEvent::kHighMult;
42 UInt_t kTriggerMask = kTriggerInt;
45 * Interface (pure virtual) that all configuration classes must
51 virtual Bool_t DoCDBconnect() const = 0;
53 virtual Bool_t DoEventStat() const = 0;
55 virtual Bool_t DoCentrality() const = 0;
57 virtual Bool_t DoQAsym() const = 0;
58 /** @return there is a 2nd file */
59 virtual Bool_t DoVZERO() const = 0;
61 virtual Bool_t DoVZEROPbPb() const = 0;
63 virtual Bool_t DoVertex() const = 0;
64 /** @return needs RP */
65 virtual Bool_t DoSPD() const = 0;
67 virtual Bool_t DoTPC() const = 0;
69 virtual Bool_t DoHLT() const = 0;
70 /** @return needs RP */
71 virtual Bool_t DoSDD() const = 0;
73 virtual Bool_t DoSSDdEdx() const = 0;
75 virtual Bool_t DoTRD() const = 0;
77 virtual Bool_t DoITS() const = 0;
79 virtual Bool_t DoITSsaTracks() const = 0;
81 virtual Bool_t DoITSalign() const = 0;
83 virtual Bool_t DoCALO() const = 0;
85 virtual Bool_t DoMUONTrig() const = 0;
87 virtual Bool_t DoImpParRes() const = 0;
89 virtual Bool_t DoMUON() const = 0;
91 virtual Bool_t DoTOF() const = 0;
93 virtual Bool_t DoHMPID() const = 0;
95 virtual Bool_t DoT0() const = 0;
97 virtual Bool_t DoZDC() const = 0;
99 virtual Bool_t DoPIDResponse() const = 0;
101 virtual Bool_t DoPIDqa() const = 0;
103 virtual Bool_t DoFWD() const = 0;
105 virtual Bool_t DoPHOS() const = 0;
107 virtual Bool_t DoPHOSTrig() const = 0;
109 virtual Bool_t DoEMCAL() const = 0;
111 virtual Bool_t DoFBFqa() const = 0;
112 /** @return NEEDS geometry */
113 virtual Bool_t DoMUONEff() const = 0;
114 /** @return NEEDS MCtruth */
115 virtual Bool_t DoV0() const = 0;
116 /** @return Get Debug level */
117 virtual Int_t DebugLevel() const = 0;
119 virtual void PrintOne(const char* title, Bool_t use) const
121 Printf("%-30s : %3s", title, use ? "yes" : "no");
123 virtual void Print() const
125 PrintOne("CDBconnect ", DoCDBconnect());
126 PrintOne("EventStat ", DoEventStat());
127 PrintOne("Centrality ", DoCentrality());
128 PrintOne("QAsym ", DoQAsym());
129 PrintOne("VZERO", DoVZERO());
130 PrintOne("VZEROPbPb ", DoVZEROPbPb());
131 PrintOne("Vertex ", DoVertex());
132 PrintOne("SPD needs RP ", DoSPD());
133 PrintOne("TPC ", DoTPC());
134 PrintOne("HLT ", DoHLT());
135 PrintOne("SDD needs RP", DoSDD());
136 PrintOne("SSDdEdx ", DoSSDdEdx());
137 PrintOne("TRD ", DoTRD());
138 PrintOne("ITS ", DoITS());
139 PrintOne("ITSsaTracks ", DoITSsaTracks());
140 PrintOne("ITSalign ", DoITSalign());
141 PrintOne("CALO ", DoCALO());
142 PrintOne("MUONTrig ", DoMUONTrig());
143 PrintOne("ImpParRes ", DoImpParRes());
144 PrintOne("MUON ", DoMUON());
145 PrintOne("TOF ", DoTOF());
146 PrintOne("HMPID ", DoHMPID());
147 PrintOne("T0 ", DoT0());
148 PrintOne("ZDC ", DoZDC());
149 PrintOne("PIDResponse ", DoPIDResponse());
150 PrintOne("PIDqa ", DoPIDqa());
151 PrintOne("FWD ", DoFWD());
152 PrintOne("PHOS ", DoPHOS());
153 PrintOne("PHOSTrig ", DoPHOSTrig());
154 PrintOne("EMCAL ", DoEMCAL());
155 PrintOne("FBFqa ", DoFBFqa());
156 PrintOne("MUONEff NEEDS geometry", DoMUONEff());
157 PrintOne("V0 NEEDS MCtruth ", DoV0());
160 VirtualQACfg* qaCfg = 0;
162 //====================================================================
164 * Load the needed libraries
169 Bool_t is10h = grp->period.EqualTo("LHC10h",TString::kIgnoreCase);
170 gSystem->SetIncludePath("-I. "
171 "-I$ROOTSYS/include "
172 "-I$ALICE_ROOT/include "
176 "-I$ALICE_ROOT/PWGPP "
177 "-I$ALICE_ROOT/PWGPP/TRD");
178 gSystem->Load("libANALYSIS");
179 gSystem->Load("libANALYSISalice");
180 gSystem->Load("libOADB");
181 gSystem->Load("libESDfilter");
182 gSystem->Load("libCORRFW");
183 gSystem->Load("libTender");
184 gSystem->Load("libPWGPP");
185 gSystem->Load("libAliHLTTrigger");
187 if ((qaCfg->DoEMCAL() && detCfg->UseEMCAL()) ||
188 ((qaCfg->DoPHOS() || qaCfg->DoPHOSTrig()) && detCfg->UsePHOS()) ||
189 (qaCfg->DoCALO() && !is10h)) {
190 gSystem->Load("libEMCALUtils");
191 gSystem->Load("libPHOSUtils");
192 gSystem->Load("libPWGCaloTrackCorrBase");
193 gSystem->Load("libPWGGACaloTrackCorrelations");
194 gSystem->Load("libPWGGACaloTasks");
195 gSystem->Load("libPWGGAPHOSTasks");
196 gSystem->Load("libPWGTools");
197 gSystem->Load("libPWGEMCAL");
198 gSystem->Load("libPWGGAEMCALTasks");
200 if((qaCfg->DoMUON() || qaCfg->DoMUONTrig()) && detCfg->UseMUON()) {
201 gSystem->Load("libPWGmuon");
202 gSystem->Load("libPWGPPMUONlite");
203 gSystem->Load("libPWGmuondep");
205 if (qaCfg->DoFWD() && detCfg->UseFMD()) {
206 gSystem->Load("libPWGLFforward2");
210 //====================================================================
212 * Add the analysis tasks
214 * @param cdb_location
216 void AddAnalysisTasks(const char *cdb_location)
218 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
219 mgr->SetCommonFileName("QAresults.root");
221 Bool_t is10h = grp->period.EqualTo("LHC10h",TString::kIgnoreCase);
222 // --- Some short-hands --------------------------------------------
223 TString ali = "$ALICE_ROOT";
224 TString ana = ali + "/ANALYSIS";
225 TString oadb = ali + "/OADB";
226 TString pwghf = ali + "/PWGHF";
227 TString pwglf = ali + "/PWGLF";
228 TString pwgje = ali + "/PWGJE";
229 TString pwgdq = ali + "/PWGDQ";
230 TString pwgpp = ali + "/PWGPP";
231 TString pwgga = ali + "/PWGGA";
233 // --- Statistics task ---------------------------------------------
234 mgr->AddStatisticsTask(kTriggerMask);
236 // --- CDB connection ----------------------------------------------
237 if (qaCfg->DoCDBconnect()) {
238 gROOT->LoadMacro(pwgpp+"/PilotTrain/AddTaskCDBconnect.C");
239 AliTaskCDBconnect *taskCDB = AddTaskCDBconnect(cdb_location, grp->run);
240 if (!taskCDB) return;
243 // --- Event Statistics (Jan Fiete) --------------------------------
244 if (qaCfg->DoEventStat()) {
245 gROOT->LoadMacro(oadb+"/macros/AddTaskPhysicsSelection.C");
246 AliPhysicsSelectionTask* physSelTask = AddTaskPhysicsSelection(kTRUE/*MC*/);
247 // Hack by Alexander for LHC10h
248 // gROOT->LoadMacro("LHC10hPS.C");
249 // AliOADBPhysicsSelection* ops = LHC10hPS(grp->period, grp->run);
251 // physSelTask->GetPhysicsSelection()->SetCustomOADBObjects(ops,0);
253 // --- PIDResponse(JENS) -------------------------------------------
254 if (qaCfg->DoPIDResponse() && !is10h) {
255 gROOT->LoadMacro(ana+"/macros/AddTaskPIDResponse.C");
256 AliAnalysisTaskPIDResponse *PIDResponse = AddTaskPIDResponse(kTRUE);
257 PIDResponse->SelectCollisionCandidates(kTriggerMask);
259 // --- Centrality (A. Toia) ----------------------------------------
260 if (qaCfg->DoCentrality()) {
261 gROOT->LoadMacro(oadb+"/macros/AddTaskCentrality.C");
262 AliCentralitySelectionTask *taskCentrality = AddTaskCentrality();
263 taskCentrality->SetMCInput();
266 // --- Vertexing (A. Dainese) --------------------------------------
267 if (qaCfg->DoVertex()) {
268 gROOT->LoadMacro(pwgpp+"/macros/AddTaskVertexESD.C");
269 // Specific setting for MC
270 AliAnalysisTaskVertexESD* taskvertexesd =
271 AddTaskVertexESD(kTRUE, kTriggerMask);
272 taskvertexesd->SelectCollisionCandidates(kTriggerMask);
275 // --- TPC QA (E. Sicking) -----------------------------------------
276 if (qaCfg->DoQAsym()) {
277 // offline trigger in AddTask
278 gROOT->LoadMacro(pwgpp+"/PilotTrain/AddTaskQAsym.C");
279 AliAnalysisTaskSE * taskqasim = AddTaskQAsym(0,
285 // --- VZERO QA (C. Cheshkov) -------------------------------------
286 if (qaCfg->DoVZERO() && detCfg->UseVZERO()) {
287 gROOT->LoadMacro(pwgpp+"/PilotTrain/AddTaskVZEROQA.C");
288 AliAnalysisTaskSE * taskv0qa = AddTaskVZEROQA(0);
290 if (qaCfg->DoVZEROPbPb() && detCfg->UseVZERO() && grp->IsAA()) {
291 gROOT->LoadMacro(pwgpp+"/VZERO/AddTaskVZEROPbPb.C");
292 AliAnaVZEROPbPb* taskV0PbPb =
293 (AliAnaVZEROPbPb*)AddTaskVZEROPbPb(Int_t(grp->run));
295 // --- TPC (Jacek Otwinowski & Michael Knichel) --------------------
298 // - Optionally MC information can be used by setting the 1st
300 // - Optionally friends information can be switched off by setting
301 // the 2st argument to false
302 // - Optionally highMult axis can be used by setting the 3st
303 // argument to true (for PbPb)
304 if (qaCfg->DoTPC() && detCfg->UseTPC()) {
305 gROOT->LoadMacro(pwgpp+"/TPC/macros/AddTaskPerformanceTPCdEdxQA.C");
306 AliPerformanceTask *tpcQA = 0;
308 // High multiplicity Pb-Pb
309 tpcQA = AddTaskPerformanceTPCdEdxQA(kTRUE, kTRUE, kTRUE);
311 // Low multiplicity (pp)
312 tpcQA = AddTaskPerformanceTPCdEdxQA(kTRUE, kTRUE, kFALSE);
314 tpcQA->SelectCollisionCandidates(kTriggerMask);
315 AliPerformanceRes::SetMergeEntriesCut(5000000);
318 // --- HLT (Alberica Toia) -----------------------------------------
319 if (qaCfg->DoHLT() && detCfg->UseTPC()) {
320 gROOT->LoadMacro(pwgpp+"/TPC/macros/AddTaskPerformanceTPCdEdxQA.C");
321 AliPerformanceTask *hltQA = AddTaskPerformanceTPCdEdxQA(kTRUE, kTRUE,
323 hltQA->SelectCollisionCandidates(kTriggerMask);
325 // --- SPD (A. Mastroserio) ----------------------------------------
326 if (qaCfg->DoSPD() && detCfg->UseITS()) {
327 gROOT->LoadMacro(pwgpp+"/PilotTrain/AddTaskSPDQA.C");
328 AliAnalysisTaskSPD* taskspdqa = (AliAnalysisTaskSPD*)AddTaskSPDQA();
329 // Request from Annalisa
330 if (grp->IsAA()) taskspdqa->SetHeavyIonMode();
331 taskspdqa->SelectCollisionCandidates(kTriggerMask);
332 taskspdqa->SetOCDBInfo(grp->run, "raw://");
334 // --- SDD (F. Prino) ----------------------------------------------
335 if (qaCfg->DoSDD() && detCfg->UseITS()) {
336 gROOT->LoadMacro(pwgpp+"/PilotTrain/AddSDDPoints.C");
337 AliAnalysisTaskSE* tasksdd = AddSDDPoints();
338 tasksdd->SelectCollisionCandidates(kTriggerMask);
340 // --- SSD dEdx (Marek Chojnacki) ----------------------------------
341 if (qaCfg->DoSSDdEdx() && detCfg->UseITS()) {
342 gROOT->LoadMacro(pwgpp+"/PilotTrain/AddTaskdEdxSSDQA.C");
343 AliAnalysisTaskSE* taskssddedx = AddTaskdEdxSSDQA();
344 taskssddedx->SelectCollisionCandidates(kTriggerMask);
347 // --- ITS ---------------------------------------------------------
348 if (qaCfg->DoITS() && detCfg->UseITS()) {
349 // hardcoded non-zero trigger mask
350 gROOT->LoadMacro(pwgpp+"/macros/AddTaskPerformanceITS.C");
351 AliAnalysisTaskITSTrackingCheck *itsQA = 0;
352 AliAnalysisTaskITSTrackingCheck *itsQACent0010 = 0;
353 AliAnalysisTaskITSTrackingCheck *itsQACent3050 = 0;
354 AliAnalysisTaskITSTrackingCheck *itsQACent6080 = 0;
356 itsQA = AddTaskPerformanceITS(kTRUE);
358 itsQA = AddTaskPerformanceITS(kTRUE);
359 itsQACent0010 = AddTaskPerformanceITS(kTRUE,kFALSE,kFALSE,3500,10000);
360 itsQACent3050 = AddTaskPerformanceITS(kTRUE,kFALSE,kFALSE,590,1570);
361 itsQACent6080 = AddTaskPerformanceITS(kTRUE,kFALSE,kFALSE,70,310);
364 // --- ITS saTracks, align (F.Prino) -------------------------------
365 if (qaCfg->DoITSsaTracks() && detCfg->UseITS()) {
366 // offline trigger in AddTask
367 gROOT->LoadMacro(pwgpp+"/macros/AddTaskITSsaTracks.C");
368 AliAnalysisTaskITSsaTracks *itssaTracks = AddTaskITSsaTracks(kTRUE,kFALSE);
369 itssaTracks->SelectCollisionCandidates(kTriggerMask);
371 if (qaCfg->DoITSalign() && detCfg->UseITS()) {
372 // no offline trigger selection
373 gROOT->LoadMacro(pwgpp+"/macros/AddTaskITSAlign.C");
374 AliAnalysisTaskITSAlignQA *itsAlign = AddTaskITSAlign(0,2011);
377 // --- TRD (Alex Bercuci, M. Fasel) --------------------------------
378 if(qaCfg->DoTRD() && detCfg->UseTRD()) {
379 // no offline trigger selection
380 gROOT->LoadMacro(pwgpp+"/macros/AddTrainPerformanceTRD.C");
381 // steer individual TRD tasks
383 doCheckESD(kTRUE), // AliTRDcheckESD
384 doCheckDET(kTRUE), // AliTRDcheckDET
385 doEffic(kTRUE), // AliTRDefficiency
386 doResolution(kTRUE),// AliTRDresolution
387 doCheckPID(kTRUE), // AliTRDcheckPID
388 doV0Monitor(kFALSE);// AliTRDv0Monitor
389 AddTrainPerformanceTRD(Translate(doCheckESD, doCheckDET, doEffic,
390 doResolution, doCheckPID, doV0Monitor));
393 // --- ZDC (Chiara Oppedisano) -------------------------------------
394 if(qaCfg->DoZDC() && detCfg->UseZDC()) {
395 // hardcoded kMB trigger mask
396 gROOT->LoadMacro(pwgpp+"/ZDC/AddTaskZDCQA.C");
397 AliAnalysisTaskSE *taskZDC = AddTaskZDCQA();
398 taskZDC->SelectCollisionCandidates(kTriggerMask);
401 // --- Calorimetry (Gustavo Conesa) --------------------------------
402 if(qaCfg->DoCALO() && !is10h) {
403 gROOT->LoadMacro(pwgga+
404 "/CaloTrackCorrelations/macros/QA/AddTaskCalorimeterQA.C");
405 AliAnalysisTaskCaloTrackCorrelation *taskCaloQA =
406 AddTaskCalorimeterQA("default");
407 taskCaloQA->SetDebugLevel(0);
408 // offline mask set in AddTask to kMB
409 taskCaloQA->SelectCollisionCandidates(kTriggerMask);
410 // Add a new calo task with EMC1 trigger only
412 taskCaloQA = AddTaskCalorimeterQA("trigEMC");
413 taskCaloQA->SetDebugLevel(0);
414 taskCaloQA->SelectCollisionCandidates(kTriggerEMC);
418 // --- Muon Trigger ------------------------------------------------
419 if(qaCfg->DoMUONTrig() && detCfg->UseMUON()) {
420 // no offline trigger selection
421 gROOT->LoadMacro(pwgpp+"/macros/AddTaskMTRchamberEfficiency.C");
422 AliAnalysisTaskTrigChEff *taskMuonTrig = AddTaskMTRchamberEfficiency();
425 // --- Muon Efficiency (not used) ----------------------------------
426 if(qaCfg->DoMUONEff() && detCfg->UseMUON()) {
427 gROOT->LoadMacro(ali+"/PWG3/muondep/AddTaskMUONTrackingEfficiency.C");
428 AliAnalysisTaskMuonTrackingEff *taskMuonTrackEff =
429 AddTaskMUONTrackingEfficiency();
432 // --- V0-Decay Reconstruction (Ana Marin) (not used) --------------
434 gROOT->LoadMacro(pwgpp+"/macros/AddTaskV0QA.C");
435 AliAnalysisTaskV0QA *taskv0QA = AddTaskV0QA(kTRUE);
438 // -- Impact parameter resolution ----------------------------------
439 // (xianbao.yuan@pd.infn.it, andrea.dainese@pd.infn.it)
440 if (qaCfg->DoImpParRes()) {
441 gROOT->LoadMacro(pwgpp+"/macros/AddTaskImpParRes.C");
442 AliAnalysisTaskSE* taskimpparres=0;
443 // Specific setting for MC
445 taskimpparres= AddTaskImpParRes(kTRUE);
447 taskimpparres= AddTaskImpParRes(kTRUE,-1,kTRUE,kFALSE);
449 taskimpparres->SelectCollisionCandidates(kTriggerMask);
452 // --- MUON QA (Philippe Pillot) -----------------------------------
453 if (qaCfg->DoMUON() && detCfg->UseMUON()) {
454 // trigger analysis internal
455 gROOT->LoadMacro(pwgpp+"/PilotTrain/AddTaskMuonQA.C");
456 AliAnalysisTaskSE* taskmuonqa= AddTaskMuonQA();
459 // --- TOF (Francesca Bellini) -------------------------------------
460 if (qaCfg->DoTOF() && detCfg->UseTOF()) {
461 gROOT->LoadMacro(pwgpp+"/TOF/AddTaskTOFQA.C");
462 AliAnalysisTaskTOFqa *tofQA = AddTaskTOFQA(kFALSE);
463 tofQA->SelectCollisionCandidates(kTriggerMask);
466 // --- PIDqa(JENS) -------------------------------------------------
467 if (qaCfg->DoPIDqa() && !is10h) {
468 gROOT->LoadMacro(ana+"/macros/AddTaskPIDqa.C");
469 AliAnalysisTaskPIDqa *PIDQA = AddTaskPIDqa();
470 PIDQA->SelectCollisionCandidates(kTriggerMask);
473 // --- HMPID QA (Giacomo Volpe) ------------------------------------
475 if (qaCfg->DoHMPID() && detCfg->UseHMPID()) {
476 gROOT->LoadMacro(pwgpp+"/HMPID/AddTaskHmpidQA.C");
477 AliAnalysisTaskSE* taskhmpidqa= AddTaskHmpidQA(kTRUE);
478 // offline mask set in AddTask to kMB
479 taskhmpidqa->SelectCollisionCandidates(kTriggerMask);
482 // --- T0 QA (Alla Mayevskaya) -------------------------------------
483 if (qaCfg->DoT0() && detCfg->UseT0()) {
484 // no offline trigger selection
485 gROOT->LoadMacro(pwgpp+"/T0/AddTaskT0QA.C");
486 AliT0AnalysisTaskQA* taskt0qa= AddTaskT0QA();
487 taskt0qa->SelectCollisionCandidates(kTriggerMask);
490 // ---- FMD QA (Christian Holm Christiansen) -----------------------
491 if (qaCfg->DoFWD() && detCfg->UseFMD()) {
492 gROOT->LoadMacro(pwglf+"/FORWARD/analysis2/AddTaskForwardQA.C");
493 // Parameters: usemc, usecentrality
494 // AliAnalysisTaskSE *forwardQA = (AliAnalysisTaskSE *)
495 AddTaskForwardQA(kTRUE, qaCfg->DoCentrality());
496 // HACK: to read corrections from current directory
497 const char* hack="AliForwardCorrectionManager::Instance().SetPrefix(\".\")";
498 gROOT->ProcessLine(hack);
499 const char* hack2="AliForwardCorrectionManager::Instance().Print(\"R\")";
500 gROOT->ProcessLine(hack2);
501 // No offline trigger config. needed (see #84077)
504 // --- PHOS QA (Boris Polishchuk) ----------------------------------
505 if (qaCfg->DoPHOS()&& detCfg->UsePHOS()) {
506 gROOT->LoadMacro(pwgga+"/PHOSTasks/CaloCellQA/macros/AddTaskCaloCellsQA.C");
507 AliAnalysisTaskCaloCellsQA *taskPHOSCellQA1 =
508 AddTaskCaloCellsQA(4, 1, NULL,"PHOSCellsQA_AnyInt");
509 taskPHOSCellQA1->SelectCollisionCandidates(kTriggerMask);
510 taskPHOSCellQA1->GetCaloCellsQA()->SetClusterEnergyCuts(0.3,0.3,1.0);
512 AliAnalysisTaskCaloCellsQA *taskPHOSCellQA2 =
513 AddTaskCaloCellsQA(4, 1, NULL,"PHOSCellsQA_PHI7");
514 taskPHOSCellQA2->SelectCollisionCandidates(AliVEvent::kPHI7);
515 taskPHOSCellQA2->GetCaloCellsQA()->SetClusterEnergyCuts(0.3,0.3,1.0);
519 gROOT->LoadMacro(pwgga+"/PHOSTasks/PHOS_PbPbQA/macros/AddTaskPHOSPbPb.C");
520 AliAnalysisTaskPHOSPbPbQA* phosPbPb = AddTaskPHOSPbPbQA(0);
523 if (qaCfg->DoPHOSTrig() && detCfg->UsePHOS()) {
524 gROOT->LoadMacro(pwgga+
525 "/PHOSTasks/PHOS_TriggerQA/macros/AddTaskPHOSTriggerQA.C");
526 AliAnalysisTaskPHOSTriggerQA *taskPHOSTrig = AddTaskPHOSTriggerQA(0,0);
529 // --- EMCAL QA (Gustavo Conesa) -----------------------------------
530 if (qaCfg->DoEMCAL() && detCfg->UseEMCAL()) {
531 gROOT->LoadMacro(pwgga+"/EMCALTasks/macros/AddTaskEMCALTriggerQA.C");
532 AliAnalysisTaskEMCALTriggerQA *emctrig = AddTaskEMCALTriggerQA();
535 // --- FLOW and BF QA (C.Perez && A.Rodriguez) ---------------------
536 if (qaCfg->DoFBFqa()) {
537 gROOT->LoadMacro(pwgpp+"/macros/AddTaskFBFqa.C");
538 AliAnalysisTaskSE *qaFBFMB = (AliAnalysisTaskSE*)AddTaskFBFqa("qaFBFmb",
540 qaFBFMB->SelectCollisionCandidates(AliVEvent::kMB);
541 AliAnalysisTaskSE *qaFBFSC = (AliAnalysisTaskSE*)AddTaskFBFqa("qaFBFsc",
543 qaFBFSC->SelectCollisionCandidates(AliVEvent::kSemiCentral);
544 AliAnalysisTaskSE *qaFBFCE = (AliAnalysisTaskSE*)AddTaskFBFqa("qaFBFce",
546 qaFBFCE->SelectCollisionCandidates(AliVEvent::kCentral);
550 * Helper function to make @c outputs_valid file
553 void ValidateOutput()
556 out.open("outputs_valid", ios::out);
560 //====================================================================
564 * @param dir directory
567 void QAMerge(const char *dir, Int_t stage)
570 TStopwatch timer; timer.Start();
571 TString outputDir = dir;
572 TObjArray outputFiles;
573 outputFiles.Add(new TObjString("QAresults.root"));
574 outputFiles.Add(new TObjString("EventStat_temp.root"));
576 TString mergeExcludes = "";
577 TIter iter(&outputFiles);
579 Bool_t merged = kTRUE;
580 while((str = static_cast<TObjString*>(iter()))) {
581 TString& outputFile = str->GetString();
582 // Skip already merged outputs
583 if (!gSystem->AccessPathName(outputFile)) {
584 ::Warning("Merge","Output file <%s> found. Not merging again.",
588 if (mergeExcludes.Contains(outputFile.Data())) continue;
589 merged = AliAnalysisAlien::MergeOutput(outputFile,
594 ::Error("Merge", "Cannot merge %s\n", outputFile.Data());
598 TString infolog = "fileinfo.log";
599 AliAnalysisAlien::MergeInfo(infolog, dir);
601 if (!outputDir.Contains("Stage")) {
606 // --- Set up to run terminate -------------------------------------
607 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
608 mgr->SetSkipTerminate(kFALSE);
609 if (!mgr->InitAnalysis()) return;
612 mgr->StartAnalysis("gridterminate", (TTree*)0);
617 //====================================================================
621 * @param run Run number
622 * @param xmlfile Collection file
624 * @param cdb CDB location
627 const char* xmlfile = "wn.xml",
628 Int_t stage = 0, /*0 = QA train, 1...n - merging stage*/
629 const char* cdb = "raw://")
631 // -----------------------------------------------------------------
633 // Get GRP parameters. Defines global "grp" as a pointer to GRPData
635 gROOT->Macro(Form("GRP.C(%d)", run));
636 gROOT->Macro("BaseConfig.C");
637 gROOT->Macro("QAConfig.C");
638 gROOT->Macro("DetConfig.C");
640 Int_t debug_level = qaCfg->DebugLevel(); // Debugging
641 TString cdbString(cdb);
642 if (cdbString.Contains("raw://")) {
643 TGrid::Connect("alien://");
644 if (!gGrid || !gGrid->IsConnected()) {
645 ::Error("QAtrain", "No grid connection");
650 // --- Some settings -----------------------------------------------
651 // Set temporary merging directory to current one
652 gSystem->Setenv("TMPDIR", gSystem->pwd());
653 // Set temporary compilation directory to current one
654 gSystem->SetBuildDir(gSystem->pwd(), kTRUE);
655 // Load common libraries and set include path
657 printf("Include path: %s\n", gSystem->GetIncludePath());
659 // === Make the analysis manager and connect event handlers ========
661 // --- Analysis manager and load libraries -------------------------
662 AliAnalysisManager *mgr = new AliAnalysisManager("QA", "Production train");
663 mgr->SetRunFromPath(grp->run);
665 // --- Create ESD input handler ------------------------------------
666 AliESDInputHandlerRP *esdHandler = new AliESDInputHandlerRP();
667 esdHandler->SetReadFriends(kTRUE);
668 esdHandler->SetActiveBranches("ESDfriend");
669 mgr->SetInputEventHandler(esdHandler);
671 // --- Monte Carlo handler -----------------------------------------
673 AliMCEventHandler* mcHandler = new AliMCEventHandler();
674 mgr->SetMCtruthEventHandler(mcHandler);
675 mcHandler->SetPreReadMode(1);
676 mcHandler->SetReadTR(true);
679 // === Set up tasks ================================================
681 // --- Create tasks ------------------------------------------------
682 AddAnalysisTasks(cdb);
684 // --- Debugging if needed -----------------------------------------
685 if (debug_level > 0) mgr->SetDebugLevel(debug_level);
687 // --- If merging, do so here and exit -----------------------------
689 QAMerge(xmlfile, stage);
693 // === Run the analysis ============================================
695 // --- Make our chain ----------------------------------------------
696 TChain *chain = new TChain("esdTree");
697 chain->Add("AliESDs.root");
699 // --- Run the thing -----------------------------------------------
702 if (!mgr->InitAnalysis()) return;
705 mgr->SetSkipTerminate(kTRUE);
707 mgr->StartAnalysis("local", chain);