From Mihaela: new train that can QA more than one reconstruction
[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 *); 
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 kTriggerMuonBarell = AliVEvent::kMUU7;
38 UInt_t kTriggerEMC   = AliVEvent::kEMC7 | 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   = 1;
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 {
86   run_number = run;
87
88   TGrid::Connect("alien://");
89   if (!gGrid || !gGrid->IsConnected()) {
90     ::Error("QAtrain", "No grid connection");
91     return;
92   }   
93   // Set temporary merging directory to current one
94   gSystem->Setenv("TMPDIR", gSystem->pwd());
95   // Set temporary compilation directory to current one
96   gSystem->SetBuildDir(gSystem->pwd(), kTRUE);
97   // Load libraries
98   LoadLibraries();
99   printf("Include path: %s\n", gSystem->GetIncludePath());
100   // Create manager
101   AliAnalysisManager *mgr  = new AliAnalysisManager("PilotAnalysis", "Production train");
102   mgr->SetRunFromPath(run_number);
103   // Input handler
104   AliESDInputHandlerRP *esdHandler = new AliESDInputHandlerRP();
105   esdHandler->SetReadFriends(kTRUE);
106   esdHandler->SetActiveBranches("ESDfriend");
107   mgr->SetInputEventHandler(esdHandler);
108   mgr->SetDebugLevel(debug_level);
109   
110   // AnalysisTasks
111   AddAnalysisTasks(suffix);
112   if (stage>0) {
113     QAmerge(suffix, xmlfile, stage);
114     return;
115   }   
116   // Input chain
117   TChain *chain = new TChain("esdTree");
118   chain->Add("AliESDs.root");
119   TStopwatch timer;
120   timer.Start();
121   if (mgr->InitAnalysis()) {                                                                                                              
122     mgr->PrintStatus(); 
123     mgr->SetSkipTerminate(kTRUE);
124 //    mgr->SetNSysInfo(1);
125     mgr->StartAnalysis("local", chain);
126   }
127   timer.Print();
128 }
129
130 void LoadLibraries()
131 {
132   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");
133   gSystem->Load("libANALYSIS");
134   gSystem->Load("libANALYSISalice");
135   gSystem->Load("libCORRFW");
136   gSystem->Load("libTENDER");
137   gSystem->Load("libPWGPP.so");
138   gSystem->Load("libAliHLTTrigger.so");
139
140   if (doEMCAL || doPHOS || doCALO) {
141      gSystem->Load("libEMCALUtils");
142      gSystem->Load("libPHOSUtils");
143      gSystem->Load("libPWGCaloTrackCorrBase");
144      gSystem->Load("libPWGGACaloTrackCorrelations");
145      gSystem->Load("libPWGGACaloTasks");
146      gSystem->Load("libPWGGAPHOSTasks");
147      gSystem->Load("libPWGGAEMCALTasks");
148   }  
149   if(doMUON || doMUONTrig) {
150      gSystem->Load("libPWGmuon");
151      gSystem->Load("libPWGPPMUONlite");
152      gSystem->Load("libPWGmuondep");
153   }
154   if (doFMD) {
155      gSystem->Load("libPWGLFforward2");
156   }      
157 }
158
159 void AddAnalysisTasks(const char *suffix)
160 {
161   TString ss(suffix);
162   ss.ToLower();
163   Bool_t ibarrel = (ss.Contains("barrel"))?kTRUE:kFALSE;
164   AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
165   mgr->SetCommonFileName(Form("QAresults%s.root",suffix));
166   // Statistics task
167   mgr->AddStatisticsTask(kTriggerMask);
168   //
169   // CDB connection
170   //
171   if (doCDBconnect) {
172     gROOT->LoadMacro("$ALICE_ROOT/PWGPP/PilotTrain/AddTaskCDBconnect.C");
173     AliTaskCDBconnect *taskCDB = AddTaskCDBconnect();
174     if (!taskCDB) return;
175     AliCDBManager *cdb = AliCDBManager::Instance();
176     cdb->SetDefaultStorage("raw://");
177     taskCDB->SetRunNumber(run_number);
178   }    
179   
180   //
181   // Event Statistics (Jan Fiete)
182   //
183   if (doEventStat) {
184       gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskPhysicsSelection.C");
185       AliPhysicsSelectionTask* physSelTask = AddTaskPhysicsSelection(kFALSE /*MC*/);
186       AliAnalysisDataContainer *cstatsout = (AliAnalysisDataContainer*)mgr->GetOutputs()->FindObject("cstatsout");
187       cstatsout->SetFileName(Form("EventStat_temp%s.root", suffix));
188   }
189   
190   //
191   // Centrality (A. Toia)
192   //
193   if (doCentrality) {
194      if (!iCollisionType) {
195         printf("Disabling centrality task for p-p\n");
196         doCentrality = kFALSE;
197      } else {           
198         gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskCentrality.C");
199         AliCentralitySelectionTask *taskCentrality = AddTaskCentrality();
200      }   
201   }   
202   
203   // Vertexing (A. Dainese)
204   // 
205   if (doVertex) {
206     gROOT->LoadMacro("$ALICE_ROOT/PWGPP/macros/AddTaskVertexESD.C");
207     AliAnalysisTaskVertexESD* taskvertexesd =  AddTaskVertexESD(kFALSE, kTriggerMask);
208     taskvertexesd->SelectCollisionCandidates(kTriggerMask);
209   }  
210
211   // TPC QA (E. Sicking)
212   //
213   if (doQAsym) {
214   // offline trigger in AddTask
215     gROOT->LoadMacro("$ALICE_ROOT/PWGPP/PilotTrain/AddTaskQAsym.C");
216     AliAnalysisTaskSE * taskqasim = AddTaskQAsym(0, kTriggerMask, kTriggerHM, kTriggerEMC, kTriggerMuonBarell);
217   }  
218   //
219   // VZERO QA  (C. Cheshkov)
220   //
221   if (doVZERO && ibarrel) {
222     gROOT->LoadMacro("$ALICE_ROOT/PWGPP/PilotTrain/AddTaskVZEROQA.C");
223     AliAnalysisTaskSE * taskv0qa = AddTaskVZEROQA(0);
224 //  taskv0qa->SelectCollisionCandidates();
225   }
226   if (doVZEROPbPb && iCollisionType==1) {
227     gROOT->LoadMacro("$ALICE_ROOT/PWGPP/VZERO/AddTaskVZEROPbPb.C");
228     AliAnaVZEROPbPb* taskV0PbPb = (AliAnaVZEROPbPb*)AddTaskVZEROPbPb(0);
229 //    taskV0PbPb->SetClassesNames("CTRUE-,C0HWU-,CPBI2WU_B1-,CPBI2_B1-,CPBI1WU-,CPBI1-,CVHNWU-,CVHN-,CVLNWU-,CVLN-");
230 //    taskV0PbPb->SetClassesNames("CTRUE-,C0HWU-,CPBI2WU,CPBI2,CPBI1WU-,CPBI1-,CVHNWU,CVHN,CVLNWU,CVLN");
231 //    taskV0PbPb->SetClassesNames("CTRUE-,C0HWU-,CPBI2WU-,CPBI2-,CPBI2WU_B1-,CPBI2_B1-,CPBI1WU-,CPBI1-,CVHNWU-,CVHN-,CVHN_R2-,CVHNWU_R2-,CVLNWU-,CVLN-,CVLN_B2-,CVLNWU_B2-");
232 //    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-");
233     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-");
234   }
235   //
236   // TPC (Jacek Otwinowski & Michael Knichel)
237   //
238   //
239   // Optionally MC information can be used by setting the 1st argument to true
240   // Optionally friends information can be switched off by setting the 2st argument 
241   // to false
242   // Optionally highMult axis can be used by setting the 3st argument to true (for PbPb)
243   if (doTPC && ibarrel) {
244     gROOT->LoadMacro("$ALICE_ROOT/PWGPP/TPC/macros/AddTaskPerformanceTPCdEdxQA.C");
245     AliPerformanceTask *tpcQA = 0;
246     if (iCollisionType) {
247        // High multiplicity Pb-Pb
248        tpcQA = AddTaskPerformanceTPCdEdxQA(kFALSE, kTRUE, kTRUE);
249     } else {
250       // Low multiplicity (pp)
251        tpcQA = AddTaskPerformanceTPCdEdxQA(kFALSE, kTRUE, kFALSE);
252     }
253     tpcQA->SelectCollisionCandidates(kTriggerMask);
254   }  
255
256   // HLT (Alberica Toia)
257   if (doHLT && ibarrel) {
258     gROOT->LoadMacro("$ALICE_ROOT/PWGPP/TPC/macros/AddTaskPerformanceTPCdEdxQA.C");
259     AliPerformanceTask *hltQA = AddTaskPerformanceTPCdEdxQA(kFALSE, kTRUE, kFALSE,0,kTRUE);
260     hltQA->SelectCollisionCandidates(kTriggerMask);
261   }  
262   //
263   // SPD (A. Mastroserio)
264   //
265   if (doSPD) {
266     gROOT->LoadMacro("$ALICE_ROOT/PWGPP/PilotTrain/AddTaskSPDQA.C");
267     AliAnalysisTaskSPD* taskspdqa = (AliAnalysisTaskSPD*)AddTaskSPDQA();
268     // Request from Annalisa
269     if (iCollisionType) taskspdqa->SetHeavyIonMode();
270     taskspdqa->SelectCollisionCandidates(kTriggerMask);
271     taskspdqa->SetOCDBInfo(run_number, "raw://");
272   }  
273   //
274   // SDD (F. Prino)
275   //
276   if (doSDD) {
277     gROOT->LoadMacro("$ALICE_ROOT/PWGPP/PilotTrain/AddSDDPoints.C");
278     AliAnalysisTaskSE* tasksdd = AddSDDPoints();
279     tasksdd->SelectCollisionCandidates(kTriggerMask);
280   }
281   //
282   // SSD dEdx (Marek Chojnacki)
283   //
284   if (doSSDdEdx) {
285     gROOT->LoadMacro("$ALICE_ROOT/PWGPP/PilotTrain/AddTaskdEdxSSDQA.C");
286     AliAnalysisTaskSE* taskssddedx = AddTaskdEdxSSDQA();
287     taskssddedx->SelectCollisionCandidates(kTriggerMask);
288   }
289
290   //
291   // ITS
292   //
293   if (doITS) {
294   // hardcoded non-zero trigger mask
295       gROOT->LoadMacro("$ALICE_ROOT/PWGPP/macros/AddTaskPerformanceITS.C");
296       AliAnalysisTaskITSTrackingCheck *itsQA = 0;
297       AliAnalysisTaskITSTrackingCheck *itsQACent0010 = 0;
298       AliAnalysisTaskITSTrackingCheck *itsQACent3050 = 0;
299       AliAnalysisTaskITSTrackingCheck *itsQACent6080 = 0;
300       if(iCollisionType==0) {
301         itsQA = AddTaskPerformanceITS(kFALSE);
302       } else {
303         itsQA = AddTaskPerformanceITS(kFALSE);
304         itsQACent0010 = AddTaskPerformanceITS(kFALSE,kFALSE,kFALSE,3500,10000);
305         itsQACent3050 = AddTaskPerformanceITS(kFALSE,kFALSE,kFALSE,590,1570);
306         itsQACent6080 = AddTaskPerformanceITS(kFALSE,kFALSE,kFALSE,70,310);
307       }
308   }
309   //
310   // ITS saTracks, align (F.Prino)
311   //
312   if (doITSsaTracks) {
313   // offline trigger in AddTask
314      gROOT->LoadMacro("$ALICE_ROOT/PWGPP/macros/AddTaskITSsaTracks.C");
315      AliAnalysisTaskITSsaTracks *itssaTracks = AddTaskITSsaTracks(kFALSE,kFALSE);
316      itssaTracks->SelectCollisionCandidates(kTriggerMask);
317   }   
318   if (doITSalign) {
319   // no offline trigger selection
320      gROOT->LoadMacro("$ALICE_ROOT/PWGPP/macros/AddTaskITSAlign.C");
321      AliAnalysisTaskITSAlignQA *itsAlign = AddTaskITSAlign(0,2011);
322   }   
323   //
324   // TRD (Alex Bercuci, M. Fasel) 
325   //
326   if(doTRD && ibarrel) {
327   // no offline trigger selection
328       gROOT->LoadMacro("$ALICE_ROOT/PWGPP/macros/AddTrainPerformanceTRD.C");
329       // steer individual TRD tasks
330       Bool_t 
331       doCheckESD(kTRUE),  // AliTRDcheckESD
332       doCheckDET(kTRUE),  // AliTRDcheckDET
333       doEffic(kTRUE),     // AliTRDefficiency
334       doResolution(kTRUE),// AliTRDresolution
335       doCheckPID(kTRUE),  // AliTRDcheckPID
336       doV0Monitor(kFALSE);// AliTRDv0Monitor
337       AddTrainPerformanceTRD(Translate(doCheckESD, doCheckDET, doEffic, doResolution, doCheckPID, doV0Monitor));
338   }
339
340   //
341   // ZDC (Chiara Oppedisano) 
342   //
343   if(doZDC && ibarrel) {
344   // hardcoded kMB trigger mask
345      gROOT->LoadMacro("$ALICE_ROOT/PWGPP/ZDC/AddTaskZDCQA.C");
346      AliAnalysisTaskSE *taskZDC = AddTaskZDCQA();
347      taskZDC->SelectCollisionCandidates(kTriggerMask);
348   }   
349   //
350   // Calorimetry (Gustavo Conesa)
351   //
352
353   if(doCALO) {
354       gROOT->LoadMacro("$ALICE_ROOT/PWGGA/CaloTrackCorrelations/macros/QA/AddTaskCalorimeterQA.C");
355       AliAnalysisTaskCaloTrackCorrelation *taskCaloQA = AddTaskCalorimeterQA("ESD", 2011, kFALSE, kFALSE);
356       taskCaloQA->SetDebugLevel(0);
357       // offline mask set in AddTask to kMB
358       taskCaloQA->SelectCollisionCandidates(kTriggerMask);
359       // Add a new calo task with EMC1 trigger only
360       taskCaloQA = AddTaskCalorimeterQA("ESD", 2011, kFALSE, kFALSE, "", "EMC7");
361       taskCaloQA->SetDebugLevel(0);
362       taskCaloQA->SelectCollisionCandidates(kTriggerEMC);
363   }
364
365   //
366   // Muon Trigger
367   //
368   
369   if(doMUONTrig) {
370   // no offline trigger selection
371       gROOT->LoadMacro("$ALICE_ROOT/PWGPP/macros/AddTaskMTRchamberEfficiency.C");
372       AliAnalysisTaskTrigChEff *taskMuonTrig = AddTaskMTRchamberEfficiency();
373   }
374
375   //
376   // Impact parameter resolution (xianbao.yuan@pd.infn.it, andrea.dainese@pd.infn.it)
377   //
378   if (doImpParRes && ibarrel) {
379     gROOT->LoadMacro("$ALICE_ROOT/PWGPP/macros/AddTaskImpParRes.C");
380     AliAnalysisTaskSE* taskimpparres=0;
381     if(iCollisionType==0) {
382        taskimpparres= AddTaskImpParRes();
383     } else {
384        taskimpparres= AddTaskImpParRes(kFALSE,-1,kFALSE,kFALSE);
385     }
386     taskimpparres->SelectCollisionCandidates(kTriggerMask);
387   }  
388   //
389   // MUON QA (Philippe Pillot)
390   //
391   if (doMUON) {
392   // trigger analysis internal
393     gROOT->LoadMacro("$ALICE_ROOT/PWGPP/PilotTrain/AddTaskMuonQA.C");
394     AliAnalysisTaskSE* taskmuonqa= AddTaskMuonQA();
395   }  
396   //
397   // TOF (Francesca Bellini)
398   //
399   if (doTOF && ibarrel) {
400     gROOT->LoadMacro("$ALICE_ROOT/PWGPP/TOF/AddTaskTOFQA.C");
401     AliAnalysisTaskTOFqa *tofQA = AddTaskTOFQA();
402     tofQA->SelectCollisionCandidates(kTriggerMask);
403   } 
404    //
405   // PIDResponse(JENS)
406   //
407   if (doPIDResponse && ibarrel) {
408     gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskPIDResponse.C"); 
409     AliAnalysisTaskPIDResponse *PIDResponse = AddTaskPIDResponse();
410     PIDResponse->SelectCollisionCandidates(kTriggerMask);
411   }  
412
413   //
414   // PIDqa(JENS)
415   //
416   if (doPIDqa && ibarrel) {
417     gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskPIDqa.C");
418     AliAnalysisTaskPIDqa *PIDQA = AddTaskPIDqa();
419     PIDQA->SelectCollisionCandidates(kTriggerMask);
420   }  
421  
422   //
423   // HMPID QA (Giacomo Volpe)
424   //
425   if (doHMPID && ibarrel) {
426     gROOT->LoadMacro("$ALICE_ROOT/PWGPP/HMPID/AddTaskHmpidQA.C");
427     AliAnalysisTaskSE* taskhmpidqa= AddTaskHmpidQA(kFALSE);
428       // offline mask set in AddTask to kMB
429     taskhmpidqa->SelectCollisionCandidates(kTriggerMask);
430   }      
431   
432   
433   // T0 QA (Alla Mayevskaya)
434   if (doT0 && ibarrel) {
435   // no offline trigger selection
436     gROOT->LoadMacro("$ALICE_ROOT/PWGPP/T0/AddTaskT0QA.C");
437     AliT0AnalysisTaskQA* taskt0qa= AddTaskT0QA();
438     taskt0qa->SelectCollisionCandidates(kTriggerMask);
439   }      
440   // FMD QA (Christian Holm Christiansen)
441   if (doFMD && ibarrel) {
442     gROOT->LoadMacro("$ALICE_ROOT/PWGLF/FORWARD/analysis2/AddTaskForwardQA.C");
443     // Parameters: usemc, usecentrality
444     AliAnalysisTaskSE *forwardQA = (AliAnalysisTaskSE *)AddTaskForwardQA(kFALSE, kFALSE);
445     // No offline trigger config. needed (see #84077)
446   }
447    //     
448   // PHOS QA (Boris Polishchuk)
449   //
450   if (doPHOS) {
451     gROOT->LoadMacro("$ALICE_ROOT/PWGGA/PHOSTasks/CaloCellQA/macros/AddTaskCaloCellsQA.C");
452     AliAnalysisTaskCaloCellsQA *taskPHOSCellQA1 = AddTaskCaloCellsQA(4, 1, NULL,"PHOSCellsQA_AnyInt"); 
453     taskPHOSCellQA1->SelectCollisionCandidates(kTriggerMask);
454     taskPHOSCellQA1->GetCaloCellsQA()->SetClusterEnergyCuts(0.3,0.3,1.0);
455     AliAnalysisTaskCaloCellsQA *taskPHOSCellQA2 = AddTaskCaloCellsQA(4, 1, NULL,"PHOSCellsQA_PHI7"); 
456     taskPHOSCellQA2->SelectCollisionCandidates(AliVEvent::kPHI7);
457     taskPHOSCellQA2->GetCaloCellsQA()->SetClusterEnergyCuts(0.3,0.3,1.0);
458     // Pi0 QA fo PbPb
459     if (iCollisionType) {
460       gROOT->LoadMacro("$ALICE_ROOT/PWGGA/PHOSTasks/PHOS_PbPbQA/macros/AddTaskPHOSPbPb.C");
461       AliAnalysisTaskPHOSPbPbQA* phosPbPb = AddTaskPHOSPbPbQA(0);
462     }
463   }    
464   if (doPHOSTrig) {
465      gROOT->LoadMacro("$ALICE_ROOT/PWGGA/PHOSTasks/PHOS_TriggerQA/macros/AddTaskPHOSTriggerQA.C");
466      AliAnalysisTaskPHOSTriggerQA *taskPHOSTrig = AddTaskPHOSTriggerQA(NULL);
467   }
468   //
469   // EMCAL QA (Gustavo Conesa)
470   //
471   if (doEMCAL) {
472      gROOT->LoadMacro("$ALICE_ROOT/PWGGA/EMCALTasks/macros/AddTaskEMCALTriggerQA.C");
473      AliAnalysisTaskEMCALTriggerQA *emctrig = AddTaskEMCALTriggerQA();
474   }   
475   //     
476   // FLOW and BF QA (C.Perez && A.Rodriguez)
477   //
478   if (doFBFqa && ibarrel) {
479     gROOT->LoadMacro("$ALICE_ROOT/PWGPP/macros/AddTaskFBFqa.C");
480     AliAnalysisTaskSE *qaFBFMB = (AliAnalysisTaskSE*) AddTaskFBFqa("qaFBFmb",kFALSE);
481     qaFBFMB->SelectCollisionCandidates(AliVEvent::kMB);
482     AliAnalysisTaskSE *qaFBFSC = (AliAnalysisTaskSE*) AddTaskFBFqa("qaFBFsc",kFALSE);
483     qaFBFSC->SelectCollisionCandidates(AliVEvent::kSemiCentral);
484     AliAnalysisTaskSE *qaFBFCE = (AliAnalysisTaskSE*) AddTaskFBFqa("qaFBFce",kFALSE);
485     qaFBFCE->SelectCollisionCandidates(AliVEvent::kCentral);
486   }
487 }
488
489 void QAmerge(const char *suffix, const char *dir, Int_t stage)
490 {
491 // Merging method
492   TStopwatch timer;
493   timer.Start();
494   TString outputDir = dir;
495   TString outputFiles = Form("QAresults%s.root,EventStat_temp%s.root,RecoQAresults%s.root",suffix,suffix,suffix);
496   TString mergeExcludes = "";
497   TObjArray *list = outputFiles.Tokenize(",");
498   TIter *iter = new TIter(list);
499   TObjString *str;
500   TString outputFile;
501   Bool_t merged = kTRUE;
502   while((str=(TObjString*)iter->Next())) {
503     outputFile = str->GetString();
504     // Skip already merged outputs
505     if (!gSystem->AccessPathName(outputFile)) {
506        printf("Output file <%s> found. Not merging again.",outputFile.Data());
507        continue;
508     }
509     if (mergeExcludes.Contains(outputFile.Data())) continue;
510     merged = AliAnalysisAlien::MergeOutput(outputFile, outputDir, 10, stage);
511     if (!merged && !outputFile.Contains("RecoQAresults")) {
512        printf("ERROR: Cannot merge %s\n", outputFile.Data());
513        return;
514     }
515   }
516   // read the analysis manager from file
517   if (!outputDir.Contains("Stage")) {
518     ofstream out;
519     out.open("outputs_valid", ios::out);
520     out.close();    
521     return;
522   }
523   AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
524   mgr->SetRunFromPath(mgr->GetRunFromAlienPath(dir));
525   mgr->SetSkipTerminate(kFALSE);
526   if (!mgr->InitAnalysis()) return;
527   mgr->PrintStatus();
528   AliLog::SetGlobalLogLevel(AliLog::kError);
529   TTree *tree = NULL;
530   mgr->StartAnalysis("gridterminate", tree);
531   if (strlen(suffix)) {
532      if (gSystem->Exec(Form("mv trending.root trending%s.root", suffix)))
533         ::Error("QAmerge", "File trending.root was not produced");
534      if (gSystem->Exec(Form("mv event_stat.root event_stat%s.root", suffix)))
535         ::Error("QAmerge", "File trending.root was not produced");
536   }   
537   ofstream out;
538   out.open("outputs_valid", ios::out);
539   out.close();
540   timer.Print();
541 }