]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG/EMCAL/macros/runEMCalAnalysis.C
Split: fix refs to AddTaskCentrality.C
[u/mrichter/AliRoot.git] / PWG / EMCAL / macros / runEMCalAnalysis.C
CommitLineData
b58cf082 1// runEMCalAnalysis.C
2// =====================
3// This macro can be used to run EMCal analysis within the EMCal part of the 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, M. Verweij
21
22#include <ctime>
23#include "TGrid.h"
24
25AliAnalysisGrid* 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//______________________________________________________________________________
30void runEMCalAnalysis(
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 = 1, // number of files analyzed locally
38 const char* runPeriod = "LHC11h", // set the run period (used on grid)
39 const char* uniqueName = "EMCal_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 = kTRUE, // trigger, if tender, track and cluster selection should be used (always)
42 Bool_t isMC = kFALSE, // trigger, if MC handler should be used
43 // Here you have to specify additional code files you want to use but that are not in aliroot
44 const char* addCXXs = "",
45 const char* addHs = "",
46
47 // These two settings depend on the dataset and your quotas on the AliEN services
48 Int_t maxFilesPerWorker = 4,
49 Int_t workerTTL = 7200
50
51 )
52{
53
54 // Some pre-settings and constants
55 enum AlgoType {kKT, kANTIKT};
56 enum JetType {kFULLJETS, kCHARGEDJETS, kNEUTRALJETS};
57 gSystem->SetFPEMask();
58 gSystem->Setenv("ETRAIN_ROOT", ".");
59 gSystem->Setenv("ETRAIN_PERIOD", runPeriod);
60 // change this objects to strings
61 TString usedData(dataType);
62 TString additionalCXXs(addCXXs);
63 TString additionalHs(addHs);
64 cout << dataType << " analysis chosen" << endl;
65 if (useGrid)
66 {
67 cout << "-- using AliEn grid.\n";
68 if (usedData == "sESD")
69 {
70 cout << "Skimmed ESD analysis not available on the grid!" << endl;
71 return;
72 }
73 }
74 else
75 cout << "-- using local analysis.\n";
76
77
78 // Load necessary libraries
79 LoadLibs();
80
81 // Create analysis manager
82 AliAnalysisManager* mgr = new AliAnalysisManager(uniqueName);
83
84 // Check type of input and create handler for it
85 TString localFiles("-1");
86 if(usedData == "AOD")
87 {
88 localFiles = "files_aod.txt";
89 gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/train/AddAODHandler.C");
90 AliAODInputHandler* aodH = AddAODHandler();
91 }
92 else if((usedData == "ESD") || (usedData == "sESD"))
93 {
94 if (usedData == "ESD")
95 localFiles = "files_esd.txt";
96 else
97 localFiles = "files_sesd.txt";
98
99 gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/train/AddESDHandler.C");
100 AliESDInputHandler* esdH = AddESDHandler();
101 }
102 else
103 {
104 cout << "Data type not recognized! You have to specify ESD, AOD, or sESD!\n";
105 }
106
107 if(!useGrid)
108 cout << "Using " << localFiles.Data() << " as input file list.\n";
109
110 // Create MC handler, if MC is demanded
111 if (isMC && (usedData != "AOD"))
112 {
113 AliMCEventHandler* mcH = new AliMCEventHandler();
114 mcH->SetPreReadMode(AliMCEventHandler::kLmPreRead);
115 mcH->SetReadTR(kTRUE);
116 mgr->SetMCtruthEventHandler(mcH);
117 }
118
119 // ################# Now: Add some basic tasks
120
121 // Physics selection task
122 gROOT->LoadMacro("$ALICE_ROOT/PWG/EMCAL/macros/AddTaskEmcalPhysicsSelection.C");
123 AliPhysicsSelectionTask *physSelTask = AddTaskEmcalPhysicsSelection(kTRUE, kTRUE, pSel, 5, 5, 10, kTRUE, -1, -1, -1, -1);
124
125 if (!physSelTask)
126 {
127 cout << "no physSelTask";
128 return;
129 }
130
131 // Centrality task
132 if (usedData == "ESD") {
1c06a186 133 gROOT->LoadMacro("$ALICE_ROOT/OADB/macros/AddTaskCentrality.C");
b58cf082 134 AliCentralitySelectionTask *centralityTask = AddTaskCentrality(kTRUE);
135 }
136
137 // Compatibility task, only needed for skimmed ESD
138 if (usedData == "sESD") {
139 gROOT->LoadMacro("$ALICE_ROOT/PWG/EMCAL/macros/AddTaskEmcalCompat.C");
140 AliEmcalCompatTask *comptask = AddTaskEmcalCompat();
141 }
142
143 // Setup task
144 gROOT->LoadMacro("$ALICE_ROOT/PWG/EMCAL/macros/AddTaskEmcalSetup.C");
145 AliEmcalSetupTask *setupTask = AddTaskEmcalSetup();
146 setupTask->SetGeoPath("$ALICE_ROOT/OADB/EMCAL");
147
148 // Tender Supplies
149 if (useTender) {
150 gROOT->LoadMacro("$ALICE_ROOT/PWG/EMCAL/macros/AddTaskEmcalPreparation.C");
151 //adjust pass when running locally. On grid give empty string, will be picked up automatically from path to ESD/AOD file
152 AliAnalysisTaskSE *clusm = AddTaskEmcalPreparation(runPeriod,"pass1");
153 }
154
155 // Names of the different objects passed around; these are the default names; added here mostly for documentation purposes
156 // rhoName is only set if the background subtraction is switched on (doBkg)
157 TString tracksName = "AODFilterTracks";
158 TString clustersName = "EmcCaloClusters";
159
160 // ################# Now: Call jet preparation macro (picotracks, hadronic corrected caloclusters, ...)
161 gROOT->LoadMacro("$ALICE_ROOT/PWG/EMCAL/macros/AddTaskMatchingChain.C");
162 AddTaskMatchingChain(runPeriod,pSel,
163 clustersName,1.,kTRUE,
164 0.1,kTRUE,kTRUE);
165
166 // ################# Now: Add analysis task
167 // Here you can put in your AddTaskMacro for your task
168 gROOT->LoadMacro("$ALICE_ROOT/PWG/EMCAL/macros/AddTaskEmcalSample.C");
169 AliAnalysisTaskEmcalSample* anaTask = AddTaskEmcalSample(tracksName, clustersName, 4);
170
171 // Set the physics selection for all given tasks
172 TObjArray *toptasks = mgr->GetTasks();
173 for (Int_t i=0; i<toptasks->GetEntries(); ++i)
174 {
175 AliAnalysisTaskSE *task = dynamic_cast<AliAnalysisTaskSE*>(toptasks->At(i));
176 if (!task)
177 continue;
178 if (task->InheritsFrom("AliPhysicsSelectionTask"))
179 continue;
180 ::Info("setPSel", "Set physics selection for %s (%s)", task->GetName(), task->ClassName());
181 task->SelectCollisionCandidates(pSel);
182 }
183
184 mgr->SetUseProgressBar(1, 25);
185
186 if (!mgr->InitAnalysis())
187 return;
188 mgr->PrintStatus();
189
190 if (useGrid)
191 { // GRID CALCULATION
192
193 AliAnalysisGrid *plugin = CreateAlienHandler(uniqueName, gridDir, gridMode, runNumbers, pattern, additionalCXXs, additionalHs, maxFilesPerWorker, workerTTL, isMC);
194 mgr->SetGridHandler(plugin);
195
196 // start analysis
197 cout << "Starting GRID Analysis...";
198 mgr->SetDebugLevel(0);
199 mgr->StartAnalysis("grid",10);
200 }
201 else
202 { // LOCAL CALCULATION
203
204 TChain* chain = 0;
205 if (usedData == "AOD")
206 {
207 gROOT->LoadMacro("$ALICE_ROOT/PWG/EMCAL/macros/CreateAODChain.C");
208 chain = CreateAODChain(localFiles.Data(), numLocalFiles);
209 }
210 else
211 { // ESD or skimmed ESD
212 gROOT->LoadMacro("$ALICE_ROOT/PWG/EMCAL/macros/CreateESDChain.C");
213 chain = CreateESDChain(localFiles.Data(), numLocalFiles);
214 }
215
216 // start analysis
217 cout << "Starting LOCAL Analysis...";
218 mgr->SetDebugLevel(2);
219 mgr->StartAnalysis("local", chain);
220 }
221}
222
223//______________________________________________________________________________
224void LoadLibs()
225{
226 // Load common libraries (better too many than too few)
227 gSystem->Load("libTree");
228 gSystem->Load("libVMC");
229 gSystem->Load("libGeom");
230 gSystem->Load("libGui");
231 gSystem->Load("libXMLParser");
232 gSystem->Load("libMinuit");
233 gSystem->Load("libMinuit2");
234 gSystem->Load("libProof");
235 gSystem->Load("libPhysics");
236 gSystem->Load("libSTEERBase");
237 gSystem->Load("libESD");
238 gSystem->Load("libAOD");
239 gSystem->Load("libOADB");
240 gSystem->Load("libANALYSIS");
241 gSystem->Load("libCDB");
242 gSystem->Load("libRAWDatabase");
243 gSystem->Load("libSTEER");
244 gSystem->Load("libEVGEN");
245 gSystem->Load("libANALYSISalice");
246 gSystem->Load("libCORRFW");
247 gSystem->Load("libTOFbase");
248 //gSystem->Load("libTOFrec");
230b7aff 249 gSystem->Load("libRAWDatabase");
250 gSystem->Load("libRAWDatarec");
251 gSystem->Load("libTPCbase");
252 gSystem->Load("libTPCrec");
253 gSystem->Load("libITSbase");
254 gSystem->Load("libITSrec");
255 gSystem->Load("libTRDbase");
256 gSystem->Load("libTender");
257 gSystem->Load("libSTAT");
258 gSystem->Load("libTRDrec");
259 gSystem->Load("libHMPIDbase");
260 gSystem->Load("libPWGPP");
b58cf082 261 gSystem->Load("libPWGHFbase");
262 gSystem->Load("libPWGDQdielectron");
263 gSystem->Load("libPWGHFhfe");
264 gSystem->Load("libEMCALUtils");
265 gSystem->Load("libPHOSUtils");
266 gSystem->Load("libPWGCaloTrackCorrBase");
267 gSystem->Load("libEMCALraw");
268 gSystem->Load("libEMCALbase");
269 gSystem->Load("libEMCALrec");
270 gSystem->Load("libTRDbase");
271 gSystem->Load("libVZERObase");
272 gSystem->Load("libVZEROrec");
230b7aff 273 gSystem->Load("libTender");
274 gSystem->Load("libTenderSupplies");
b58cf082 275 gSystem->Load("libPWGTools");
276 gSystem->Load("libPWGEMCAL");
277 gSystem->Load("libESDfilter");
278 gSystem->Load("libPWGGAEMCALTasks");
279 gSystem->Load("libPWGCFCorrelationsBase");
280 gSystem->Load("libPWGCFCorrelationsDPhi");
281
282 // include paths
283 gSystem->AddIncludePath("-Wno-deprecated");
284 gSystem->AddIncludePath("-I$ALICE_ROOT -I$ALICE_ROOT/include -I$ALICE_ROOT/EMCAL");
285 gSystem->AddIncludePath("-I$ALICE_ROOT/PWGDQ/dielectron -I$ALICE_ROOT/PWGHF/hfe");
286}
287
288AliAnalysisGrid* CreateAlienHandler(const char* uniqueName, const char* gridDir, const char* gridMode, const char* runNumbers,
289 const char* pattern, TString additionalCode, TString additionalHeaders, Int_t maxFilesPerWorker,
290 Int_t workerTTL, Bool_t isMC)
291{
292 TDatime currentTime;
293 TString tmpName(uniqueName);
294
295 // Only add current date and time when not in terminate mode! In this case the exact name has to be supplied by the user
296 if(strcmp(gridMode, "terminate"))
297 {
298 tmpName += "_";
299 tmpName += currentTime.GetDate();
300 tmpName += "_";
301 tmpName += currentTime.GetTime();
302 }
303
304 TString tmpAdditionalLibs("");
b578ace1 305 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 %s %s",additionalCode.Data(),additionalHeaders.Data());
b58cf082 306
307
308 TString macroName("");
309 TString execName("");
310 TString jdlName("");
311 macroName = Form("%s.C", tmpName.Data());
312 execName = Form("%s.sh", tmpName.Data());
313 jdlName = Form("%s.jdl", tmpName.Data());
314
315 AliAnalysisAlien *plugin = new AliAnalysisAlien();
316 plugin->SetOverwriteMode();
317 plugin->SetRunMode(gridMode);
318
319 // Here you can set the (Ali)ROOT version you want to use
320 plugin->SetAPIVersion("V1.1x");
321 plugin->SetROOTVersion("v5-34-08-6");
322 plugin->SetAliROOTVersion("vAN-20140525");
323
324 plugin->SetGridDataDir(gridDir); // e.g. "/alice/sim/LHC10a6"
325 plugin->SetDataPattern(pattern); //dir structure in run directory
326 if (!isMC)
327 plugin->SetRunPrefix("000");
328
329 plugin->AddRunList(runNumbers);
330
331 plugin->SetGridWorkingDir(Form("work/%s",tmpName.Data()));
332 plugin->SetGridOutputDir("output"); // In this case will be $HOME/work/output
333
334 plugin->SetAnalysisSource(additionalCode.Data());
335 plugin->SetAdditionalLibs(tmpAdditionalLibs.Data());
336
337 plugin->SetDefaultOutputs(kTRUE);
338 //plugin->SetMergeExcludes("");
339 plugin->SetAnalysisMacro(macroName.Data());
340 plugin->SetSplitMaxInputFileNumber(maxFilesPerWorker);
341 plugin->SetExecutable(execName.Data());
342 plugin->SetTTL(workerTTL);
343 plugin->SetInputFormat("xml-single");
344 plugin->SetJDLName(jdlName.Data());
345 plugin->SetPrice(1);
346 plugin->SetSplitMode("se");
347 plugin->SetNtestFiles(1);
348
349 return plugin;
350}