]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGJE/EMCALJetTasks/macros/runEMCalJetAnalysis.C
Merge branch 'master' into TPCdev
[u/mrichter/AliRoot.git] / PWGJE / EMCALJetTasks / macros / runEMCalJetAnalysis.C
1 // runEMCalJetAnalysis.C
2 // =====================
3 // This macro can be used to run a jet analysis within the EMCal Jet Framework.
4 //
5 // Examples:
6 // -> Analyze ESDs from the pA pilot run on the AliEn grid with your task in AnaClass.cxx/.h
7 //     dataType = "ESD", useGrid = kTRUE, pattern = "*ESDs/pass2/*ESDs.root", addCXXs = "AnaClass.cxx", 
8 //     addHs = "AnaClass.h", gridDir = "/alice/data/2012/LHC12g", gridMode = "full", runNumbers = "188359 188362"
9 //     
10 // -> Analyze AODs (up to 96 files) locally given in files_aod.txt
11 //     dataType = "AOD", useGrid = kFALSE, numLocalFiles = 96
12 //
13 // MERGING ON ALIEN
14 // ++++++++++++++++
15 // If you run on the grid, you can monitor the jobs with alimonitor.cern.ch. When enough of them are in DONE state,
16 // you have to merge the output. This can be done automatically, if you just change the gridMode to "terminate" and
17 // give the EXACT name of the task whose output should be merged in uniqueName.
18 // 
19 //
20 // Authors: R. Haake, S. Aiola
21
22 #include <ctime>
23 #include "TGrid.h"
24
25 AliAnalysisGrid* CreateAlienHandler(const char* uniqueName, const char* gridDir, const char* gridMode, const char* runNumbers, 
26                                      const char* pattern, TString additionalCode, TString additionalHeaders, Int_t maxFilesPerWorker, 
27                                      Int_t workerTTL, Bool_t isMC);
28                                     
29 //______________________________________________________________________________
30 void runEMCalJetAnalysis(
31          Bool_t         useGrid             = kTRUE,                      // local or grid
32          const char*    gridMode            = "test",                      // set the grid run mode (can be "full", "test", "offline", "submit" or "terminate")
33          const char*    dataType            = "AOD",                       // set the analysis type, AOD, ESD or sESD
34          const char*    pattern             = "*ESDs/pass2/AOD145/*AOD.root",    // file pattern (here one can specify subdirs like passX etc.) (used on grid)
35          const char*    gridDir             = "/alice/data/2011/LHC11h_2",   // dir on alien, where the files live (used on grid)
36          const char*    runNumbers          = "167903 167915",             // considered run numbers (used on grid)
37          UInt_t         numLocalFiles       = 50,                          // number of files analyzed locally  
38          const char*    runPeriod           = "LHC11h",                    // set the run period (used on grid)
39          const char*    uniqueName          = "EMCalJF_LEGOTrainTest",     // sets base string for the name of the task on the grid
40          UInt_t         pSel                = AliVEvent::kAny,             // used event selection for every task except for the analysis tasks
41          Bool_t         useTender           = kFALSE,                      // trigger, if tender task should be used
42          Bool_t         isMC                = kFALSE,                      // trigger, if MC handler should be used
43          Bool_t         doBkg               = kTRUE,
44          // Here you have to specify additional code files you want to use but that are not in aliroot
45          const char*    addCXXs             = "",
46          const char*    addHs               = "",
47
48          // These two settings depend on the dataset and your quotas on the AliEN services
49          Int_t          maxFilesPerWorker   = 4,
50          Int_t          workerTTL           = 7200
51
52          )
53 {
54
55   // Some pre-settings and constants
56   enum AlgoType {kKT, kANTIKT};
57   enum JetType  {kFULLJETS, kCHARGEDJETS, kNEUTRALJETS};
58   gSystem->SetFPEMask();
59   gSystem->Setenv("ETRAIN_ROOT", ".");
60   gSystem->Setenv("ETRAIN_PERIOD", runPeriod);
61   // change this objects to strings
62   TString usedData(dataType);
63   TString additionalCXXs(addCXXs);
64   TString additionalHs(addHs);
65   cout << dataType << " analysis chosen" << endl;
66   if (useGrid)  
67   {
68     cout << "-- using AliEn grid.\n";
69     if (usedData == "sESD") 
70     {
71       cout << "Skimmed ESD analysis not available on the grid!" << endl;
72       return;
73     }
74   }
75   else
76     cout << "-- using local analysis.\n";
77   
78
79   // Load necessary libraries
80   LoadLibs();
81
82   // Create analysis manager
83   AliAnalysisManager* mgr = new AliAnalysisManager(uniqueName);
84
85   // Check type of input and create handler for it
86   TString localFiles("-1");
87   if(usedData == "AOD")
88   {
89     localFiles = "files_aod.txt";
90     gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/train/AddAODHandler.C");
91     AliAODInputHandler* aodH = AddAODHandler();
92   }
93   else if((usedData == "ESD") || (usedData == "sESD"))
94   {
95     if (usedData == "ESD")
96       localFiles = "files_esd.txt";
97     else
98       localFiles = "files_sesd.txt";
99     
100     gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/train/AddESDHandler.C");
101     AliESDInputHandler* esdH = AddESDHandler();
102   }
103   else
104   {
105     cout << "Data type not recognized! You have to specify ESD, AOD, or sESD!\n";
106   }
107   
108   if(!useGrid)
109     cout << "Using " << localFiles.Data() << " as input file list.\n";
110
111   // Create MC handler, if MC is demanded
112   if (isMC && (usedData != "AOD"))
113   {
114     AliMCEventHandler* mcH = new AliMCEventHandler();
115     mcH->SetPreReadMode(AliMCEventHandler::kLmPreRead);
116     mcH->SetReadTR(kTRUE);
117     mgr->SetMCtruthEventHandler(mcH); 
118   }
119   
120   // ################# Now: Add some basic tasks
121
122   // Physics selection task
123   gROOT->LoadMacro("$ALICE_ROOT/PWG/EMCAL/macros/AddTaskEmcalPhysicsSelection.C");
124   AliPhysicsSelectionTask *physSelTask = AddTaskEmcalPhysicsSelection(kTRUE, kTRUE, pSel, 5, 5, 10, kTRUE, -1, -1, -1, -1);
125
126   if (!physSelTask) 
127   {
128     cout << "no physSelTask"; 
129     return; 
130   }
131
132   // Centrality task
133   if (usedData == "ESD") {
134     gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskCentrality.C");
135     AliCentralitySelectionTask *centralityTask = AddTaskCentrality(kTRUE);
136   }
137
138   // Compatibility task, only needed for skimmed ESD
139   if (usedData == "sESD") {
140     gROOT->LoadMacro("$ALICE_ROOT/PWG/EMCAL/macros/AddTaskEmcalCompat.C");
141     AliEmcalCompatTask *comptask = AddTaskEmcalCompat();
142   }
143
144   // Setup task
145   gROOT->LoadMacro("$ALICE_ROOT/PWG/EMCAL/macros/AddTaskEmcalSetup.C");
146   AliEmcalSetupTask *setupTask = AddTaskEmcalSetup();
147   setupTask->SetGeoPath("$ALICE_ROOT/OADB/EMCAL");
148   
149   // Tender Supplies
150   if (useTender)
151   {
152     gROOT->LoadMacro("$ALICE_ROOT/PWG/EMCAL/macros/AddTaskEMCALTender.C");
153     AliAnalysisTaskSE *tender = AddTaskEMCALTender(runPeriod, kTRUE, kTRUE, kTRUE, kTRUE, kTRUE, kFALSE, kTRUE, kTRUE, kTRUE,
154                                                    AliEMCALRecoUtils::kBeamTestCorrected,kTRUE,0.1,0.05,AliEMCALRecParam::kClusterizerv2,
155                                                    kFALSE,kFALSE,-1,1e6,1e6);
156     if (usedData != "AOD" && !useGrid) {
157       AliTender *alitender = dynamic_cast<AliTender*>(tender);
158       alitender->SetDefaultCDBStorage("local://$ALICE_ROOT/OCDB"); 
159     }
160   }
161
162   // Names of the different objects passed around; these are the default names; added here mostly for documentation purposes
163   // rhoName is only set if the background subtraction is switched on (doBkg)
164   TString tracksName = "PicoTracks";
165   TString clustersName = "CaloClusters";
166   TString clustersCorrName = "CaloClustersCorr";
167   TString rhoName = "";
168
169   // ################# Now: Call jet preparation macro (picotracks, hadronic corrected caloclusters, ...) 
170   gROOT->LoadMacro("$ALICE_ROOT/PWGJE/EMCALJetTasks/macros/AddTaskJetPreparation.C");
171   AddTaskJetPreparation(runPeriod, tracksName, "MCParticlesSelected", clustersName, clustersCorrName);
172
173   // ################# Now: Add jet finders+analyzers
174   gROOT->LoadMacro("$ALICE_ROOT/PWGJE/EMCALJetTasks/macros/AddTaskEmcalJet.C");
175   AliEmcalJetTask* jetFinderTask = AddTaskEmcalJet(tracksName, clustersCorrName, kANTIKT, 0.2, kCHARGEDJETS, 0.150, 0.300);
176
177   if (doBkg) {
178     rhoName = "Rho";
179     AliEmcalJetTask* jetFinderTask = AddTaskEmcalJet(tracksName, clustersCorrName, kKT, 0.2, kCHARGEDJETS, 0.150, 0.300);
180
181     TString kTpcKtJetsName(Form("Jet_KTChargedR020_%s_pT0150_%s_ET0300_pt_scheme",tracksName.Data(),clustersCorrName.Data())); 
182     gROOT->LoadMacro("$ALICE_ROOT/PWGJE/EMCALJetTasks/macros/AddTaskRho.C");
183     rhotask = (AliAnalysisTaskRho*) AddTaskRho(kTpcKtJetsName, tracksName, clustersCorrName, rhoName, 0.2, "TPC", 0.01, 0, 0, 2, kTRUE);
184     //rhotask__->SetScaleFunction(sfunc);
185     //rhotask->SelectCollisionCandidates(kPhysSel);
186     rhotask->SetHistoBins(100,0,250);
187   }
188   // Here you can put in your AddTaskMacro for your task
189   gROOT->LoadMacro("$ALICE_ROOT/PWGJE/EMCALJetTasks/macros/AddTaskEmcalJetSample.C");
190   AliAnalysisTaskEmcalJetSample* anaTask = 0;
191   AddTaskEmcalJetSample(tracksName, clustersCorrName, jetFinderTask->GetName(), rhoName, 4);
192
193   // Set the physics selection for all given tasks
194   TObjArray *toptasks = mgr->GetTasks();
195   for (Int_t i=0; i<toptasks->GetEntries(); ++i) 
196   {
197     AliAnalysisTaskSE *task = dynamic_cast<AliAnalysisTaskSE*>(toptasks->At(i));
198     if (!task)
199       continue;
200     if (task->InheritsFrom("AliPhysicsSelectionTask"))
201       continue;
202     ::Info("setPSel", "Set physics selection for %s (%s)", task->GetName(), task->ClassName());
203     task->SelectCollisionCandidates(pSel);
204   }
205
206   mgr->SetUseProgressBar(1, 25);
207         
208   if (!mgr->InitAnalysis()) 
209     return;
210   mgr->PrintStatus();
211
212   if (useGrid) 
213   {  // GRID CALCULATION
214
215     AliAnalysisGrid *plugin = CreateAlienHandler(uniqueName, gridDir, gridMode, runNumbers, pattern, additionalCXXs, additionalHs, maxFilesPerWorker, workerTTL, isMC);
216     mgr->SetGridHandler(plugin);
217
218     // start analysis
219     cout << "Starting GRID Analysis...";
220     mgr->SetDebugLevel(0);
221     mgr->StartAnalysis("grid");
222   }
223   else
224   {  // LOCAL CALCULATION
225
226     TChain* chain = 0;
227     if (usedData == "AOD") 
228     {
229       gROOT->LoadMacro("$ALICE_ROOT/PWG/EMCAL/macros/CreateAODChain.C");
230       chain = CreateAODChain(localFiles.Data(), numLocalFiles);
231     }
232     else
233     {  // ESD or skimmed ESD
234       gROOT->LoadMacro("$ALICE_ROOT/PWG/EMCAL/macros/CreateESDChain.C");
235       chain = CreateESDChain(localFiles.Data(), numLocalFiles);
236     }
237     
238     // start analysis
239     cout << "Starting LOCAL Analysis...";
240     mgr->SetDebugLevel(2);
241     mgr->StartAnalysis("local", chain);
242   }
243 }
244
245 //______________________________________________________________________________
246 void LoadLibs()
247 {
248   // Load common libraries (better too many than too few)
249   gSystem->Load("libTree");
250   gSystem->Load("libVMC");
251   gSystem->Load("libGeom");
252   gSystem->Load("libGui");
253   gSystem->Load("libXMLParser");
254   gSystem->Load("libMinuit");
255   gSystem->Load("libMinuit2");
256   gSystem->Load("libProof");
257   gSystem->Load("libPhysics");
258   gSystem->Load("libSTEERBase");
259   gSystem->Load("libESD");
260   gSystem->Load("libAOD");
261   gSystem->Load("libOADB");
262   gSystem->Load("libANALYSIS");
263   gSystem->Load("libCDB");
264   gSystem->Load("libRAWDatabase");
265   gSystem->Load("libSTEER");
266   gSystem->Load("libEVGEN");
267   gSystem->Load("libANALYSISalice");
268   gSystem->Load("libCORRFW");
269   gSystem->Load("libTOFbase");
270   //gSystem->Load("libTOFrec");
271   gSystem->Load("libRAWDatabase.so");
272   gSystem->Load("libRAWDatarec.so");
273   gSystem->Load("libTPCbase.so");
274   gSystem->Load("libTPCrec.so");
275   gSystem->Load("libITSbase.so");
276   gSystem->Load("libITSrec.so");
277   gSystem->Load("libTRDbase.so");
278   gSystem->Load("libTENDER.so");
279   gSystem->Load("libSTAT.so");
280   gSystem->Load("libTRDrec.so");
281   gSystem->Load("libHMPIDbase.so");
282   gSystem->Load("libPWGPP.so");
283   gSystem->Load("libPWGHFbase");
284   gSystem->Load("libPWGDQdielectron");
285   gSystem->Load("libPWGHFhfe");
286   gSystem->Load("libEMCALUtils");
287   gSystem->Load("libPHOSUtils");
288   gSystem->Load("libPWGCaloTrackCorrBase");
289   gSystem->Load("libEMCALraw");
290   gSystem->Load("libEMCALbase");
291   gSystem->Load("libEMCALrec");
292   gSystem->Load("libTRDbase");
293   gSystem->Load("libVZERObase");
294   gSystem->Load("libVZEROrec");
295   gSystem->Load("libTENDER");
296   gSystem->Load("libTENDERSupplies");
297   gSystem->Load("libPWGTools");
298   gSystem->Load("libPWGEMCAL");
299   gSystem->Load("libESDfilter");
300   gSystem->Load("libPWGGAEMCALTasks");
301   gSystem->Load("libPWGCFCorrelationsBase");
302   gSystem->Load("libPWGCFCorrelationsDPhi");
303
304   //load CGAL, Fastjet and SISCone
305   gSystem->Load("libCGAL");
306   gSystem->Load("libfastjet");
307     //For FastJet 3.x use siscon*,fastjetplugins for 2.x use SISConePlugin
308   gSystem->Load("libSISConePlugin");
309   gSystem->Load("libCDFConesPlugin");
310   //  gSystem->Load("libsiscone");
311   //  gSystem->Load("libsiscone_spherical");
312   //  gSystem->Load("libfastjetplugins");
313   gSystem->Load("libJETAN");
314   gSystem->Load("libFASTJETAN");
315   gSystem->Load("libPWGJEEMCALJetTasks");
316
317
318   // include paths
319   gSystem->AddIncludePath("-Wno-deprecated");
320   gSystem->AddIncludePath("-I$ALICE_ROOT -I$ALICE_ROOT/include -I$ALICE_ROOT/EMCAL");
321   gSystem->AddIncludePath("-I$ALICE_ROOT/PWGDQ/dielectron -I$ALICE_ROOT/PWGHF/hfe");
322   gSystem->AddIncludePath("-I$ALICE_ROOT/JETAN -I$ALICE_ROOT/JETAN/fastjet");
323 }
324
325 AliAnalysisGrid* CreateAlienHandler(const char* uniqueName, const char* gridDir, const char* gridMode, const char* runNumbers, 
326                                      const char* pattern, TString additionalCode, TString additionalHeaders, Int_t maxFilesPerWorker, 
327                                      Int_t workerTTL, Bool_t isMC)
328 {
329   TDatime currentTime;
330   TString tmpName(uniqueName);
331
332   // Only add current date and time when not in terminate mode! In this case the exact name has to be supplied by the user
333   if(strcmp(gridMode, "terminate"))
334   {
335     tmpName += "_";
336     tmpName += currentTime.GetDate();
337     tmpName += "_";
338     tmpName += currentTime.GetTime();
339   }
340
341   TString tmpAdditionalLibs("");
342   tmpAdditionalLibs = Form("libTree.so libVMC.so libGeom.so libGui.so libXMLParser.so libMinuit.so libMinuit2.so libProof.so libPhysics.so libSTEERBase.so libESD.so libAOD.so libOADB.so libANALYSIS.so libCDB.so libRAWDatabase.so libSTEER.so libANALYSISalice.so libCORRFW.so libTOFbase.so libRAWDatabase.so libRAWDatarec.so libTPCbase.so libTPCrec.so libITSbase.so libITSrec.so libTRDbase.so libTENDER.so libSTAT.so libTRDrec.so libHMPIDbase.so libPWGPP.so libPWGHFbase.so libPWGDQdielectron.so libPWGHFhfe.so libEMCALUtils.so libPHOSUtils.so libPWGCaloTrackCorrBase.so libEMCALraw.so libEMCALbase.so libEMCALrec.so libTRDbase.so libVZERObase.so libVZEROrec.so libTENDER.so libTENDERSupplies.so libESDfilter.so libPWGTools.so libPWGEMCAL.so libPWGGAEMCALTasks.so libPWGCFCorrelationsBase.so libPWGCFCorrelationsDPhi.so  libCGAL.so libJETAN.so libfastjet.so libSISConePlugin.so libCDFConesPlugin.so libFASTJETAN.so libPWGJE.so libPWGmuon.so libPWGJEEMCALJetTasks.so %s %s",additionalCode.Data(),additionalHeaders.Data());
343
344
345   TString macroName("");
346   TString execName("");
347   TString jdlName("");
348   macroName = Form("%s.C", tmpName.Data());
349   execName = Form("%s.sh", tmpName.Data());
350   jdlName = Form("%s.jdl", tmpName.Data());
351
352   AliAnalysisAlien *plugin = new AliAnalysisAlien();
353   plugin->SetOverwriteMode();
354   plugin->SetRunMode(gridMode);
355      
356   // Here you can set the (Ali)ROOT version you want to use
357   plugin->SetAPIVersion("V1.1x");
358   plugin->SetROOTVersion("v5-34-08-6");
359   plugin->SetAliROOTVersion("vAN-20140525");
360
361   plugin->SetGridDataDir(gridDir); // e.g. "/alice/sim/LHC10a6"
362   plugin->SetDataPattern(pattern); //dir structure in run directory
363   if (!isMC)
364    plugin->SetRunPrefix("000");
365
366   plugin->AddRunList(runNumbers);
367
368   plugin->SetGridWorkingDir(Form("work/%s",tmpName.Data()));
369   plugin->SetGridOutputDir("output"); // In this case will be $HOME/work/output
370
371   plugin->SetAnalysisSource(additionalCode.Data());
372   plugin->SetAdditionalLibs(tmpAdditionalLibs.Data());
373   plugin->AddExternalPackage("boost::v1_43_0");
374   plugin->AddExternalPackage("cgal::v3.6");
375   plugin->AddExternalPackage("fastjet::v2.4.2");
376
377   plugin->SetDefaultOutputs(kTRUE);
378   //plugin->SetMergeExcludes("");
379   plugin->SetAnalysisMacro(macroName.Data());
380   plugin->SetSplitMaxInputFileNumber(maxFilesPerWorker);
381   plugin->SetExecutable(execName.Data());
382   plugin->SetTTL(workerTTL);
383   plugin->SetInputFormat("xml-single");
384   plugin->SetJDLName(jdlName.Data());
385   plugin->SetPrice(1);      
386   plugin->SetSplitMode("se");
387
388   return plugin;
389 }