5 TString g_aliroot_version;
\r
6 TString g_root_version;
\r
8 TString g_plugin_mode;
\r
12 AliAnalysisAlien *CreateGridHandler(){
\r
14 // Setup main settings of the Alien plugin
\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
21 plugin->SetMergeViaJDL(kTRUE);
\r
22 plugin->SetOverwriteMode();
\r
23 plugin->SetNtestFiles(1);
\r
25 plugin->SetAPIVersion("V1.1x");
\r
26 plugin->SetROOTVersion(g_root_version.Data());
\r
27 plugin->SetAliROOTVersion(g_aliroot_version.Data());
\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
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
43 void SplitConfigEntry(const std::string &input, TString &key, TString &value){
\r
45 // Decode key and value of a config entry
\r
47 std::istringstream stream(input, istringstream::in);
\r
52 value = tmp.c_str();
\r
55 void DecodeRunlist(const TString &val){
\r
57 // Tokenize run list
\r
59 TObjArray *runstrings = val.Tokenize(",");
\r
62 TIter runIter(runstrings);
\r
63 g_runlist.Set(runstrings->GetEntries());
\r
65 while((os = dynamic_cast<TObjString *>(runIter()))){
\r
66 runstr = os->String();
\r
67 g_runlist[nruns++] = runstr.Atoi();
\r
72 bool IsMC(const TString &val){
\r
74 // Determine whether sample is MC or Data
\r
76 if(!val.CompareTo("MC")) return true;
\r
80 bool FindDataSample(const TMap &lookup, TObjArray &sampleinfis){
\r
82 // Find Data sample in the list of samples
\r
84 TObjArray *entry = dynamic_cast<TObjArray *>(lookup.GetValue(g_sample.Data()));
\r
86 printf("Sample %s not found in the list of samples", g_sample.Data());
\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
95 bool GetData(TObjArray &in, TString &out, int pos){
\r
97 // Helper function reading data string
\r
99 TObjString *entry = dynamic_cast<TObjString *>(in.At(pos));
\r
101 printf("Entry at pos %d not a string\n", pos);
\r
104 out = entry->String();
\r
108 void AddSample(TMap &lookup,
\r
109 const char *key, const char* datadir, const char * pattern, const char *sampletype, const char *dataformat){
\r
111 // Add sample entry to the lookup table
\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
121 void Generate_Sample_Lookup(TMap &lookup){
\r
123 // Create Lookup table for each period
\r
124 // Vector contains
\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
145 void ConfigParser(const char *configname){
\r
147 // Parse configuration
\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
155 if(!key.CompareTo("aliroot")){
\r
157 g_aliroot_version = value;
\r
160 if(!key.CompareTo("root")){
\r
162 g_root_version = value;
\r
165 if(!key.CompareTo("sample")){
\r
170 if(!key.CompareTo("runlist")){
\r
172 DecodeRunlist(value);
\r
175 if(!key.CompareTo("mode")){
\r
176 g_plugin_mode = value;
\r
179 if(!key.CompareTo("traindir")){
\r
180 g_train_dir = value;
\r
183 printf("Unknown key: %s\n", key.Data());
\r
187 bool MakeSample(AliAnalysisAlien *plugin, TMap &lookup){
\r
189 // Fill Sample information (Data dir, pattern, run list) to the Alien plugin
\r
192 bool found = FindDataSample(lookup, infos);
\r
194 printf("sample %s not found\n", g_sample.Data());
\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
211 bool CreateTrainDir(AliAnalysisAlien *plugin, const TMap &lookup){
\r
213 // Make train data dir name and JDL, C and sh file names
\r
216 bool found = FindDataSample(lookup, infos);
\r
218 printf("sample %s not found\n", g_sample.Data());
\r
221 TString type; GetData(infos, type, 2);
\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
233 g_train_dir = Form("%d_%d%02d%02d_%02d%02d", nruns, time.GetYear(), time.GetMonth(), time.GetDay(), time.GetHour(), time.GetMinute());
\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
243 void SetupUtil(bool IsMC, bool isAOD){
\r
245 // Setup utility packages
\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
253 //==== Physics Selection ====
\r
255 gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskPhysicsSelection.C");
\r
256 AliPhysicsSelectionTask* physSelTask = AddTaskPhysicsSelection(isMC);
\r
259 //==== Add tender ====
\r
261 gROOT->LoadMacro("AddTaskTender.C");
\r
265 //===== ADD PID RESPONSE: ===
\r
266 gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskPIDResponse.C");
\r
267 AddTaskPIDResponse(IsMC);
\r
269 //===== ADD CENTRALITY: ===
\r
271 gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskCentrality.C");
\r
272 AddTaskCentrality();
\r
276 void SetupHandlers(bool isMC, bool isAOD){
\r
280 TString macrobase = "$ALICE_ROOT/ANALYSIS/macros/train/";
\r
281 TString macroname = macrobase;
\r
283 macroname += "AddAODHandler.C";
\r
285 macroname += "AddESDHandler.C";
\r
286 gROOT->Macro(macroname.Data());
\r
289 // Add MC truth event handler
\r
290 gROOT->LoadMacro(Form("%s/AddMCHandler.C", macrobase.Data()));
\r
295 void SetupHFEtask(bool isMC, bool isAOD){
\r
296 gROOT->LoadMacro("$ALICE_ROOT/PWGHF/hfe/macros/AddTaskHFEpPb.C");
\r
297 AddTaskHFEpPb(isAOD);
\r
299 gROOT->LoadMacro("$ALICE_ROOT/PWGHF/hfe/macros/AddTaskHFEnpepPb.C");
\r
300 AddTaskHFEnpepPb();
\r
304 void SetupTrain(const TMap &lookup){
\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
311 bool isMC(false), isAOD(false);
\r
313 bool found = FindDataSample(lookup, infos);
\r
315 TString type, mode;
\r
316 GetData(infos, type, 2);
\r
317 GetData(infos, mode, 3);
\r
319 if(!mode.CompareTo("AOD")) isAOD = true;
\r
321 SetupHandlers(isMC, isAOD);
\r
322 SetupUtil(isMC, isAOD);
\r
323 SetupHFEtask(isMC, isAOD);
\r
326 void GenerateMergeConfigs(){
\r
328 // Generate configurations for merging
\r
329 // (MergeViaJDL and Terminate)
\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
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
355 printf("Configurations for MergeViaJDL and terminate generated\n");
\r
358 void runGridpPb(const char *config = "config.txt"){
\r
363 TGrid::Connect("alien://");
\r
365 // Create Lookup with sample information
\r
367 Generate_Sample_Lookup(sampleinfos);
\r
369 ConfigParser(config);
\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
377 if(!MakeSample(plugin, sampleinfos)){
\r
378 printf("Cannot create data sample\n");
\r
381 if(!g_plugin_mode.CompareTo("full")){
\r
382 // full mode, creating config files for the merging stage
\r
383 GenerateMergeConfigs();
\r
386 AliAnalysisManager *mgr = new AliAnalysisManager("tpctofanalysis");
\r
387 mgr->SetGridHandler(plugin);
\r
389 SetupTrain(sampleinfos);
\r
392 if (!mgr->InitAnalysis()) return;
\r
393 mgr->PrintStatus();
\r
394 // Start analysis in grid.
\r
395 mgr->StartAnalysis("grid");
\r