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