]>
Commit | Line | Data |
---|---|---|
8628b70c | 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( | |
d4f91bbd | 31 | Bool_t useGrid = kTRUE, // local or grid |
8628b70c | 32 | const char* gridMode = "test", // set the grid run mode (can be "full", "test", "offline", "submit" or "terminate") |
d4f91bbd | 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) | |
8628b70c | 37 | UInt_t numLocalFiles = 50, // number of files analyzed locally |
d4f91bbd | 38 | const char* runPeriod = "LHC11h", // set the run period (used on grid) |
8628b70c | 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 | |
95449deb | 42 | Bool_t isMC = kFALSE, // trigger, if MC handler should be used |
d4f91bbd | 43 | Bool_t doBkg = kTRUE, |
8628b70c | 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 | |
8628b70c | 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 | |
12eb4ac1 | 112 | if (isMC && (usedData != "AOD")) |
8628b70c | 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(); | |
7030f36f | 147 | setupTask->SetGeoPath("$ALICE_ROOT/OADB/EMCAL"); |
8628b70c | 148 | |
8628b70c | 149 | // Tender Supplies |
150 | if (useTender) | |
151 | { | |
152 | gROOT->LoadMacro("$ALICE_ROOT/PWG/EMCAL/macros/AddTaskEMCALTender.C"); | |
8612dfc8 | 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); | |
8628b70c | 156 | if (usedData != "AOD" && !useGrid) { |
157 | AliTender *alitender = dynamic_cast<AliTender*>(tender); | |
7030f36f | 158 | alitender->SetDefaultCDBStorage("local://$ALICE_ROOT/OCDB"); |
8628b70c | 159 | } |
160 | } | |
161 | ||
d4f91bbd | 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 | ||
8628b70c | 169 | // ################# Now: Call jet preparation macro (picotracks, hadronic corrected caloclusters, ...) |
8628b70c | 170 | gROOT->LoadMacro("$ALICE_ROOT/PWGJE/EMCALJetTasks/macros/AddTaskJetPreparation.C"); |
d4f91bbd | 171 | AddTaskJetPreparation(runPeriod, tracksName, "MCParticlesSelected", clustersName, clustersCorrName); |
8628b70c | 172 | |
173 | // ################# Now: Add jet finders+analyzers | |
8628b70c | 174 | gROOT->LoadMacro("$ALICE_ROOT/PWGJE/EMCALJetTasks/macros/AddTaskEmcalJet.C"); |
d4f91bbd | 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 | } | |
8628b70c | 188 | // Here you can put in your AddTaskMacro for your task |
189 | gROOT->LoadMacro("$ALICE_ROOT/PWGJE/EMCALJetTasks/macros/AddTaskEmcalJetSample.C"); | |
d4f91bbd | 190 | AliAnalysisTaskEmcalJetSample* anaTask = 0; |
191 | AddTaskEmcalJetSample(tracksName, clustersCorrName, jetFinderTask->GetName(), rhoName, 4); | |
8628b70c | 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"); | |
0764884d | 297 | gSystem->Load("libPWGTools"); |
8628b70c | 298 | gSystem->Load("libPWGEMCAL"); |
3c91145c | 299 | gSystem->Load("libESDfilter"); |
8628b70c | 300 | gSystem->Load("libPWGGAEMCALTasks"); |
8628b70c | 301 | gSystem->Load("libPWGCFCorrelationsBase"); |
302 | gSystem->Load("libPWGCFCorrelationsDPhi"); | |
303 | ||
304 | //load CGAL, Fastjet and SISCone | |
305 | gSystem->Load("libCGAL"); | |
306 | gSystem->Load("libfastjet"); | |
0764884d | 307 | //For FastJet 3.x use siscon*,fastjetplugins for 2.x use SISConePlugin |
8628b70c | 308 | gSystem->Load("libSISConePlugin"); |
e753ae51 | 309 | gSystem->Load("libCDFConesPlugin"); |
0764884d RR |
310 | // gSystem->Load("libsiscone"); |
311 | // gSystem->Load("libsiscone_spherical"); | |
312 | // gSystem->Load("libfastjetplugins"); | |
8628b70c | 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(""); | |
8b74ce3e | 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()); |
8628b70c | 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"); | |
d4f91bbd | 358 | plugin->SetROOTVersion("v5-34-08-6"); |
359 | plugin->SetAliROOTVersion("vAN-20140525"); | |
8628b70c | 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 | } |