]> git.uio.no Git - u/mrichter/AliRoot.git/blob - ANALYSIS/macros/QAtrain_duo.C
Fixes in the CDBconnect task (Ruben) and adaptation of central trains (Mihaela)
[u/mrichter/AliRoot.git] / ANALYSIS / macros / QAtrain_duo.C
1 // QAtrain_duo - assumes having 2 sets of input data files using 2 suffixes:
2 //    AliESDs_barrel.root AliESDfriends_barrel.root ...  suffix = _barrel
3 //    AliESDs_outer.root AliESDfriends_outer.root ...    suffix = _outer
4 // HOW TO RUN (for run_no=158285):
5 // QA job: should call:
6 //    ln -fs AliESDs_barrel.root AliESDs.root
7 //    ln -fs AliESDfriends_barrel.root AliESDfriends.root
8 //    ... same for all specific reco files
9 //    aliroot -b -q QAtrain_duo.C\(\"_barrel\"\,158285\) producing:
10 //      -> EventStat_temp_barrel.root QAresults_barrel.root 400_400_0_350.stat
11 //
12 //    ln -fs AliESDs_outer.root AliESDs.root
13 //    ln -fs AliESDfriends_outer.root AliESDfriends.root
14 //    ... same for all specific reco files
15 //    aliroot QAtrain_duo.C\(\"_outer\"\,158285\) producing:
16 //      -> EventStat_temp_outer.root QAresults_outer.root 400_400_0_380.stat
17 //
18 // Each merging job:
19 // for stages i < 5
20 //    aliroot -b -q QAtrain_duo.C\(\"_barrel\"\,158285\,\"wn.xml\"\,i\)
21 //    aliroot -b -q QAtrain_duo.C\(\"_outer\"\,158285\,\"wn.xml\"\,i\)
22 //      -> same output files as the QA jobs (except .stat)
23 // for stage 5
24 //    aliroot -b -q QAtrain_duo.C\(\"_barrel\"\,158285\,\"Stage_5.xml\"\,5\)
25 //      -> event_stat_barrel.root trending_barrel.root 145230_145230_0_120345.stat
26 //    aliroot -b -q QAtrain_duo.C\(\"_outer\"\,158285\,\"Stage_5.xml\"\,5\)
27 //      -> event_stat_outer.root trending_outer.root 145230_145230_0_132897.stat
28 #include "Riostream.h"
29 void LoadLibraries();
30 void AddAnalysisTasks(const char *, const char *); 
31 void QAmerge(const char *,const char *, Int_t);
32
33 Int_t iCollisionType = 0; // 0=pp, 1=PbPb
34 // Trigger mask.
35
36 UInt_t kTriggerInt = AliVEvent::kAnyINT;
37 UInt_t kTriggerMuonBarrel = AliVEvent::kMUU7 | AliVEvent::kMuonUnlikeLowPt8 | AliVEvent::kMuonUnlikeLowPt0;
38 UInt_t kTriggerEMC   = AliVEvent::kEMC7 | AliVEvent::kEMC8 | AliVEvent::kEMCEJE | AliVEvent::kEMCEGA;
39 UInt_t kTriggerHM   = AliVEvent::kHighMult;
40 // Main trigger mask used:
41 UInt_t kTriggerMask = kTriggerInt;
42
43 Int_t runNumbers[5] = {158626};
44
45 Bool_t doCDBconnect   = 1;
46 Bool_t doEventStat    = 1;
47 Bool_t doCentrality   = 0;
48 Bool_t doQAsym        = 1;
49 Bool_t doVZERO        = 1;   // there is a 2nd file
50 Bool_t doVZEROPbPb    = 1; 
51 Bool_t doVertex       = 1;
52 Bool_t doSPD          = 1;   // needs RP   
53 Bool_t doTPC          = 1;
54 Bool_t doHLT          = 1;
55 Bool_t doSDD          = 1;   // needs RP
56 Bool_t doSSDdEdx      = 1;
57
58 Bool_t doTRD          = 1;
59 Bool_t doITS          = 1;
60 Bool_t doITSsaTracks  = 1; 
61 Bool_t doITSalign     = 1;  
62 Bool_t doCALO         = 1;
63 Bool_t doMUONTrig     = 1;
64 Bool_t doImpParRes    = 1;
65 Bool_t doMUON         = 1;
66 Bool_t doTOF          = 1;
67 Bool_t doHMPID        = 1;
68 Bool_t doT0           = 1;
69 Bool_t doZDC          = 1;
70 Bool_t doPIDResponse  = 1;
71 Bool_t doPIDqa        = 1; //new
72 Bool_t doFMD          = 1; // new
73 Bool_t doPHOS         = 1; // new
74 Bool_t doPHOSTrig     = 1; // new
75 Bool_t doEMCAL        = 1;
76 Bool_t doFBFqa        = 1; // new - not ported yet to revision
77
78                // Debug level
79 Int_t       debug_level        = 1;        // Debugging
80 Int_t       run_number = 0;
81
82 void QAtrain_duo(const char *suffix="", Int_t run = 0, 
83              const char *xmlfile   = "wn.xml",
84              Int_t  stage          = 0, /*0 = QA train, 1...n - merging stage*/
85              const char *cdb     = "raw://")
86 //             const char *cdb     = "local://$ALICE_ROOT/OCDB")
87 {
88   run_number = run;
89   TString ss(suffix);
90   ss.ToLower();
91   Bool_t ibarrel = (ss.Contains("barrel"))?kTRUE:kFALSE;
92
93   TString cdbString(cdb);
94   if (cdbString.Contains("raw://"))
95   {
96     TGrid::Connect("alien://");
97     if (!gGrid || !gGrid->IsConnected()) {
98       ::Error("QAtrain", "No grid connection");
99       return;
100     }  
101   }
102   // Set temporary merging directory to current one
103   gSystem->Setenv("TMPDIR", gSystem->pwd());
104   // Set temporary compilation directory to current one
105   gSystem->SetBuildDir(gSystem->pwd(), kTRUE);
106   // Load libraries
107   LoadLibraries();
108   printf("Include path: %s\n", gSystem->GetIncludePath());
109   // Create manager
110   AliAnalysisManager *mgr  = new AliAnalysisManager("PilotAnalysis", "Production train");
111   mgr->SetRunFromPath(run_number);
112   // Input handler
113   AliESDInputHandlerRP *esdHandler = new AliESDInputHandlerRP();
114   if (ibarrel) {
115     esdHandler->SetReadFriends(kTRUE);
116     esdHandler->SetActiveBranches("ESDfriend");
117   }
118   mgr->SetInputEventHandler(esdHandler);
119   mgr->SetDebugLevel(debug_level);
120   mgr->SetFileInfoLog("fileinfo.log"); 
121   
122   // AnalysisTasks
123   AddAnalysisTasks(suffix, cdb);
124   if (stage>0) {
125     QAmerge(suffix, xmlfile, stage);
126     return;
127   }   
128   // Input chain
129   TChain *chain = new TChain("esdTree");
130   chain->Add("AliESDs.root");
131   TStopwatch timer;
132   timer.Start();
133   if (mgr->InitAnalysis()) {                                                                                                              
134     mgr->PrintStatus(); 
135     mgr->SetSkipTerminate(kTRUE);
136 //    mgr->SetNSysInfo(1);
137     mgr->StartAnalysis("local", chain);
138   }
139   timer.Print();
140 }
141
142 void LoadLibraries()
143 {
144   gSystem->SetIncludePath("-I. -I$ROOTSYS/include -I$ALICE_ROOT/include -I$ALICE_ROOT -I$ALICE_ROOT/ITS -I$ALICE_ROOT/TRD -I$ALICE_ROOT/PWGPP -I$ALICE_ROOT/PWGPP/TRD");
145   gSystem->Load("libANALYSIS");
146   gSystem->Load("libANALYSISalice");
147   gSystem->Load("libCORRFW");
148   gSystem->Load("libTENDER");
149   gSystem->Load("libPWGPP.so");
150   gSystem->Load("libAliHLTTrigger.so");
151
152   if (doEMCAL || doPHOS || doCALO) {
153      gSystem->Load("libEMCALUtils");
154      gSystem->Load("libPHOSUtils");
155      gSystem->Load("libPWGCaloTrackCorrBase");
156      gSystem->Load("libPWGGACaloTrackCorrelations");
157      gSystem->Load("libPWGGACaloTasks");
158      gSystem->Load("libPWGGAPHOSTasks");
159      gSystem->Load("libPWGTools");
160      gSystem->Load("libPWGEMCAL");
161      gSystem->Load("libPWGGAEMCALTasks");
162   }  
163   if(doMUON || doMUONTrig) {
164      gSystem->Load("libPWGmuon");
165      gSystem->Load("libPWGPPMUONlite");
166      gSystem->Load("libPWGmuondep");
167   }
168   if (doFMD) {
169      gSystem->Load("libPWGLFforward2");
170   }      
171 }
172
173 void AddAnalysisTasks(const char *suffix, const char *cdb_location)
174 {
175   TString ss(suffix);
176   ss.ToLower();
177   Bool_t ibarrel = (ss.Contains("barrel"))?kTRUE:kFALSE;
178   Bool_t iall = ss.IsNull();
179   AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
180   mgr->SetCommonFileName(Form("QAresults%s.root",suffix));
181   // Statistics task
182   mgr->AddStatisticsTask(kTriggerMask);
183   //
184   // CDB connection
185   //
186   if (doCDBconnect) {
187     gROOT->LoadMacro("$ALICE_ROOT/PWGPP/PilotTrain/AddTaskCDBconnect.C");
188     AliTaskCDBconnect *taskCDB = AddTaskCDBconnect(cdb_location, run_number);    
189 //    AliTaskCDBconnect *taskCDB = AddTaskCDBconnect();
190     if (!taskCDB) return;
191     AliCDBManager *cdb = AliCDBManager::Instance();
192     cdb->SetDefaultStorage(cdb_location);
193 //    taskCDB->SetRunNumber(run_number);
194   }    
195   
196   //
197   // Event Statistics (Jan Fiete)
198   //
199   if (doEventStat) {
200       gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskPhysicsSelection.C");
201       AliPhysicsSelectionTask* physSelTask = AddTaskPhysicsSelection(kFALSE /*MC*/);
202       AliAnalysisDataContainer *cstatsout = (AliAnalysisDataContainer*)mgr->GetOutputs()->FindObject("cstatsout");
203       cstatsout->SetFileName(Form("EventStat_temp%s.root", suffix));
204   }
205   
206   //
207   // Centrality (A. Toia)
208   //
209   if (doCentrality) {
210 //     if (!iCollisionType) {
211 //        printf("Disabling centrality task for p-p\n");
212 //        doCentrality = kFALSE;
213 //     } else {           
214         gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskCentrality.C");
215         AliCentralitySelectionTask *taskCentrality = AddTaskCentrality();
216       AliAnalysisDataContainer *centralityout = (AliAnalysisDataContainer*)mgr->GetOutputs()->FindObject("CentralityStat");
217       centralityout->SetFileName(Form("EventStat_temp%s.root", suffix));
218 //     }   
219   }   
220   
221   // Vertexing (A. Dainese)
222   // 
223   if (doVertex && (ibarrel || iall)) {
224     gROOT->LoadMacro("$ALICE_ROOT/PWGPP/macros/AddTaskVertexESD.C");
225     AliAnalysisTaskVertexESD* taskvertexesd =  AddTaskVertexESD(kFALSE, kTriggerMask);
226     taskvertexesd->SelectCollisionCandidates(kTriggerMask);
227   }  
228
229   // TPC QA (E. Sicking)
230   //
231   if (doQAsym && (ibarrel || iall)) {
232   // offline trigger in AddTask
233     gROOT->LoadMacro("$ALICE_ROOT/PWGPP/PilotTrain/AddTaskQAsym.C");
234     AliAnalysisTaskSE * taskqasim = AddTaskQAsym(0, kTriggerMask, kTriggerHM, kTriggerEMC, kTriggerMuonBarrel);
235   }  
236   //
237   // VZERO QA  (C. Cheshkov)
238   //
239   if (doVZERO && (ibarrel || iall)) {
240     gROOT->LoadMacro("$ALICE_ROOT/PWGPP/PilotTrain/AddTaskVZEROQA.C");
241     AliAnalysisTaskSE * taskv0qa = AddTaskVZEROQA(0);
242 //  taskv0qa->SelectCollisionCandidates();
243     gROOT->LoadMacro("$ALICE_ROOT/PWGPP/PilotTrain/AddTaskVZEROQATrig.C");
244     AliAnaVZEROQA *taskv0qatrig = AddTaskVZEROQATrig(0);
245     taskv0qatrig->SelectCollisionCandidates(AliVEvent::kINT8);
246
247   }
248   if (doVZEROPbPb && iCollisionType==0) {
249     gROOT->LoadMacro("$ALICE_ROOT/PWGPP/VZERO/AddTaskVZEROPbPb.C");
250     AliAnaVZEROPbPb* taskV0PbPb = (AliAnaVZEROPbPb*)AddTaskVZEROPbPb(run_number);
251 //    taskV0PbPb->SetClassesNames("CTRUE-,C0HWU-,CPBI2WU_B1-,CPBI2_B1-,CPBI1WU-,CPBI1-,CVHNWU-,CVHN-,CVLNWU-,CVLN-");
252 //    taskV0PbPb->SetClassesNames("CTRUE-,C0HWU-,CPBI2WU,CPBI2,CPBI1WU-,CPBI1-,CVHNWU,CVHN,CVLNWU,CVLN");
253 //    taskV0PbPb->SetClassesNames("CTRUE-,C0HWU-,CPBI2WU-,CPBI2-,CPBI2WU_B1-,CPBI2_B1-,CPBI1WU-,CPBI1-,CVHNWU-,CVHN-,CVHN_R2-,CVHNWU_R2-,CVLNWU-,CVLN-,CVLN_B2-,CVLNWU_B2-");
254 //    taskV0PbPb->SetClassesNames("CTRUE-,C0HWU-,CPBI2WU-,CPBI2-,CPBI2WU_B1-,CPBI2_B1-,CPBI1WU-,CPBI1-,CVHNWU-,CVHN-,CVHN_R2-,CVHNWU_R2-,CVLNWU-,CVLN-,CVLN_R1-,CVLN_B2-,CVLNWU_R1-,CVLNWU_B2-");
255 //    taskV0PbPb->SetClassesNames("CTRUE-,C0HWU-,CPBI2WU-,CPBI2-,CPBI2WU_B1-,CPBI2_B1-,CPBI1WU-,CPBI1-,CVHNWU-,CVHN-,CVHN_R2-,CVHNWU_R2-,CVLNWU-,CVLN-,CVLN_R1-,CVLN_B2-,CVLNWU_R1-,CVLNWU_B2-,CSEMI_R1-,CSEMIWU_R1-,CCENT_R2-,CCENTWU_R2-");
256   }
257   //
258   // TPC (Jacek Otwinowski & Michael Knichel)
259   //
260   //
261   // Optionally MC information can be used by setting the 1st argument to true
262   // Optionally friends information can be switched off by setting the 2st argument 
263   // to false
264   // Optionally highMult axis can be used by setting the 3st argument to true (for PbPb)
265   if (doTPC && (ibarrel || iall)) {
266     gROOT->LoadMacro("$ALICE_ROOT/PWGPP/TPC/macros/AddTaskPerformanceTPCdEdxQA.C");
267     AliPerformanceTask *tpcQA = 0;
268     if (iCollisionType) {
269        // High multiplicity Pb-Pb
270        tpcQA = AddTaskPerformanceTPCdEdxQA(kFALSE, kTRUE, kTRUE);
271     } else {
272       // Low multiplicity (pp)
273        tpcQA = AddTaskPerformanceTPCdEdxQA(kFALSE, kTRUE, kFALSE);
274     }
275     tpcQA->SelectCollisionCandidates(kTriggerMask);
276   }  
277
278   // HLT (Alberica Toia)
279   if (doHLT && (ibarrel || iall)) {
280     gROOT->LoadMacro("$ALICE_ROOT/PWGPP/TPC/macros/AddTaskPerformanceTPCdEdxQA.C");
281     AliPerformanceTask *hltQA = AddTaskPerformanceTPCdEdxQA(kFALSE, kTRUE, kFALSE,0,kTRUE);
282     hltQA->SelectCollisionCandidates(kTriggerMask);
283   }  
284   //
285   // SPD (A. Mastroserio)
286   //
287   if (doSPD && (ibarrel || iall)) {
288     gROOT->LoadMacro("$ALICE_ROOT/PWGPP/PilotTrain/AddTaskSPDQA.C");
289     AliAnalysisTaskSPD* taskspdqa = (AliAnalysisTaskSPD*)AddTaskSPDQA();
290     // Request from Annalisa
291     if (iCollisionType) taskspdqa->SetHeavyIonMode();
292     taskspdqa->SelectCollisionCandidates(kTriggerMask);
293     taskspdqa->SetOCDBInfo(run_number, cdb_location);
294   }  
295   //
296   // SDD (F. Prino)
297   //
298   if (doSDD && (ibarrel || iall)) {
299     gROOT->LoadMacro("$ALICE_ROOT/PWGPP/PilotTrain/AddSDDPoints.C");
300     AliAnalysisTaskSE* tasksdd = AddSDDPoints();
301     tasksdd->SelectCollisionCandidates(kTriggerMask);
302   }
303   //
304   // SSD dEdx (Marek Chojnacki)
305   //
306   if (doSSDdEdx && (ibarrel || iall)) {
307     gROOT->LoadMacro("$ALICE_ROOT/PWGPP/PilotTrain/AddTaskdEdxSSDQA.C");
308     AliAnalysisTaskSE* taskssddedx = AddTaskdEdxSSDQA();
309     taskssddedx->SelectCollisionCandidates(kTriggerMask);
310   }
311
312   //
313   // ITS
314   //
315   if (doITS && (ibarrel || iall)) {
316   // hardcoded non-zero trigger mask
317       gROOT->LoadMacro("$ALICE_ROOT/PWGPP/macros/AddTaskPerformanceITS.C");
318       AliAnalysisTaskITSTrackingCheck *itsQA = 0;
319       AliAnalysisTaskITSTrackingCheck *itsQACent0010 = 0;
320       AliAnalysisTaskITSTrackingCheck *itsQACent3050 = 0;
321       AliAnalysisTaskITSTrackingCheck *itsQACent6080 = 0;
322       if(iCollisionType==0) {
323         itsQA = AddTaskPerformanceITS(kFALSE);
324       } else {
325         itsQA = AddTaskPerformanceITS(kFALSE);
326         itsQACent0010 = AddTaskPerformanceITS(kFALSE,kFALSE,kFALSE,3500,10000);
327         itsQACent3050 = AddTaskPerformanceITS(kFALSE,kFALSE,kFALSE,590,1570);
328         itsQACent6080 = AddTaskPerformanceITS(kFALSE,kFALSE,kFALSE,70,310);
329       }
330   }
331   //
332   // ITS saTracks, align (F.Prino)
333   //
334   if (doITSsaTracks && (ibarrel || iall)) {
335   // offline trigger in AddTask
336      gROOT->LoadMacro("$ALICE_ROOT/PWGPP/macros/AddTaskITSsaTracks.C");
337      AliAnalysisTaskITSsaTracks *itssaTracks = AddTaskITSsaTracks(kFALSE,kFALSE);
338      itssaTracks->SelectCollisionCandidates(kTriggerMask);
339   }   
340   if (doITSalign && (ibarrel || iall)) {
341   // no offline trigger selection
342      gROOT->LoadMacro("$ALICE_ROOT/PWGPP/macros/AddTaskITSAlign.C");
343      AliAnalysisTaskITSAlignQA *itsAlign = AddTaskITSAlign(0,2012);
344   }   
345   //
346   // TRD (Alex Bercuci, M. Fasel) 
347   //
348   if(doTRD && (ibarrel || iall)) {
349   // no offline trigger selection
350       gROOT->LoadMacro("$ALICE_ROOT/PWGPP/macros/AddTrainPerformanceTRD.C");
351       // steer individual TRD tasks
352       Bool_t 
353       doCheckESD(kTRUE),  // AliTRDcheckESD
354       doCheckDET(kTRUE),  // AliTRDcheckDET
355       doEffic(kTRUE),     // AliTRDefficiency
356       doResolution(kTRUE),// AliTRDresolution
357       doCheckPID(kTRUE),  // AliTRDcheckPID
358       doV0Monitor(kFALSE);// AliTRDv0Monitor
359       AddTrainPerformanceTRD(Translate(doCheckESD, doCheckDET, doEffic, doResolution, doCheckPID, doV0Monitor));
360   }
361
362   //
363   // ZDC (Chiara Oppedisano) 
364   //
365   if(doZDC && (ibarrel || iall)) {
366   // hardcoded kMB trigger mask
367      gROOT->LoadMacro("$ALICE_ROOT/PWGPP/ZDC/AddTaskZDCQA.C");
368      AliAnalysisTaskSE *taskZDC = AddTaskZDCQA();
369      taskZDC->SelectCollisionCandidates(kTriggerMask);
370   }   
371   //
372   // Calorimetry (Gustavo Conesa)
373   //
374
375   if(doCALO) {
376   // - In case of MC analysis, it skips the triggered events wagon (given that
377   //the normal wagon is always suffixed as "default")
378   //- No need to pass the type of data
379   //- No need to specify the year. In principle the year is only needed when
380   //setting the size of some histograms (change in number of SM along the years),
381   //I do not know how to access automatically the run number when the histograms
382   // are created in the UserCreateOutput. By default I set them to the maximum
383   //expected size, but I still let the possibility to check the year.
384
385   //So the way to initialize the task in trunk is now
386
387   //AddTaskCalorimeterQA(Bool_t kSimulation = kFALSE,
388                                    //  const char *suffix="default",
389                                    // TString outputFile = "", 
390                                    //  Int_t year = 2012, 
391                                    //  Bool_t kPrintSettings = kFALSE)
392
393   //So, in principle only the first 2 need to be specified.
394
395   
396       gROOT->LoadMacro("$ALICE_ROOT/PWGGA/CaloTrackCorrelations/macros/QA/AddTaskCalorimeterQA.C");
397       AliAnalysisTaskCaloTrackCorrelation *taskCaloQA = AddTaskCalorimeterQA(kFALSE, "default");
398       taskCaloQA->SetDebugLevel(0);
399       // offline mask set in AddTask to kMB
400       taskCaloQA->SelectCollisionCandidates(kTriggerMask);
401       // Add a new calo task with EMC1 trigger only
402       taskCaloQA = AddTaskCalorimeterQA(kFALSE, "trigEMC");
403       taskCaloQA->SetDebugLevel(0);
404       taskCaloQA->SelectCollisionCandidates(kTriggerEMC);
405   }
406
407   //
408   // Muon Trigger
409   //
410   
411   if(doMUONTrig) {
412   // no offline trigger selection
413       gROOT->LoadMacro("$ALICE_ROOT/PWGPP/macros/AddTaskMTRchamberEfficiency.C");
414       AliAnalysisTaskTrigChEff *taskMuonTrig = AddTaskMTRchamberEfficiency();
415 //      taskMuonTrig->GetMuonTrackCuts()->SetCustomParamFromRun(160000,2);       
416   }
417
418   //
419   // Impact parameter resolution (xianbao.yuan@pd.infn.it, andrea.dainese@pd.infn.it)
420   //
421   if (doImpParRes && (ibarrel || iall)) {
422     gROOT->LoadMacro("$ALICE_ROOT/PWGPP/macros/AddTaskImpParRes.C");
423     AliAnalysisTaskSE* taskimpparres=0;
424     if(iCollisionType==0) {
425        taskimpparres= AddTaskImpParRes();
426     } else {
427        taskimpparres= AddTaskImpParRes(kFALSE,-1,kFALSE,kFALSE);
428     }
429     taskimpparres->SelectCollisionCandidates(kTriggerMask);
430   }  
431   //
432   // MUON QA (Philippe Pillot)
433   //
434   if (doMUON) {
435   // trigger analysis internal
436     gROOT->LoadMacro("$ALICE_ROOT/PWGPP/PilotTrain/AddTaskMuonQA.C");
437     AliAnalysisTaskMuonQA* taskmuonqa= AddTaskMuonQA();
438 //    taskmuonqa->GetTrackCuts()->SetCustomParamFromRun(160000,2);
439   }  
440   //
441   // TOF (Francesca Bellini)
442   //
443   if (doTOF && (ibarrel || iall)) {
444     gROOT->LoadMacro("$ALICE_ROOT/PWGPP/TOF/AddTaskTOFQA.C");
445     AliAnalysisTaskTOFqa *tofQA = AddTaskTOFQA(kTRUE);
446     tofQA->SelectCollisionCandidates(kTriggerMask);
447   } 
448    //
449   // PIDResponse(JENS)
450   //
451   if (doPIDResponse && (ibarrel || iall)) {
452     gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskPIDResponse.C"); 
453     AliAnalysisTaskPIDResponse *PIDResponse = AddTaskPIDResponse();
454     PIDResponse->SelectCollisionCandidates(kTriggerMask);
455   }  
456
457   //
458   // PIDqa(JENS)
459   //
460   if (doPIDqa && (ibarrel || iall)) {
461     gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskPIDqa.C");
462     AliAnalysisTaskPIDqa *PIDQA = AddTaskPIDqa();
463     PIDQA->SelectCollisionCandidates(kTriggerMask);
464   }  
465  
466   //
467   // HMPID QA (Giacomo Volpe)
468   //
469   if (doHMPID && (ibarrel || iall)) {
470     gROOT->LoadMacro("$ALICE_ROOT/PWGPP/HMPID/AddTaskHmpidQA.C");
471     AliAnalysisTaskSE* taskhmpidqa= AddTaskHmpidQA(kFALSE);
472       // offline mask set in AddTask to kMB
473     taskhmpidqa->SelectCollisionCandidates(kTriggerMask);
474   }      
475   
476   
477   // T0 QA (Alla Mayevskaya)
478   if (doT0 && (ibarrel || iall)) {
479   // no offline trigger selection
480     gROOT->LoadMacro("$ALICE_ROOT/PWGPP/T0/AddTaskT0QA.C");
481     AliT0AnalysisTaskQA* taskt0qa= AddTaskT0QA();
482     taskt0qa->SelectCollisionCandidates(kTriggerMask);
483   }      
484   // FMD QA (Christian Holm Christiansen)
485   if (doFMD && (ibarrel || iall)) {
486     gROOT->LoadMacro("$ALICE_ROOT/PWGLF/FORWARD/analysis2/AddTaskForwardQA.C");
487     // Parameters: usemc, usecentrality
488     AliForwardQATask *forwardQA = (AliAnalysisTaskSE *)AddTaskForwardQA(kFALSE, kFALSE);
489     forwardQA->SetDebug(0);
490     // No offline trigger config. needed (see #84077)
491   }
492    //     
493   // PHOS QA (Boris Polishchuk)
494   //
495   if (doPHOS) {
496     gROOT->LoadMacro("$ALICE_ROOT/PWGGA/PHOSTasks/CaloCellQA/macros/AddTaskCaloCellsQA.C");
497     AliAnalysisTaskCaloCellsQA *taskPHOSCellQA1 = AddTaskCaloCellsQA(4, 1, NULL,"PHOSCellsQA_AnyInt"); 
498     taskPHOSCellQA1->SelectCollisionCandidates(kTriggerMask);
499     taskPHOSCellQA1->GetCaloCellsQA()->SetClusterEnergyCuts(0.3,0.3,1.0);
500     AliAnalysisTaskCaloCellsQA *taskPHOSCellQA2 = AddTaskCaloCellsQA(4, 1, NULL,"PHOSCellsQA_PHI7"); 
501     taskPHOSCellQA2->SelectCollisionCandidates(AliVEvent::kPHI7);
502     taskPHOSCellQA2->GetCaloCellsQA()->SetClusterEnergyCuts(0.3,0.3,1.0);
503     // Pi0 QA fo PbPb
504     if (iCollisionType == 0) {
505       gROOT->LoadMacro("$ALICE_ROOT/PWGGA/PHOSTasks/PHOS_PbPbQA/macros/AddTaskPHOSPbPb.C");
506       AliAnalysisTaskPHOSPbPbQA* phosPbPb = AddTaskPHOSPbPbQA(0);
507     }
508   }    
509   if (doPHOSTrig) {
510      gROOT->LoadMacro("$ALICE_ROOT/PWGGA/PHOSTasks/PHOS_TriggerQA/macros/AddTaskPHOSTriggerQA.C");
511      AliAnalysisTaskPHOSTriggerQA *taskPHOSTrig = AddTaskPHOSTriggerQA(NULL);
512   }
513   //
514   // EMCAL QA (Gustavo Conesa)
515   //
516   if (doEMCAL) {
517      gROOT->LoadMacro("$ALICE_ROOT/PWGGA/EMCALTasks/macros/AddTaskEMCALTriggerQA.C");
518      AliAnalysisTaskEMCALTriggerQA *emctrig = AddTaskEMCALTriggerQA();
519 //     emctrig->GetRecoUtils()->SwitchOffBadChannelsRemoval();
520   }   
521   //     
522   // FLOW and BF QA (C.Perez && A.Rodriguez)
523   //
524   if (doFBFqa && (ibarrel || iall)) {
525     gROOT->LoadMacro("$ALICE_ROOT/PWGPP/macros/AddTaskFBFqa.C");
526     AliAnalysisTaskSE *qaFBFMB = (AliAnalysisTaskSE*) AddTaskFBFqa("qaFBFmb",kFALSE);
527     qaFBFMB->SelectCollisionCandidates(AliVEvent::kMB);
528     AliAnalysisTaskSE *qaFBFSC = (AliAnalysisTaskSE*) AddTaskFBFqa("qaFBFsc",kFALSE);
529     qaFBFSC->SelectCollisionCandidates(AliVEvent::kSemiCentral);
530     AliAnalysisTaskSE *qaFBFCE = (AliAnalysisTaskSE*) AddTaskFBFqa("qaFBFce",kFALSE);
531     qaFBFCE->SelectCollisionCandidates(AliVEvent::kCentral);
532   }
533 }
534
535 void QAmerge(const char *suffix, const char *dir, Int_t stage)
536 {
537 // Merging method
538   TStopwatch timer;
539   timer.Start();
540   TString outputDir = dir;
541   TString outputFiles = Form("QAresults%s.root,EventStat_temp%s.root,RecoQAresults%s.root",suffix,suffix,suffix);
542   TString mergeExcludes = "";
543   TObjArray *list = outputFiles.Tokenize(",");
544   TIter *iter = new TIter(list);
545   TObjString *str;
546   TString outputFile;
547   Bool_t merged = kTRUE;
548   while((str=(TObjString*)iter->Next())) {
549     outputFile = str->GetString();
550     // Skip already merged outputs
551     if (!gSystem->AccessPathName(outputFile)) {
552        printf("Output file <%s> found. Not merging again.",outputFile.Data());
553        continue;
554     }
555     if (mergeExcludes.Contains(outputFile.Data())) continue;
556     merged = AliAnalysisAlien::MergeOutput(outputFile, outputDir, 10, stage);
557     if (!merged && !outputFile.Contains("RecoQAresults")) {
558        printf("ERROR: Cannot merge %s\n", outputFile.Data());
559        continue;
560     }
561   }
562   // read the analysis manager from file
563   TString infolog = "fileinfo.log";
564   AliAnalysisAlien::MergeInfo(infolog, dir); 
565   if (!outputDir.Contains("Stage")) {
566     ofstream out;
567     out.open("outputs_valid", ios::out);
568     out.close();    
569     return;
570   }
571   AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
572   mgr->SetRunFromPath(mgr->GetRunFromAlienPath(dir));
573   mgr->SetSkipTerminate(kFALSE);
574   if (!mgr->InitAnalysis()) return;
575   mgr->PrintStatus();
576   AliLog::SetGlobalLogLevel(AliLog::kError);
577   TTree *tree = NULL;
578   gROOT->cd();
579   mgr->StartAnalysis("gridterminate", tree);
580   if (strlen(suffix)) {
581      if (gSystem->Exec(Form("mv trending.root trending%s.root", suffix)))
582         ::Error("QAmerge", "File trending.root was not produced");
583      if (gSystem->Exec(Form("mv event_stat.root event_stat%s.root", suffix)))
584         ::Error("QAmerge", "File trending.root was not produced");
585   }   
586   ofstream out;
587   out.open("outputs_valid", ios::out);
588   out.close();
589   timer.Print();
590 }