]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGLF/FORWARD/analysis2/sim/QA.C
Merge branch 'feature-movesplit'
[u/mrichter/AliRoot.git] / PWGLF / FORWARD / analysis2 / sim / QA.C
CommitLineData
f8b7a926 1/**
2 * @file QA.C
3 * @author Christian Holm Christensen <cholm@nbi.dk>
4 * @date Wed Sep 24 15:04:38 2014
5 *
6 * @brief Master script for QA train
7 *
8 * @note Do not modify this script.
9 *
10 *
421f877c 11 * This script reads in 4 other scripts
f8b7a926 12 *
13 * - GRP.C to load the global run parameters for the selected run,
14 * such as collision system, energy, etc.
15 *
16 * - AODConfig.C which defines a number of functions that return
17 * either true or false. The tasks added depends on these functions
421f877c 18 *
19 * - BaseConfig.C which defines some base classes
20 *
21 * - DetConfig.C which defines which detectors are active and on.
f8b7a926 22 *
421f877c 23 * Users can customize QAConfig.C and DetConfig.C according to their
24 * needs
f8b7a926 25 */
26// Trigger mask.
27UInt_t kTriggerInt = AliVEvent::kAnyINT;
28UInt_t kTriggerMuonAll = (AliVEvent::kMUL7 |
29 AliVEvent::kMUSH7 |
30 AliVEvent::kMUU7 |
31 AliVEvent::kMUS7 |
32 AliVEvent::kMUSPB |
33 AliVEvent::kMUSHPB |
34 AliVEvent::kMuonLikePB |
35 AliVEvent::kMuonUnlikePB);
36UInt_t kTriggerMuonBarell = AliVEvent::kMUU7;
37UInt_t kTriggerEMC = (AliVEvent::kEMC7 |
38 AliVEvent::kEMC8 |
39 AliVEvent::kEMCEJE |
40 AliVEvent::kEMCEGA);
41UInt_t kTriggerHM = AliVEvent::kHighMult;
42UInt_t kTriggerMask = kTriggerInt;
43
44/**
45 * Interface (pure virtual) that all configuration classes must
46 * implement.
47 */
48struct VirtualQACfg
49{
50 /** @return */
51 virtual Bool_t DoCDBconnect() const = 0;
52 /** @return */
53 virtual Bool_t DoEventStat() const = 0;
54 /** @return */
55 virtual Bool_t DoCentrality() const = 0;
56 /** @return */
57 virtual Bool_t DoQAsym() const = 0;
58 /** @return there is a 2nd file */
59 virtual Bool_t DoVZERO() const = 0;
60 /** @return */
61 virtual Bool_t DoVZEROPbPb() const = 0;
62 /** @return */
63 virtual Bool_t DoVertex() const = 0;
64 /** @return needs RP */
65 virtual Bool_t DoSPD() const = 0;
66 /** @return */
67 virtual Bool_t DoTPC() const = 0;
68 /** @return */
69 virtual Bool_t DoHLT() const = 0;
70 /** @return needs RP */
71 virtual Bool_t DoSDD() const = 0;
72 /** @return */
73 virtual Bool_t DoSSDdEdx() const = 0;
74 /** @return */
75 virtual Bool_t DoTRD() const = 0;
76 /** @return */
77 virtual Bool_t DoITS() const = 0;
78 /** @return */
79 virtual Bool_t DoITSsaTracks() const = 0;
80 /** @return */
81 virtual Bool_t DoITSalign() const = 0;
82 /** @return */
83 virtual Bool_t DoCALO() const = 0;
84 /** @return */
85 virtual Bool_t DoMUONTrig() const = 0;
86 /** @return */
87 virtual Bool_t DoImpParRes() const = 0;
88 /** @return */
89 virtual Bool_t DoMUON() const = 0;
90 /** @return */
91 virtual Bool_t DoTOF() const = 0;
92 /** @return */
93 virtual Bool_t DoHMPID() const = 0;
94 /** @return */
95 virtual Bool_t DoT0() const = 0;
96 /** @return */
97 virtual Bool_t DoZDC() const = 0;
98 /** @return */
99 virtual Bool_t DoPIDResponse() const = 0;
100 /** @return */
101 virtual Bool_t DoPIDqa() const = 0;
102 /** @return */
103 virtual Bool_t DoFWD() const = 0;
104 /** @return */
105 virtual Bool_t DoPHOS() const = 0;
106 /** @return */
107 virtual Bool_t DoPHOSTrig() const = 0;
108 /** @return */
109 virtual Bool_t DoEMCAL() const = 0;
110 /** @return */
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;
ee275c29 118
119 virtual void PrintOne(const char* title, Bool_t use) const
120 {
121 Printf("%-30s : %3s", title, use ? "yes" : "no");
122 }
123 virtual void Print() const
124 {
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());
158 }
f8b7a926 159};
160VirtualQACfg* qaCfg = 0;
161
162//====================================================================
163/**
164 * Load the needed libraries
165 *
166 */
167void LoadLibraries()
168{
169 Bool_t is10h = grp->period.EqualTo("LHC10h",TString::kIgnoreCase);
170 gSystem->SetIncludePath("-I. "
171 "-I$ROOTSYS/include "
172 "-I$ALICE_ROOT/include "
173 "-I$ALICE_ROOT "
174 "-I$ALICE_ROOT/ITS "
175 "-I$ALICE_ROOT/TRD "
176 "-I$ALICE_ROOT/PWGPP "
177 "-I$ALICE_ROOT/PWGPP/TRD");
178 gSystem->Load("libANALYSIS");
179 gSystem->Load("libANALYSISalice");
180 gSystem->Load("libOADB");
4070f709 181 gSystem->Load("libESDfilter");
f8b7a926 182 gSystem->Load("libCORRFW");
af472fff 183 gSystem->Load("libTender");
4070f709 184 gSystem->Load("libPWGPP");
185 gSystem->Load("libAliHLTTrigger");
f8b7a926 186
ee275c29 187 if ((qaCfg->DoEMCAL() && detCfg->UseEMCAL()) ||
188 ((qaCfg->DoPHOS() || qaCfg->DoPHOSTrig()) && detCfg->UsePHOS()) ||
f8b7a926 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");
199 }
ee275c29 200 if((qaCfg->DoMUON() || qaCfg->DoMUONTrig()) && detCfg->UseMUON()) {
f8b7a926 201 gSystem->Load("libPWGmuon");
202 gSystem->Load("libPWGPPMUONlite");
203 gSystem->Load("libPWGmuondep");
204 }
ee275c29 205 if (qaCfg->DoFWD() && detCfg->UseFMD()) {
f8b7a926 206 gSystem->Load("libPWGLFforward2");
207 }
208}
209
210//====================================================================
211/**
212 * Add the analysis tasks
213 *
214 * @param cdb_location
215 */
216void AddAnalysisTasks(const char *cdb_location)
217{
218 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
219 mgr->SetCommonFileName("QAresults.root");
220
221 Bool_t is10h = grp->period.EqualTo("LHC10h",TString::kIgnoreCase);
222 // --- Some short-hands --------------------------------------------
223 TString ali = "$ALICE_ROOT";
224 TString ana = ali + "/ANALYSIS";
1c06a186 225 TString oadb = ali + "/OADB";
f8b7a926 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";
232
233 // --- Statistics task ---------------------------------------------
234 mgr->AddStatisticsTask(kTriggerMask);
235
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;
241 }
242
243 // --- Event Statistics (Jan Fiete) --------------------------------
244 if (qaCfg->DoEventStat()) {
63b6cbd0 245 gROOT->LoadMacro(oadb+"/macros/AddTaskPhysicsSelection.C");
f8b7a926 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);
250 // if (ops)
251 // physSelTask->GetPhysicsSelection()->SetCustomOADBObjects(ops,0);
252 }
253 // --- PIDResponse(JENS) -------------------------------------------
254 if (qaCfg->DoPIDResponse() && !is10h) {
255 gROOT->LoadMacro(ana+"/macros/AddTaskPIDResponse.C");
256 AliAnalysisTaskPIDResponse *PIDResponse = AddTaskPIDResponse(kTRUE);
257 PIDResponse->SelectCollisionCandidates(kTriggerMask);
258 }
259 // --- Centrality (A. Toia) ----------------------------------------
260 if (qaCfg->DoCentrality()) {
1c06a186 261 gROOT->LoadMacro(oadb+"/macros/AddTaskCentrality.C");
f8b7a926 262 AliCentralitySelectionTask *taskCentrality = AddTaskCentrality();
263 taskCentrality->SetMCInput();
264 }
265
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);
273 }
274
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,
280 kTriggerMask,
281 kTriggerHM,
282 kTriggerEMC,
283 kTriggerMuonBarell);
284 }
285 // --- VZERO QA (C. Cheshkov) -------------------------------------
ee275c29 286 if (qaCfg->DoVZERO() && detCfg->UseVZERO()) {
f8b7a926 287 gROOT->LoadMacro(pwgpp+"/PilotTrain/AddTaskVZEROQA.C");
288 AliAnalysisTaskSE * taskv0qa = AddTaskVZEROQA(0);
289 }
ee275c29 290 if (qaCfg->DoVZEROPbPb() && detCfg->UseVZERO() && grp->IsAA()) {
f8b7a926 291 gROOT->LoadMacro(pwgpp+"/VZERO/AddTaskVZEROPbPb.C");
292 AliAnaVZEROPbPb* taskV0PbPb =
293 (AliAnaVZEROPbPb*)AddTaskVZEROPbPb(Int_t(grp->run));
294 }
295 // --- TPC (Jacek Otwinowski & Michael Knichel) --------------------
296 //
297 //
298 // - Optionally MC information can be used by setting the 1st
299 // argument to true
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)
ee275c29 304 if (qaCfg->DoTPC() && detCfg->UseTPC()) {
f8b7a926 305 gROOT->LoadMacro(pwgpp+"/TPC/macros/AddTaskPerformanceTPCdEdxQA.C");
306 AliPerformanceTask *tpcQA = 0;
307 if (grp->IsAA()) {
308 // High multiplicity Pb-Pb
309 tpcQA = AddTaskPerformanceTPCdEdxQA(kTRUE, kTRUE, kTRUE);
310 } else {
311 // Low multiplicity (pp)
312 tpcQA = AddTaskPerformanceTPCdEdxQA(kTRUE, kTRUE, kFALSE);
313 }
314 tpcQA->SelectCollisionCandidates(kTriggerMask);
315 AliPerformanceRes::SetMergeEntriesCut(5000000);
316 }
317
318 // --- HLT (Alberica Toia) -----------------------------------------
ee275c29 319 if (qaCfg->DoHLT() && detCfg->UseTPC()) {
f8b7a926 320 gROOT->LoadMacro(pwgpp+"/TPC/macros/AddTaskPerformanceTPCdEdxQA.C");
ee275c29 321 AliPerformanceTask *hltQA = AddTaskPerformanceTPCdEdxQA(kTRUE, kTRUE,
322 kFALSE,0,kTRUE);
f8b7a926 323 hltQA->SelectCollisionCandidates(kTriggerMask);
324 }
325 // --- SPD (A. Mastroserio) ----------------------------------------
ee275c29 326 if (qaCfg->DoSPD() && detCfg->UseITS()) {
f8b7a926 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://");
333 }
334 // --- SDD (F. Prino) ----------------------------------------------
ee275c29 335 if (qaCfg->DoSDD() && detCfg->UseITS()) {
f8b7a926 336 gROOT->LoadMacro(pwgpp+"/PilotTrain/AddSDDPoints.C");
337 AliAnalysisTaskSE* tasksdd = AddSDDPoints();
338 tasksdd->SelectCollisionCandidates(kTriggerMask);
339 }
340 // --- SSD dEdx (Marek Chojnacki) ----------------------------------
ee275c29 341 if (qaCfg->DoSSDdEdx() && detCfg->UseITS()) {
f8b7a926 342 gROOT->LoadMacro(pwgpp+"/PilotTrain/AddTaskdEdxSSDQA.C");
343 AliAnalysisTaskSE* taskssddedx = AddTaskdEdxSSDQA();
344 taskssddedx->SelectCollisionCandidates(kTriggerMask);
345 }
346
347 // --- ITS ---------------------------------------------------------
ee275c29 348 if (qaCfg->DoITS() && detCfg->UseITS()) {
f8b7a926 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;
355 if(grp->IsPP()) {
356 itsQA = AddTaskPerformanceITS(kTRUE);
357 } else {
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);
362 }
363 }
364 // --- ITS saTracks, align (F.Prino) -------------------------------
ee275c29 365 if (qaCfg->DoITSsaTracks() && detCfg->UseITS()) {
f8b7a926 366 // offline trigger in AddTask
367 gROOT->LoadMacro(pwgpp+"/macros/AddTaskITSsaTracks.C");
368 AliAnalysisTaskITSsaTracks *itssaTracks = AddTaskITSsaTracks(kTRUE,kFALSE);
369 itssaTracks->SelectCollisionCandidates(kTriggerMask);
370 }
ee275c29 371 if (qaCfg->DoITSalign() && detCfg->UseITS()) {
f8b7a926 372 // no offline trigger selection
373 gROOT->LoadMacro(pwgpp+"/macros/AddTaskITSAlign.C");
374 AliAnalysisTaskITSAlignQA *itsAlign = AddTaskITSAlign(0,2011);
375 }
376
377 // --- TRD (Alex Bercuci, M. Fasel) --------------------------------
ee275c29 378 if(qaCfg->DoTRD() && detCfg->UseTRD()) {
f8b7a926 379 // no offline trigger selection
380 gROOT->LoadMacro(pwgpp+"/macros/AddTrainPerformanceTRD.C");
381 // steer individual TRD tasks
382 Bool_t
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));
391 }
392
393 // --- ZDC (Chiara Oppedisano) -------------------------------------
ee275c29 394 if(qaCfg->DoZDC() && detCfg->UseZDC()) {
f8b7a926 395 // hardcoded kMB trigger mask
396 gROOT->LoadMacro(pwgpp+"/ZDC/AddTaskZDCQA.C");
397 AliAnalysisTaskSE *taskZDC = AddTaskZDCQA();
398 taskZDC->SelectCollisionCandidates(kTriggerMask);
399 }
400
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
411 if (!is10h) {
412 taskCaloQA = AddTaskCalorimeterQA("trigEMC");
413 taskCaloQA->SetDebugLevel(0);
414 taskCaloQA->SelectCollisionCandidates(kTriggerEMC);
415 }
416 }
417
418 // --- Muon Trigger ------------------------------------------------
ee275c29 419 if(qaCfg->DoMUONTrig() && detCfg->UseMUON()) {
f8b7a926 420 // no offline trigger selection
421 gROOT->LoadMacro(pwgpp+"/macros/AddTaskMTRchamberEfficiency.C");
422 AliAnalysisTaskTrigChEff *taskMuonTrig = AddTaskMTRchamberEfficiency();
423 }
424
425 // --- Muon Efficiency (not used) ----------------------------------
ee275c29 426 if(qaCfg->DoMUONEff() && detCfg->UseMUON()) {
f8b7a926 427 gROOT->LoadMacro(ali+"/PWG3/muondep/AddTaskMUONTrackingEfficiency.C");
428 AliAnalysisTaskMuonTrackingEff *taskMuonTrackEff =
429 AddTaskMUONTrackingEfficiency();
430 }
431
432 // --- V0-Decay Reconstruction (Ana Marin) (not used) --------------
433 if (qaCfg->DoV0()) {
434 gROOT->LoadMacro(pwgpp+"/macros/AddTaskV0QA.C");
435 AliAnalysisTaskV0QA *taskv0QA = AddTaskV0QA(kTRUE);
436 }
437
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
444 if(grp->IsPP()) {
445 taskimpparres= AddTaskImpParRes(kTRUE);
446 } else {
447 taskimpparres= AddTaskImpParRes(kTRUE,-1,kTRUE,kFALSE);
448 }
449 taskimpparres->SelectCollisionCandidates(kTriggerMask);
450 }
451
452 // --- MUON QA (Philippe Pillot) -----------------------------------
ee275c29 453 if (qaCfg->DoMUON() && detCfg->UseMUON()) {
f8b7a926 454 // trigger analysis internal
455 gROOT->LoadMacro(pwgpp+"/PilotTrain/AddTaskMuonQA.C");
456 AliAnalysisTaskSE* taskmuonqa= AddTaskMuonQA();
457 }
458
459 // --- TOF (Francesca Bellini) -------------------------------------
ee275c29 460 if (qaCfg->DoTOF() && detCfg->UseTOF()) {
f8b7a926 461 gROOT->LoadMacro(pwgpp+"/TOF/AddTaskTOFQA.C");
462 AliAnalysisTaskTOFqa *tofQA = AddTaskTOFQA(kFALSE);
463 tofQA->SelectCollisionCandidates(kTriggerMask);
464 }
465
466 // --- PIDqa(JENS) -------------------------------------------------
467 if (qaCfg->DoPIDqa() && !is10h) {
468 gROOT->LoadMacro(ana+"/macros/AddTaskPIDqa.C");
469 AliAnalysisTaskPIDqa *PIDQA = AddTaskPIDqa();
470 PIDQA->SelectCollisionCandidates(kTriggerMask);
471 }
472
473 // --- HMPID QA (Giacomo Volpe) ------------------------------------
474 //
ee275c29 475 if (qaCfg->DoHMPID() && detCfg->UseHMPID()) {
f8b7a926 476 gROOT->LoadMacro(pwgpp+"/HMPID/AddTaskHmpidQA.C");
477 AliAnalysisTaskSE* taskhmpidqa= AddTaskHmpidQA(kTRUE);
478 // offline mask set in AddTask to kMB
479 taskhmpidqa->SelectCollisionCandidates(kTriggerMask);
480 }
481
482 // --- T0 QA (Alla Mayevskaya) -------------------------------------
ee275c29 483 if (qaCfg->DoT0() && detCfg->UseT0()) {
f8b7a926 484 // no offline trigger selection
485 gROOT->LoadMacro(pwgpp+"/T0/AddTaskT0QA.C");
486 AliT0AnalysisTaskQA* taskt0qa= AddTaskT0QA();
487 taskt0qa->SelectCollisionCandidates(kTriggerMask);
488 }
489
490 // ---- FMD QA (Christian Holm Christiansen) -----------------------
ee275c29 491 if (qaCfg->DoFWD() && detCfg->UseFMD()) {
f8b7a926 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)
502 }
503
504 // --- PHOS QA (Boris Polishchuk) ----------------------------------
ee275c29 505 if (qaCfg->DoPHOS()&& detCfg->UsePHOS()) {
f8b7a926 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);
511
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);
516
517 // Pi0 QA fo PbPb
518 if (grp->IsAA()) {
519 gROOT->LoadMacro(pwgga+"/PHOSTasks/PHOS_PbPbQA/macros/AddTaskPHOSPbPb.C");
520 AliAnalysisTaskPHOSPbPbQA* phosPbPb = AddTaskPHOSPbPbQA(0);
521 }
522 }
ee275c29 523 if (qaCfg->DoPHOSTrig() && detCfg->UsePHOS()) {
f8b7a926 524 gROOT->LoadMacro(pwgga+
525 "/PHOSTasks/PHOS_TriggerQA/macros/AddTaskPHOSTriggerQA.C");
526 AliAnalysisTaskPHOSTriggerQA *taskPHOSTrig = AddTaskPHOSTriggerQA(0,0);
527 }
528
529 // --- EMCAL QA (Gustavo Conesa) -----------------------------------
ee275c29 530 if (qaCfg->DoEMCAL() && detCfg->UseEMCAL()) {
f8b7a926 531 gROOT->LoadMacro(pwgga+"/EMCALTasks/macros/AddTaskEMCALTriggerQA.C");
532 AliAnalysisTaskEMCALTriggerQA *emctrig = AddTaskEMCALTriggerQA();
533 }
534
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",
539 kFALSE);
540 qaFBFMB->SelectCollisionCandidates(AliVEvent::kMB);
541 AliAnalysisTaskSE *qaFBFSC = (AliAnalysisTaskSE*)AddTaskFBFqa("qaFBFsc",
542 kFALSE);
543 qaFBFSC->SelectCollisionCandidates(AliVEvent::kSemiCentral);
544 AliAnalysisTaskSE *qaFBFCE = (AliAnalysisTaskSE*)AddTaskFBFqa("qaFBFce",
545 kFALSE);
546 qaFBFCE->SelectCollisionCandidates(AliVEvent::kCentral);
547 }
548}
b2a78539 549/**
550 * Helper function to make @c outputs_valid file
551 *
552 */
553void ValidateOutput()
554{
555 std::ofstream out;
556 out.open("outputs_valid", ios::out);
557 out.close();
558}
f8b7a926 559
560//====================================================================
561/**
562 * Run QA merging
563 *
564 * @param dir directory
565 * @param stage stage
566 */
567void QAMerge(const char *dir, Int_t stage)
568{
569// Merging method
570 TStopwatch timer; timer.Start();
571 TString outputDir = dir;
b2a78539 572 TObjArray outputFiles;
573 outputFiles.Add(new TObjString("QAresults.root"));
574 outputFiles.Add(new TObjString("EventStat_temp.root"));
575
f8b7a926 576 TString mergeExcludes = "";
b2a78539 577 TIter iter(&outputFiles);
f8b7a926 578 TObjString* str = 0;
f8b7a926 579 Bool_t merged = kTRUE;
580 while((str = static_cast<TObjString*>(iter()))) {
b2a78539 581 TString& outputFile = str->GetString();
f8b7a926 582 // Skip already merged outputs
583 if (!gSystem->AccessPathName(outputFile)) {
b2a78539 584 ::Warning("Merge","Output file <%s> found. Not merging again.",
585 outputFile.Data());
f8b7a926 586 continue;
587 }
588 if (mergeExcludes.Contains(outputFile.Data())) continue;
589 merged = AliAnalysisAlien::MergeOutput(outputFile,
590 outputDir,
591 10,
592 stage);
593 if (!merged) {
b2a78539 594 ::Error("Merge", "Cannot merge %s\n", outputFile.Data());
595 continue;
f8b7a926 596 }
597 }
598 TString infolog = "fileinfo.log";
599 AliAnalysisAlien::MergeInfo(infolog, dir);
600
601 if (!outputDir.Contains("Stage")) {
b2a78539 602 ValidateOutput();
603 timer.Print();
f8b7a926 604 return;
605 }
606 // --- Set up to run terminate -------------------------------------
607 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
f8b7a926 608 mgr->SetSkipTerminate(kFALSE);
609 if (!mgr->InitAnalysis()) return;
b2a78539 610
f8b7a926 611 mgr->PrintStatus();
b2a78539 612 mgr->StartAnalysis("gridterminate", (TTree*)0);
613 ValidateOutput();
f8b7a926 614 timer.Print();
615}
616
617//====================================================================
618/**
619 * Run QA trains
620 *
621 * @param run Run number
622 * @param xmlfile Collection file
623 * @param stage Stage
f8b7a926 624 * @param cdb CDB location
625 */
626void QA(UInt_t run,
627 const char* xmlfile = "wn.xml",
628 Int_t stage = 0, /*0 = QA train, 1...n - merging stage*/
629 const char* cdb = "raw://")
630{
631 // -----------------------------------------------------------------
632 //
633 // Get GRP parameters. Defines global "grp" as a pointer to GRPData
634 //
635 gROOT->Macro(Form("GRP.C(%d)", run));
421f877c 636 gROOT->Macro("BaseConfig.C");
f8b7a926 637 gROOT->Macro("QAConfig.C");
ee275c29 638 gROOT->Macro("DetConfig.C");
639 qaCfg->Print();
f8b7a926 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");
646 return;
647 }
648 }
649
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
656 LoadLibraries();
657 printf("Include path: %s\n", gSystem->GetIncludePath());
658
659 // === Make the analysis manager and connect event handlers ========
660 //
661 // --- Analysis manager and load libraries -------------------------
662 AliAnalysisManager *mgr = new AliAnalysisManager("QA", "Production train");
663 mgr->SetRunFromPath(grp->run);
664
665 // --- Create ESD input handler ------------------------------------
666 AliESDInputHandlerRP *esdHandler = new AliESDInputHandlerRP();
667 esdHandler->SetReadFriends(kTRUE);
668 esdHandler->SetActiveBranches("ESDfriend");
669 mgr->SetInputEventHandler(esdHandler);
670
671 // --- Monte Carlo handler -----------------------------------------
672 if (true) {
673 AliMCEventHandler* mcHandler = new AliMCEventHandler();
674 mgr->SetMCtruthEventHandler(mcHandler);
675 mcHandler->SetPreReadMode(1);
676 mcHandler->SetReadTR(true);
677 }
678
679 // === Set up tasks ================================================
680 //
681 // --- Create tasks ------------------------------------------------
682 AddAnalysisTasks(cdb);
683
684 // --- Debugging if needed -----------------------------------------
685 if (debug_level > 0) mgr->SetDebugLevel(debug_level);
686
687 // --- If merging, do so here and exit -----------------------------
688 if (stage>0) {
689 QAMerge(xmlfile, stage);
690 return;
691 }
692
693 // === Run the analysis ============================================
694 //
695 // --- Make our chain ----------------------------------------------
696 TChain *chain = new TChain("esdTree");
697 chain->Add("AliESDs.root");
698
699 // --- Run the thing -----------------------------------------------
700 TStopwatch timer;
701 timer.Start();
b2a78539 702 if (!mgr->InitAnalysis()) return;
703
704 mgr->PrintStatus();
705 mgr->SetSkipTerminate(kTRUE);
706 mgr->SetNSysInfo(1);
707 mgr->StartAnalysis("local", chain);
f8b7a926 708 timer.Print();
709}
710
711//
712// EOF
713//
714