TENDER becomes Tender
[u/mrichter/AliRoot.git] / PWGPP / PilotTrain / PilotAnalysis.C
1 #include "Riostream.h"
2 void LoadLibraries();
3 void AddAnalysisTasks(); 
4 class AliAnalysisAlien;                                                                                                                    
5 AliAnalysisAlien* CreateAlienHandler(const char *plugin_mode);
6
7 // Collision type: 0 = p-p   1 = Pb-Pb
8 Int_t  iCollisionType = 0;
9 // Trigger mask.
10 // Still need to change:
11 UInt_t kTriggerInt = AliVEvent::kAnyINT;
12 UInt_t kTriggerMuonAll = AliVEvent::kMUL7 | AliVEvent::kMUSH7 | AliVEvent::kMUU7 | AliVEvent::kMUS7;
13 UInt_t kTriggerMuonBarell = AliVEvent::kMUU7;
14 UInt_t kTriggerEMC   = AliVEvent::kEMC7;
15 UInt_t kTriggerHM   = AliVEvent::kHighMult;
16 // Main trigger mask used:
17 UInt_t kTriggerMask = kTriggerInt;
18
19 Int_t runNumbers[5] = {154780};
20
21 Bool_t doCDBconnect   = 1;
22 Bool_t doEventStat    = 1;
23 Bool_t doCentrality   = 0;
24 Bool_t doQAsym        = 1;
25 Bool_t doVZERO        = 1;   // there is a 2nd file
26 Bool_t doVertex       = 1;
27 Bool_t doSPD          = 1;   // needs RP   
28 Bool_t doTPC          = 1;
29 Bool_t doSDD          = 1;   // needs RP
30 Bool_t doSSDdEdx      = 1;
31
32 Bool_t doTRD          = 1;
33 Bool_t doITS          = 1;
34 Bool_t doITSsaTracks  = 1; 
35 Bool_t doITSalign     = 1;  
36 Bool_t doCALO         = 1;
37 Bool_t doMUONTrig     = 1;
38 Bool_t doImpParRes    = 1;
39 Bool_t doMUON         = 1;
40 Bool_t doTOF          = 1;
41 Bool_t doHMPID        = 1;
42 Bool_t doT0           = 1;
43 Bool_t doZDC          = 1;
44 Bool_t doPIDResponse  = 1;
45 Bool_t doPIDqa        = 1; //new
46 Bool_t doFMD          = 1; // new
47
48 Bool_t doMUONEff      = 0;   // NEEDS geometry
49 Bool_t doV0           = 0;   // NEEDS MCtruth 
50
51 TString     train_name         = "QA";      // QA local folder name
52 TString     train_tag          = (iCollisionType)?"_Pb-Pb":"_p-p";        // Train special tag appended to 
53                                             // visible name. ("sim", "pp", ...)
54                // Name in train page (DON'T CHANGE)
55 TString     visible_name       = Form("QA$2_$3%s", train_tag.Data()); //# FIXED #
56 TString     job_comment        = "PWGPP QA kAnyInt, QAsym(add kMUU7 and kEMC7) CALO (add kEMC7)  triggers"; // Can add observations here
57                // Job tag (DON'T CHANGE)
58 TString     job_tag            = Form("%s: %s", visible_name.Data(), job_comment.Data());
59                // Package versions - Modify as needed
60 TString     root_version       = "v5-28-00e-1";
61 TString     aliroot_version    = "v4-21-29-AN";
62                // Production directory - change as needed for test mode
63 TString     grid_datadir       = "/alice/data/2011/LHC11c";
64                // Work directory in GRID (DON'T CHANGE)
65 TString     grid_workdir       = "/alice/cern.ch/user/a/alidaq/QA/QA$2";
66                // Job splitting
67 Int_t       grid_split         = 20;       // Splitting
68                // Debug level
69 Int_t       debug_level        = 1;        // Debugging
70                // File merging
71 Int_t       maxMergeFiles      = 10;       // Max files to merge in a chunk
72                // Data pattern - change as needed for test mode
73 TString     data_pattern       = "*ESDs/pass1/*ESDs.root";
74                // Output directory (DON'T CHANGE)
75 TString     alien_outdir       = "$1/QA$2";
76                // Input collection (production mode)
77 TString     data_collection    = "$1/qa1.xml";
78 TString     mergeExcludes      = ""; // Files to be excluded for merging
79 TString     mergeDirName       = "QA$2";
80 TString     terminateFiles     = "trending.root"; // Files produced during Terminate
81
82 Bool_t useProductionMode       = kTRUE;
83 Bool_t useMergeViaJDL          = kTRUE;
84 Bool_t useFastReadOption       = kFALSE;
85 Bool_t useOverwriteMode        = kTRUE;
86 Bool_t useDevelopmentVersion   = kFALSE;
87
88 void PilotAnalysis(const char *plugin_mode = "full")
89 {
90   TString smode(plugin_mode);
91   smode.ToLower();
92   if (smode == "test") useProductionMode = kFALSE;
93   if (!useProductionMode) {
94      TGrid::Connect("alien://");
95      if (!gGrid || !gGrid->IsConnected()) {
96        ::Error("PilotAnalysis", "No grid connection");
97        return;
98      }
99   }   
100   // Write configuration
101   TString cdir = gSystem->WorkingDirectory();
102   gSystem->MakeDirectory(train_name);
103   gSystem->ChangeDirectory(train_name);
104   ofstream out;
105   out.open(Form("%sConfig.C",train_name.Data()), ios::out);
106   out << "{" << endl;
107   out << "   train_name      = " << "\"" << train_name.Data() << "\";" << endl;
108   out << "   root_version    = " << "\"" << root_version.Data() << "\";" << endl;
109   out << "   aliroot_version = " << "\"" << aliroot_version.Data() << "\";" << endl;
110   out << "   grid_datadir   = " << "\"" << grid_datadir.Data() << "\";" << endl;
111   if (!alien_outdir.Length()) alien_outdir = Form("output_%s",train_name.Data());
112   out << "   alien_outdir    = " << "\"" << alien_outdir.Data() << "\";" << endl;
113   out << "   doQAsim         = " << doQAsym << ";" << endl;
114   out << "   doVZERO         = " << doVZERO << ";" << endl;
115   out << "   doVertex        = " << doVertex << ";" << endl;
116   out << "   doSPD           = " << doSPD << ";" << endl;
117   out << "   doSDD           = " << doSDD << ";" << endl;
118   out << "   doSSDdEdx       = " << doSSDdEdx << ";" << endl;
119   out << "   doTPC           = " << doTPC << ";" << endl;
120   out << "   doTRD           = " << doTRD << ";" << endl;
121   out << "   doITS           = " << doITS << ";" << endl;
122   out << "   doITSsaTracks   = " << doITSsaTracks << ";" << endl;
123   out << "   doITSalign      = " << doITSalign << ";" << endl;
124   out << "   doZDC           = " << doZDC << ";" << endl;
125   out << "   doImpParRes     = " << doImpParRes << ";" << endl;
126   out << "   doMUON          = " << doMUON << ";" << endl;
127   out << "   doTOF           = " << doTOF << ";" << endl;
128   out << "   doHMPID         = " << doHMPID << ";" << endl;
129   out << "   doZDC           = " << doZDC << ";" << endl;
130   out << "   doT0            = " << doT0 << ";" << endl;
131   out << "   doPIDResponse   = " << doPIDResponse << ";" << endl;
132   out << "   doPIDqa         = " << doPIDqa << ";" << endl;
133   out << "   doFMD           = " << doFMD << ";" << endl;
134   out << "   doEventStat     = " << doEventStat << ";" << endl;
135   if (iCollisionType) out << "   doCentrality    = " << doCentrality << ";" << endl;
136   out << "}" << endl;
137   out.close();
138   
139   // Load libraries
140   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");
141   LoadLibraries();
142   // Create manager
143   AliAnalysisManager *mgr  = new AliAnalysisManager("PilotAnalysis", "Production train");
144   if (!strcmp(plugin_mode,"test")) mgr->SetNSysInfo(100);
145   // Input handler
146   AliESDInputHandlerRP *esdHandler = new AliESDInputHandlerRP();
147   esdHandler->SetReadFriends(kTRUE);
148   esdHandler->SetActiveBranches("ESDfriend");
149   mgr->SetInputEventHandler(esdHandler);
150   mgr->SetDebugLevel(debug_level);
151   
152   // AnalysisTasks
153   AddAnalysisTasks();
154   // Grid handler
155   AliAnalysisAlien *alienHandler = CreateAlienHandler(plugin_mode);
156   mgr->SetGridHandler(alienHandler);
157   if (mgr->InitAnalysis()) {                                                                                                              
158     mgr->PrintStatus(); 
159     if (!strcmp(plugin_mode, "local")) mgr->StartAnalysis("local");
160     else mgr->StartAnalysis("grid");
161   }
162 }
163
164 void LoadLibraries()
165 {
166   gSystem->Load("libANALYSIS");
167   gSystem->Load("libANALYSISalice");
168   gSystem->Load("libCORRFW");
169   gSystem->Load("libTender");
170   gSystem->Load("libPWG0base.so");
171   gSystem->Load("libPWG0dep.so");
172   gSystem->Load("libPWG0selectors.so");
173   gSystem->Load("libPWGPP.so");
174
175   if (doCALO) {
176      gSystem->Load("libEMCALUtils");
177      gSystem->Load("libPHOSUtils");
178      gSystem->Load("libPWG4PartCorrBase");
179      gSystem->Load("libPWG4PartCorrDep");
180   }  
181   if(doMUON || doMUONTrig) {
182      gSystem->Load("libPWGHFbase");
183      gSystem->Load("libPWGmuon");
184      gSystem->Load("libPWGmuondep");
185   }
186   if (doFMD) {
187      gSystem->Load("libPWG2forward2");
188   }      
189 }
190
191 void AddAnalysisTasks()
192 {
193   AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
194   mgr->SetCommonFileName("QAresults.root");
195   // Statistics task
196   mgr->AddStatisticsTask(kTriggerMask);
197   //
198   // CDB connection
199   //
200   if (doCDBconnect) {
201     gROOT->LoadMacro("$ALICE_ROOT/PWGPP/PilotTrain/AddTaskCDBconnect.C");
202     AliTaskCDBconnect *taskCDB = AddTaskCDBconnect();
203     if (!taskCDB) return;
204     taskCDB->SetRunNumber(runNumbers[0]);
205   }    
206   
207   //
208   // Event Statistics (Jan Fiete)
209   //
210   if (doEventStat) {
211       gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskPhysicsSelection.C");
212       AliPhysicsSelectionTask* physSelTask = AddTaskPhysicsSelection(kFALSE /*MC*/);
213 //      mgr->RegisterExtraFile("event_stat.root");
214       if (!terminateFiles.IsNull()) terminateFiles += ",";
215       terminateFiles += "event_stat.root";
216   }
217   
218   //
219   // Centrality (A. Toia)
220   //
221   if (doCentrality) {
222      if (!iCollisionType) {
223         printf("Disabling centrality task for p-p\n");
224         doCentrality = kFALSE;
225      } else {           
226         gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskCentrality.C");
227         AliCentralitySelectionTask *taskCentrality = AddTaskCentrality();
228      }   
229   }   
230   
231   // Vertexing (A. Dainese)
232   // 
233   if (doVertex) {
234     gROOT->LoadMacro("$ALICE_ROOT/PWGPP/macros/AddTaskVertexESD.C");
235     AliAnalysisTaskVertexESD* taskvertexesd =  AddTaskVertexESD(kFALSE, kTriggerMask);
236     taskvertexesd->SelectCollisionCandidates(kTriggerMask);
237   }  
238
239   // TPC QA (E. Sicking)
240   //
241   if (doQAsym) {
242   // offline trigger in AddTask
243     gROOT->LoadMacro("$ALICE_ROOT/PWGPP/PilotTrain/AddTaskQAsym.C");
244     AliAnalysisTaskSE * taskqasim = AddTaskQAsym(0, kTriggerMask, kTriggerHM, kTriggerEMC, kTriggerMuonBarell);
245     // taskqasim->SelectCollisionCandidates(); // Set by AddTask
246   }  
247   //
248   // VZERO QA  (C. Cheshkov)
249   //
250   if (doVZERO) {
251     gROOT->LoadMacro("$ALICE_ROOT/PWGPP/PilotTrain/AddTaskVZEROQA.C");
252     AliAnalysisTaskSE * taskv0qa = AddTaskVZEROQA(0);
253 //  taskv0qa->SelectCollisionCandidates();
254   }
255   //
256   // TPC (Jacek Otwinowski & Michael Knichel & Weilin Yu)
257   //
258   //
259   // Optionally MC information can be used by setting the 1st argument to true
260   // Optionally friends information can be switched off by setting the 2st argument 
261   // to false
262   // Optionally highMult axis can be used by setting the 3st argument to true (for PbPb)
263   if (doTPC) {
264     gROOT->LoadMacro("$ALICE_ROOT/PWGPP/TPC/macros/AddTaskPerformanceTPCdEdxQA.C");
265     // low multiplicity (pp) 
266     //AliPerformanceTask *tpcQA = AddTaskPerformanceTPCdEdxQA(kFALSE, kTRUE, kFALSE);
267     // high multiplicity (Pb-Pb)
268     AliPerformanceTask *tpcQA = AddTaskPerformanceTPCdEdxQA(kFALSE, kTRUE, kTRUE);
269     tpcQA->SelectCollisionCandidates(kTriggerMask);
270   }  
271   //
272   // SPD (A. Mastroserio)
273   //
274   if (doSPD) {
275     gROOT->LoadMacro("$ALICE_ROOT/PWGPP/PilotTrain/AddTaskSPDQA.C");
276     AliAnalysisTaskSE* taskspdqa = AddTaskSPDQA();
277     taskspdqa->SelectCollisionCandidates(kTriggerMask);
278   }  
279   //
280   // SDD (F. Prino)
281   //
282   if (doSDD) {
283     gROOT->LoadMacro("$ALICE_ROOT/PWGPP/PilotTrain/AddSDDPoints.C");
284     AliAnalysisTaskSE* tasksdd = AddSDDPoints();
285     tasksdd->SelectCollisionCandidates(kTriggerMask);
286   }
287   //
288   // SSD dEdx (Marek Chojnacki)
289   //
290   if (doSSDdEdx) {
291     gROOT->LoadMacro("$ALICE_ROOT/PWGPP/PilotTrain/AddTaskdEdxSSDQA.C");
292     AliAnalysisTaskSE* taskssddedx = AddTaskdEdxSSDQA();
293     taskssddedx->SelectCollisionCandidates(kTriggerMask);
294   }
295
296   //
297   // ITS
298   //
299   if (doITS) {
300   // hardcoded non-zero trigger mask
301       gROOT->LoadMacro("$ALICE_ROOT/PWGPP/macros/AddTaskPerformanceITS.C");
302       AliAnalysisTaskITSTrackingCheck *itsQA = 0;
303       AliAnalysisTaskITSTrackingCheck *itsQACent0010 = 0;
304       AliAnalysisTaskITSTrackingCheck *itsQACent3050 = 0;
305       AliAnalysisTaskITSTrackingCheck *itsQACent6080 = 0;
306       if(iCollisionType==0) {
307         itsQA = AddTaskPerformanceITS(kFALSE);
308       } else {
309         itsQA = AddTaskPerformanceITS(kFALSE);
310         itsQACent0010 = AddTaskPerformanceITS(kFALSE,kFALSE,kFALSE,3500,10000);
311         itsQACent3050 = AddTaskPerformanceITS(kFALSE,kFALSE,kFALSE,590,1570);
312         itsQACent6080 = AddTaskPerformanceITS(kFALSE,kFALSE,kFALSE,70,310);
313       }
314   }
315   //
316   // ITS saTracks, align (F.Prino)
317   //
318   if (doITSsaTracks) {
319   // offline trigger in AddTask
320      gROOT->LoadMacro("$ALICE_ROOT/PWGPP/macros/AddTaskITSsaTracks.C");
321      AliAnalysisTaskITSsaTracks *itssaTracks = AddTaskITSsaTracks(kFALSE,kFALSE);
322      itssaTracks->SelectCollisionCandidates(kTriggerMask);
323   }   
324   if (doITSalign) {
325   // no offline trigger selection
326      gROOT->LoadMacro("$ALICE_ROOT/PWGPP/macros/AddTaskITSAlign.C");
327      AliAnalysisTaskITSAlignQA *itsAlign = AddTaskITSAlign(0,2011);
328   }   
329   //
330   // TRD (Alex Bercuci, M. Fasel) 
331   //
332   if(doTRD) {
333   // no offline trigger selection
334       gROOT->LoadMacro("$ALICE_ROOT/PWGPP/macros/AddTrainPerformanceTRD.C");
335       // steer individual TRD tasks
336       Bool_t 
337       doCheckESD(kTRUE),  // AliTRDcheckESD
338       doCheckDET(kTRUE),  // AliTRDcheckDET
339       doEffic(kTRUE),     // AliTRDefficiency
340       doResolution(kTRUE),// AliTRDresolution
341       doCheckPID(kTRUE),  // AliTRDcheckPID
342       doV0Monitor(kFALSE);// AliTRDv0Monitor
343       AddTrainPerformanceTRD(Translate(doCheckESD, doCheckDET, doEffic, doResolution, doCheckPID, doV0Monitor));
344   }
345
346   //
347   // ZDC (Chiara Oppedisano) 
348   //
349   if(doZDC) {
350   // hardcoded kMB trigger mask
351      gROOT->LoadMacro("$ALICE_ROOT/PWGPP/ZDC/AddTaskZDCQA.C");
352      AliAnalysisTaskSE *taskZDC = AddTaskZDCQA();
353      taskZDC->SelectCollisionCandidates(kTriggerMask);
354   }   
355   //
356   // Calorimetry (Gustavo Conesa)
357   //
358
359   if(doCALO) {
360       gROOT->LoadMacro("$ALICE_ROOT/PWG4/macros/QA/AddTaskCalorimeterQA.C");
361       AliAnalysisTaskParticleCorrelation *taskCaloQA = AddTaskCalorimeterQA("ESD", 2011, kFALSE, kFALSE);
362       taskCaloQA->SetDebugLevel(0);
363       // offline mask set in AddTask to kMB
364       taskCaloQA->SelectCollisionCandidates(kTriggerMask);
365       // Add a new calo task with EMC1 trigger only
366       taskCaloQA = AddTaskCalorimeterQA("ESD", 2011, kFALSE, kFALSE, "", "EMC7");
367       taskCaloQA->SetDebugLevel(0);
368       taskCaloQA->SelectCollisionCandidates(kTriggerEMC);
369   }
370
371   //
372   // Muon Trigger
373   //
374   
375   if(doMUONTrig) {
376   // no offline trigger selection
377       gROOT->LoadMacro("$ALICE_ROOT/PWGPP/macros/AddTaskMTRchamberEfficiency.C");
378       AliAnalysisTaskTrigChEff *taskMuonTrig = AddTaskMTRchamberEfficiency();
379   }
380
381   //
382   // Muon Efficiency (not used)
383   //
384
385   if(doMUONEff) {
386       gROOT->LoadMacro("$ALICE_ROOT/PWG3/muondep/AddTaskMUONTrackingEfficiency.C");
387       AliAnalysisTaskMuonTrackingEff *taskMuonTrackEff = AddTaskMUONTrackingEfficiency();
388   }
389   
390   //
391   // V0-Decay Reconstruction (Ana Marin) (not used)
392   // 
393
394   if (doV0) {
395       gROOT->LoadMacro("$ALICE_ROOT/PWGPP/macros/AddTaskV0QA.C");
396       AliAnalysisTaskV0QA *taskv0QA = AddTaskV0QA(kFALSE);
397   }
398   //
399   // Impact parameter resolution (xianbao.yuan@pd.infn.it, andrea.dainese@pd.infn.it)
400   //
401   if (doImpParRes) {
402     gROOT->LoadMacro("$ALICE_ROOT/PWGPP/macros/AddTaskImpParRes.C");
403     AliAnalysisTaskSE* taskimpparres=0;
404     if(iCollisionType==0) {
405        taskimpparres= AddTaskImpParRes();
406     } else {
407        taskimpparres= AddTaskImpParRes(kFALSE,-1,kFALSE,kFALSE);
408     }
409     taskimpparres->SelectCollisionCandidates(kTriggerMask);
410   }  
411   //
412   // MUON QA (Philippe Pillot)
413   //
414   if (doMUON) {
415   // trigger analysis internal
416     gROOT->LoadMacro("$ALICE_ROOT/PWG3/muon/AddTaskMuonQA.C");
417     AliAnalysisTaskSE* taskmuonqa= AddTaskMuonQA();
418   }  
419   //
420   // TOF (Francesca Bellini)
421   //
422   if (doTOF) {
423     gROOT->LoadMacro("$ALICE_ROOT/PWGPP/TOF/AddTaskTOFQA.C");
424     AliAnalysisTaskTOFqa *tofQA = AddTaskTOFQA();
425     tofQA->SelectCollisionCandidates(kTriggerMask);
426   } 
427    //
428   // PIDResponse(JENS)
429   //
430   if (doPIDqa) {
431     gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskPIDResponse.C"); 
432     AliAnalysisTaskPIDResponse *PIDResponse = AddTaskPIDResponse();
433     PIDResponse->SelectCollisionCandidates(kTriggerMask);
434   }  
435
436   //
437   // PIDqa(JENS)
438   //
439   if (doPIDqa) {
440     gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskPIDqa.C");
441     AliAnalysisTaskPIDqa *PIDQA = AddTaskPIDqa();
442     PIDQA->SelectCollisionCandidates(kTriggerMask);
443   }  
444  
445   //
446   // HMPID QA (Giacomo Volpe)
447   //
448   if (doHMPID) {
449     gROOT->LoadMacro("$ALICE_ROOT/PWGPP/HMPID/AddTaskHmpidQA.C");
450     AliAnalysisTaskSE* taskhmpidqa= AddTaskHmpidQA(kFALSE);
451       // offline mask set in AddTask to kMB
452     taskhmpidqa->SelectCollisionCandidates(kTriggerMask);
453   }      
454   // T0 QA (Alla Mayevskaya)
455   if (doT0) {
456   // no offline trigger selection
457     gROOT->LoadMacro("$ALICE_ROOT/PWGPP/T0/AddTaskT0QA.C");
458     AliT0AnalysisTaskQA* taskt0qa= AddTaskT0QA();
459     taskt0qa->SelectCollisionCandidates(kTriggerMask);
460   }      
461   // FMD QA (Christian Holm Christiansen)
462   if (doFMD) {
463     gROOT->LoadMacro("$ALICE_ROOT/PWG2/FORWARD/analysis2/AddTaskForwardQA.C");
464     // Parameters: usemc, usecentrality
465     AliAnalysisTaskSE *forwardQA = (AliAnalysisTaskSE *)AddTaskForwardQA(kFALSE, kFALSE);
466     // No offline trigger config. needed (see #84077)
467   }
468 }
469
470 //______________________________________________________________________________
471 AliAnalysisAlien* CreateAlienHandler(const char *plugin_mode)
472 {
473 // Check if user has a valid token, otherwise make one. This has limitations.
474 // One can always follow the standard procedure of calling alien-token-init then
475 //   source /tmp/gclient_env_$UID in the current shell.
476    AliAnalysisAlien *plugin = new AliAnalysisAlien();
477 // Set the run mode (can be "full", "test", "offline", "submit" or "terminate")
478    plugin->SetRunMode(plugin_mode);
479    if (useProductionMode) {
480       plugin->SetProductionMode();
481       plugin->AddDataFile(data_collection);
482    }   
483    plugin->SetJobTag(job_tag);
484    plugin->SetNtestFiles(2);
485    plugin->SetCheckCopy(kFALSE);
486    plugin->SetMergeDirName(mergeDirName);
487 // Set versions of used packages
488    plugin->SetAPIVersion("V1.1x");
489    plugin->SetROOTVersion(root_version);
490    plugin->SetAliROOTVersion(aliroot_version);
491 // Declare input data to be processed.
492 // Method 1: Create automatically XML collections using alien 'find' command.
493 // Define production directory LFN
494    plugin->SetGridDataDir(grid_datadir);
495 // Set data search pattern
496    plugin->SetDataPattern(data_pattern);
497 // ...then add run numbers to be considered
498 //   if (!iAODanalysis) plugin->SetRunRange(run_range[0], run_range[1]);
499 //   plugin->SetOutputSingleFolder("outpu$ALICE_ROOT/PWGPP/T0/Addt");
500    if (!useProductionMode) {
501       plugin->SetRunPrefix("000");
502       plugin->SetOutputToRunNo();
503       for (Int_t i=0; i<2; i++) {
504          if (!runNumbers[i]) break;
505          plugin->AddRunNumber(runNumbers[i]);
506       }   
507    }
508 // Define alien work directory where all files will be copied. Relative to alien $HOME.
509    plugin->SetGridWorkingDir(grid_workdir);
510 // Declare alien output directory. Relative to working directory.
511    if (alien_outdir.IsNull()) alien_outdir = Form("output_%s",train_name.Data());
512    plugin->SetGridOutputDir(alien_outdir);
513
514    if (useDevelopmentVersion) {
515      plugin->EnablePackage("STEERBase");
516      plugin->EnablePackage("ESD");
517      plugin->EnablePackage("AOD");
518      plugin->EnablePackage("ANALYSIS");
519      plugin->EnablePackage("ANALYSISalice");
520    }
521
522 // Declare the analysis source files names separated by blancs. To be compiled runtime
523 // using ACLiC on the worker nodes.
524 // Declare all libraries (other than the default ones for the framework. These will be
525 // loaded by the generated analysis macro. Add all extra files (task .cxx/.h) here.
526    plugin->AddIncludePath("-I. -I$ROOTSYS/include -I$ALICE_ROOT/include -I$ALICE_ROOT/ITS -I$ALICE_ROOT/TRD");
527    
528    plugin->SetAdditionalLibs("libCORRFW.so libTender.so libPWG0base.so libPWG0dep.so libPWG0selectors.so libPWGPP.so \
529                               libEMCALUtils.so libPHOSUtils.so libPWG4PartCorrBase.so libPWG4PartCorrDep.so \
530                               libPWGHFbase.so libPWGmuon.so libPWGmuondep.so libPWG2forward2.so");
531      
532 // Declare the output file names separated by blancs.
533    plugin->SetDefaultOutputs();
534    plugin->SetMaxMergeFiles(maxMergeFiles);
535    plugin->SetNrunsPerMaster(1);
536    
537    // Put default output files to archive
538    AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
539    TIter next(mgr->GetOutputs());
540    AliAnalysisDataContainer *output;
541    if (!mergeExcludes.IsNull()) plugin->SetMergeExcludes(mergeExcludes);
542    if (!terminateFiles.IsNull()) plugin->SetTerminateFiles(terminateFiles);
543 // Set friends
544 // Optionally set a name for the generated analysis macro (default MyAnalysis.C)
545    plugin->SetAnalysisMacro(Form("%s.C", train_name.Data()));
546 // Optionally set a name for the generated validation script
547    plugin->SetValidationScript("validation.sh");
548 // Optionally set maximum number of input files/subjob (default 100, put 0 to ignore)
549    plugin->SetSplitMaxInputFileNumber(grid_split);
550 // Optionally set number of failed jobs that will trigger killing waiting sub-jobs.
551 //   plugin->SetMaxInitFailed(5);
552 // Optionally modify the number of replicas
553    plugin->SetNumberOfReplicas(5);
554 // Optionally resubmit threshold.
555 //   plugin->SetMasterResubmitThreshold(90);
556 // Optionally set time to live (default 30000 sec)
557    plugin->SetTTL(70000);
558 // Optionally set input format (default xml-single)
559    plugin->SetInputFormat("xml-single");
560 // Optionally modify the name of the generated JDL (default analysis.jdl)
561    plugin->SetJDLName(Form("%s.jdl", train_name.Data()));
562 // Optionally modify the executable name (default analysis.sh)
563    plugin->SetExecutable(Form("%s.sh", train_name.Data()));
564 // Optionally modify job price (default 1)
565    plugin->SetPrice(1);      
566 // Optionally modify split mode (default 'se')    
567    plugin->SetSplitMode("se");
568    plugin->SetExecutableCommand("aliroot -b -q");
569 // Merge via JDL
570    plugin->SetMergeViaJDL(useMergeViaJDL);
571 // Use fastread option
572    plugin->SetFastReadOption(useFastReadOption);
573 // UseOverwrite mode
574    plugin->SetOverwriteMode(useOverwriteMode);   
575 /*********************************************************
576  ***     PROOF MODE SPECIFIC SETTINGS         ************
577  *********************************************************/
578 // Proof cluster
579 //   plugin->SetProofCluster("alice-caf");
580    plugin->SetProofCluster("skaf.saske.sk");
581 // Dataset to be used   
582    plugin->SetProofDataSet("/alice/data/LHC10e_000128175_p1#esdTree");
583 // May need to reset proof. Supported modes: 0-no reset, 1-soft, 2-hard
584    plugin->SetProofReset(0);
585 // May limit number of workers
586    plugin->SetNproofWorkers(1);   
587 // May use a specific version of root installed in proof
588    plugin->SetRootVersionForProof("current_dbg");
589 // May set the aliroot mode. Check http://aaf.cern.ch/node/83 
590    plugin->SetAliRootMode("ALIROOT"); // Loads AF libs by default
591 // May request ClearPackages (individual ClearPackage not supported)
592    plugin->SetClearPackages(kFALSE);
593 // Plugin test mode works only providing a file containing test file locations
594    plugin->SetFileForTestMode(gSystem->ExpandPathName("$ALICE_ROOT/PWGPP/PilotTrain/files.txt"));
595    return plugin;
596 }