TENDER becomes Tender, removing .so
[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") {
133 gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskCentrality.C");
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("");
230b7aff 305 tmpAdditionalLibs = Form("libTree libVMC libGeom libGui libXMLParser libMinuit libMinuit2 libProof libPhysics libSTEERBase libESD libAOD libOADB libANALYSIS libCDB libRAWDatabase libSTEER libANALYSISalice libCORRFW libTOFbase libRAWDatabase libRAWDatarec libTPCbase libTPCrec libITSbase libITSrec libTRDbase libTender libSTAT libTRDrec libHMPIDbase libPWGPP libPWGHFbase libPWGDQdielectron libPWGHFhfe libEMCALUtils libPHOSUtils libPWGCaloTrackCorrBase libEMCALraw libEMCALbase libEMCALrec libTRDbase libVZERObase libVZEROrec libTender libTenderSupplies libESDfilter libPWGTools libPWGEMCAL libPWGGAEMCALTasks libPWGCFCorrelationsBase libPWGCFCorrelationsDPhi %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}