3 void AddAnalysisTasks();
4 class AliAnalysisAlien;
5 AliAnalysisAlien* CreateAlienHandler(const char *plugin_mode);
7 Int_t runNumbers[5] = {119934};
10 Bool_t doQAsym = 1; // output ok
11 Bool_t doVZERO = 1; // output ok but there is a 2nd file
12 Bool_t doVertex = 1; // output ok
13 Bool_t doSPD = 1; // output ok, needs RP
14 Bool_t doFMD = 1; // output ok
15 Bool_t doTPC = 1; // output ok
16 Bool_t doEventStat = 1; // output ok
17 Bool_t doSDD = 1; // outout ok needs RP
18 Bool_t doSSDdEdx = 1; // testing
20 Bool_t doTRD = 1; // TRD
21 Bool_t doITS = 1; // ITS
22 Bool_t doCALO = 1; // Calorimeter
23 Bool_t doMUONTrig = 1; // MUON trigger
24 Bool_t doMUONEff = 0; // MUON efficiency NEEDS geometry
25 Bool_t doV0 = 0; // V0 recosntruction performance NEEDS MCtruth
27 TString train_name = "QAtest";
28 //TString train_name = "TR019_PASS6";
29 TString job_tag = "QA4_LHC10c: PWG1 QA train";
30 //TString job_tag = "TR019: LHC09d-Pass6 ESD filtering w. PhysSelection -> AOD (including muon deltas)";
31 TString root_version = "v5-26-00b-5";
32 TString aliroot_version = "v4-19-13-AN";
33 TString grid_datadir = "/alice/data/2010/LHC10c";
34 //TString grid_datadir = "/alice/data/2009/LHC09d";
35 TString data_pattern = "*ESDs/pass1/*ESDs.root";
36 TString alien_outdir = "";
37 //TString alien_outdir = "/alice/cern.ch/user/m/mgheata/analysisDATA/output_QA007_PASS1_7TeV/000114917";
38 //TString alien_outdir = "/alice/data/2009/LHC09d/analysis/PASS6/AOD";
39 TString mergeExcludes;
41 Bool_t useProductionMode = kTRUE;
42 Bool_t useMergeViaJDL = kTRUE;
43 Bool_t useFastReadOption = kTRUE;
44 Bool_t useOverwriteMode = kTRUE;
45 Bool_t useDevelopmentVersion = kFALSE;
47 void PilotAnalysis(const char *plugin_mode = "full")
49 TGrid::Connect("alien://");
50 if (!gGrid || !gGrid->IsConnected()) {
51 ::Error("PilotAnalysis", "No grid connection");
54 // Write configuration
55 TString cdir = gSystem->WorkingDirectory();
56 gSystem->MakeDirectory(train_name);
57 gSystem->ChangeDirectory(train_name);
59 out.open(Form("%sConfig.C",train_name.Data()), ios::out);
61 out << " train_name = " << "\"" << train_name.Data() << "\";" << endl;
62 out << " root_version = " << "\"" << root_version.Data() << "\";" << endl;
63 out << " aliroot_version = " << "\"" << aliroot_version.Data() << "\";" << endl;
64 out << " grid_datadir = " << "\"" << grid_datadir.Data() << "\";" << endl;
65 if (!alien_outdir.Length()) alien_outdir = Form("output_%s",train_name.Data());
66 out << " alien_outdir = " << "\"" << alien_outdir.Data() << "\";" << endl;
67 out << " doAOD = " << doAOD << ";" << endl;
68 out << " doQAsim = " << doQAsym << ";" << endl;
69 out << " doVZERO = " << doVZERO << ";" << endl;
70 out << " doVertex = " << doVertex << ";" << endl;
71 out << " doSPD = " << doSPD << ";" << endl;
72 out << " doSDD = " << doSDD << ";" << endl;
73 out << " doSSDdEdx = " << doSSDdEdx << ";" << endl;
74 out << " doFMD = " << doFMD << ";" << endl;
75 out << " doTPC = " << doTPC << ";" << endl;
76 out << " doEventStat = " << doEventStat << ";" << endl;
81 gSystem->SetIncludePath("-I. -I$ROOTSYS/include -I$ALICE_ROOT/include -I$ALICE_ROOT -I$ALICE_ROOT/ITS -I$ALICE_ROOT/TRD");
84 AliAnalysisManager *mgr = new AliAnalysisManager("PilotAnalysis", "Production train");
85 mgr->SetNSysInfo(100);
87 AliESDInputHandlerRP *esdHandler = new AliESDInputHandlerRP();
88 esdHandler->SetReadFriends(kTRUE);
89 esdHandler->SetActiveBranches("ESDfriend");
90 mgr->SetInputEventHandler(esdHandler);
93 AliAODHandler* aodHandler = new AliAODHandler();
94 aodHandler->SetOutputFileName("AliAOD.root");
95 if (!mergeExcludes.IsNull()) mergeExcludes += " ";
96 mergeExcludes += "AliAOD.root";
97 mgr->SetOutputEventHandler(aodHandler);
100 mgr->SetDebugLevel(1);
101 mgr->SetSaveCanvases(kTRUE);
106 AliAnalysisAlien *alienHandler = CreateAlienHandler(plugin_mode);
107 mgr->SetGridHandler(alienHandler);
108 if (mgr->InitAnalysis()) {
110 mgr->StartAnalysis("grid");
111 TString alien_workdir = gGrid->GetHomeDirectory();
112 alien_workdir += "analysisDATA";
113 TString configName = Form("%s/%sConfig.C", alien_workdir.Data(), train_name.Data());
114 if (strcmp(plugin_mode, "test")) {
115 printf("=== Registering configuration file <%s>===\n", configName.Data());
116 if (AliAnalysisAlien::FileExists(configName.Data())) gGrid->Rm(configName.Data());
117 TFile::Cp(Form("file:%sConfig.C",train_name.Data()), Form("alien://%s", configName.Data()));
124 gSystem->Load("libANALYSIS");
125 gSystem->Load("libANALYSISalice");
126 gSystem->Load("libCORRFW");
127 gSystem->Load("libTENDER");
128 gSystem->Load("libPWG0base.so");
129 gSystem->Load("libPWG0dep.so");
130 gSystem->Load("libPWG0selectors.so");
131 gSystem->Load("libPWG1.so");
132 gSystem->Load("libPWG2.so");
133 gSystem->Load("libPWG2forward.so");
136 gSystem->Load("libEMCALUtils");
137 gSystem->Load("libPWG4PartCorrBase");
138 gSystem->Load("libPWG4PartCorrDep");
140 if(doMUONTrig || doAOD) {
141 gSystem->Load("libPWG3base");
142 gSystem->Load("libPWG3muon");
143 gSystem->Load("libPWG3muondep");
147 void AddAnalysisTasks()
149 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
150 mgr->SetCommonFileName("QAresults.root");
151 // AOD creation with collision events
153 gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskESDFilter.C");
154 mgr->RegisterExtraFile("AliAOD.Muons.root");
155 mgr->RegisterExtraFile("AliAOD.Dimuons.root");
156 AliAnalysisTaskESDfilter *taskesdfilter = AddTaskESDFilter(kFALSE, kTRUE, kTRUE, doEventStat);
159 // Event Statistics (Jan Fiete)
163 gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskPhysicsSelection.C");
164 AliPhysicsSelectionTask* physSelTask = AddTaskPhysicsSelection();
165 mgr->RegisterExtraFile("event_stat.root");
167 // Vertexing (A. Dainese)
170 gROOT->LoadMacro("$ALICE_ROOT/PWG1/macros/AddTaskVertexESD.C");
171 AliAnalysisTaskVertexESD* taskvertexesd = AddTaskVertexESD();
172 taskvertexesd->SelectCollisionCandidates();
175 // TPC QA (E. Sicking)
178 gROOT->LoadMacro("$ALICE_ROOT/PWG1/PilotTrain/AddTaskQAsym.C");
179 AliAnalysisTaskSE * taskqasim = AddTaskQAsym(0);
180 taskqasim->SelectCollisionCandidates();
183 // VZERO QA (C. Cheshkov)
186 gROOT->LoadMacro("$ALICE_ROOT/PWG1/PilotTrain/AddTaskVZEROQA.C");
187 AliAnalysisTaskSE * taskv0qa = AddTaskVZEROQA(0);
188 // taskv0qa->SelectCollisionCandidates();
191 // TPC (Jacek Otwinowski)
194 gROOT->LoadMacro("$(ALICE_ROOT)/PWG1/TPC/macros/AddTaskPerformanceTPCQA.C");
195 AliPerformanceTask *tpcQA = AddTaskPerformanceTPCQA(kFALSE, kTRUE);
198 // SPD (A. Mastroserio)
201 gROOT->LoadMacro("$ALICE_ROOT/PWG1/PilotTrain/AddTaskSPDQA.C");
202 AliAnalysisTaskSE* taskspdqa = AddTaskSPDQA();
203 taskspdqa->SelectCollisionCandidates();
209 gROOT->LoadMacro("$ALICE_ROOT/PWG1/PilotTrain/AddSDDPoints.C");
210 AliAnalysisTaskSE* tasksdd = AddSDDPoints();
211 tasksdd->SelectCollisionCandidates();
214 // SSD dEdx (Marek Chojnacki)
217 gROOT->LoadMacro("$ALICE_ROOT/PWG1/PilotTrain/AddTaskdEdxSSDQA.C");
218 AliAnalysisTaskSE* taskssddedx = AddTaskdEdxSSDQA();
219 taskssddedx->SelectCollisionCandidates();
226 gROOT->LoadMacro("$ALICE_ROOT/PWG1/macros/AddTaskPerformanceITS.C");
227 AliAnalysisTaskITSTrackingCheck *itsQA = AddTaskPerformanceITS(kFALSE);
230 // TRD (Alex Bercuci, M. Fasel)
233 gROOT->LoadMacro("$ALICE_ROOT/PWG1/macros/AddTrainPerformanceTRD.C");
234 AddTrainPerformanceTRD("ALL");
238 // Calorimetry (Gustavo Conesa)
242 gROOT->LoadMacro("$ALICE_ROOT/PWG4/macros/QA/AddTaskCalorimeterQA.C");
243 AliAnalysisTaskParticleCorrelation *taskCaloQA = AddTaskCalorimeterQA("ESD", kTRUE, kFALSE);
244 taskCaloQA->SetDebugLevel(0);
252 gROOT->LoadMacro("$ALICE_ROOT/PWG1/macros/AddTaskMTRchamberEfficiency.C");
253 AliAnalysisTaskTrigChEff *taskMuonTrig = AddTaskMTRchamberEfficiency();
261 gROOT->LoadMacro("$ALICE_ROOT/PWG3/muondep/AddTaskMUONTrackingEfficiency.C");
262 AliAnalysisTaskMuonTrackingEff *taskMuonTrackEff = AddTaskMUONTrackingEfficiency();
266 // V0-Decay Reconstruction (Ana Marin)
270 gROOT->LoadMacro("$ALICE_ROOT/PWG1/macros/AddTaskV0QA.C");
271 AliAnalysisTaskV0QA *taskv0QA = AddTaskV0QA(kFALSE);
273 // FMD (Hans Hjersing Dalsgaard)
276 gROOT->LoadMacro("$ALICE_ROOT/PWG1/PilotTrain/AddTaskFMD.C");
277 AliAnalysisTaskSE* taskfmd = AddTaskFMD();
278 taskfmd->SelectCollisionCandidates();
282 //______________________________________________________________________________
283 AliAnalysisAlien* CreateAlienHandler(const char *plugin_mode)
285 // Check if user has a valid token, otherwise make one. This has limitations.
286 // One can always follow the standard procedure of calling alien-token-init then
287 // source /tmp/gclient_env_$UID in the current shell.
288 if (!AliAnalysisGrid::CreateToken()) return NULL;
289 AliAnalysisAlien *plugin = new AliAnalysisAlien();
290 // Set the run mode (can be "full", "test", "offline", "submit" or "terminate")
291 plugin->SetRunMode(plugin_mode);
292 if (useProductionMode) plugin->SetProductionMode();
293 plugin->SetJobTag(job_tag);
294 plugin->SetNtestFiles(1);
295 // Set versions of used packages
296 plugin->SetAPIVersion("V1.1x");
297 plugin->SetROOTVersion(root_version);
298 plugin->SetAliROOTVersion(aliroot_version);
299 // Declare input data to be processed.
300 // Method 1: Create automatically XML collections using alien 'find' command.
301 // Define production directory LFN
302 plugin->SetGridDataDir(grid_datadir);
303 // Set data search pattern
304 plugin->SetDataPattern(data_pattern);
305 // ...then add run numbers to be considered
306 // if (!iAODanalysis) plugin->SetRunRange(run_range[0], run_range[1]);
307 plugin->SetRunPrefix("000");
308 // plugin->SetOutputSingleFolder("output");
309 plugin->SetOutputToRunNo();
310 // Int_t run_numbers[30] = {104065, 104155, 104157, 104159, 104160, 104315, 104316, 104320, 104321, 104439,
311 // 104792, 104793, 104799, 104800, 104801, 104802, 104803, 104821, 104824, 104825,
312 // 104841, 104845, 104849, 104852, 104865, 104867, 104876, 104892, 105143, 105160};
313 // Int_t run_numbers[8] = {114785, 114778, 114757, 114753, 114745, 114744, 114743, 114737};
314 // Int_t run_numbers[2] = {114785, 114917};
315 for (Int_t i=0; i<2; i++) {
316 if (!runNumbers[i]) break;
317 plugin->AddRunNumber(runNumbers[i]);
319 // Define alien work directory where all files will be copied. Relative to alien $HOME.
320 plugin->SetGridWorkingDir(train_name);
321 // Declare alien output directory. Relative to working directory.
322 if (alien_outdir.IsNull()) alien_outdir = Form("output_%s",train_name.Data());
323 plugin->SetGridOutputDir(alien_outdir);
325 if (useDevelopmentVersion) {
326 plugin->EnablePackage("STEERBase");
327 plugin->EnablePackage("ESD");
328 plugin->EnablePackage("AOD");
329 plugin->EnablePackage("ANALYSIS");
330 plugin->EnablePackage("ANALYSISalice");
333 // Declare the analysis source files names separated by blancs. To be compiled runtime
334 // using ACLiC on the worker nodes.
335 // Declare all libraries (other than the default ones for the framework. These will be
336 // loaded by the generated analysis macro. Add all extra files (task .cxx/.h) here.
337 plugin->AddIncludePath("-I. -I$ROOTSYS/include -I$ALICE_ROOT/include -I$ALICE_ROOT/ITS -I$ALICE_ROOT/TRD");
339 plugin->SetAdditionalLibs("libTENDER.so libPWG0base.so libPWG0dep.so libPWG0selectors.so libPWG1.so libPWG2.so \
340 libPWG2forward.so libEMCALUtils.so libPWG4PartCorrBase.so libPWG4PartCorrDep.so \
341 libPWG3base.so libPWG3muon.so libPWG3muondep.so");
343 // Declare the output file names separated by blancs.
344 // (can be like: file.root or file.root@ALICE::Niham::File)
345 plugin->SetDefaultOutputs();
346 // plugin->SetMergeExcludes(mergeExclude);
347 plugin->SetMaxMergeFiles(20);
348 plugin->SetNrunsPerMaster(1);
349 // Optionally define the files to be archived.
350 // plugin->SetOutputArchive("log_archive.zip:stdout,stderr@ALICE::NIHAM::File root_archive.zip:AliAOD.root,AOD.tag.root@ALICE::NIHAM::File");
352 // Put default output files to archive
353 TString listhists = "";
354 TString listaods = "";
355 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
356 TIter next(mgr->GetOutputs());
357 AliAnalysisDataContainer *output;
358 while ((output=(AliAnalysisDataContainer*)next())) {
359 const char *filename = output->GetFileName();
360 if (!(strcmp(filename, "default"))) {
361 if (!mgr->GetOutputEventHandler()) continue;
362 filename = mgr->GetOutputEventHandler()->GetOutputFileName();
363 if (listaods.Length()) listaods += ",";
364 listaods += filename;
366 if (listhists.Contains(filename)) continue;
367 if (listhists.Length()) listhists += ",";
368 listhists += filename;
371 if (mgr->GetExtraFiles().Length()) {
372 if (listhists.Length()) listhists += ",";
373 listhists += mgr->GetExtraFiles();
374 listhists.ReplaceAll(" ", ",");
376 if (listhists.Length()) listhists = Form("hist_archive.zip:%s", listhists.Data());
377 if (listaods.Length()) listaods = Form("aod_archive.zip:%s", listaods.Data());
378 if (!listhists.Length()) {
379 ::Fatal("AnalysisTrainNew", "No task output !");
381 TString outputArchive = "log_archive.zip:stdout,stderr@disk=4";
382 if (listaods.Length()) {
383 outputArchive += " ";
384 outputArchive += listaods;
385 outputArchive += "@disk=4";
387 if (listhists.Length()) {
388 outputArchive += " ";
389 outputArchive += listhists;
390 outputArchive += "@disk=4";
392 if (!mergeExcludes.IsNull()) plugin->SetMergeExcludes(mergeExcludes);
394 // if (iAODanalysis && iPWG3d2h)
395 // plugin->SetFriendChainName("AliAOD.VertexingHF.root");
396 plugin->SetOutputArchive(outputArchive);
397 // Optionally set a name for the generated analysis macro (default MyAnalysis.C)
398 plugin->SetAnalysisMacro(Form("%s.C", train_name.Data()));
399 // Optionally set maximum number of input files/subjob (default 100, put 0 to ignore)
400 plugin->SetSplitMaxInputFileNumber(1);
401 // Optionally set number of failed jobs that will trigger killing waiting sub-jobs.
402 // plugin->SetMaxInitFailed(5);
403 // Optionally resubmit threshold.
404 // plugin->SetMasterResubmitThreshold(90);
405 // Optionally set time to live (default 30000 sec)
406 plugin->SetTTL(70000);
407 // Optionally set input format (default xml-single)
408 plugin->SetInputFormat("xml-single");
409 // Optionally modify the name of the generated JDL (default analysis.jdl)
410 plugin->SetJDLName(Form("%s.jdl", train_name.Data()));
411 // Optionally modify the executable name (default analysis.sh)
412 plugin->SetExecutable(Form("%s.sh", train_name.Data()));
413 // Optionally modify job price (default 1)
415 // Optionally modify split mode (default 'se')
416 plugin->SetSplitMode("se");
417 plugin->SetExecutableCommand("aliroot -b -q");
419 plugin->SetMergeViaJDL(useMergeViaJDL);
420 // Use fastread option
421 plugin->SetFastReadOption(useFastReadOption);
423 plugin->SetOverwriteMode(useOverwriteMode);