]>
Commit | Line | Data |
---|---|---|
fe0275ad | 1 | #include "Riostream.h" |
f59ecfbc | 2 | void LoadLibraries(); |
3 | void AddAnalysisTasks(); | |
4 | class AliAnalysisAlien; | |
5 | AliAnalysisAlien* CreateAlienHandler(const char *plugin_mode); | |
6 | ||
7 | Bool_t doQAsym = 1; // output ok | |
8 | Bool_t doVZERO = 1; // output ok but there is a 2nd file | |
9 | Bool_t doVertex = 1; // output ok | |
10 | Bool_t doSPD = 1; // output ok, needs RP | |
11 | Bool_t doFMD = 1; // output ok | |
12 | Bool_t doTPC = 1; // output ok | |
13 | Bool_t doEventStat = 1; // output ok | |
14 | Bool_t doSDD = 1; // outout ok needs RP | |
8e52a034 | 15 | // new |
16 | Bool_t doTRD = 1; // TRD | |
17 | Bool_t doITS = 1; // ITS | |
18 | Bool_t doCALO = 1; // Calorimeter | |
19 | Bool_t doMUONTrig = 1; // MUON trigger | |
20 | Bool_t doMUONEff = 0; // MUON efficiency NEEDS geometry | |
2efff183 | 21 | Bool_t doV0 = 0; // V0 recosntruction performance NEEDS MCtruth |
f59ecfbc | 22 | |
fe0275ad | 23 | TString train_name = "QA001_PASS4"; |
24 | TString job_tag = "QA001: PWG1 QA train"; | |
25 | TString root_version = "v5-26-00b"; | |
26 | TString aliroot_version = "v4-19-04-AN"; | |
27 | TString grid_datadir = "/alice/data/2009/LHC09d"; | |
28 | TString data_pattern = "*ESDs/pass4/*ESDs.root"; | |
29 | //TString alien_outdir = ""; | |
30 | TString alien_outdir = "/alice/data/2009/LHC09d/analysis/QA001_PASS4"; | |
31 | ||
32 | Bool_t useProductionMode = kTRUE; | |
33 | ||
f59ecfbc | 34 | void PilotAnalysis(const char *plugin_mode = "full") |
35 | { | |
36 | TGrid::Connect("alien://"); | |
37 | if (!gGrid || !gGrid->IsConnected()) { | |
38 | ::Error("PilotAnalysis", "No grid connection"); | |
39 | return; | |
40 | } | |
fe0275ad | 41 | // Write configuration |
42 | TString cdir = gSystem->WorkingDirectory(); | |
43 | gSystem->MakeDirectory(train_name); | |
44 | gSystem->ChangeDirectory(train_name); | |
45 | ofstream out; | |
46 | out.open(Form("%sConfig.C",train_name.Data()), ios::out); | |
47 | out << "{" << endl; | |
48 | out << " train_name = " << "\"" << train_name.Data() << "\";" << endl; | |
49 | out << " root_version = " << "\"" << root_version.Data() << "\";" << endl; | |
50 | out << " aliroot_version = " << "\"" << aliroot_version.Data() << "\";" << endl; | |
51 | out << " grid_datadir = " << "\"" << grid_datadir.Data() << "\";" << endl; | |
52 | if (!alien_outdir.Length()) alien_outdir = Form("output_%s",train_name.Data()); | |
53 | out << " alien_outdir = " << "\"" << alien_outdir.Data() << "\";" << endl; | |
54 | out << " doQAsim = " << doQAsym << ";" << endl; | |
55 | out << " doVZERO = " << doVZERO << ";" << endl; | |
56 | out << " doVertex = " << doVertex << ";" << endl; | |
57 | out << " doSPD = " << doSPD << ";" << endl; | |
58 | out << " doSDD = " << doSDD << ";" << endl; | |
59 | out << " doFMD = " << doFMD << ";" << endl; | |
60 | out << " doTPC = " << doTPC << ";" << endl; | |
61 | out << " doEventStat = " << doEventStat << ";" << endl; | |
62 | out << "}" << endl; | |
63 | out.close(); | |
64 | ||
f59ecfbc | 65 | // Load libraries |
66 | gSystem->SetIncludePath("-I. -I$ROOTSYS/include -I$ALICE_ROOT/include -I$ALICE_ROOT/ITS"); | |
67 | LoadLibraries(); | |
68 | // Create manager | |
69 | AliAnalysisManager *mgr = new AliAnalysisManager("PilotAnalysis", "Production train"); | |
70 | mgr->SetNSysInfo(1); | |
71 | // Input handler | |
72 | AliESDInputHandlerRP *esdHandler = new AliESDInputHandlerRP(); | |
73 | esdHandler->SetActiveBranches("ESDfriend"); | |
74 | mgr->SetInputEventHandler(esdHandler); | |
75 | ||
76 | mgr->SetDebugLevel(3); | |
fe0275ad | 77 | mgr->SetSaveCanvases(kTRUE); |
78 | ||
f59ecfbc | 79 | // AnalysisTasks |
80 | AddAnalysisTasks(); | |
81 | // Grid handler | |
fe0275ad | 82 | AliAnalysisAlien *alienHandler = CreateAlienHandler(plugin_mode); |
f59ecfbc | 83 | mgr->SetGridHandler(alienHandler); |
84 | if (mgr->InitAnalysis()) { | |
85 | mgr->PrintStatus(); | |
86 | mgr->StartAnalysis("grid"); | |
fe0275ad | 87 | TString alien_workdir = gGrid->GetHomeDirectory(); |
88 | alien_workdir += "analysisDATA"; | |
89 | TString configName = Form("%s/%sConfig.C", alien_workdir.Data(), train_name.Data()); | |
90 | if (strcmp(plugin_mode, "test")) { | |
91 | printf("=== Registering configuration file <%s>===\n", configName.Data()); | |
92 | if (AliAnalysisAlien::FileExists(configName.Data())) gGrid->Rm(configName.Data()); | |
93 | TFile::Cp(Form("file:%sConfig.C",train_name.Data()), Form("alien://%s", configName.Data())); | |
94 | } | |
f59ecfbc | 95 | } |
96 | } | |
97 | ||
98 | void LoadLibraries() | |
99 | { | |
8e52a034 | 100 | gSystem->Load("libANALYSIS.so"); |
101 | gSystem->Load("libANALYSISalice.so"); | |
102 | gSystem->Load("libTENDER.so"); | |
103 | gSystem->Load("libCORRFW.so"); | |
f59ecfbc | 104 | gSystem->Load("libPWG0base.so"); |
105 | gSystem->Load("libPWG0dep.so"); | |
106 | gSystem->Load("libPWG0selectors.so"); | |
107 | gSystem->Load("libPWG1.so"); | |
108 | gSystem->Load("libPWG2.so"); | |
8e52a034 | 109 | gSystem->Load("libPWG3muon.so"); |
110 | gSystem->Load("libPWG3muondep.so"); | |
f59ecfbc | 111 | gSystem->Load("libPWG2forward.so"); |
8e52a034 | 112 | gSystem->Load("libPWG4PartCorrBase.so"); |
113 | gSystem->Load("libPWG4PartCorrDep.so"); | |
114 | ||
f59ecfbc | 115 | if (doSPD) { |
fe0275ad | 116 | TFile::Cp(gSystem->ExpandPathName("$ALICE_ROOT/PWG1/ITS/AliAnalysisTaskSPD.cxx"), "AliAnalysisTaskSPD.cxx"); |
117 | TFile::Cp(gSystem->ExpandPathName("$ALICE_ROOT/PWG1/ITS/AliAnalysisTaskSPD.h"), "AliAnalysisTaskSPD.h"); | |
f59ecfbc | 118 | gROOT->LoadMacro("AliAnalysisTaskSPD.cxx++g"); |
119 | } | |
120 | if (doSDD) { | |
fe0275ad | 121 | TFile::Cp(gSystem->ExpandPathName("$ALICE_ROOT/PWG1/ITS/AliAnalysisTaskSDDRP.cxx"), "AliAnalysisTaskSDDRP.cxx"); |
122 | TFile::Cp(gSystem->ExpandPathName("$ALICE_ROOT/PWG1/ITS/AliAnalysisTaskSDDRP.h"), "AliAnalysisTaskSDDRP.h"); | |
123 | // gROOT->LoadMacro("AliAnalysisTaskSDDRP.cxx++g"); | |
f59ecfbc | 124 | } |
125 | } | |
126 | ||
127 | void AddAnalysisTasks() | |
128 | { | |
8e52a034 | 129 | // |
f59ecfbc | 130 | // Vertexing (A. Dainese) |
131 | // | |
8e52a034 | 132 | |
f59ecfbc | 133 | if (doVertex) { |
134 | gROOT->LoadMacro("$ALICE_ROOT/PWG1/macros/AddTaskVertexESD.C"); | |
135 | AliAnalysisTaskVertexESD* taskvertexesd = AddTaskVertexESD(); | |
136 | taskvertexesd->SelectCollisionCandidates(); | |
137 | } | |
138 | ||
8e52a034 | 139 | // |
f59ecfbc | 140 | // TPC QA (E. Sicking) |
141 | // | |
8e52a034 | 142 | |
f59ecfbc | 143 | if (doQAsym) { |
144 | gROOT->LoadMacro("$ALICE_ROOT/PWG1/PilotTrain/AddTaskQAsym.C"); | |
145 | AliAnalysisTaskSE * taskqasim = AddTaskQAsym(); | |
146 | taskqasim->SelectCollisionCandidates(); | |
147 | } | |
8e52a034 | 148 | |
149 | ||
f59ecfbc | 150 | // |
151 | // VZERO QA (C. Cheshkov) | |
152 | // | |
8e52a034 | 153 | |
f59ecfbc | 154 | if (doVZERO) { |
155 | gROOT->LoadMacro("$ALICE_ROOT/PWG1/PilotTrain/AddTaskVZEROQA.C"); | |
156 | AliAnalysisTaskSE * taskv0qa = AddTaskVZEROQA(0); | |
f59ecfbc | 157 | } |
8e52a034 | 158 | |
159 | // | |
f59ecfbc | 160 | // FMD (Hans Hjersing Dalsgaard) |
161 | // | |
8e52a034 | 162 | |
f59ecfbc | 163 | if (doFMD) { |
164 | gROOT->LoadMacro("$ALICE_ROOT/PWG1/PilotTrain/AddTaskFMD.C"); | |
165 | AliAnalysisTaskSE* taskfmd = AddTaskFMD(); | |
166 | taskfmd->SelectCollisionCandidates(); | |
167 | } | |
8e52a034 | 168 | |
f59ecfbc | 169 | // |
170 | // TPC (Jacek Otwinowski) | |
171 | // | |
8e52a034 | 172 | |
f59ecfbc | 173 | if (doTPC) { |
174 | gROOT->LoadMacro("$(ALICE_ROOT)/PWG1/TPC/macros/AddTaskPerformanceTPCQA.C"); | |
175 | AliPerformanceTask *tpcQA = AddTaskPerformanceTPCQA(kFALSE, kTRUE); | |
176 | } | |
8e52a034 | 177 | |
178 | // | |
179 | // ITS | |
180 | // | |
181 | if (doITS) { | |
182 | gROOT->LoadMacro("$ALICE_ROOT/PWG1/macros/AddTaskPerformanceITS.C"); | |
183 | AliAnalysisTaskITSTrackingCheck *itsQA = AddTaskPerformanceITS(kFALSE); | |
184 | } | |
185 | ||
f59ecfbc | 186 | // |
187 | // SPD (A. Mastroserio) | |
188 | // | |
8e52a034 | 189 | |
f59ecfbc | 190 | if (doSPD) { |
191 | gROOT->LoadMacro("$ALICE_ROOT/PWG1/PilotTrain/AddTaskSPDQA.C"); | |
192 | AliAnalysisTaskSE* taskspdqa = AddTaskSPDQA(); | |
193 | taskspdqa->SelectCollisionCandidates(); | |
8e52a034 | 194 | } |
195 | ||
f59ecfbc | 196 | // |
197 | // SDD (F. Prino) | |
198 | // | |
8e52a034 | 199 | |
f59ecfbc | 200 | if (doSDD) { |
201 | gROOT->LoadMacro("$ALICE_ROOT/PWG1/PilotTrain/AddSDDPoints.C"); | |
202 | AliAnalysisTaskSE* tasksdd = AddSDDPoints(); | |
203 | tasksdd->SelectCollisionCandidates(); | |
204 | } | |
8e52a034 | 205 | |
206 | ||
f59ecfbc | 207 | // |
208 | // Event Statistics (Jan Fiete) | |
209 | // | |
210 | ||
211 | if (doEventStat) { | |
212 | gROOT->LoadMacro("$ALICE_ROOT/PWG1/PilotTrain/AddTaskPhysicsSelection.C"); | |
213 | AliPhysicsSelectionTask* physSelTask = AddTaskPhysicsSelection(); | |
214 | AliPhysicsSelection* physSel = physSelTask->GetPhysicsSelection(); | |
215 | physSel->AddBackgroundIdentification(new AliBackgroundSelection()); | |
fe0275ad | 216 | AliAnalysisManager::GetAnalysisManager()->RegisterExtraFile("event_stat.root"); |
8e52a034 | 217 | } |
218 | ||
219 | ||
220 | // | |
221 | // TRD (Alex Bercuci, M. Fasel) | |
222 | // | |
223 | if(doTRD) { | |
803ca16a | 224 | gROOT->LoadMacro("$ALICE_ROOT/PWG1/macros/AddTrainPerformanceTRD.C"); |
225 | AddTrainPerformanceTRD("ALL"); | |
8e52a034 | 226 | } |
227 | ||
228 | // | |
229 | // Calorimetry (Gustavo Conesa) | |
230 | // | |
231 | ||
232 | if(doCALO) { | |
233 | gROOT->LoadMacro("$ALICE_ROOT/PWG4/macros/QA/AddTaskCalorimeterQA.C"); | |
234 | AliAnalysisTaskParticleCorrelation *taskCaloQA = AddTaskCalorimeterQA("ESD", kTRUE, kFALSE); | |
2efff183 | 235 | taskCaloQA->SetDebugLevel(0); |
8e52a034 | 236 | } |
237 | ||
238 | // | |
239 | // Muon Trigger | |
240 | // | |
241 | ||
242 | if(doMUONTrig) { | |
243 | gROOT->LoadMacro("$ALICE_ROOT/PWG1/macros/AddTaskMTRchamberEfficiency.C"); | |
244 | AliAnalysisTaskTrigChEff *taskMuonTrig = AddTaskMTRchamberEfficiency(); | |
245 | } | |
246 | ||
247 | // | |
248 | // Muon Efficiency | |
249 | // | |
250 | ||
251 | if(doMUONEff) { | |
252 | gROOT->LoadMacro("$ALICE_ROOT/PWG3/muondep/AddTaskMUONTrackingEfficiency.C"); | |
253 | AliAnalysisTaskMuonTrackingEff *taskMuonTrackEff = AddTaskMUONTrackingEfficiency(); | |
254 | } | |
255 | ||
256 | // | |
257 | // V0-Decay Reconstruction (Ana Marin) | |
258 | // | |
259 | ||
260 | if (doV0) { | |
261 | gROOT->LoadMacro("$ALICE_ROOT/PWG1/macros/AddTaskV0QA.C"); | |
262 | AliAnalysisTaskV0QA *taskv0QA = AddTaskV0QA(kFALSE); | |
263 | } | |
264 | ||
265 | ||
f59ecfbc | 266 | } |
267 | ||
268 | //______________________________________________________________________________ | |
269 | AliAnalysisAlien* CreateAlienHandler(const char *plugin_mode) | |
270 | { | |
271 | // Check if user has a valid token, otherwise make one. This has limitations. | |
272 | // One can always follow the standard procedure of calling alien-token-init then | |
273 | // source /tmp/gclient_env_$UID in the current shell. | |
274 | if (!AliAnalysisGrid::CreateToken()) return NULL; | |
275 | AliAnalysisAlien *plugin = new AliAnalysisAlien(); | |
276 | // Set the run mode (can be "full", "test", "offline", "submit" or "terminate") | |
277 | plugin->SetRunMode(plugin_mode); | |
fe0275ad | 278 | if (useProductionMode) plugin->SetProductionMode(); |
279 | plugin->SetJobTag(job_tag); | |
f59ecfbc | 280 | plugin->SetNtestFiles(1); |
281 | // Set versions of used packages | |
f59ecfbc | 282 | plugin->SetAPIVersion("V1.1x"); |
fe0275ad | 283 | plugin->SetROOTVersion(root_version); |
284 | plugin->SetAliROOTVersion(aliroot_version); | |
f59ecfbc | 285 | // Declare input data to be processed. |
286 | // Method 1: Create automatically XML collections using alien 'find' command. | |
287 | // Define production directory LFN | |
fe0275ad | 288 | plugin->SetGridDataDir(grid_datadir); |
f59ecfbc | 289 | // Set data search pattern |
fe0275ad | 290 | plugin->SetDataPattern(data_pattern); |
f59ecfbc | 291 | // ...then add run numbers to be considered |
292 | // if (!iAODanalysis) plugin->SetRunRange(run_range[0], run_range[1]); | |
293 | plugin->SetRunPrefix("000"); | |
294 | plugin->SetOutputSingleFolder("output"); | |
295 | plugin->SetOutputToRunNo(); | |
296 | Int_t run_numbers[30] = {104065, 104155, 104157, 104159, 104160, 104315, 104316, 104320, 104321, 104439, | |
297 | 104792, 104793, 104799, 104800, 104801, 104802, 104803, 104821, 104824, 104825, | |
298 | 104841, 104845, 104849, 104852, 104865, 104867, 104876, 104892, 105143, 105160}; | |
299 | for (Int_t i=0; i<30; i++) { | |
300 | plugin->AddRunNumber(run_numbers[i]); | |
301 | } | |
302 | // Define alien work directory where all files will be copied. Relative to alien $HOME. | |
303 | plugin->SetGridWorkingDir("analysisDATA"); | |
304 | // Declare alien output directory. Relative to working directory. | |
fe0275ad | 305 | if (alien_outdir.IsNull()) alien_outdir = Form("output_%s",train_name.Data()); |
306 | plugin->SetGridOutputDir(alien_outdir); | |
f59ecfbc | 307 | |
308 | // plugin->EnablePackage(""); | |
309 | ||
310 | // Declare the analysis source files names separated by blancs. To be compiled runtime | |
311 | // using ACLiC on the worker nodes. | |
312 | // Declare all libraries (other than the default ones for the framework. These will be | |
313 | // loaded by the generated analysis macro. Add all extra files (task .cxx/.h) here. | |
314 | plugin->AddIncludePath("-I$ROOTSYS/include -I$ALICE_ROOT/include -I$ALICE_ROOT/ITS"); | |
315 | plugin->SetAnalysisSource("AliAnalysisTaskSPD.cxx AliAnalysisTaskSDDRP.cxx"); | |
316 | plugin->SetAdditionalLibs("libTENDER.so libPWG0base.so libPWG0dep.so libPWG0selectors.so libPWG1.so libPWG2.so libPWG2forward.so AliAnalysisTaskSPD.h AliAnalysisTaskSPD.cxx AliAnalysisTaskSDDRP.h AliAnalysisTaskSDDRP.cxx"); | |
317 | ||
318 | // Declare the output file names separated by blancs. | |
319 | // (can be like: file.root or file.root@ALICE::Niham::File) | |
320 | plugin->SetDefaultOutputs(); | |
321 | // plugin->SetMergeExcludes(mergeExclude); | |
322 | plugin->SetMaxMergeFiles(100); | |
323 | plugin->SetNrunsPerMaster(1); | |
324 | // Optionally define the files to be archived. | |
325 | // plugin->SetOutputArchive("log_archive.zip:stdout,stderr@ALICE::NIHAM::File root_archive.zip:AliAOD.root,AOD.tag.root@ALICE::NIHAM::File"); | |
326 | ||
327 | // Put default output files to archive | |
328 | TString listhists = ""; | |
329 | TString listaods = ""; | |
330 | AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager(); | |
331 | TIter next(mgr->GetOutputs()); | |
332 | AliAnalysisDataContainer *output; | |
333 | while ((output=(AliAnalysisDataContainer*)next())) { | |
334 | const char *filename = output->GetFileName(); | |
335 | if (!(strcmp(filename, "default"))) { | |
336 | if (!mgr->GetOutputEventHandler()) continue; | |
337 | filename = mgr->GetOutputEventHandler()->GetOutputFileName(); | |
338 | if (listaods.Length()) listaods += ","; | |
339 | listaods += filename; | |
340 | } else { | |
341 | if (listhists.Contains(filename)) continue; | |
342 | if (listhists.Length()) listhists += ","; | |
343 | listhists += filename; | |
344 | } | |
345 | } | |
346 | if (mgr->GetExtraFiles().Length()) { | |
fe0275ad | 347 | if (listhists.Length()) listhists += ","; |
348 | listhists += mgr->GetExtraFiles(); | |
349 | listhists.ReplaceAll(" ", ","); | |
f59ecfbc | 350 | } |
351 | if (listhists.Length()) listhists = Form("hist_archive.zip:%s", listhists.Data()); | |
352 | if (listaods.Length()) listaods = Form("aod_archive.zip:%s", listaods.Data()); | |
353 | if (!listhists.Length()) { | |
354 | ::Fatal("AnalysisTrainNew", "No task output !"); | |
355 | } | |
fe0275ad | 356 | TString outputArchive = "log_archive.zip:stdout,stderr@disk=4"; |
f59ecfbc | 357 | if (listaods.Length()) { |
358 | outputArchive += " "; | |
359 | outputArchive += listaods; | |
fe0275ad | 360 | outputArchive += "@disk=4"; |
f59ecfbc | 361 | } |
362 | if (listhists.Length()) { | |
363 | outputArchive += " "; | |
364 | outputArchive += listhists; | |
fe0275ad | 365 | outputArchive += "@disk=4"; |
f59ecfbc | 366 | } |
367 | // Set friends | |
368 | // if (iAODanalysis && iPWG3d2h) | |
369 | // plugin->SetFriendChainName("AliAOD.VertexingHF.root"); | |
370 | plugin->SetOutputArchive(outputArchive); | |
371 | // Optionally set a name for the generated analysis macro (default MyAnalysis.C) | |
fe0275ad | 372 | plugin->SetAnalysisMacro(Form("%s.C", train_name.Data())); |
f59ecfbc | 373 | // Optionally set maximum number of input files/subjob (default 100, put 0 to ignore) |
374 | plugin->SetSplitMaxInputFileNumber(1000); | |
375 | // Optionally set number of failed jobs that will trigger killing waiting sub-jobs. | |
376 | // plugin->SetMaxInitFailed(5); | |
377 | // Optionally resubmit threshold. | |
378 | // plugin->SetMasterResubmitThreshold(90); | |
379 | // Optionally set time to live (default 30000 sec) | |
380 | plugin->SetTTL(70000); | |
381 | // Optionally set input format (default xml-single) | |
382 | plugin->SetInputFormat("xml-single"); | |
383 | // Optionally modify the name of the generated JDL (default analysis.jdl) | |
fe0275ad | 384 | plugin->SetJDLName(Form("%s.jdl", train_name.Data())); |
f59ecfbc | 385 | // Optionally modify the executable name (default analysis.sh) |
fe0275ad | 386 | plugin->SetExecutable(Form("%s.sh", train_name.Data())); |
f59ecfbc | 387 | // Optionally modify job price (default 1) |
388 | plugin->SetPrice(1); | |
389 | // Optionally modify split mode (default 'se') | |
390 | plugin->SetSplitMode("se"); | |
391 | plugin->SetExecutableCommand("aliroot -b -q"); | |
392 | return plugin; | |
393 | } |