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