namespace added for constants
[u/mrichter/AliRoot.git] / PWG2 / FLOW / macros / testMaker.C
1 /////////////////////////////////////////////////////////////
2 //
3 // $Id$
4 //
5 // Author: Emanuele Simili
6 //
7 /////////////////////////////////////////////////////////////
8 //
9 // Description: AliRoot macro to make AliFlowEvents from AliESDs (new way) 
10 //
11 /////////////////////////////////////////////////////////////
12
13 #include <vector>
14 #include <iostream>
15 #include <fstream>
16 #include "TMath.h"
17 #include "TFile.h"
18 #include "TObjArray"
19 #include "TStopwatch.h"
20
21 using namespace std; //required for resolving the 'cout' symbol
22
23 TChain* CreateESDChain(const char* aDataDir = "ESDfiles.txt", Int_t aRuns = -1, Int_t offset = 0) ;
24 void LookupWrite(TChain* chain, const char* target) ;
25
26 //////////////////////////////////////////////////////////////////////////////////////////////////////
27
28 int testMaker(int cen = -1)
29 {
30  cout << " . Here the new flow maker (2007 rs) ... " << endl ;
31  cout << endl ;
32
33  bool kOne = kFALSE ;
34  int limit = -1 ;
35
36  if(limit>0)
37  {
38   cout << " . limited to " << limit << "events . " << endl ;
39   cout << endl ;
40  }
41  
42  // flowEvents file (output) //
43
44  TString output = "flowEvts" ;
45  if(cen >= 0) { output += cen ; }
46  output += ".root" ;
47  
48  // start, load libs //
49
50  TStopwatch timer;
51  timer.Start();
52
53  //gSystem->Load("libPhysics.so");
54  gSystem->Load("libPWG2flow.so");
55
56  // open output file //
57
58  TFile * fFlowfile = new TFile(output.Data(),"RECREATE") ;
59  //fFlowfile->cd() ; 
60
61  // esd chain (imput) //
62
63  TString baseDir = "." ; 
64  TChain* pESDchain = CreateESDChain(baseDir.Data(),limit,0);
65  Int_t fNumberOfEvents = (Int_t)pESDchain->GetEntries() ;
66  cout << " tot. " << fNumberOfEvents << " events in the TChain ... " << endl ; cout << endl ;
67
68  TString fESDbranch = "ESD" ;
69  AliESD * pEsd = 0 ;
70  pESDchain->SetBranchAddress(fESDbranch.Data(),&pEsd) ;
71
72  // flow maker //
73
74  AliFlowMaker * flowMaker = new  AliFlowMaker() ;
75
76  // flags 
77  flowMaker->DoTracks(kTRUE) ;
78  flowMaker->DoV0s(kFALSE) ;     // kTRUE
79
80  // cuts, etc.
81  flowMaker->SetNHitsCut(1) ;
82  flowMaker->SetECut(0.01,100.) ;
83  //flowMaker->SetLabelCut(..,..) ;
84  flowMaker->PrintCutList() ;
85
86  // loop //
87
88  Int_t evtN = 0 ;
89  Int_t count = 0 ;
90  AliFlowEvent * flowEvt = 0 ;
91  for(evtN=0;evtN<fNumberOfEvents;evtN++)
92  {
93   pESDchain->GetEntry(evtN,1) ;
94
95   Int_t evtNN = -1 ;
96   // Int_t evtNN = pEsd->GetEventNumber() ;
97   Int_t nTrk = pEsd->GetNumberOfTracks() ;
98   Int_t nV0s = pEsd->GetNumberOfV0s() ;
99   cout << endl ; cout << " Event " << evtN << "  ( " << evtNN << " )  : " << nTrk << " tracks  &  " << nV0s << " v0s ." << endl ;
100
101   flowEvt = flowMaker->FillFlowEvent(pEsd) ;
102   // cout << " Event filled " << flowEvt << " ... " << endl ; // flowEvt->Dump() ; cout << endl ;
103
104   TString evtID = "" ; evtID += evtN ; 
105   fFlowfile->cd() ; flowEvt->Write(evtID.Data()) ;
106   cout <<  " Event " << evtN << "  ( " << evtID.Data() << " )  -  written on disk (" << output << ") ." << endl;
107   delete flowEvt ;
108
109   if(count == limit) { break ; }  
110   count++ ;  
111  }
112  
113  fFlowfile->Close() ; 
114  
115  cout <<  endl ;
116  cout << " Finished ... " << endl ;
117  cout << "  nTracks:  " << flowMaker->GetNgoodTracks() << " (" << flowMaker->GetNposiTracks() << "+ , " << flowMaker->GetNnegaTracks() << "-) " << endl ;   
118  cout << "  nV0s:  " << flowMaker->GetNgoodV0s() << endl ;           
119  cout << "  nTracks (|eta|<0.5):  " << flowMaker->GetNgoodTracksEta() << endl ; 
120  // cout << "  nTracks unconstrained:  " << flowMaker->GetNunconstrained() << endl ;     
121  cout << "  Bayesian :  " ; 
122  for(int ii=0;ii<5;ii++) { cout << flowMaker->GetBayesianNorm(ii) << "   " ; } 
123  cout << " . " << endl ; 
124
125  timer.Stop() ;
126  cout << endl ;
127  timer.Print() ;
128  cout << " . here it was (maker rs) ... " << endl ;  //juice!
129  cout << endl ;
130  
131  // cout << endl ; cout << " Memory Check (from Paul)" << endl ; 
132  // gObjectTable->Print();
133  // cout << endl ; cout << endl ;
134
135  return cen ;
136 }
137
138 //////////////////////////////////////////////////////////////////////////////////////////////////////
139
140 // Helper macros for creating chains (from: CreateESDChain.C,v 1.10 jgrosseo Exp)
141 TChain* CreateESDChain(const char* aDataDir, Int_t aRuns, Int_t offset)
142 {
143   // creates chain of files in a given directory or file containing a list.
144   // In case of directory the structure is expected as:
145   // <aDataDir>/<dir0>/AliESDs.root
146   // <aDataDir>/<dir1>/AliESDs.root
147   // ...
148
149   if (!aDataDir)
150     return 0;
151
152   Long_t id, size, flags, modtime;
153   if (gSystem->GetPathInfo(aDataDir, &id, &size, &flags, &modtime))
154   {
155     printf("%s not found.\n", aDataDir);
156     return 0;
157   }
158
159   TChain* chain = new TChain("esdTree");
160   TChain* chaingAlice = 0;
161
162   if (flags & 2)
163   {
164     TString execDir(gSystem->pwd());
165     TSystemDirectory* baseDir = new TSystemDirectory(".", aDataDir);
166     TList* dirList            = baseDir->GetListOfFiles();
167     Int_t nDirs               = dirList->GetEntries();
168     gSystem->cd(execDir);
169
170     cout << "* Reading :  " << aDataDir << "   (+" << nDirs << ")" << endl ;
171       
172     Int_t count = 0;
173
174     for (Int_t iDir=0; iDir<nDirs; ++iDir)
175     {
176       TSystemFile* presentDir = (TSystemFile*) dirList->At(iDir);
177       if (!presentDir || !presentDir->IsDirectory() || strcmp(presentDir->GetName(), ".") == 0 || strcmp(presentDir->GetName(), "..") == 0)
178       {
179         cout << " Skip : " << presentDir->GetName() << endl ;
180       
181         continue;
182       }
183
184       if (offset > 0)
185       {
186         cout << " OffSet : " << offset << endl ;
187       
188         --offset;
189         continue;
190       }
191
192       if (count++ == aRuns)
193       {
194         cout << " aRuns : " << aRuns << endl ;
195         
196         break;
197       }
198
199       TString presentDirName(aDataDir);
200       presentDirName += "/";
201       presentDirName += presentDir->GetName();
202
203       chain->Add(presentDirName + "/AliESDs.root/esdTree");
204     }
205   }
206   else
207   {
208     // Open the input stream
209     ifstream in;
210     in.open(aDataDir);
211
212     Int_t count = 0;
213
214     // Read the input list of files and add them to the chain
215     TString esdfile;
216     while(in.good()) {
217       in >> esdfile;
218       if (!esdfile.Contains("root")) continue; // protection
219
220       if (offset > 0)
221       {
222         --offset;
223         continue;
224       }
225
226       if (count++ == aRuns)
227         break;
228
229         // add esd file
230       chain->Add(esdfile);
231     }
232
233     in.close();
234   }
235
236   return chain;
237 }
238
239 //////////////////////////////////////////////////////////////////////////////////////////////////////
240
241 void LookupWrite(TChain* chain, const char* target)
242 {
243   // looks up the chain and writes the remaining files to the text file target
244
245   chain->Lookup();
246
247   TObjArray* list = chain->GetListOfFiles();
248   TIterator* iter = list->MakeIterator();
249   TObject* obj = 0;
250
251   ofstream outfile;
252   outfile.open(target);
253
254   while ((obj = iter->Next()))
255     outfile << obj->GetTitle() << "#AliESDs.root" << endl;
256
257   outfile.close();
258
259   delete iter;
260 }
261
262 //////////////////////////////////////////////////////////////////////////////////////////////////////