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