Improved version, kinetree included
[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 = 10, Int_t offset = 0) ;
24 void LookupWrite(TChain* chain, const char* target) ;
25
26 void testMaker(TString output = "flowEvts.root")
27 {
28  cout << " . Here the new flow maker (2007b) ... " << endl ;
29  cout << endl ;
30
31  bool kOne = kFALSE ;
32
33  TStopwatch timer;
34  timer.Start();
35
36  gSystem->Load("libPWG2flow.so");
37
38  // output file //
39
40  TFile * fFlowfile = new TFile(output.Data(),"RECREATE") ;
41  //fFlowfile->cd() ; 
42
43  // esd chain //
44
45  // TString fESDfileName = "AliESDs.root" ; TString fESDtree = "esdTree" ; 
46  TChain* pESDchain = CreateESDChain(".",10,0);
47  Int_t fNumberOfEvents = (Int_t)pESDchain->GetEntries() ;
48  cout << " tot. " << fNumberOfEvents << " events in the TChain ... " << endl ; cout << endl ;
49
50  TString fESDbranch = "ESD" ;
51  AliESD * pEsd = 0 ;
52  pESDchain->SetBranchAddress(fESDbranch.Data(),&pEsd) ;
53
54  // flow maker //
55
56  AliFlowMaker * flowMaker = new  AliFlowMaker() ;
57  // cuts, etc.
58  flowMaker->SetNHitsCut(1) ;
59  flowMaker->SetECut(0.01,100.) ;
60  //flowMaker->SetLabelCut(..,..) ;
61  flowMaker->PrintCutList() ;
62
63  // loop //
64
65  Int_t evtN = 0 ;
66  AliFlowEvent * flowEvt = 0 ;
67  for(evtN=0;evtN<fNumberOfEvents;evtN++)
68  {
69   pESDchain->GetEntry(evtN,1) ;
70
71   Int_t evtNN = -1 ;
72   //  Int_t evtNN = pEsd->GetEventNumber() ;
73   Int_t nTrk = pEsd->GetNumberOfTracks() ;
74   Int_t nV0s = pEsd->GetNumberOfV0s() ;
75   cout << endl ; cout << " Event " << evtN << "  ( " << evtNN << " )  : " << nTrk << " tracks  &  " << nV0s << " v0s ." << endl ;
76
77   flowEvt = flowMaker->FillFlowEvent(pEsd) ;
78   cout << " Event filled " << flowEvt << " ... " << endl ;
79   // cout << endl ; cout << " trks : " << flowEvt->TrackCollection()->GetEntries() << endl ;
80   // flowEvt->Dump() ; cout << endl ;
81
82   TString evtID = "" ; evtID += evtN ; 
83   fFlowfile->cd() ; 
84   flowEvt->Write(evtID.Data()) ;
85   cout <<  " Event " << evtN << "  ( " << evtID.Data() << " )  -  written on disk (" << output << ") ." << endl;
86   delete flowEvt ;
87  }
88  
89  fFlowfile->Close() ; 
90  
91  cout <<  endl ;
92  cout << " Finished ... " << endl ;
93  cout << "  nTracks:  " << flowMaker->GetNgoodTracks() << endl ;   
94  cout << "  nV0s:  " << flowMaker->GetNgoodV0s()  << endl ;          
95  cout << "  nTracks (|eta|<0.5):  " << flowMaker->GetNgoodTracksEta() << endl ; 
96  cout << "  nTracks+:  " << flowMaker->GetNposiTracks() << endl ;            
97  cout << "  nTracks-:  " << flowMaker->GetNnegaTracks() << endl ;            
98  cout << "  nTracks unconstrained:  " << flowMaker->GetNunconstrained() << endl ;        
99  cout << "  Bayesian :  " ; 
100  for(int ii=0;ii<5;ii++) { cout << flowMaker->GetBayesianNorm(ii) << "   " ; } 
101  cout << " . " << endl ; 
102
103  timer.Stop() ;
104  cout << endl ;
105  timer.Print() ;
106  cout << " . here it was (maker) ... " << endl ;  //juice!
107  cout << endl ;
108
109  // break ;
110
111 }
112
113
114 // Helper macros for creating chains (from: CreateESDChain.C,v 1.10 jgrosseo Exp)
115 TChain* CreateESDChain(const char* aDataDir, Int_t aRuns, Int_t offset)
116 {
117   // creates chain of files in a given directory or file containing a list.
118   // In case of directory the structure is expected as:
119   // <aDataDir>/<dir0>/AliESDs.root
120   // <aDataDir>/<dir1>/AliESDs.root
121   // ...
122
123   if (!aDataDir)
124     return 0;
125
126   Long_t id, size, flags, modtime;
127   if (gSystem->GetPathInfo(aDataDir, &id, &size, &flags, &modtime))
128   {
129     printf("%s not found.\n", aDataDir);
130     return 0;
131   }
132
133   TChain* chain = new TChain("esdTree");
134   TChain* chaingAlice = 0;
135
136   if (flags & 2)
137   {
138     TString execDir(gSystem->pwd());
139     TSystemDirectory* baseDir = new TSystemDirectory(".", aDataDir);
140     TList* dirList            = baseDir->GetListOfFiles();
141     Int_t nDirs               = dirList->GetEntries();
142     gSystem->cd(execDir);
143
144     Int_t count = 0;
145
146     for (Int_t iDir=0; iDir<nDirs; ++iDir)
147     {
148       TSystemFile* presentDir = (TSystemFile*) dirList->At(iDir);
149       if (!presentDir || !presentDir->IsDirectory() || strcmp(presentDir->GetName(), ".") == 0 || strcmp(presentDir->GetName(), "..") == 0)
150         continue;
151
152       if (offset > 0)
153       {
154         --offset;
155         continue;
156       }
157
158       if (count++ == aRuns)
159         break;
160
161       TString presentDirName(aDataDir);
162       presentDirName += "/";
163       presentDirName += presentDir->GetName();
164
165       chain->Add(presentDirName + "/AliESDs.root/esdTree");
166     }
167   }
168   else
169   {
170     // Open the input stream
171     ifstream in;
172     in.open(aDataDir);
173
174     Int_t count = 0;
175
176     // Read the input list of files and add them to the chain
177     TString esdfile;
178     while(in.good()) {
179       in >> esdfile;
180       if (!esdfile.Contains("root")) continue; // protection
181
182       if (offset > 0)
183       {
184         --offset;
185         continue;
186       }
187
188       if (count++ == aRuns)
189         break;
190
191         // add esd file
192       chain->Add(esdfile);
193     }
194
195     in.close();
196   }
197
198   return chain;
199 }
200
201 void LookupWrite(TChain* chain, const char* target)
202 {
203   // looks up the chain and writes the remaining files to the text file target
204
205   chain->Lookup();
206
207   TObjArray* list = chain->GetListOfFiles();
208   TIterator* iter = list->MakeIterator();
209   TObject* obj = 0;
210
211   ofstream outfile;
212   outfile.open(target);
213
214   while ((obj = iter->Next()))
215     outfile << obj->GetTitle() << "#AliESDs.root" << endl;
216
217   outfile.close();
218
219   delete iter;
220 }