dc840795f6d719843fcc301eff24dbd0578b14f6
[u/mrichter/AliRoot.git] / PWGLF / FORWARD / analysis2 / trains / MakeAODTrain.C
1 /**
2  * @file   MakeAODTrain.C
3  * @author Christian Holm Christensen <cholm@dalsgaard.hehi.nbi.dk>
4  * @date   Tue Jul 12 10:05:30 2011
5  * 
6  * @brief  Run first pass analysis - make AOD tree
7  * 
8  * @ingroup pwglf_forward_trains_specific
9  */
10 #include "TrainSetup.C"
11 #include <sstream>
12
13 //====================================================================
14 /**
15  * Analysis train to make Forward and Central multiplicity
16  * 
17  *
18  * @ingroup pwglf_forward_aod
19  * @ingroup pwglf_forward_trains_specific
20  */
21 class MakeAODTrain : public TrainSetup
22 {
23 public:
24   /** 
25    * Constructor. 
26    * 
27    * @param name     Name of train (free form)
28    */
29   MakeAODTrain(const  TString& name) 
30     : TrainSetup(name)
31   {
32     fOptions.Add("run",   "NUMBER",  "Run number for corrs", 0);
33     fOptions.Add("sys",   "SYSTEM",  "1:pp, 2:PbPb, 3:pPb", 0);
34     fOptions.Add("snn",   "ENERGY",  "Center of mass energy in GeV", 0);
35     fOptions.Add("field", "STRENGTH","L3 field strength in kG", 0);
36     fOptions.Add("forward-config", "FILE", "Forward configuration", 
37                  "ForwardAODConfig.C");
38     fOptions.Add("central-config", "FILE", "Central configuration", 
39                  "CentralAODConfig.C");
40     fOptions.Add("cent",  "Use centrality");
41     fOptions.Add("tpc-ep", "Use TPC event plane");
42     fOptions.Add("satelitte", "Use satelitte interactions");
43     fOptions.Add("corr", "DIR", "Corrections dir", "");
44     fOptions.Set("type", "ESD");
45   }
46 protected:
47   /** 
48    * Create the tasks 
49    * 
50    * @param mgr  Analysis manager 
51    */
52   void CreateTasks(AliAnalysisManager* mgr)
53   {
54     // --- Output file name ------------------------------------------
55     AliAnalysisManager::SetCommonFileName("forward.root");
56
57     // --- Load libraries/pars ---------------------------------------
58     fHelper->LoadLibrary("PWGLFforward2");
59     
60     // --- Set load path ---------------------------------------------
61     gROOT->SetMacroPath(Form("%s:$(ALICE_ROOT)/PWGLF/FORWARD/analysis2",
62                              gROOT->GetMacroPath()));
63     gROOT->SetMacroPath(Form("%s:$(ALICE_ROOT)/ANALYSIS/macros",
64                              gROOT->GetMacroPath()));
65
66     // --- Check if this is MC ---------------------------------------
67     Bool_t mc = mgr->GetMCtruthEventHandler() != 0;
68     
69     // --- Add TPC eventplane task
70     if (fOptions.Has("tpc-ep")) gROOT->Macro("AddTaskEventplane.C");
71
72     // --- Task to copy header information ---------------------------
73     gROOT->Macro("AddTaskCopyHeader.C");
74
75     // --- Get options -----------------------------------------------
76     ULong_t  run = fOptions.AsInt("run", 0);
77     UShort_t sys = fOptions.AsInt("sys", 0);
78     UShort_t sNN = fOptions.AsInt("snn", 0);
79     UShort_t fld = fOptions.AsInt("field", 0);
80     TString  cor = "";
81     if (fOptions.Has("corr")) cor = fOptions.Get("corr"); 
82     
83     // --- Add the task ----------------------------------------------
84     TString fwdConfig = fOptions.Get("forward-config");
85     gROOT->Macro(Form("AddTaskForwardMult.C(%d,%ld,%d,%d,%d,\"%s\",\"%s\")", 
86                       mc, run, sys, sNN, fld, fwdConfig.Data(), cor.Data()));
87     fHelper->LoadAux(gSystem->Which(gROOT->GetMacroPath(), fwdConfig), true);
88
89     // --- Add the task ----------------------------------------------
90     TString cenConfig = fOptions.Get("central-config");
91     gROOT->Macro(Form("AddTaskCentralMult.C(%d,%ld,%d,%d,%d,\"%s\",\"%s\")", 
92                       mc, run, sys, sNN, fld, cenConfig.Data(), cor.Data()));
93     fHelper->LoadAux(gSystem->Which(gROOT->GetMacroPath(), cenConfig), true);
94
95     // --- Add MC particle task --------------------------------------
96     if (mc) gROOT->Macro("AddTaskMCParticleFilter.C");
97
98     if (!cor.IsNull()) {
99       fHelper->LoadAux(Form("%s/fmd_corrections.root",cor.Data()), true);
100       fHelper->LoadAux(Form("%s/spd_corrections.root",cor.Data()), true);
101     }
102   }
103   //__________________________________________________________________
104   /** 
105    * Create physics selection , and add to manager
106    * 
107    * @param mc Whether this is for MC 
108    * @param mgr Manager 
109    */
110   void CreatePhysicsSelection(Bool_t mc, AliAnalysisManager* mgr)
111   {
112     TrainSetup::CreatePhysicsSelection(mc, mgr);
113
114     // --- Get input event handler -----------------------------------
115     AliInputEventHandler* ih =
116       dynamic_cast<AliInputEventHandler*>(mgr->GetInputEventHandler());
117     if (!ih) 
118       Fatal("CreatePhysicsSelection", "Couldn't get input handler (%p)", ih);
119     
120     // --- Get Physics selection -------------------------------------
121     AliPhysicsSelection* ps = 
122       dynamic_cast<AliPhysicsSelection*>(ih->GetEventSelection());
123     if (!ps) 
124       Fatal("CreatePhysicsSelection", "Couldn't get PhysicsSelection (%p)",ps);
125
126     // --- Special for pPb pilot run Sep. 2012 -----------------------
127     UShort_t sys = fOptions.AsInt("sys", 0);
128     if (sys == 3) { 
129       Warning("CreatePhysicsSelection", 
130               "Special setup for pPb pilot run September, 2012");
131       gROOT->SetMacroPath(Form("%s:$(ALICE_ROOT)/ANALYSIS/macros",
132                                gROOT->GetMacroPath()));
133       gROOT->LoadMacro("PhysicsSelectionOADB_CINT5_pA.C");
134       gROOT->ProcessLine(Form("((AliPhysicsSelection*)%p)"
135                               "->SetCustomOADBObjects("
136                               "OADBSelection_CINT5_V0A(),0);", ps));
137       ps->SetSkipTriggerClassSelection(true);
138     }
139     // --- Ignore trigger class when selecting events.  This means ---
140     // --- that we get offline+(A,C,E) events too --------------------
141     // ps->SetSkipTriggerClassSelection(true);
142   }
143   //__________________________________________________________________
144   /** 
145    * Create the centrality selection only if requested
146    * 
147    * @param mc  Monte-Carlo truth flag 
148    * @param mgr Manager
149    */
150   void CreateCentralitySelection(Bool_t mc, AliAnalysisManager* mgr)
151   {
152     if (!fOptions.Has("cent")) return;
153     TrainSetup::CreateCentralitySelection(mc, mgr);
154   }
155   //__________________________________________________________________
156   const char* ClassName() const { return "MakeAODTrain"; }
157   //__________________________________________________________________
158   /** 
159    * Overloaded to create new dNdeta.C and dndeta.sh in the output 
160    * directory
161    * 
162    * @param asShellScript 
163    */
164   void SaveSetup(Bool_t asShellScript)
165   {
166     TrainSetup::SaveSetup(asShellScript);
167
168     if (!fHelper) { 
169       Warning("MakeAODTrain::SaveSetup", 
170               "Cannot make dNdeta.C script without helper");
171       return;
172     }
173     
174     AliAnalysisManager* mgr = AliAnalysisManager::GetAnalysisManager();
175     Bool_t              mc  = mgr && (mgr->GetMCtruthEventHandler() != 0);
176     OptionList          uopts(fHelper->Options());
177     OptionList          opts(fOptions);
178     TString             cls("MakedNdetaTrain");
179     TString             name(fName);
180     Int_t               sys = fOptions.AsInt("sys", 0);
181     if (name.Contains("aod")) name.ReplaceAll("aod", "dndeta");
182     else                      name.Append("_dndeta");
183     opts.Remove("forward-config");
184     opts.Remove("central-config");
185     opts.Remove("run");
186     opts.Remove("sys");
187     opts.Remove("snn");
188     opts.Remove("field");
189     opts.Remove("bare-ps");
190     opts.Remove("tpc-ep");
191     opts.Remove("corr");
192     opts.Add("trig", "TRIGGER", "Trigger type", "INEL");
193     opts.Add("vzMin", "CENTIMETER", "Lower bound on Ip Z", -10.);
194     opts.Add("vzMax", "CENTIMETER", "Upper bound on Ip Z", +10.);
195     opts.Add("scheme", "FLAGS", "Normalization scheme", 
196              "TRIGGER EVENT BACKGROUND");
197     opts.Add("cut-edges", "Cut edges of acceptance", true);
198     opts.Add("trigEff", "EFFICIENCY", "Trigger efficiency", 1.);
199     opts.Add("trigEff0", "EFFICIENCY", "0-bin trigger efficiency", 1.);
200     opts.Add("mc", "Also analyse MC truth", fHelper->IsMC());
201     
202     // Rewrite our URL 
203     TString outString = fHelper->OutputLocation();
204     if (outString.IsNull()) outString = fEscapedName;
205     TUrl    outUrl(outString);
206     
207     if (uopts.Find("pattern") && outString.EndsWith("AliAOD.root")) 
208       uopts.Set("pattern", "*/AliAOD.root");
209     if (uopts.Find("concat")) uopts.Set("concat", true);
210
211     std::stringstream s;
212     uopts.Store(s, "", "&", false, true);
213     outUrl.SetOptions(s.str().c_str());
214       
215     opts.Set("url", outUrl.GetUrl());
216     opts.Set("type", "AOD");
217     if (!fDatimeString.IsNull()) opts.Set("date", fDatimeString);
218
219     if (sys != 1) {
220       opts.Set("cent", true);
221       opts.Set("trig", "");
222       opts.Set("scheme", "");
223       SaveSetupROOT("dNdeta", cls, name, opts, &uopts);
224       if (asShellScript) 
225         SaveSetupShell("dndeta", cls, name, opts, &uopts);
226     }
227     else {
228       name.ReplaceAll("dndeta", "dndeta_inel");
229       SaveSetupROOT("dNdetaINEL", cls, name, opts, &uopts);
230       if (asShellScript) 
231         SaveSetupShell("dndeta_inel", cls, name, opts, &uopts);
232       
233       name.ReplaceAll("inel", "nsd");
234       opts.Set("trig", "V0AND");
235       opts.Set("scheme", "EVENT TRIGGER");
236       SaveSetupROOT("dNdetaNSD", cls, name, opts, &uopts);
237       if (asShellScript) 
238         SaveSetupShell("dndeta_nsd", cls, name, opts, &uopts);
239       
240       name.ReplaceAll("nsd", "inelgt0");
241       opts.Set("trig", "INELGT0");
242       opts.Set("scheme", "EVENT TRIGGER");
243       SaveSetupROOT("dNdetaINELGt0", cls, name, opts, &uopts);
244       if (asShellScript) 
245         SaveSetupShell("dndeta_inelgt0", cls, name, opts, &uopts);
246     }
247
248     SaveSummarize();
249     if (!fHelper || fHelper->Mode() != Helper::kGrid) return;
250
251     SaveDownloadAODs();
252   }
253   /** 
254    * Write a ROOT script to draw summary 
255    * 
256    */
257   void SaveSummarize()
258   {
259     std::ofstream f("Summarize.C");
260     if (!f) { 
261       Error("SaveSummarize", "Failed to open Summarize.C script");
262       return;
263     }
264     f << "// Generated by " << ClassName() << "\n"
265       << "// WHAT is a bit mask of\n"
266       << "//   0x001     Event inspector\n"
267       << "//   0x002     Sharing filter\n"
268       << "//   0x004     Density calculator\n"
269       << "//   0x008     Corrector\n"
270       << "//   0x010     Histogram collector\n"
271       << "//   0x020     Analysis step cartoon\n"
272       << "//   0x040     Results\n"
273       << "//   0x080     Central\n"
274       << "//   0x100     Landscape\n"
275       << "//   0x200     Pause\n"
276       << "//\n"
277       << "void Summarize(const char* filename=\"forward.root\",\n"
278       << "               UShort_t what=0x1FF)\n"
279       << "{\n"
280       << "  const char* fwd=\"$ALICE_ROOT/PWGLF/FORWARD/analysis2\";\n"
281       << "  gROOT->LoadMacro(Form(\"%s/DrawAODSummary.C\",fwd));\n"
282       << "  DrawAODSummary(filename,what);\n"
283       << "}\n"
284       << "// EOF" << std::endl;
285     f.close();
286   }
287   /** 
288    * Make a ROOT Script to download the generated AODs
289    * 
290    */
291   void SaveDownloadAODs()
292   {
293     std::ofstream f("DownloadAODs.C");
294     if (!f) { 
295       Error("SaveDownloadAODs", "Failed to open DownloadAODs.C");
296       return;
297     }
298     f << "// Generated by " << ClassName() << "\n"
299       << "void DownloadAODs(Bool_t force=false)\n"
300       << "{\n"
301       << "  if (!TGrid::Connect(\"alien://\")) {\n"
302       << "    Error(\"DownloadAODs\",\"Failed to connect to AliEn\");\n"
303       << "    return;\n"
304       << "  }\n\n"
305       << "  TString dir(\"" << fHelper->OutputPath() << "\");\n"
306       << "  TString pat(\"*/AliAOD.root\");\n"
307       << "  TGridResult* r = gGrid->Query(dir,pat);\n"
308       << "  if (!r) {\n"
309       << "    Error(\"DownloadAODs\",\"No result from query\");\n"
310       << "    return;\n"
311       << "  }\n\n"
312       << "  Int_t n = r->GetEntries();\n"
313       << "  Printf(\"=== Got a total of %d AOD files\",n);\n"
314       << "  for (Int_t i = 0; i < n; i++) {\n"
315       << "     TString path(r->GetKey(i, \"turl\"));\n"
316       << "     TString dir(gSystem->DirName(path));\n"
317       << "     TString sub(gSystem->BaseName(dir));\n"
318       << "     TString subsub(gSystem->BaseName(gSystem->DirName(dir)));\n"
319       << "     TString out = TString::Format(\"AliAOD_%s_%s.root\",\n"
320       << "                                   subsub.Data(),sub.Data());\n"
321       << "     if (!gSystem->AccessPathName(out.Data()) && !force) {\n"
322       << "       Printf(\"=== Already have %s\",out.Data());\n"
323       << "       continue;\n"
324       << "     }\n"
325       << "     Printf(\"=== Getting %s %s (%3d/%3d)\",\n"
326       << "            subsub.Data(),sub.Data(),i,n);\n"
327       << "     if (!TFile::Cp(path, out)) {\n"
328       << "       Warning(\"DownloadAODs\",\"Failed to copy %s -> %s\",\n"
329       << "               path.Data(), out.Data());\n"
330       << "       continue;\n"
331       << "     }\n"
332       << "   }\n"
333       << "}\n"
334       << "// EOF\n"
335       << std::endl;
336     f.close();
337   }   
338   void PostShellCode(std::ostream& f)
339   {
340     f << "  echo \"=== Summarizing results ...\"\n"
341       << "  aliroot -l -b -q ${prefix}Summarize.C\n"
342       << std::endl;
343   }
344 };
345 //
346 // EOF
347 //