TENDER becomes Tender
[u/mrichter/AliRoot.git] / PWGLF / FORWARD / trains / AODTrain.C
1 /**
2  * @file   AODTrain.C
3  * @author Christian Holm Christensen <cholm@master.hehi.nbi.dk>
4  * @date   Wed Feb  6 23:10:29 2013
5  * 
6  * @brief  Setup of train like the `official' AODtrain.C script
7  * 
8  * 
9  * @ingroup pwglf_forward_trains_examples
10  */
11 #ifndef __CINT__
12 # include <AliAnalysisManager.h>
13 #else 
14 class AliAnalysisManager;
15 #endif
16 #include "TrainSetup.C"
17
18 /**
19  * Setup of train like the `official' AODtrain.C script
20  * 
21  * @ingroup pwglf_forward_trains_examples
22  */
23 class AODTrain : public TrainSetup
24 {
25 public:
26   //------------------------------------------------------------------
27   /** 
28    * Constructor 
29    * 
30    * @param name Name of job
31    */
32   AODTrain(const char* name="myTest") : TrainSetup(name) 
33   {
34     fOptions.Set("type", "ESD");
35     // over all options 
36     fOptions.Add("collision", "TYPE", "Collision system", 0);
37     fOptions.Add("year", "YEAR", "Year", 2011);
38     fOptions.Add("cdb", "Connect to CDB", true);
39     fOptions.Add("physics-selection", "Use PhysicsSelection", true);
40     fOptions.Add("tender", "Use of Tenders", false);
41     fOptions.Add("centrality", "Use centrality", false);
42     fOptions.Add("v0-tender", "Use of V0 tender", false);
43     fOptions.Add("track-refs", "Also read track references");
44     fOptions.Add("kinematics-filter", "Use kinematics fitler");
45     fOptions.Add("sys-info", "Use sys info");
46     fOptions.Add("run", "RUNNUMBER", "Set initial run number", 0);
47     
48     // Task options 
49     fOptions.Add("esd-filter", "Use ESD fitler", true);
50     fOptions.Add("muon-copy", "Make additional MUON specific AOD", true);
51     fOptions.Add("jetan", "Use Jet analysis", true);
52     fOptions.Add("jetan-delta", "Make Jet analysis delta AOD", true);
53     fOptions.Add("vertexing", "Use PWGHF vertexing", true);
54     fOptions.Add("jpsi-filter", "Use PWGDQ J/Psi filter", false);
55     fOptions.Add("d0-decay", "Use PWGHF D0->h+h", true);
56     fOptions.Add("high-pt", "Use high pt", true);
57     fOptions.Add("forward-nch", "Forward charged particle", true);
58     // Other 
59     fOptions.Add("pid-response", "Use PID response", true);
60     fOptions.Add("pid-qa", "Do PID QA", true);
61   }
62   //------------------------------------------------------------------
63   /** 
64    * Create our tasks 
65    * 
66    * @param mgr Manager 
67    */
68   void CreateTasks(AliAnalysisManager* mgr)
69   {
70
71     fRailway->LoadLibrary("libCORRFW");
72
73     Bool_t cdb              = fOptions.Has("cdb");
74     Bool_t tender           = fOptions.Has("tender");
75     Bool_t physicsSelection = fOptions.Has("physics-selection");
76
77     if (cdb || tender) {
78       fRailway->LoadLibrary("libCDB");
79       fRailway->LoadLibrary("libProof");
80       fRailway->LoadLibrary("libRAWDatabase");
81       fRailway->LoadLibrary("libSTEER");
82       fRailway->LoadLibrary("libSTAT");
83       fRailway->LoadLibrary("libTRDbase");
84       fRailway->LoadLibrary("libVZERObase");
85       fRailway->LoadLibrary("libTPCbase");
86       fRailway->LoadLibrary("libITSbase");
87       fRailway->LoadLibrary("libHMPIDbase");
88       fRailway->LoadLibrary("libTender");
89       fRailway->LoadLibrary("libTenderSupplies");
90     }
91
92     if (fOptions.Has("sys-info")) mgr->SetNSysInfo(100);
93     
94     // AliAnalysisTask*   task = 0;
95     AliAnalysisTaskSE* seTask = 0;
96
97     AliAnalysisManager::SetCommonFileName("AODQA.root");
98     if (tender) 
99       CoupleCar("$ALICE_ROOT/ANALYSIS/TenderSupplies/AddTaskTender.C",
100               Form("%d", fOptions.Has("v0-tender")));
101     
102     if (fOptions.Has("pid-response")) 
103       CoupleCar("AddTaskPIDResponse.C");
104
105     if (fOptions.Has("pid-qa")) {
106       seTask = CoupleSECar("AddTaskPIDqa.C");
107       seTask->SelectCollisionCandidates(AliVEvent::kAny);
108     }
109     
110     if (cdb && !tender) {
111       fRailway->LoadLibrary("libRAWDatarec");
112       fRailway->LoadLibrary("libTRDrec");
113       fRailway->LoadLibrary("libVZEROrec");
114       fRailway->LoadLibrary("libTPCrec");
115       fRailway->LoadLibrary("libITSrec");
116       fRailway->LoadLibrary("libPWGPP");
117
118       // CoupleCar("$ALICE_ROOT/PWGPP/PilotTrain/AddTaskCDBconnect.C");
119       gROOT->LoadMacro("$ALICE_ROOT/PWGPP/PilotTrain/AddTaskCDBconnect.C");
120       gROOT->ProcessLine(Form("AddTaskCDBconnect(%d)", fOptions.AsInt("run")));
121       gROOT->ProcessLine("AliCDBManager* cdb = AliCDBManager::Instance();"
122                          "cdb->SetDefaultStorage(\"raw://\");");
123     }
124     
125     if (fOptions.Has("high-pt"))
126       CoupleCar("AddTaskFilteredTree.C");
127   
128     if (fOptions.Has("esd-filter")) {
129       fRailway->LoadLibrary("PWGmuon");
130       if (fOptions.Has("muon-copy")) {
131         mgr->RegisterExtraFile("AliAOD.Muons.root");
132         mgr->RegisterExtraFile("AliAOD.Dimuons.root");
133       }
134       Int_t runFlag = (fOptions.AsInt("year") % 100) * 100;
135       TString args = 
136         TString::Format("%d,%d,false,false,false,false,true,false,false,%d",
137                         fOptions.Has("kinematics-filter"), 
138                         fOptions.Has("muon-copy"), runFlag);
139       CoupleCar("AddTaskESDFilter.C", args);
140     }
141   
142     Bool_t vertexing = fOptions.Has("vertexing");
143     Bool_t d0Decay   = fOptions.Has("d0-decay");
144     if (vertexing || d0Decay) {
145       TString src = "$ALICE_ROOT/PWGHF/vertexingHF/ConfigVertexingHF.C";
146       if (fOptions.AsInt("collision") == 1) 
147         src.ReplaceAll(".C", "highmult.C");
148       TFile::Cp(src, "ConfigVertexingHF.C");
149       fRailway->LoadAux("ConfigVertexingHF.C");
150     }    
151
152     if (vertexing) {
153       fRailway->LoadLibrary("PWGflowBase");
154       fRailway->LoadLibrary("PWGflowTasks");
155       fRailway->LoadLibrary("PWGHFvertexingHF");
156       seTask = 
157         CoupleSECar("$ALICE_ROOT/PWGHF/vertexingHF/macros/AddTaskVertexingHF.C");
158       seTask->SelectCollisionCandidates(0);
159       mgr->RegisterExtraFile("AliAOD.VertexingHF.root");
160     }
161
162     if (fOptions.Has("jpsi-filtering")) { 
163       fRailway->LoadLibrary("PWGDQdielectron");
164       seTask = 
165         CoupleSECar("$ALICE_ROOT/PWGDQ/dielectron/macros/AddTaskJPSIFilter.C");
166       seTask->SelectCollisionCandidates(0);
167       mgr->RegisterExtraFile("AliAOD.Dielectron.root");
168     }
169   
170     if (d0Decay) 
171       CoupleCar("$ALICE_ROOT/PWGHF/vertexingHF/AddD2HTrain.C",
172               "kFALSE, 1,0,0,0,0,0,0,0,0,0,0");
173   
174     if (fOptions.Has("jetan")) {
175       fRailway->LoadLibrary("JETAN");
176       
177       Bool_t jetanDelta = fOptions.Has("jetan-delta");      
178       if (jetanDelta) {
179         fRailway->LoadLibrary("CGAL");
180         fRailway->LoadLibrary("fastjet");
181         fRailway->LoadLibrary("siscone");
182         fRailway->LoadLibrary("SISConePlugin");
183         fRailway->LoadLibrary("FASTJETAN");
184         // --- For newer fastjet ---
185         // fRailway->LoadLibrary("CGAL");
186         // fRailway->LoadLibrary("fastjet");
187         // fRailway->LoadLibrary("fastjettools");
188         // fRailway->LoadLibrary("siscone");
189         // fRailway->LoadLibrary("siscone_spherical");
190         // fRailway->LoadLibrary("fastjetplugins");
191         // fRailway->LoadLibrary("FASTJETAN");
192       }
193       
194       // Write script to do this - avoid useless links against loadable
195       // library
196       std::ofstream o("AddJets.C");
197       o << "void AddJets(AliAnalysisManager*  mgr,\n"
198         << "             UInt_t               highPt,\n"
199         << "             const char*          deltaAOD,\n"
200         << "             Bool_t               useDelta,\n"
201         << "             Bool_t               usePS,\n"
202         << "             Bool_t               pbpb,\n"
203         << "             Float_t              etaCut,\n"
204         << "             Float_t              centLow,\n"
205         << "             Float_t              centHigh)\n"
206         << "{\n"
207         << "  gROOT->SetMacroPath(Form(\"%s:$ALICE_ROOT/PWGJE/macros\",\n"
208         << "                           gROOT->GetMacroPath()));\n"
209         << "  \n"                      
210         << "  gROOT->LoadMacro(\"AddTaskJets.C\");\n"
211         << "  AliAnalysisTaskJets *jTask = 0;\n"
212         << "  jTask = AddTaskJets(\"AOD\",\"UA1\",0.4,highPt,1.,0);\n"
213         << "  jTask->SetNonStdOutputFile(deltaAOD);\n"
214         << "  \n"
215         << "  if (useDelta) {\n"
216         << "    mgr->RegisterExtraFile(deltaAOD);\n"
217         << "    if (pbpb) {\n"
218         << "      jTask = AddTaskJets(\"AOD\",\"UA1\",0.4,highPt,1.,2);\n"
219         << "      jTask->SetNonStdOutputFile(deltaAOD);\n"
220         << "    }\n"
221         << "  }\n"
222         << "  \n";
223       o << "  jTask =AddTaskJets(\"AOD\",\"SISCONE\",0.4,highPt,0.15,0);\n"
224         << "  jTask->SetNonStdOutputFile(deltaAOD);\n"
225         << "  TString subBranches = jTask->GetNonStdBranch();\n"
226         << "  \n";
227       o << "  gROOT->LoadMacro(\"AddTaskJetCluster.C\");\n"
228         << "  AliAnalysisTaskJetCluster* cTask = 0;\n"
229         << "  cTask = AddTaskJetCluster(\"AOD\",\"\",highPt,usePS,\n"
230         << "                          \"KT\",0.4,0,1,deltaAOD,0.15,etaCut,0);\n"
231         << "  cTask->SetBackgroundCalc(kTRUE);\n"
232         << "  cTask->SetNRandomCones(10);\n"
233         << "  cTask->SetCentralityCut(centLow,centHigh);\n"
234         << "  cTask->SetGhostEtamax(etaCut);\n"
235         << "  TString bgBranch = Form(\"%s_%s\",\n"
236         << "    AliAODJetEventBackground::StdBranchName(),\n"
237         << "    cTask->GetJetOutputBranch());\n"
238         << "  \n";
239       o << "  cTask = AddTaskJetCluster(\"AOD\",\"\",highPt,usePS,\n"
240         << "                          \"ANTIKT\",0.4,2,1,deltaAOD,0.15);\n"
241         << "  cTask->SetNRandomCones(10);\n"
242         << "  cTask->SetCentralityCut(centLow,centHigh);\n"
243         << "  if (pbpb) cTask->SetBackgroundBranch(bgBranch);\n"
244         << "  subBranches += Form(\" %s\",cTask->GetJetOutputBranch());\n"
245         << "  \n";
246       o << "  cTask = AddTaskJetCluster(\"AOD\",\"\",highPt,usePS,\n"
247         <<                           "\"ANTIKT\",0.2,0,1,deltaAOD,0.15);\n"
248         << "  cTask->SetCentralityCut(centLow,centHigh);\n"
249         << "  if (pbpb) cTask->SetBackgroundBranch(bgBranch);\n"
250         << "  subBranches += Form(\" %s\",cTask->GetJetOutputBranch());\n"
251         << "  \n";
252       o << "  if (pbpb) {\n"
253         << "    gROOT->LoadMacro(\"AddTaskJetBackgroundSubtract.C\");\n"
254         << "    AliAnalysisTaskJetBackgroundSubtract* sTask = 0;\n"
255         << "    sTask = AddTaskJetBackgroundSubtract(subBranches,1,\"B0\",\n"
256         << "                                         \"B%d\");\n"
257         << "    sTask->SetBackgroundBranch(bgBranch);\n"
258         << "    sTask->SetNonStdOutputFile(deltaAOD);\n"
259         << "  }\n"
260         << "}\n"
261         << std::endl;
262       o.close();
263
264       UInt_t  highPtFilterMask = 272;
265       TString deltaAODJetName  = "AliAOD.Jets.root";
266       Float_t trackEtaWindow   = 0.9;
267       Float_t centLow          = 0;
268       Float_t centHigh         = 0;
269       gROOT->Macro(Form("./AddJets.C((AliAnalysisManager*)%p,"
270                         "%d,\"%s\",%d,%d,%d,%f,%f,%f);",
271                         mgr, highPtFilterMask, deltaAODJetName.Data(),
272                         jetanDelta, physicsSelection,
273                         fOptions.AsInt("collision") == 1, // pbpb
274                         trackEtaWindow, centLow, centHigh));
275     }
276     if (fOptions.Has("forward-nch") && physicsSelection) {
277       Bool_t fwdMC = (mgr->GetMCtruthEventHandler() != 0 && 
278                       fOptions.Has("track-refs"));
279     
280       CoupleCar("$ALICE_ROOT/PWGLF/FORWARD/analysis2/AddTaskForwardMult.C",
281               Form("%d", fwdMC));
282     }
283   }
284   //------------------------------------------------------------------
285   /** 
286    * Create physics selection, and add to manager
287    * 
288    * @param mc Whether this is for MC 
289    * @param mgr Manager
290    */
291   virtual void CreatePhysicsSelection(Bool_t mc, AliAnalysisManager* mgr)
292   {
293     if (fOptions.Has("physics-selection")) 
294       TrainSetup::CreatePhysicsSelection(mc, mgr);
295   }
296   //------------------------------------------------------------------
297   /** 
298    * Create centrality selection, and add to manager
299    * 
300    * @param mc Whether this is for MC 
301    * @param mgr Manager
302    */
303   virtual void CreateCentralitySelection(Bool_t mc, AliAnalysisManager* mgr)
304   {
305     if (fOptions.Has("centrality")) 
306       TrainSetup::CreateCentralitySelection(mc, mgr);
307   }
308   //------------------------------------------------------------------
309   /** 
310    * Create MC input handler 
311    * 
312    * @param mc    Assume monte-carlo input 
313    * 
314    * @return 
315    */
316   virtual AliVEventHandler* CreateMCHandler(UShort_t /*type*/, bool mc)
317   {
318     if (!mc) return 0;
319     AliMCEventHandler* mcHandler = new AliMCEventHandler();
320     mcHandler->SetReadTR(fOptions.Has("track-refs")); 
321     return mcHandler;
322   }
323   //------------------------------------------------------------------
324   /** 
325    * Get the name of this set-up 
326    * 
327    * @return Name of this setup 
328    */
329   const char* ClassName() const { return "AODTrain"; }
330 };
331 //
332 // EOF
333 //