hooks for PMD flow analysis
[u/mrichter/AliRoot.git] / PWG2 / FLOW / macros / runFlowTaskCentralityTrain.C
1 enum anaModes {mLocal,mPROOF,mGrid};
2 //mLocal: Analyze locally files in your computer using aliroot
3 //mPROOF: Analyze CAF files with PROOF
4 //mGrid: Analyze files on Grid via AliEn plug-in and using precompiled FLOW libraries
5
6 // CENTRALITY DEFINITION
7 //Int_t binfirst = 4;  //where do we start numbering bins
8 //Int_t binlast = 6;  //where do we stop numbering bins
9 //const Int_t numberOfCentralityBins = 9;
10 Int_t binfirst = 0;  //where do we start numbering bins
11 Int_t binlast = 8;  //where do we stop numbering bins
12 const Int_t numberOfCentralityBins = 9;
13 Float_t centralityArray[numberOfCentralityBins+1] = {0.,5.,10.,20.,30.,40.,50.,60.,70.,80.}; // in centrality percentile
14 //Int_t centralityArray[numberOfCentralityBins+1] = {41,80,146,245,384,576,835,1203,1471,10000}; // in terms of TPC only reference multiplicity
15
16 TString commonOutputFileName = "outputCentrality"; // e.g.: result for centrality bin 0 will be in the file "outputCentrality0.root", etc
17
18 //void runFlowTaskCentralityTrain(Int_t mode=mLocal, Int_t nEvents = 10,
19 //Bool_t DATA = kFALSE, const Char_t* dataDir="/Users/snelling/alice_data/Therminator_midcentral", Int_t offset = 0)
20
21 void runFlowTaskCentralityTrain( Int_t mode = mPROOF,
22                                  Bool_t useFlowParFiles = kFALSE,
23                                  Bool_t DATA = kTRUE,
24                                  const Char_t* dataDir = "/alice/data/LHC10h_000137162_p1_plusplusplus#esdTree",
25                                  Int_t nEvents = 1e4,
26                                  Int_t offset = 0,
27                                  Bool_t useTender = kFALSE )
28 {
29   // Time:
30   TStopwatch timer;
31   timer.Start();
32   // Cross-check user settings before starting:
33   //  CrossCheckUserSettings(DATA);
34
35   // Load needed libraries:
36   LoadLibraries(mode,useFlowParFiles);
37
38   // Create analysis manager:
39   AliAnalysisManager *mgr = new AliAnalysisManager("FlowAnalysisManager");
40
41   // Chains:
42   if(mode == mLocal)
43   {
44     TChain* chain = CreateESDChain(dataDir, nEvents, offset);
45     //TChain* chain = CreateAODChain(dataDir, nEvents, offset);
46   }
47
48   // Connect plug-in to the analysis manager:
49   if(mode == mGrid)
50   {
51     gROOT->LoadMacro("CreateAlienHandler.C");
52     AliAnalysisGrid *alienHandler = CreateAlienHandler(useFlowParFiles);
53     if(!alienHandler) return;
54     mgr->SetGridHandler(alienHandler);
55   }
56
57   // Event handlers:
58   AliVEventHandler* esdH = new AliESDInputHandler;
59   mgr->SetInputEventHandler(esdH);
60   if (!DATA)
61   {
62     AliMCEventHandler *mc = new AliMCEventHandler();
63     mgr->SetMCtruthEventHandler(mc);
64   }
65
66   // Task to check the offline trigger:
67   gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskPhysicsSelection.C");
68   AddTaskPhysicsSelection(!DATA);
69
70   //Add the centrality determination task
71   gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskCentrality.C");
72   AddTaskCentrality();
73
74   if (useTender)
75   {
76     //Add the tenders
77     gROOT->LoadMacro("$ALICE_ROOT/PWG2/FLOW/macros/AddTaskTenderFlow.C");
78     AddTaskTenderFlow();
79   }
80
81   // Setup analysis per centrality bin:
82   gROOT->LoadMacro("AddTaskFlowCentrality.C");
83   for (Int_t i=binfirst; i<binlast+1; i++)
84   {
85     Float_t lowCentralityBinEdge = centralityArray[i];
86     Float_t highCentralityBinEdge = centralityArray[i+1];
87     Printf("\nWagon for centrality bin %i: %.0f-%.0f",i,lowCentralityBinEdge,highCentralityBinEdge);
88     AddTaskFlowCentrality( lowCentralityBinEdge,
89                            highCentralityBinEdge,
90                            commonOutputFileName );
91   } // end of for (Int_t i=0; i<numberOfCentralityBins; i++)
92
93   // Enable debug printouts:
94   mgr->SetDebugLevel(2);
95   // Run the analysis:
96   if(!mgr->InitAnalysis()) return;
97   mgr->PrintStatus();
98   if(mode == mLocal)
99   {
100     mgr->StartAnalysis("local",chain);
101   }
102   else if(mode == mPROOF)
103   {
104     mgr->StartAnalysis("proof",dataDir,nEvents,offset);
105   }
106   else if(mode == mGrid)
107   {
108     mgr->StartAnalysis("grid");
109   }
110
111   // Print real and CPU time used for analysis:
112   timer.Stop();
113   timer.Print();
114
115 } // end of void runFlowTaskCentralityTrain(...)
116
117 //===============================================================================================
118 /*
119 void CrossCheckUserSettings(Bool_t bData)
120 {
121  // Check in this method if the user settings make sense.
122  if(LYZ1SUM && LYZ2SUM) {cout<<" WARNING: You cannot run LYZ1 and LYZ2 at the same time! LYZ2 needs the output from LYZ1 !!!!"<<endl; exit(0); }
123  if(LYZ1PROD && LYZ2PROD) {cout<<" WARNING: You cannot run LYZ1 and LYZ2 at the same time! LYZ2 needs the output from LYZ1 !!!!"<<endl; exit(0); }
124  if(LYZ2SUM && LYZEP) {cout<<" WARNING: You cannot run LYZ2 and LYZEP at the same time! LYZEP needs the output from LYZ2 !!!!"<<endl; exit(0); }
125  if(LYZ1SUM && LYZEP) {cout<<" WARNING: You cannot run LYZ1 and LYZEP at the same time! LYZEP needs the output from LYZ2 !!!!"<<endl; exit(0); }
126 } // end of void CrossCheckUserSettings()
127 */
128 //===============================================================================================
129
130 void LoadLibraries(const anaModes mode, Bool_t useFlowParFiles )
131 {
132   //--------------------------------------
133   // Load the needed libraries most of them already loaded by aliroot
134   //--------------------------------------
135
136   gSystem->Load("libCore");
137   gSystem->Load("libTree");
138   gSystem->Load("libGeom");
139   gSystem->Load("libVMC");
140   gSystem->Load("libXMLIO");
141   gSystem->Load("libPhysics");
142   gSystem->Load("libXMLParser");
143   gSystem->Load("libProof");
144   gSystem->Load("libMinuit");
145
146   if (mode==mLocal || mode==mGrid)
147   {
148     gSystem->Load("libSTEERBase");
149     gSystem->Load("libCDB");
150     gSystem->Load("libRAWDatabase");
151     gSystem->Load("libRAWDatarec");
152     gSystem->Load("libESD");
153     gSystem->Load("libAOD");
154     gSystem->Load("libSTEER");
155     gSystem->Load("libANALYSIS");
156     gSystem->Load("libANALYSISalice");
157     gSystem->Load("libTPCbase");
158     gSystem->Load("libTOFbase");
159     gSystem->Load("libTOFrec");
160     gSystem->Load("libTRDbase");
161     gSystem->Load("libVZERObase");
162     gSystem->Load("libVZEROrec");
163     gSystem->Load("libT0base");
164     gSystem->Load("libT0rec");
165     gSystem->Load("libTENDER");
166     gSystem->Load("libTENDERSupplies");
167
168     if (useFlowParFiles)
169     {
170       AliAnalysisAlien::SetupPar("PWG2flowCommon");
171       AliAnalysisAlien::SetupPar("PWG2flowTasks");
172     }
173     else
174     {
175       gSystem->Load("libPWG2flowCommon");
176       gSystem->Load("libPWG2flowTasks");
177     }
178   }
179   else if (mode==mPROOF)
180   {
181     TList* list = new TList();
182     list->Add(new TNamed("ALIROOT_MODE", "ALIROOT"));
183     if (useFlowParFiles)
184       list->Add(new TNamed("ALIROOT_EXTRA_LIBS", "ANALYSIS:ANALYSISalice:TENDER:TENDERSupplies"));
185     else
186       list->Add(new TNamed("ALIROOT_EXTRA_LIBS", "ANALYSIS:ANALYSISalice:TENDER:TENDERSupplies:PWG2flowCommon:PWG2flowTasks"));
187
188     //list->Add(new TNamed("ALIROOT_EXTRA_INCLUDES","PWG2/FLOW/AliFlowCommon:PWG2/FLOW/AliFlowTasks"));
189
190     // Connect to proof
191     printf("*** Connect to PROOF ***\n");
192     gEnv->SetValue("XSec.GSI.DelegProxy","2");
193     //TProof* proof = TProof::Open("alice-caf.cern.ch");
194     TProof* proof = TProof::Open("skaf.saske.sk");
195
196     // list the data available
197     //gProof->ShowDataSets("/*/*");
198     //gProof->ShowDataSets("/alice/sim/"); //for MC Data
199     //gProof->ShowDataSets("/alice/data/"); //for REAL Data
200
201     proof->ClearPackages();
202     proof->EnablePackage("VO_ALICE@AliRoot::v4-21-14-AN",list);
203
204     if (useFlowParFiles)
205     {
206       gProof->UploadPackage("PWG2flowCommon.par");
207       gProof->UploadPackage("PWG2flowTasks.par");
208     }
209
210     // Show enables Packages
211     gProof->ShowEnabledPackages();
212   }
213 } // end of void LoadLibraries(const anaModes mode)
214
215 // Helper macros for creating chains
216 // from: CreateESDChain.C,v 1.10 jgrosseo Exp
217 TChain* CreateESDChain(const char* aDataDir, Int_t aRuns, Int_t offset)
218 {
219   // creates chain of files in a given directory or file containing a list.
220   // In case of directory the structure is expected as:
221   // <aDataDir>/<dir0>/AliESDs.root
222   // <aDataDir>/<dir1>/AliESDs.root
223   // ...
224
225   if (!aDataDir)
226     return 0;
227
228   Long_t id, size, flags, modtime;
229   if (gSystem->GetPathInfo(aDataDir, &id, &size, &flags, &modtime))
230   {
231     printf("%s not found.\n", aDataDir);
232     return 0;
233   }
234
235   TChain* chain = new TChain("esdTree");
236   TChain* chaingAlice = 0;
237
238   if (flags & 2)
239   {
240     TString execDir(gSystem->pwd());
241     TSystemDirectory* baseDir = new TSystemDirectory(".", aDataDir);
242     TList* dirList            = baseDir->GetListOfFiles();
243     Int_t nDirs               = dirList->GetEntries();
244     gSystem->cd(execDir);
245
246     Int_t count = 0;
247
248     for (Int_t iDir=0; iDir<nDirs; ++iDir)
249     {
250       TSystemFile* presentDir = (TSystemFile*) dirList->At(iDir);
251       if (!presentDir || !presentDir->IsDirectory() || strcmp(presentDir->GetName(), ".") == 0 || strcmp(presentDir->GetName(), "..") == 0)
252         continue;
253
254       if (offset > 0)
255       {
256         --offset;
257         continue;
258       }
259
260       if (count++ == aRuns)
261         break;
262
263       TString presentDirName(aDataDir);
264       presentDirName += "/";
265       presentDirName += presentDir->GetName();
266       chain->Add(presentDirName + "/AliESDs.root/esdTree");
267       //  cerr<<presentDirName<<endl;
268     }
269
270   }
271   else
272   {
273     // Open the input stream
274     ifstream in;
275     in.open(aDataDir);
276
277     Int_t count = 0;
278
279     // Read the input list of files and add them to the chain
280     TString esdfile;
281     while(in.good())
282     {
283       in >> esdfile;
284       if (!esdfile.Contains("root")) continue; // protection
285
286       if (offset > 0)
287       {
288         --offset;
289         continue;
290       }
291
292       if (count++ == aRuns)
293         break;
294
295       // add esd file
296       chain->Add(esdfile);
297     }
298
299     in.close();
300   }
301
302   return chain;
303
304 } // end of TChain* CreateESDChain(const char* aDataDir, Int_t aRuns, Int_t offset)
305
306 //===============================================================================================
307
308 TChain* CreateAODChain(const char* aDataDir, Int_t aRuns, Int_t offset)
309 {
310   // creates chain of files in a given directory or file containing a list.
311   // In case of directory the structure is expected as:
312   // <aDataDir>/<dir0>/AliAOD.root
313   // <aDataDir>/<dir1>/AliAOD.root
314   // ...
315
316   if (!aDataDir)
317     return 0;
318
319   Long_t id, size, flags, modtime;
320   if (gSystem->GetPathInfo(aDataDir, &id, &size, &flags, &modtime))
321   {
322     printf("%s not found.\n", aDataDir);
323     return 0;
324   }
325
326   TChain* chain = new TChain("aodTree");
327   TChain* chaingAlice = 0;
328
329   if (flags & 2)
330   {
331     TString execDir(gSystem->pwd());
332     TSystemDirectory* baseDir = new TSystemDirectory(".", aDataDir);
333     TList* dirList            = baseDir->GetListOfFiles();
334     Int_t nDirs               = dirList->GetEntries();
335     gSystem->cd(execDir);
336
337     Int_t count = 0;
338
339     for (Int_t iDir=0; iDir<nDirs; ++iDir)
340     {
341       TSystemFile* presentDir = (TSystemFile*) dirList->At(iDir);
342       if (!presentDir || !presentDir->IsDirectory() || strcmp(presentDir->GetName(), ".") == 0 || strcmp(presentDir->GetName(), "..") == 0)
343         continue;
344
345       if (offset > 0)
346       {
347         --offset;
348         continue;
349       }
350
351       if (count++ == aRuns)
352         break;
353
354       TString presentDirName(aDataDir);
355       presentDirName += "/";
356       presentDirName += presentDir->GetName();
357       chain->Add(presentDirName + "/AliAOD.root/aodTree");
358       // cerr<<presentDirName<<endl;
359     }
360
361   }
362   else
363   {
364     // Open the input stream
365     ifstream in;
366     in.open(aDataDir);
367
368     Int_t count = 0;
369
370     // Read the input list of files and add them to the chain
371     TString aodfile;
372     while(in.good())
373     {
374       in >> aodfile;
375       if (!aodfile.Contains("root")) continue; // protection
376
377       if (offset > 0)
378       {
379         --offset;
380         continue;
381       }
382
383       if (count++ == aRuns)
384         break;
385
386       // add aod file
387       chain->Add(aodfile);
388     }
389
390     in.close();
391   }
392
393   return chain;
394
395 } // end of TChain* CreateAODChain(const char* aDataDir, Int_t aRuns, Int_t offset)
396