]>
Commit | Line | Data |
---|---|---|
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 | ||
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 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 | //______________________________________________________________________________ | |
224 | void 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 | ||
288 | AliAnalysisGrid* 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 | } |