]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGHF/hfe/macros/test/runGridpPb.C
modified
[u/mrichter/AliRoot.git] / PWGHF / hfe / macros / test / runGridpPb.C
1 #include <fstream>\r
2 #include <iostream>\r
3 #include <string>\r
4 \r
5 TString g_aliroot_version;\r
6 TString g_root_version;\r
7 TString g_sample;\r
8 TString g_plugin_mode;\r
9 TString g_train_dir;\r
10 TArrayI g_runlist;\r
11 \r
12 AliAnalysisAlien *CreateGridHandler(){\r
13         //\r
14         // Setup main settings of the Alien plugin\r
15         //\r
16         AliAnalysisAlien *plugin = new AliAnalysisAlien();\r
17         plugin->SetRunMode(g_plugin_mode.Data());\r
18         if(!g_plugin_mode.CompareTo("Terminate"))\r
19                 plugin->SetMergeViaJDL(kFALSE);\r
20         else\r
21                 plugin->SetMergeViaJDL(kTRUE);\r
22         plugin->SetOverwriteMode();\r
23         plugin->SetNtestFiles(1);\r
24 \r
25         plugin->SetAPIVersion("V1.1x");\r
26         plugin->SetROOTVersion(g_root_version.Data());\r
27         plugin->SetAliROOTVersion(g_aliroot_version.Data());\r
28 \r
29         plugin->SetOutputToRunNo();\r
30         plugin->AddIncludePath("-I. .I$ALIEN_ROOT/api/lib -I$ROOTSYS/lib -I$ROOTSYS/include -I$ALICE_ROOT/include -I$ALICE_ROOT/PWGHF/ -I$ALICE_ROOT/PWGHF/hfe/macros -I$ALICE_ROOT/PWGHF/hfe -I$ALICE_ROOT/ANALYSIS -I$ALICE_ROOT/ANALYSIS/Tender -I$ALICE_ROOT/ANALYSIS/TenderSupplies -I$ALICE_ROOT/PWG/ -I$ALICE_ROOT/PWG/FLOW -I$ALICE_ROOT/PWG/Base -I$ALICE_ROOT/PWG/Tasks");\r
31         plugin->SetAdditionalLibs("libGui.so  libXMLParser.so libSTEERBase.so libESD.so libAOD.so libCDB.so libANALYSIS.so libANALYSISalice.so libCORRFW.so  libPWGflowBase.so libPWGflowTasks.so libPWGHFhfe.so libTENDER.so libProof.so libRAWDatabase.so libSTEER.so libTOFbase.so");\r
32    \r
33         plugin->SetDefaultOutputs(kFALSE);\r
34         plugin->SetOutputFiles("AnalysisResults.root"); \r
35         plugin->SetExecutableCommand("aliroot -b -q");\r
36         plugin->SetTTL(30000);\r
37         plugin->SetInputFormat("xml-single");\r
38         plugin->SetPrice(1);      \r
39         plugin->SetSplitMode("se");\r
40         return plugin;\r
41 }\r
42 \r
43 void SplitConfigEntry(const std::string &input, TString &key, TString &value){\r
44         //\r
45         // Decode key and value of a config entry\r
46         //\r
47         std::istringstream stream(input, istringstream::in);\r
48         std::string tmp;\r
49         stream >> tmp;\r
50         key = tmp.c_str();\r
51         stream >> tmp;\r
52         value = tmp.c_str();\r
53 }\r
54 \r
55 void DecodeRunlist(const TString &val){\r
56         //\r
57         // Tokenize run list\r
58         //\r
59         TObjArray *runstrings = val.Tokenize(",");\r
60         TObjString *os;\r
61         TString runstr;\r
62         TIter runIter(runstrings);\r
63         g_runlist.Set(runstrings->GetEntries());\r
64         int nruns(0);\r
65         while((os = dynamic_cast<TObjString *>(runIter()))){\r
66                 runstr = os->String();\r
67                 g_runlist[nruns++] = runstr.Atoi();\r
68         }\r
69         delete runstrings;\r
70 }\r
71 \r
72 bool IsMC(const TString &val){\r
73         // \r
74         // Determine whether sample is MC or Data\r
75         //\r
76         if(!val.CompareTo("MC")) return true;\r
77         return false;\r
78 }\r
79 \r
80 bool FindDataSample(const TMap &lookup, TObjArray &sampleinfis){\r
81         //\r
82         // Find Data sample in the list of samples\r
83         //\r
84         TObjArray *entry = dynamic_cast<TObjArray *>(lookup.GetValue(g_sample.Data()));\r
85         if(!entry){\r
86                 printf("Sample %s not found in the list of samples", g_sample.Data());\r
87                 return false;\r
88         }\r
89         // Copy to output container\r
90         sampleinfis.SetOwner(kFALSE);\r
91         for(int ival = 0; ival < 4; ival++) sampleinfis.AddAt(entry->At(ival), ival);\r
92         return true;\r
93 }\r
94 \r
95 bool GetData(TObjArray &in, TString &out, int pos){\r
96         //\r
97         // Helper function reading data string\r
98         //\r
99         TObjString *entry = dynamic_cast<TObjString *>(in.At(pos));\r
100         if(!entry){\r
101                 printf("Entry at pos %d not a string\n", pos);\r
102                 return false;\r
103         }\r
104         out = entry->String();\r
105         return true;\r
106 }\r
107 \r
108 void AddSample(TMap &lookup,\r
109                 const char *key, const char* datadir, const char * pattern, const char *sampletype, const char *dataformat){\r
110         //\r
111         // Add sample entry to the lookup table\r
112         //\r
113         TObjArray *infos = new TObjArray(); \r
114         infos->AddAt(new TObjString(datadir), 0);\r
115         infos->AddAt(new TObjString(pattern), 1);\r
116         infos->AddAt(new TObjString(sampletype), 2);\r
117         infos->AddAt(new TObjString(dataformat), 3);\r
118         lookup.Add(new TObjString(key), infos);\r
119 }\r
120 \r
121 void Generate_Sample_Lookup(TMap &lookup){\r
122         // \r
123         // Create Lookup table for each period\r
124         // Vector contains \r
125         //   - path\r
126         //   - pattern\r
127         //   - MC/Data \r
128         //   - ESD/AOD\r
129         //\r
130         AddSample(lookup, "LHC13b.pass2", "/alice/data/2013/LHC13b", "*/pass2/*/AliESDs.root", "Data", "ESD");\r
131         AddSample(lookup, "LHC13b.pass2.AOD", "/alice/data/2013/LHC13b", "*/pass2/AOD/*/AliAOD.root", "Data", "AOD"); \r
132         AddSample(lookup, "LHC13b.pass2.AOD126", "/alice/data/2013/LHC13b", "*/pass2/AOD126/*/AliAOD.root", "Data", "AOD"); \r
133         AddSample(lookup, "LHC13c.pass1", "/alice/data/2013/LHC13c/", "*/pass1/*/AliESDs.root", "Data", "ESD");\r
134         AddSample(lookup, "LHC13c.pass1.AOD", "/alice/data/2013/LHC13c/", "*/pass1/AOD/*/AliAOD.root", "Data", "AOD");\r
135         AddSample(lookup, "LHC13c.pass1.AOD126", "/alice/data/2013/LHC13c/", "*/pass1/AOD126/*/AliAOD.root", "Data", "AOD");\r
136         AddSample(lookup, "LHC13b2", "/alice/sim/2013/LHC13b2", "*/*/AliESDs.root", "MC", "ESD");\r
137         AddSample(lookup, "LHC13b2.AOD", "/alice/sim/2013/LHC13b2", "*/AliAOD.root", "MC", "AOD");\r
138         AddSample(lookup, "LHC13b2plus", "/alice/sim/2013/LHC13b2_plus", "*/*/AliESDs.root", "MC", "ESD");\r
139         AddSample(lookup, "LHC13b2plus.AOD", "/alice/sim/2013/LHC13b2_plus", "*/AliAOD.root", "MC", "AOD");\r
140         AddSample(lookup, "LHC13b3", "/alice/sim/2013/LHC13b3", "*/*/AliESDs.root", "MC", "ESD");\r
141         AddSample(lookup, "LHC13b3.AOD", "/alice/sim/2013/LHC13b3", "*/AliAOD.root", "MC", "AOD");\r
142         printf("Lookup table with sample information generated\n");\r
143 }\r
144 \r
145 void ConfigParser(const char *configname){\r
146         //\r
147         // Parse configuration\r
148         //\r
149         std::ifstream in(configname);\r
150         std::string config;\r
151         TString key, value;\r
152         while(getline(in, config)){\r
153                 SplitConfigEntry(config, key, value);\r
154                 key.ToLower();\r
155                 if(!key.CompareTo("aliroot")){\r
156                         // Aliroot version\r
157                         g_aliroot_version = value;\r
158                         continue;\r
159                 }\r
160                 if(!key.CompareTo("root")){\r
161                         // root version\r
162                         g_root_version = value;\r
163                         continue;\r
164                 }\r
165                 if(!key.CompareTo("sample")){\r
166                         // sample name\r
167                         g_sample = value; \r
168                         continue;\r
169                 }\r
170                 if(!key.CompareTo("runlist")){\r
171                         // Runlist\r
172                         DecodeRunlist(value); \r
173                         continue;\r
174                 }\r
175                 if(!key.CompareTo("mode")){\r
176                         g_plugin_mode = value;\r
177                         continue;\r
178                 }\r
179                 if(!key.CompareTo("traindir")){\r
180                         g_train_dir = value;\r
181                         continue;\r
182                 }\r
183                 printf("Unknown key: %s\n", key.Data());\r
184         }\r
185 }\r
186 \r
187 bool MakeSample(AliAnalysisAlien *plugin, TMap &lookup){\r
188         //\r
189         // Fill Sample information (Data dir, pattern, run list) to the Alien plugin\r
190         //\r
191         TObjArray infos;\r
192         bool found = FindDataSample(lookup, infos);\r
193         if(!found){\r
194                 printf("sample %s not found\n", g_sample.Data());\r
195                 return false;\r
196         }\r
197         TString datadir, pattern, type;\r
198         GetData(infos, datadir, 0);\r
199         GetData(infos, pattern, 1);\r
200         GetData(infos, type, 2);\r
201         plugin->SetGridDataDir(datadir.Data());\r
202         plugin->SetDataPattern(pattern.Data());\r
203         if(!IsMC(type)) plugin->SetRunPrefix("000");\r
204         // Add runs to the sample\r
205         for(int irun = 0; irun < g_runlist.GetSize(); irun++){\r
206                 plugin->AddRunNumber(g_runlist[irun]);\r
207         }\r
208         return true;\r
209 }\r
210 \r
211 bool CreateTrainDir(AliAnalysisAlien *plugin, const TMap &lookup){\r
212         //\r
213         // Make train data dir name and JDL, C and sh file names\r
214         //\r
215         TObjArray infos;\r
216         bool found = FindDataSample(lookup, infos);\r
217         if(!found){\r
218                 printf("sample %s not found\n", g_sample.Data());\r
219                 return false;\r
220         }\r
221         TString type; GetData(infos, type, 2);\r
222 \r
223         // check whether the train dir is already provided or needs to be specified\r
224         if(!g_train_dir.Length()){\r
225                 // Query number of train runs before\r
226                 const char *gridhome = gGrid->GetHomeDirectory();\r
227                 const char gridoutdir[256];\r
228                 sprintf(gridoutdir, "%sAnalysis_pPb/%s", gridhome, type.Data());\r
229                 TGridResult *trainruns = gGrid->Ls(gridoutdir);\r
230                 int nruns = trainruns->GetEntries();\r
231                 // Get Date and time\r
232                 TDatime time;\r
233                 g_train_dir = Form("%d_%d%02d%02d_%02d%02d", nruns, time.GetYear(), time.GetMonth(), time.GetDay(), time.GetHour(), time.GetMinute());\r
234         }\r
235         \r
236         plugin->SetGridWorkingDir(Form("Analysis_pPb/%s/%s", type.Data(), g_train_dir.Data()));\r
237         plugin->SetJDLName(Form("TPCTOFanalysispPb_%s_%s.jdl", type.Data(), g_train_dir.Data()));\r
238         plugin->SetExecutable(Form("TPCTOFanalysispPb_%s_%s.sh", type.Data(), g_train_dir.Data()));\r
239         plugin->SetAnalysisMacro(Form("TPCTOFanalysispPb_%s_%s.C", type.Data(), g_train_dir.Data()));\r
240         return true;\r
241 }\r
242 \r
243 void SetupUtil(bool IsMC, bool isAOD){\r
244         //\r
245         // Setup utility packages\r
246         //\r
247         // 1. Physics Selection (ESD only)\r
248         // 2. Tender (ESD only)\r
249         // 3. PID Response (always)\r
250         // 4. Centrality Task (ESD only)\r
251         //\r
252 \r
253         //==== Physics Selection ====\r
254         if(!isAOD){\r
255                 gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskPhysicsSelection.C");\r
256                 AliPhysicsSelectionTask* physSelTask = AddTaskPhysicsSelection(isMC);\r
257         }\r
258 \r
259         //==== Add tender ====\r
260         if(!isAOD){\r
261                 gROOT->LoadMacro("AddTaskTender.C");\r
262                 AddTaskTender();\r
263         }\r
264 \r
265         //===== ADD PID RESPONSE: ===\r
266         gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskPIDResponse.C");\r
267         AddTaskPIDResponse(IsMC);\r
268 \r
269         //===== ADD CENTRALITY: ===\r
270         if(!isAOD){\r
271                 gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskCentrality.C");\r
272                 AddTaskCentrality();\r
273         }\r
274 }\r
275 \r
276 void SetupHandlers(bool isMC, bool isAOD){\r
277         //\r
278         // Setup Handlers\r
279         //\r
280         TString macrobase = "$ALICE_ROOT/ANALYSIS/macros/train/";\r
281         TString macroname = macrobase;\r
282         if(isAOD)\r
283                 macroname += "AddAODHandler.C";\r
284         else\r
285                 macroname += "AddESDHandler.C";\r
286         gROOT->Macro(macroname.Data());\r
287 \r
288         if(isMC){\r
289                 // Add MC truth event handler\r
290                 gROOT->LoadMacro(Form("%s/AddMCHandler.C", macrobase.Data()));\r
291                 AddMCHandler();\r
292         }\r
293 }\r
294 \r
295 void SetupHFEtask(bool isMC, bool isAOD){\r
296         gROOT->LoadMacro("$ALICE_ROOT/PWGHF/hfe/macros/AddTaskHFEpPb.C");\r
297         AddTaskHFEpPb(isAOD);\r
298         if(!isAOD){\r
299                 gROOT->LoadMacro("$ALICE_ROOT/PWGHF/hfe/macros/AddTaskHFEnpepPb.C");\r
300                 AddTaskHFEnpepPb();\r
301         }\r
302 }\r
303 \r
304 void SetupTrain(const TMap &lookup){\r
305         //\r
306         // Setup train:\r
307         //   Determine whether the trains run on MC or Data \r
308         //   and ESDs or AODs and Configure Handlers, utils\r
309         //   and HFE task according to this\r
310         //\r
311         bool isMC(false), isAOD(false);\r
312         TObjArray infos;\r
313         bool found = FindDataSample(lookup, infos);\r
314         if(!found) return;\r
315         TString type, mode;\r
316         GetData(infos, type, 2);\r
317         GetData(infos, mode, 3);\r
318         isMC = IsMC(type);\r
319         if(!mode.CompareTo("AOD")) isAOD = true;\r
320       \r
321         SetupHandlers(isMC, isAOD);\r
322         SetupUtil(isMC, isAOD);\r
323         SetupHFEtask(isMC, isAOD);\r
324 }\r
325 \r
326 void GenerateMergeConfigs(){\r
327         //\r
328         // Generate configurations for merging \r
329         // (MergeViaJDL and Terminate)\r
330         //\r
331 \r
332         // Write config for MergeViaJDL\r
333         std::ofstream outMerge("configMerge.txt");\r
334         outMerge << "aliroot " << g_aliroot_version.Data() << std::endl;\r
335         outMerge << "root " << g_root_version.Data() << std::endl;\r
336         outMerge << "sample " << g_sample.Data() << std::endl;\r
337         outMerge << "mode MergeViaJDL\n";\r
338         outMerge << "traindir " << g_train_dir.Data() << std::endl; \r
339         outMerge << "runlist ";\r
340         for(int irun = 0; irun < g_runlist.GetSize()-1; irun++) outMerge << g_runlist[irun] << ",";\r
341         outMerge << g_runlist[g_runlist.GetSize()-1] << std::endl;\r
342         outMerge.close();\r
343         // Write config for Terminate\r
344         std::ofstream outTerminate("configTerminate.txt");\r
345         outTerminate << "aliroot " << g_aliroot_version.Data() << std::endl;\r
346         outTerminate << "root " << g_root_version.Data() << std::endl;\r
347         outTerminate << "sample " << g_sample.Data() << std::endl;\r
348         outTerminate << "mode Terminate\n";\r
349         outTerminate << "traindir " << g_train_dir.Data() << std::endl; \r
350         outTerminate << "runlist ";\r
351         for(int irun = 0; irun < g_runlist.GetSize()-1; irun++) Terminate << g_runlist[irun] << ",";\r
352         outTerminate << g_runlist[g_runlist.GetSize()-1] << std::endl;\r
353         outTerminate.close();\r
354 \r
355         printf("Configurations for MergeViaJDL and terminate generated\n");\r
356 }\r
357 \r
358 void runGridpPb(const char *config = "config.txt"){\r
359         //\r
360         // run analysis \r
361         //\r
362 \r
363         TGrid::Connect("alien://");\r
364 \r
365         // Create Lookup with sample information\r
366         TMap sampleinfos;\r
367         Generate_Sample_Lookup(sampleinfos);\r
368 \r
369         ConfigParser(config);\r
370 \r
371         // Configure alien plugin\r
372         AliAnalysisAlien *plugin = CreateGridHandler();\r
373         if(!CreateTrainDir(plugin, sampleinfos)){\r
374                 printf("Cannot setup output directory\n");\r
375                 return;\r
376         }\r
377         if(!MakeSample(plugin, sampleinfos)){\r
378                 printf("Cannot create data sample\n");\r
379                 return;\r
380         }\r
381         if(!g_plugin_mode.CompareTo("full")){\r
382                 // full mode, creating config files for the merging stage\r
383                 GenerateMergeConfigs();\r
384         }\r
385 \r
386         AliAnalysisManager *mgr = new AliAnalysisManager("tpctofanalysis");\r
387         mgr->SetGridHandler(plugin);\r
388         \r
389         SetupTrain(sampleinfos);\r
390 \r
391         // Run train\r
392         if (!mgr->InitAnalysis()) return;\r
393         mgr->PrintStatus();\r
394         // Start analysis in grid.\r
395         mgr->StartAnalysis("grid");\r
396\r
397 \r