]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGLF/FORWARD/analysis2/sim/QA.C
c65a653cdee342a3aadb84e467a17c9621f8ad8c
[u/mrichter/AliRoot.git] / PWGLF / FORWARD / analysis2 / sim / QA.C
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  *
11  * This script reads in two other scripts 
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
18  * 
19  */
20 // Trigger mask.
21 UInt_t kTriggerInt        = AliVEvent::kAnyINT;
22 UInt_t kTriggerMuonAll    = (AliVEvent::kMUL7       | 
23                              AliVEvent::kMUSH7      | 
24                              AliVEvent::kMUU7       |
25                              AliVEvent::kMUS7       |
26                              AliVEvent::kMUSPB      |
27                              AliVEvent::kMUSHPB     |
28                              AliVEvent::kMuonLikePB | 
29                              AliVEvent::kMuonUnlikePB);
30 UInt_t kTriggerMuonBarell = AliVEvent::kMUU7;
31 UInt_t kTriggerEMC        = (AliVEvent::kEMC7   | 
32                              AliVEvent::kEMC8   | 
33                              AliVEvent::kEMCEJE | 
34                              AliVEvent::kEMCEGA);
35 UInt_t kTriggerHM         = AliVEvent::kHighMult;
36 UInt_t kTriggerMask       = kTriggerInt;
37
38 /**
39  * Interface (pure virtual) that all configuration classes must
40  * implement.
41  */
42 struct VirtualQACfg
43 {
44   /** @return  */
45   virtual Bool_t DoCDBconnect()  const = 0;
46   /** @return  */
47   virtual Bool_t DoEventStat()   const = 0;
48   /** @return  */
49   virtual Bool_t DoCentrality()  const = 0;
50   /** @return  */
51   virtual Bool_t DoQAsym()       const = 0;
52   /** @return  there is a 2nd file */
53   virtual Bool_t DoVZERO()       const = 0;
54   /** @return  */
55   virtual Bool_t DoVZEROPbPb()   const = 0;
56   /** @return  */
57   virtual Bool_t DoVertex()      const = 0;
58   /** @return  needs RP    */
59   virtual Bool_t DoSPD()         const = 0;
60   /** @return  */
61   virtual Bool_t DoTPC()         const = 0;
62   /** @return  */
63   virtual Bool_t DoHLT()         const = 0;
64   /** @return  needs RP */
65   virtual Bool_t DoSDD()         const = 0;
66   /** @return  */
67   virtual Bool_t DoSSDdEdx()     const = 0;
68   /** @return  */
69   virtual Bool_t DoTRD()         const = 0;
70   /** @return  */
71   virtual Bool_t DoITS()         const = 0;
72   /** @return  */
73   virtual Bool_t DoITSsaTracks() const = 0;
74   /** @return  */
75   virtual Bool_t DoITSalign()    const = 0;
76   /** @return  */
77   virtual Bool_t DoCALO()        const = 0;
78   /** @return  */
79   virtual Bool_t DoMUONTrig()    const = 0;
80   /** @return  */
81   virtual Bool_t DoImpParRes()   const = 0;
82   /** @return  */
83   virtual Bool_t DoMUON()        const = 0;
84   /** @return  */
85   virtual Bool_t DoTOF()         const = 0;
86   /** @return  */
87   virtual Bool_t DoHMPID()       const = 0;
88   /** @return  */
89   virtual Bool_t DoT0()          const = 0;
90   /** @return  */
91   virtual Bool_t DoZDC()         const = 0;
92   /** @return  */
93   virtual Bool_t DoPIDResponse() const = 0;
94   /** @return  */
95   virtual Bool_t DoPIDqa()       const = 0;
96   /** @return  */
97   virtual Bool_t DoFWD()         const = 0;
98   /** @return  */
99   virtual Bool_t DoPHOS()        const = 0;
100   /** @return  */
101   virtual Bool_t DoPHOSTrig()    const = 0;
102   /** @return  */
103   virtual Bool_t DoEMCAL()       const = 0;
104   /** @return  */
105   virtual Bool_t DoFBFqa()       const = 0;
106   /** @return  NEEDS geometry */
107   virtual Bool_t DoMUONEff()     const = 0;
108   /** @return  NEEDS MCtruth  */
109   virtual Bool_t DoV0()          const = 0;
110   /** @return Get Debug level */
111   virtual Int_t DebugLevel() const = 0;
112 };
113 VirtualQACfg* qaCfg = 0;
114
115 //====================================================================
116 /** 
117  * Load the needed libraries 
118  * 
119  */
120 void LoadLibraries()
121 {
122   Bool_t is10h = grp->period.EqualTo("LHC10h",TString::kIgnoreCase);
123   gSystem->SetIncludePath("-I. " 
124                         "-I$ROOTSYS/include " 
125                         "-I$ALICE_ROOT/include " 
126                         "-I$ALICE_ROOT " 
127                         "-I$ALICE_ROOT/ITS " 
128                         "-I$ALICE_ROOT/TRD " 
129                         "-I$ALICE_ROOT/PWGPP " 
130                         "-I$ALICE_ROOT/PWGPP/TRD");
131   gSystem->Load("libANALYSIS");
132   gSystem->Load("libANALYSISalice");
133   gSystem->Load("libOADB");
134   gSystem->Load("libESDfilter.so");
135   gSystem->Load("libCORRFW");
136   gSystem->Load("libTENDER");
137   gSystem->Load("libPWGPP.so");
138   gSystem->Load("libAliHLTTrigger.so");
139
140   if (qaCfg->DoEMCAL() || qaCfg->DoPHOS() || 
141       (qaCfg->DoCALO() && !is10h)) {
142     gSystem->Load("libEMCALUtils");
143     gSystem->Load("libPHOSUtils");
144     gSystem->Load("libPWGCaloTrackCorrBase");
145     gSystem->Load("libPWGGACaloTrackCorrelations");
146     gSystem->Load("libPWGGACaloTasks");
147     gSystem->Load("libPWGGAPHOSTasks");
148     gSystem->Load("libPWGTools");
149     gSystem->Load("libPWGEMCAL");
150     gSystem->Load("libPWGGAEMCALTasks");
151   }  
152   if(qaCfg->DoMUON() || qaCfg->DoMUONTrig()) {
153     gSystem->Load("libPWGmuon");
154     gSystem->Load("libPWGPPMUONlite");
155     gSystem->Load("libPWGmuondep");
156   }
157   if (qaCfg->DoFWD()) {
158     gSystem->Load("libPWGLFforward2");
159   }      
160 }
161  
162 //====================================================================
163 /** 
164  * Add the analysis tasks 
165  * 
166  * @param cdb_location 
167  */
168 void AddAnalysisTasks(const char *cdb_location)
169 {
170   AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
171   mgr->SetCommonFileName("QAresults.root");
172
173   Bool_t is10h = grp->period.EqualTo("LHC10h",TString::kIgnoreCase);
174   // --- Some short-hands --------------------------------------------
175   TString ali   = "$ALICE_ROOT";
176   TString ana   = ali + "/ANALYSIS";
177   TString pwghf = ali + "/PWGHF";
178   TString pwglf = ali + "/PWGLF";
179   TString pwgje = ali + "/PWGJE";
180   TString pwgdq = ali + "/PWGDQ";
181   TString pwgpp = ali + "/PWGPP";
182   TString pwgga = ali + "/PWGGA";
183   
184   // --- Statistics task ---------------------------------------------
185   mgr->AddStatisticsTask(kTriggerMask);
186
187   // --- CDB connection ----------------------------------------------
188   if (qaCfg->DoCDBconnect()) {
189     gROOT->LoadMacro(pwgpp+"/PilotTrain/AddTaskCDBconnect.C");
190     AliTaskCDBconnect *taskCDB = AddTaskCDBconnect(cdb_location, grp->run);
191     if (!taskCDB) return;
192   }    
193   
194   // --- Event Statistics (Jan Fiete) --------------------------------
195   if (qaCfg->DoEventStat()) {
196     gROOT->LoadMacro(ana+"/macros/AddTaskPhysicsSelection.C");
197     AliPhysicsSelectionTask* physSelTask = AddTaskPhysicsSelection(kTRUE/*MC*/);
198     // Hack by Alexander for LHC10h
199     // gROOT->LoadMacro("LHC10hPS.C");
200     // AliOADBPhysicsSelection* ops = LHC10hPS(grp->period, grp->run);
201     // if (ops) 
202     //   physSelTask->GetPhysicsSelection()->SetCustomOADBObjects(ops,0);
203   }
204   // --- PIDResponse(JENS) -------------------------------------------
205   if (qaCfg->DoPIDResponse() && !is10h) {
206     gROOT->LoadMacro(ana+"/macros/AddTaskPIDResponse.C"); 
207     AliAnalysisTaskPIDResponse *PIDResponse = AddTaskPIDResponse(kTRUE);
208     PIDResponse->SelectCollisionCandidates(kTriggerMask);
209   }    
210   // --- Centrality (A. Toia) ----------------------------------------
211   if (qaCfg->DoCentrality()) {
212     gROOT->LoadMacro(ana+"/macros/AddTaskCentrality.C");
213     AliCentralitySelectionTask *taskCentrality = AddTaskCentrality();
214     taskCentrality->SetMCInput();        
215   }   
216   
217   // --- Vertexing (A. Dainese) --------------------------------------
218   if (qaCfg->DoVertex()) {
219     gROOT->LoadMacro(pwgpp+"/macros/AddTaskVertexESD.C");
220     // Specific setting for MC
221     AliAnalysisTaskVertexESD* taskvertexesd =  
222       AddTaskVertexESD(kTRUE, kTriggerMask);
223     taskvertexesd->SelectCollisionCandidates(kTriggerMask);
224   }  
225
226   // --- TPC QA (E. Sicking) -----------------------------------------
227   if (qaCfg->DoQAsym()) {
228   // offline trigger in AddTask
229     gROOT->LoadMacro(pwgpp+"/PilotTrain/AddTaskQAsym.C");
230     AliAnalysisTaskSE * taskqasim = AddTaskQAsym(0, 
231                                                  kTriggerMask, 
232                                                  kTriggerHM, 
233                                                  kTriggerEMC, 
234                                                  kTriggerMuonBarell);
235   }  
236   // --- VZERO QA  (C. Cheshkov) -------------------------------------
237   if (qaCfg->DoVZERO()) {
238     gROOT->LoadMacro(pwgpp+"/PilotTrain/AddTaskVZEROQA.C");
239     AliAnalysisTaskSE * taskv0qa = AddTaskVZEROQA(0);
240   }
241   if (qaCfg->DoVZEROPbPb() && grp->IsAA()) {
242     gROOT->LoadMacro(pwgpp+"/VZERO/AddTaskVZEROPbPb.C");
243     AliAnaVZEROPbPb* taskV0PbPb = 
244       (AliAnaVZEROPbPb*)AddTaskVZEROPbPb(Int_t(grp->run));
245   }
246   // --- TPC (Jacek Otwinowski & Michael Knichel) --------------------
247   //
248   //
249   // - Optionally MC information can be used by setting the 1st
250   //   argument to true
251   // - Optionally friends information can be switched off by setting
252   //   the 2st argument to false
253   // - Optionally highMult axis can be used by setting the 3st
254   //   argument to true (for PbPb)
255   if (qaCfg->DoTPC()) {
256     gROOT->LoadMacro(pwgpp+"/TPC/macros/AddTaskPerformanceTPCdEdxQA.C");
257     AliPerformanceTask *tpcQA = 0;
258     if (grp->IsAA()) {
259        // High multiplicity Pb-Pb
260        tpcQA = AddTaskPerformanceTPCdEdxQA(kTRUE, kTRUE, kTRUE);
261     } else {
262       // Low multiplicity (pp)
263        tpcQA = AddTaskPerformanceTPCdEdxQA(kTRUE, kTRUE, kFALSE);
264     }
265     tpcQA->SelectCollisionCandidates(kTriggerMask);
266     AliPerformanceRes::SetMergeEntriesCut(5000000); 
267   }  
268
269   // --- HLT (Alberica Toia) -----------------------------------------
270   if (qaCfg->DoHLT()) {
271     gROOT->LoadMacro(pwgpp+"/TPC/macros/AddTaskPerformanceTPCdEdxQA.C");
272     AliPerformanceTask *hltQA = AddTaskPerformanceTPCdEdxQA(kTRUE, kTRUE, kFALSE,0,kTRUE);
273     hltQA->SelectCollisionCandidates(kTriggerMask);
274   }  
275   // --- SPD (A. Mastroserio) ----------------------------------------
276   if (qaCfg->DoSPD()) {
277     gROOT->LoadMacro(pwgpp+"/PilotTrain/AddTaskSPDQA.C");
278     AliAnalysisTaskSPD* taskspdqa = (AliAnalysisTaskSPD*)AddTaskSPDQA();
279     // Request from Annalisa
280     if (grp->IsAA()) taskspdqa->SetHeavyIonMode();
281     taskspdqa->SelectCollisionCandidates(kTriggerMask);
282     taskspdqa->SetOCDBInfo(grp->run, "raw://");
283   }  
284   // --- SDD (F. Prino) ----------------------------------------------
285   if (qaCfg->DoSDD()) {
286     gROOT->LoadMacro(pwgpp+"/PilotTrain/AddSDDPoints.C");
287     AliAnalysisTaskSE* tasksdd = AddSDDPoints();
288     tasksdd->SelectCollisionCandidates(kTriggerMask);
289   }
290   // --- SSD dEdx (Marek Chojnacki) ----------------------------------
291   if (qaCfg->DoSSDdEdx()) {
292     gROOT->LoadMacro(pwgpp+"/PilotTrain/AddTaskdEdxSSDQA.C");
293     AliAnalysisTaskSE* taskssddedx = AddTaskdEdxSSDQA();
294     taskssddedx->SelectCollisionCandidates(kTriggerMask);
295   }
296
297   // --- ITS ---------------------------------------------------------
298   if (qaCfg->DoITS()) {
299     // hardcoded non-zero trigger mask
300     gROOT->LoadMacro(pwgpp+"/macros/AddTaskPerformanceITS.C");
301     AliAnalysisTaskITSTrackingCheck *itsQA = 0;
302     AliAnalysisTaskITSTrackingCheck *itsQACent0010 = 0;
303     AliAnalysisTaskITSTrackingCheck *itsQACent3050 = 0;
304     AliAnalysisTaskITSTrackingCheck *itsQACent6080 = 0;
305     if(grp->IsPP()) {
306       itsQA = AddTaskPerformanceITS(kTRUE);
307     } else {
308       itsQA = AddTaskPerformanceITS(kTRUE);
309       itsQACent0010 = AddTaskPerformanceITS(kTRUE,kFALSE,kFALSE,3500,10000);
310       itsQACent3050 = AddTaskPerformanceITS(kTRUE,kFALSE,kFALSE,590,1570);
311       itsQACent6080 = AddTaskPerformanceITS(kTRUE,kFALSE,kFALSE,70,310);
312     }
313   }
314   // --- ITS saTracks, align (F.Prino) -------------------------------
315   if (qaCfg->DoITSsaTracks()) {
316     // offline trigger in AddTask
317     gROOT->LoadMacro(pwgpp+"/macros/AddTaskITSsaTracks.C");
318     AliAnalysisTaskITSsaTracks *itssaTracks = AddTaskITSsaTracks(kTRUE,kFALSE);
319     itssaTracks->SelectCollisionCandidates(kTriggerMask);
320   }   
321   if (qaCfg->DoITSalign()) {
322     // no offline trigger selection
323      gROOT->LoadMacro(pwgpp+"/macros/AddTaskITSAlign.C");
324      AliAnalysisTaskITSAlignQA *itsAlign = AddTaskITSAlign(0,2011);
325   }   
326
327   // --- TRD (Alex Bercuci, M. Fasel) --------------------------------
328   if(qaCfg->DoTRD()) {
329     // no offline trigger selection
330     gROOT->LoadMacro(pwgpp+"/macros/AddTrainPerformanceTRD.C");
331     // steer individual TRD tasks
332     Bool_t 
333       doCheckESD(kTRUE),  // AliTRDcheckESD
334       doCheckDET(kTRUE),  // AliTRDcheckDET
335       doEffic(kTRUE),     // AliTRDefficiency
336       doResolution(kTRUE),// AliTRDresolution
337       doCheckPID(kTRUE),  // AliTRDcheckPID
338       doV0Monitor(kFALSE);// AliTRDv0Monitor
339     AddTrainPerformanceTRD(Translate(doCheckESD, doCheckDET, doEffic, 
340                                      doResolution, doCheckPID, doV0Monitor));
341   }
342
343   // --- ZDC (Chiara Oppedisano) -------------------------------------
344   if(qaCfg->DoZDC()) {
345     // hardcoded kMB trigger mask
346      gROOT->LoadMacro(pwgpp+"/ZDC/AddTaskZDCQA.C");
347      AliAnalysisTaskSE *taskZDC = AddTaskZDCQA();
348      taskZDC->SelectCollisionCandidates(kTriggerMask);
349   }   
350
351   // --- Calorimetry (Gustavo Conesa) --------------------------------
352   if(qaCfg->DoCALO() && !is10h) {
353     gROOT->LoadMacro(pwgga+
354                      "/CaloTrackCorrelations/macros/QA/AddTaskCalorimeterQA.C");
355     AliAnalysisTaskCaloTrackCorrelation *taskCaloQA = 
356       AddTaskCalorimeterQA("default");
357     taskCaloQA->SetDebugLevel(0);
358     // offline mask set in AddTask to kMB
359     taskCaloQA->SelectCollisionCandidates(kTriggerMask);
360     // Add a new calo task with EMC1 trigger only
361     if (!is10h) {
362       taskCaloQA = AddTaskCalorimeterQA("trigEMC");
363       taskCaloQA->SetDebugLevel(0);
364       taskCaloQA->SelectCollisionCandidates(kTriggerEMC);
365     }
366   }
367
368   // --- Muon Trigger ------------------------------------------------
369   if(qaCfg->DoMUONTrig()) {
370     // no offline trigger selection
371     gROOT->LoadMacro(pwgpp+"/macros/AddTaskMTRchamberEfficiency.C");
372     AliAnalysisTaskTrigChEff *taskMuonTrig = AddTaskMTRchamberEfficiency();
373   }
374
375   // --- Muon Efficiency (not used) ----------------------------------
376   if(qaCfg->DoMUONEff()) {
377       gROOT->LoadMacro(ali+"/PWG3/muondep/AddTaskMUONTrackingEfficiency.C");
378       AliAnalysisTaskMuonTrackingEff *taskMuonTrackEff = 
379         AddTaskMUONTrackingEfficiency();
380   }
381   
382   // --- V0-Decay Reconstruction (Ana Marin) (not used) --------------
383   if (qaCfg->DoV0()) {
384     gROOT->LoadMacro(pwgpp+"/macros/AddTaskV0QA.C");
385     AliAnalysisTaskV0QA *taskv0QA = AddTaskV0QA(kTRUE);
386   }
387   
388   // -- Impact parameter resolution ----------------------------------
389   // (xianbao.yuan@pd.infn.it, andrea.dainese@pd.infn.it)
390   if (qaCfg->DoImpParRes()) {
391     gROOT->LoadMacro(pwgpp+"/macros/AddTaskImpParRes.C");
392     AliAnalysisTaskSE* taskimpparres=0;
393     // Specific setting for MC
394     if(grp->IsPP()) {
395       taskimpparres= AddTaskImpParRes(kTRUE);
396     } else {
397       taskimpparres= AddTaskImpParRes(kTRUE,-1,kTRUE,kFALSE);
398     }
399     taskimpparres->SelectCollisionCandidates(kTriggerMask);
400   }  
401
402   // --- MUON QA (Philippe Pillot) -----------------------------------
403   if (qaCfg->DoMUON()) {
404     // trigger analysis internal
405     gROOT->LoadMacro(pwgpp+"/PilotTrain/AddTaskMuonQA.C");
406     AliAnalysisTaskSE* taskmuonqa= AddTaskMuonQA();
407   }  
408
409   // --- TOF (Francesca Bellini) -------------------------------------
410   if (qaCfg->DoTOF()) {
411     gROOT->LoadMacro(pwgpp+"/TOF/AddTaskTOFQA.C");
412     AliAnalysisTaskTOFqa *tofQA = AddTaskTOFQA(kFALSE);
413     tofQA->SelectCollisionCandidates(kTriggerMask);
414   } 
415
416   // --- PIDqa(JENS) -------------------------------------------------
417   if (qaCfg->DoPIDqa() && !is10h) {
418     gROOT->LoadMacro(ana+"/macros/AddTaskPIDqa.C");
419     AliAnalysisTaskPIDqa *PIDQA = AddTaskPIDqa();
420     PIDQA->SelectCollisionCandidates(kTriggerMask);
421   }  
422  
423   // --- HMPID QA (Giacomo Volpe) ------------------------------------
424   //
425   if (qaCfg->DoHMPID()) {
426     gROOT->LoadMacro(pwgpp+"/HMPID/AddTaskHmpidQA.C");
427     AliAnalysisTaskSE* taskhmpidqa= AddTaskHmpidQA(kTRUE);
428     // offline mask set in AddTask to kMB
429     taskhmpidqa->SelectCollisionCandidates(kTriggerMask);
430   }      
431
432   // --- T0 QA (Alla Mayevskaya) -------------------------------------
433   if (qaCfg->DoT0()) {
434     // no offline trigger selection
435     gROOT->LoadMacro(pwgpp+"/T0/AddTaskT0QA.C");
436     AliT0AnalysisTaskQA* taskt0qa= AddTaskT0QA();
437     taskt0qa->SelectCollisionCandidates(kTriggerMask);
438   }      
439
440   // ---- FMD QA (Christian Holm Christiansen) -----------------------
441   if (qaCfg->DoFWD()) {
442     gROOT->LoadMacro(pwglf+"/FORWARD/analysis2/AddTaskForwardQA.C");
443     // Parameters: usemc, usecentrality
444     // AliAnalysisTaskSE *forwardQA = (AliAnalysisTaskSE *)
445     AddTaskForwardQA(kTRUE, qaCfg->DoCentrality());
446     // HACK: to read corrections from current directory
447     const char* hack="AliForwardCorrectionManager::Instance().SetPrefix(\".\")";
448     gROOT->ProcessLine(hack);
449     const char* hack2="AliForwardCorrectionManager::Instance().Print(\"R\")";
450     gROOT->ProcessLine(hack2);
451     // No offline trigger config. needed (see #84077)
452   }
453   
454   // --- PHOS QA (Boris Polishchuk) ----------------------------------
455   if (qaCfg->DoPHOS()) {
456     gROOT->LoadMacro(pwgga+"/PHOSTasks/CaloCellQA/macros/AddTaskCaloCellsQA.C");
457     AliAnalysisTaskCaloCellsQA *taskPHOSCellQA1 = 
458       AddTaskCaloCellsQA(4, 1, NULL,"PHOSCellsQA_AnyInt"); 
459     taskPHOSCellQA1->SelectCollisionCandidates(kTriggerMask);
460     taskPHOSCellQA1->GetCaloCellsQA()->SetClusterEnergyCuts(0.3,0.3,1.0);
461
462     AliAnalysisTaskCaloCellsQA *taskPHOSCellQA2 = 
463       AddTaskCaloCellsQA(4, 1, NULL,"PHOSCellsQA_PHI7"); 
464     taskPHOSCellQA2->SelectCollisionCandidates(AliVEvent::kPHI7);
465     taskPHOSCellQA2->GetCaloCellsQA()->SetClusterEnergyCuts(0.3,0.3,1.0);
466
467     // Pi0 QA fo PbPb
468     if (grp->IsAA()) {
469       gROOT->LoadMacro(pwgga+"/PHOSTasks/PHOS_PbPbQA/macros/AddTaskPHOSPbPb.C");
470       AliAnalysisTaskPHOSPbPbQA* phosPbPb = AddTaskPHOSPbPbQA(0);
471     }
472   }
473   if (qaCfg->DoPHOSTrig()) {
474     gROOT->LoadMacro(pwgga+
475                      "/PHOSTasks/PHOS_TriggerQA/macros/AddTaskPHOSTriggerQA.C");
476     AliAnalysisTaskPHOSTriggerQA *taskPHOSTrig = AddTaskPHOSTriggerQA(0,0);
477   }   
478
479   // --- EMCAL QA (Gustavo Conesa) -----------------------------------
480   if (qaCfg->DoEMCAL()) {
481      gROOT->LoadMacro(pwgga+"/EMCALTasks/macros/AddTaskEMCALTriggerQA.C");
482      AliAnalysisTaskEMCALTriggerQA *emctrig = AddTaskEMCALTriggerQA();
483   }   
484
485   // --- FLOW and BF QA (C.Perez && A.Rodriguez) ---------------------
486   if (qaCfg->DoFBFqa()) {
487     gROOT->LoadMacro(pwgpp+"/macros/AddTaskFBFqa.C");
488     AliAnalysisTaskSE *qaFBFMB = (AliAnalysisTaskSE*)AddTaskFBFqa("qaFBFmb",
489                                                                   kFALSE);
490     qaFBFMB->SelectCollisionCandidates(AliVEvent::kMB);
491     AliAnalysisTaskSE *qaFBFSC = (AliAnalysisTaskSE*)AddTaskFBFqa("qaFBFsc",
492                                                                   kFALSE);
493     qaFBFSC->SelectCollisionCandidates(AliVEvent::kSemiCentral);
494     AliAnalysisTaskSE *qaFBFCE = (AliAnalysisTaskSE*)AddTaskFBFqa("qaFBFce",
495                                                                   kFALSE);
496     qaFBFCE->SelectCollisionCandidates(AliVEvent::kCentral);
497   }
498 }
499
500 //====================================================================
501 /** 
502  * Run QA merging 
503  * 
504  * @param dir      directory 
505  * @param stage    stage 
506  */
507 void QAMerge(const char *dir, Int_t stage)
508 {
509 // Merging method
510   TStopwatch  timer;     timer.Start();
511   TString     outputDir     = dir;
512   TString     outputFiles   = "QAresults.root,EventStat_temp.root";
513   TString     mergeExcludes = "";
514   TObjArray*  tokens        = outputFiles.Tokenize(",");
515   TIter       iter(tokens);
516   TObjString* str           = 0;
517   TString     outputFile;
518   Bool_t      merged        = kTRUE;
519   while((str = static_cast<TObjString*>(iter()))) {
520     outputFile = str->GetString();
521     // Skip already merged outputs
522     if (!gSystem->AccessPathName(outputFile)) {
523       printf("Output file <%s> found. Not merging again.",
524              outputFile.Data());
525       continue;
526     }
527     if (mergeExcludes.Contains(outputFile.Data())) continue;
528     merged = AliAnalysisAlien::MergeOutput(outputFile, 
529                                            outputDir, 
530                                            10, 
531                                            stage);
532     if (!merged) {
533        printf("ERROR: Cannot merge %s\n", outputFile.Data());
534        continue;
535     }
536   }
537   TString infolog = "fileinfo.log";
538   AliAnalysisAlien::MergeInfo(infolog, dir); 
539
540   if (!outputDir.Contains("Stage")) {
541     ofstream out;
542     out.open("outputs_valid", ios::out);
543     out.close();    
544     return;
545   }
546   // --- Set up to run terminate -------------------------------------
547   AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
548   mgr->SetRunFromPath(mgr->GetRunFromAlienPath(dir));
549   mgr->SetSkipTerminate(kFALSE);
550   if (!mgr->InitAnalysis()) return;
551   mgr->PrintStatus();
552   AliLog::SetGlobalLogLevel(AliLog::kError);
553   TTree *tree = NULL;
554   gROOT->cd();
555   mgr->StartAnalysis("gridterminate", tree);
556   ofstream out;
557   out.open("outputs_valid", ios::out);
558   out.close();
559   timer.Print();
560 }
561
562 //====================================================================
563 /** 
564  * Run QA trains 
565  * 
566  * @param run         Run number 
567  * @param xmlfile     Collection file 
568  * @param stage       Stage 
569  * @param train       Train 
570  * @param cdb         CDB location 
571  */
572 void QA(UInt_t      run, 
573         const char* xmlfile   = "wn.xml",
574         Int_t       stage     = 0, /*0 = QA train, 1...n - merging stage*/
575         const char* cdb       = "raw://")
576 {
577   // -----------------------------------------------------------------
578   // 
579   // Get GRP parameters.  Defines global "grp" as a pointer to GRPData
580   //
581   gROOT->Macro(Form("GRP.C(%d)", run));
582   gROOT->Macro("QAConfig.C");
583   Int_t   debug_level = qaCfg->DebugLevel();   // Debugging
584   TString cdbString(cdb);
585   if (cdbString.Contains("raw://")) {
586     TGrid::Connect("alien://");
587     if (!gGrid || !gGrid->IsConnected()) {
588       ::Error("QAtrain", "No grid connection");
589       return;
590     }  
591   }  
592
593   // --- Some settings -----------------------------------------------
594   // Set temporary merging directory to current one
595   gSystem->Setenv("TMPDIR", gSystem->pwd());
596   // Set temporary compilation directory to current one
597   gSystem->SetBuildDir(gSystem->pwd(), kTRUE);
598   // Load common libraries and set include path
599   LoadLibraries();
600   printf("Include path: %s\n", gSystem->GetIncludePath());
601
602   // === Make the analysis manager and connect event handlers ========
603   // 
604   // --- Analysis manager and load libraries -------------------------
605   AliAnalysisManager *mgr  = new AliAnalysisManager("QA", "Production train");
606   mgr->SetRunFromPath(grp->run);
607
608   // --- Create ESD input handler ------------------------------------
609   AliESDInputHandlerRP *esdHandler = new AliESDInputHandlerRP();
610   esdHandler->SetReadFriends(kTRUE);
611   esdHandler->SetActiveBranches("ESDfriend");
612   mgr->SetInputEventHandler(esdHandler);
613   
614   // --- Monte Carlo handler -----------------------------------------
615   if (true) {
616     AliMCEventHandler* mcHandler = new AliMCEventHandler();
617     mgr->SetMCtruthEventHandler(mcHandler);
618     mcHandler->SetPreReadMode(1);
619     mcHandler->SetReadTR(true);
620   }
621
622   // === Set up tasks ================================================
623   //
624   // --- Create tasks ------------------------------------------------
625   AddAnalysisTasks(cdb);
626
627   // --- Debugging if needed -----------------------------------------
628   if (debug_level > 0) mgr->SetDebugLevel(debug_level);
629
630   // --- If merging, do so here and exit -----------------------------
631   if (stage>0) {
632     QAMerge(xmlfile, stage);
633     return;
634   }   
635
636   // === Run the analysis ============================================
637   //
638   // --- Make our chain ----------------------------------------------
639   TChain *chain = new TChain("esdTree");
640   chain->Add("AliESDs.root");
641
642   // --- Run the thing -----------------------------------------------
643   TStopwatch timer;
644   timer.Start();
645   if (mgr->InitAnalysis()) {
646     mgr->PrintStatus(); 
647     mgr->SetSkipTerminate(kTRUE);
648     mgr->SetNSysInfo(1);
649     mgr->StartAnalysis("local", chain);
650   }
651   timer.Print();
652 }
653
654 // 
655 // EOF
656 // 
657