]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWG1/PilotTrain/PilotAnalysis.C
dEdxSSDAQA added to PilotAnalysis
[u/mrichter/AliRoot.git] / PWG1 / PilotTrain / PilotAnalysis.C
1 #include "Riostream.h"
2 void LoadLibraries();
3 void AddAnalysisTasks(); 
4 class AliAnalysisAlien;                                                                                                                    
5 AliAnalysisAlien* CreateAlienHandler(const char *plugin_mode);
6
7 Int_t runNumbers[5] = {119934};
8
9 Bool_t doAOD          = 0;   
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
19 // new 
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 
26
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;
40
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;
46
47 void PilotAnalysis(const char *plugin_mode = "full")
48 {
49   TGrid::Connect("alien://");
50   if (!gGrid || !gGrid->IsConnected()) {
51     ::Error("PilotAnalysis", "No grid connection");
52     return;
53   }
54   // Write configuration
55   TString cdir = gSystem->WorkingDirectory();
56   gSystem->MakeDirectory(train_name);
57   gSystem->ChangeDirectory(train_name);
58   ofstream out;
59   out.open(Form("%sConfig.C",train_name.Data()), ios::out);
60   out << "{" << endl;
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;
77   out << "}" << endl;
78   out.close();
79   
80   // Load libraries
81   gSystem->SetIncludePath("-I. -I$ROOTSYS/include -I$ALICE_ROOT/include -I$ALICE_ROOT -I$ALICE_ROOT/ITS -I$ALICE_ROOT/TRD");
82   LoadLibraries();
83   // Create manager
84   AliAnalysisManager *mgr  = new AliAnalysisManager("PilotAnalysis", "Production train");
85   mgr->SetNSysInfo(100);
86   // Input handler
87   AliESDInputHandlerRP *esdHandler = new AliESDInputHandlerRP();
88   esdHandler->SetReadFriends(kTRUE);
89   esdHandler->SetActiveBranches("ESDfriend");
90   mgr->SetInputEventHandler(esdHandler);
91   if (doAOD) {
92      // AOD output handler
93      AliAODHandler* aodHandler   = new AliAODHandler();
94      aodHandler->SetOutputFileName("AliAOD.root");
95      if (!mergeExcludes.IsNull()) mergeExcludes += " ";
96      mergeExcludes += "AliAOD.root";
97      mgr->SetOutputEventHandler(aodHandler);
98   }   
99
100   mgr->SetDebugLevel(1);
101   mgr->SetSaveCanvases(kTRUE);
102   
103   // AnalysisTasks
104   AddAnalysisTasks();
105   // Grid handler
106   AliAnalysisAlien *alienHandler = CreateAlienHandler(plugin_mode);
107   mgr->SetGridHandler(alienHandler);
108   if (mgr->InitAnalysis()) {                                                                                                              
109     mgr->PrintStatus(); 
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()));  
118     }  
119   }
120 }
121
122 void LoadLibraries()
123 {
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");
134
135   if (doCALO) {
136      gSystem->Load("libEMCALUtils");
137      gSystem->Load("libPWG4PartCorrBase");
138      gSystem->Load("libPWG4PartCorrDep");
139   }  
140   if(doMUONTrig || doAOD) {
141      gSystem->Load("libPWG3base");
142      gSystem->Load("libPWG3muon");
143      gSystem->Load("libPWG3muondep");
144   }   
145 }
146
147 void AddAnalysisTasks()
148 {
149   AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
150   mgr->SetCommonFileName("QAresults.root");
151   // AOD creation with collision events
152   if (doAOD) {
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);
157   }   
158   //
159   // Event Statistics (Jan Fiete)
160   //
161
162   if (doEventStat) {
163       gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskPhysicsSelection.C");
164       AliPhysicsSelectionTask* physSelTask = AddTaskPhysicsSelection();
165       mgr->RegisterExtraFile("event_stat.root");
166   }
167   // Vertexing (A. Dainese)
168   // 
169   if (doVertex) {
170     gROOT->LoadMacro("$ALICE_ROOT/PWG1/macros/AddTaskVertexESD.C");
171     AliAnalysisTaskVertexESD* taskvertexesd =  AddTaskVertexESD();
172     taskvertexesd->SelectCollisionCandidates();
173   }  
174
175   // TPC QA (E. Sicking)
176   //
177   if (doQAsym) {
178     gROOT->LoadMacro("$ALICE_ROOT/PWG1/PilotTrain/AddTaskQAsym.C");
179     AliAnalysisTaskSE * taskqasim = AddTaskQAsym(0);
180     taskqasim->SelectCollisionCandidates();
181   }  
182   //
183   // VZERO QA  (C. Cheshkov)
184   //
185   if (doVZERO) {
186     gROOT->LoadMacro("$ALICE_ROOT/PWG1/PilotTrain/AddTaskVZEROQA.C");
187     AliAnalysisTaskSE * taskv0qa = AddTaskVZEROQA(0);
188 //  taskv0qa->SelectCollisionCandidates();
189   }
190   //
191   // TPC (Jacek Otwinowski)
192   //
193   if (doTPC) {
194     gROOT->LoadMacro("$(ALICE_ROOT)/PWG1/TPC/macros/AddTaskPerformanceTPCQA.C");
195     AliPerformanceTask *tpcQA = AddTaskPerformanceTPCQA(kFALSE, kTRUE);
196   }  
197   //
198   // SPD (A. Mastroserio)
199   //
200   if (doSPD) {
201     gROOT->LoadMacro("$ALICE_ROOT/PWG1/PilotTrain/AddTaskSPDQA.C");
202     AliAnalysisTaskSE* taskspdqa = AddTaskSPDQA();
203     taskspdqa->SelectCollisionCandidates();
204   }  
205   //
206   // SDD (F. Prino)
207   //
208   if (doSDD) {
209     gROOT->LoadMacro("$ALICE_ROOT/PWG1/PilotTrain/AddSDDPoints.C");
210     AliAnalysisTaskSE* tasksdd = AddSDDPoints();
211     tasksdd->SelectCollisionCandidates();
212   }
213   //
214   // SSD dEdx (Marek Chojnacki)
215   //
216   if (doSSDdEdx) {
217     gROOT->LoadMacro("$ALICE_ROOT/PWG1/PilotTrain/AddTaskdEdxSSDQA.C");
218     AliAnalysisTaskSE* taskssddedx = AddTaskdEdxSSDQA();
219     taskssddedx->SelectCollisionCandidates();
220   }
221
222   //
223   // ITS
224   //
225   if (doITS) {
226       gROOT->LoadMacro("$ALICE_ROOT/PWG1/macros/AddTaskPerformanceITS.C");
227       AliAnalysisTaskITSTrackingCheck *itsQA = AddTaskPerformanceITS(kFALSE);
228   }
229   //
230   // TRD (Alex Bercuci, M. Fasel) 
231   //
232   if(doTRD) {
233       gROOT->LoadMacro("$ALICE_ROOT/PWG1/macros/AddTrainPerformanceTRD.C");
234       AddTrainPerformanceTRD("ALL");
235   }
236
237   //
238   // Calorimetry (Gustavo Conesa)
239   //
240
241   if(doCALO) {
242       gROOT->LoadMacro("$ALICE_ROOT/PWG4/macros/QA/AddTaskCalorimeterQA.C");
243       AliAnalysisTaskParticleCorrelation *taskCaloQA = AddTaskCalorimeterQA("ESD", kTRUE, kFALSE);
244       taskCaloQA->SetDebugLevel(0);
245   }
246
247   //
248   // Muon Trigger
249   //
250   
251   if(doMUONTrig) {
252       gROOT->LoadMacro("$ALICE_ROOT/PWG1/macros/AddTaskMTRchamberEfficiency.C");
253       AliAnalysisTaskTrigChEff *taskMuonTrig = AddTaskMTRchamberEfficiency();
254   }
255
256   //
257   // Muon Efficiency
258   //
259
260   if(doMUONEff) {
261       gROOT->LoadMacro("$ALICE_ROOT/PWG3/muondep/AddTaskMUONTrackingEfficiency.C");
262       AliAnalysisTaskMuonTrackingEff *taskMuonTrackEff = AddTaskMUONTrackingEfficiency();
263   }
264   
265   //
266   // V0-Decay Reconstruction (Ana Marin)
267   // 
268
269   if (doV0) {
270       gROOT->LoadMacro("$ALICE_ROOT/PWG1/macros/AddTaskV0QA.C");
271       AliAnalysisTaskV0QA *taskv0QA = AddTaskV0QA(kFALSE);
272   }
273   // FMD (Hans Hjersing Dalsgaard)
274   //
275   if (doFMD) {
276     gROOT->LoadMacro("$ALICE_ROOT/PWG1/PilotTrain/AddTaskFMD.C");
277     AliAnalysisTaskSE* taskfmd = AddTaskFMD();
278     taskfmd->SelectCollisionCandidates();
279   }  
280 }
281
282 //______________________________________________________________________________
283 AliAnalysisAlien* CreateAlienHandler(const char *plugin_mode)
284 {
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]);
318    }   
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);
324
325    if (useDevelopmentVersion) {
326      plugin->EnablePackage("STEERBase");
327      plugin->EnablePackage("ESD");
328      plugin->EnablePackage("AOD");
329      plugin->EnablePackage("ANALYSIS");
330      plugin->EnablePackage("ANALYSISalice");
331    }
332
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");
338    
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");
342      
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");
351    
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;
365       } else {   
366          if (listhists.Contains(filename)) continue;
367          if (listhists.Length()) listhists += ",";
368          listhists += filename;
369       }   
370    }
371    if (mgr->GetExtraFiles().Length()) {
372       if (listhists.Length()) listhists += ",";
373       listhists += mgr->GetExtraFiles();
374       listhists.ReplaceAll(" ", ",");
375    }
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 !");
380    }
381    TString outputArchive = "log_archive.zip:stdout,stderr@disk=4";
382    if (listaods.Length()) {
383       outputArchive += " ";
384       outputArchive += listaods;
385       outputArchive += "@disk=4";
386    }   
387    if (listhists.Length()) {
388       outputArchive += " ";
389       outputArchive += listhists;
390       outputArchive += "@disk=4";
391    }   
392    if (!mergeExcludes.IsNull()) plugin->SetMergeExcludes(mergeExcludes);
393 // Set friends
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)
414    plugin->SetPrice(1);      
415 // Optionally modify split mode (default 'se')    
416    plugin->SetSplitMode("se");
417    plugin->SetExecutableCommand("aliroot -b -q");
418 // Merge via JDL
419    plugin->SetMergeViaJDL(useMergeViaJDL);
420 // Use fastread option
421    plugin->SetFastReadOption(useFastReadOption);
422 // UseOverwrite mode
423    plugin->SetOverwriteMode(useOverwriteMode);   
424    return plugin;
425 }