o) adding log tags to all files
[u/mrichter/AliRoot.git] / PWG0 / AliSelector.cxx
1 /* $Id$ */
2
3 // The class definition in esdV0.h has been generated automatically
4 // by the ROOT utility TTree::MakeSelector(). This class is derived
5 // from the ROOT class TSelector. For more information on the TSelector
6 // framework see $ROOTSYS/README/README.SELECTOR or the ROOT User Manual.
7
8 // The following methods are defined in this file:
9 //    Begin():        called everytime a loop on the tree starts,
10 //                    a convenient place to create your histograms.
11 //    SlaveBegin():   called after Begin(), when on PROOF called only on the
12 //                    slave servers.
13 //    Process():      called for each event, in this function you decide what
14 //                    to read and fill your histograms.
15 //    SlaveTerminate: called at the end of the loop on the tree, when on PROOF
16 //                    called only on the slave servers.
17 //    Terminate():    called at the end of the loop on the tree,
18 //                    a convenient place to draw/fit your histograms.
19 //
20 // To use this file, try the following session on your Tree T:
21 //
22 // Root > T->Process("AliSelector.C")
23 // Root > T->Process("AliSelector.C","some options")
24 // Root > T->Process("AliSelector.C+")
25 //
26
27 #include "AliSelector.h"
28
29 #include <TStyle.h>
30 #include <TSystem.h>
31 #include <TCanvas.h>
32 #include <TRegexp.h>
33 #include <TTime.h>
34 #include <TParticle.h>
35 #include <TParticlePDG.h>
36 #include <TFriendElement.h>
37
38 #include <AliLog.h>
39
40 ClassImp(AliSelector)
41
42 AliSelector::AliSelector() :
43   TSelector(),
44   fChain(0),
45   fESD(0),
46   fCountFiles(0),
47   fKineFile(0),
48   fHeaderFile(0),
49   fHeaderTree(0),
50   fHeader(0)
51 {
52   //
53   // Constructor. Initialization of pointers
54   //
55 }
56
57 AliSelector::~AliSelector()
58 {
59   //
60   // Destructor
61   //
62
63   // histograms are in the output list and deleted when the output
64   // list is deleted by the TSelector dtor
65 }
66
67 void AliSelector::Begin(TTree *)
68 {
69   // The Begin() function is called at the start of the query.
70   // When running with PROOF Begin() is only called on the client.
71   // The tree argument is deprecated (on PROOF 0 is passed).
72 }
73
74 void AliSelector::SlaveBegin(TTree * tree)
75 {
76   // The SlaveBegin() function is called after the Begin() function.
77   // When running with PROOF SlaveBegin() is called on each slave server.
78   // The tree argument is deprecated (on PROOF 0 is passed).
79
80   Init(tree);
81
82   AliDebug(AliLog::kDebug, "=======SLAVEBEGIN========");
83   AliDebug(AliLog::kDebug, Form("Hostname: %s", gSystem->HostName()));
84   AliDebug(AliLog::kDebug, Form("Time: %s", gSystem->Now().AsString()));
85
86   TString option = GetOption();
87 }
88
89 void AliSelector::Init(TTree *tree)
90 {
91   // The Init() function is called when the selector needs to initialize
92   // a new tree or chain. Typically here the branch addresses of the tree
93   // will be set. It is normaly not necessary to make changes to the
94   // generated code, but the routine can be extended by the user if needed.
95   // Init() will be called many times when running with PROOF.
96
97   AliDebug(AliLog::kDebug, "=========Init==========");
98
99   // Set branch addresses
100   if (tree == 0)
101   {
102     AliDebug(AliLog::kError, "ERROR: tree argument is 0.");
103     return;
104   }
105
106   fChain = dynamic_cast<TChain*> (tree);
107   if (fChain == 0)
108   {
109     AliDebug(AliLog::kDebug, "ERROR: tree argument could not be casted to TChain.");
110     return;
111   }
112
113   fChain->SetBranchAddress("ESD", &fESD);
114   if (fESD != 0)
115     AliDebug(AliLog::kInfo, "INFO: Found ESD branch in chain.");
116
117   /*fChain->SetBranchAddress("Header", &fHeader);
118   if (fHeader != 0)
119     AliDebug(AliLog::kInfo, "INFO: Found event header branch in chain.");*/
120 }
121
122 Bool_t AliSelector::Notify()
123 {
124   // The Notify() function is called when a new file is opened. This
125   // can be either for a new TTree in a TChain or when when a new TTree
126   // is started when using PROOF. Typically here the branch pointers
127   // will be retrieved. It is normaly not necessary to make changes
128   // to the generated code, but the routine can be extended by the
129   // user if needed.
130
131   AliDebug(AliLog::kDebug, "=========NOTIFY==========");
132   AliDebug(AliLog::kDebug, Form("Hostname: %s", gSystem->HostName()));
133   AliDebug(AliLog::kDebug, Form("Time: %s", gSystem->Now().AsString()));
134
135   ++fCountFiles;
136   TFile *f = fChain->GetCurrentFile();
137   AliDebug(AliLog::kInfo, Form("Processing %d. file %s", fCountFiles, f->GetName()));
138
139   DeleteKinematicsFile();
140   DeleteHeaderFile();
141
142   /*TChain* headerChain = dynamic_cast<TChain*> (((TFriendElement*) fChain->GetListOfFriends()->First())->GetTree());
143   AliDebug(AliLog::kInfo, Form("Header File: %s", headerChain->GetCurrentFile()->GetName()));*/
144
145   return kTRUE;
146 }
147
148 Bool_t AliSelector::Process(Long64_t entry)
149 {
150   // The Process() function is called for each entry in the tree (or possibly
151   // keyed object in the case of PROOF) to be processed. The entry argument
152   // specifies which entry in the currently loaded tree is to be processed.
153   // It can be passed to either TTree::GetEntry() or TBranch::GetEntry()
154   // to read either all or the required parts of the data. When processing
155   // keyed objects with PROOF, the object is already loaded and is available
156   // via the fObject pointer.
157   //
158   // This function should contain the "body" of the analysis. It can contain
159   // simple or elaborate selection criteria, run algorithms on the data
160   // of the event and typically fill histograms.
161
162   // WARNING when a selector is used with a TChain, you must use
163   //  the pointer to the current TTree to call GetEntry(entry).
164   //  The entry is always the local entry number in the current tree.
165   //  Assuming that fChain is the pointer to the TChain being processed,
166   //  use fChain->GetTree()->GetEntry(entry).
167
168   AliDebug(AliLog::kDebug, Form("=========PROCESS========== Entry %lld", entry));
169
170   if (!fChain)
171   {
172     AliDebug(AliLog::kError, "ERROR: fChain is 0.");
173     return kFALSE;
174   }
175
176   fChain->GetTree()->GetEntry(entry);
177
178   /*
179   // debugging
180   if (fESD)
181     AliDebug(AliLog::kDebug, Form("ESD: We have %d tracks.", fESD->GetNumberOfTracks()));
182
183   if (fHeader)
184     AliDebug(AliLog::kDebug, Form("Header: We have %d primaries.", fHeader->GetNprimary()));
185
186   TTree* kinematics = GetKinematics();
187   if (kinematics)
188     AliDebug(AliLog::kDebug, Form("Kinematics: We have %lld particles.", kinematics->GetEntries()));
189   */
190
191   return kTRUE;
192 }
193
194 void AliSelector::SlaveTerminate()
195 {
196   // The SlaveTerminate() function is called after all entries or objects
197   // have been processed. When running with PROOF SlaveTerminate() is called
198   // on each slave server.
199
200   DeleteKinematicsFile();
201   DeleteHeaderFile();
202 }
203
204 void AliSelector::Terminate()
205 {
206   // The Terminate() function is the last function to be called during
207   // a query. It always runs on the client, it can be used to present
208   // the results graphically or save the results to file.
209
210   AliDebug(AliLog::kDebug, "=========TERMINATE==========");
211 }
212
213 TTree* AliSelector::GetKinematics()
214 {
215   // Returns kinematics tree corresponding to current ESD active in fChain
216   // Loads the kinematics from the kinematics file, the file is identified by replacing "AliESDs" to
217   // "Kinematics" in the file path of the ESD file. This is a hack, to be changed!
218
219   if (!fKineFile)
220   {
221     if (!fChain->GetCurrentFile())
222       return 0;
223
224     TString fileName(fChain->GetCurrentFile()->GetName());
225     fileName.ReplaceAll("AliESDs", "Kinematics");
226
227     AliDebug(AliLog::kInfo, Form("Opening %s", fileName.Data()));
228
229     fKineFile = TFile::Open(fileName);
230     if (!fKineFile)
231       return 0;
232   }
233
234   return dynamic_cast<TTree*> (fKineFile->Get(Form("Event%d/TreeK", fChain->GetTree()->GetReadEntry())));
235
236   /* this is if we want to get it from a TChain
237
238   define it in the header:
239
240     TChain*          fKineChain;
241
242   this creates the chain:
243
244     TChain* chainKine = new TChain("TreeK");
245     for (Int_t i=0; i<20; ++i)
246       chainKine->Add(Form("test/Kinematics.root/Event%d/TreeK", i));
247     for (Int_t i=0; i<20; ++i)
248       chainKine->Add(Form("test2/Kinematics.root/Event%d/TreeK", i));
249
250     <mainChain>->GetUserInfo()->Add(chainKine);
251
252   we retrieve it in init:
253
254     fKineChain = dynamic_cast<TChain*> (fChain->GetUserInfo()->FindObject("TreeK"));
255
256   and use it in process:
257
258     if (fKineChain)
259     {
260       Long64_t entryK = fKineChain->GetTreeOffset()[fChain->GetChainEntryNumber(entry)];
261       cout << "Entry in fKineChain: " << entryK << endl;
262       fKineChain->LoadTree(entryK);
263       TTree* kineTree = fKineChain->GetTree();
264
265       printf("Kinematics from tree friend: We have %lld particles.\n", kineTree->GetEntries());
266     }
267   */
268 }
269
270 void AliSelector::DeleteKinematicsFile()
271 {
272   //
273   // Closes the kinematics file and deletes the pointer.
274   //
275
276   if (fKineFile)
277   {
278     fKineFile->Close();
279     delete fKineFile;
280     fKineFile = 0;
281   }
282 }
283
284 AliHeader* AliSelector::GetHeader()
285 {
286   // Returns header corresponding to current ESD active in fChain
287   // Loads the header from galice.root, the file is identified by replacing "AliESDs" to
288   // "galice" in the file path of the ESD file. This is a hack, to be changed!
289
290   if (!fHeaderFile || !fHeaderTree)
291   {
292     if (!fChain->GetCurrentFile())
293       return 0;
294
295     TString fileName(fChain->GetCurrentFile()->GetName());
296     fileName.ReplaceAll("AliESDs", "galice");
297
298     AliDebug(AliLog::kInfo, Form("Opening %s", fileName.Data()));
299
300     fHeaderFile = TFile::Open(fileName);
301     if (!fHeaderFile)
302       return 0;
303
304     fHeaderTree = dynamic_cast<TTree*> (fHeaderFile->Get("TE"));
305     if (!fHeaderTree)
306       return 0;
307
308     fHeaderTree->SetBranchAddress("Header", &fHeader);
309   }
310
311   fHeaderTree->GetEntry(fChain->GetTree()->GetReadEntry());
312
313   return fHeader;
314 }
315
316 void AliSelector::DeleteHeaderFile()
317 {
318   //
319   // Closes the kinematics file and deletes the pointer.
320   //
321
322   if (fHeaderFile)
323   {
324     fHeaderFile->Close();
325     delete fHeaderFile;
326     fHeaderTree = 0;
327     fHeader = 0;
328   }
329 }
330
331 Bool_t AliSelector::IsPrimaryCharged(TParticle* aParticle, Int_t aTotalPrimaries) const
332 {
333   //
334   // Returns if the given particle is a primary particle
335   // This function or a equivalent should be available in some common place of AliRoot
336   //
337
338   // if the particle has a daughter primary, we do not want to count it
339   if (aParticle->GetFirstDaughter() != -1 && aParticle->GetFirstDaughter() < aTotalPrimaries)
340   {
341     AliDebug(AliLog::kDebug+1, "Dropping particle because it has a daughter among the primaries.");
342     return kFALSE;
343   }
344
345   Int_t pdgCode = TMath::Abs(aParticle->GetPdgCode());
346
347   // skip quarks and gluon
348   if (pdgCode <= 10 || pdgCode == 21)
349   {
350     AliDebug(AliLog::kDebug+1, "Dropping particle because it is a quark or gluon.");
351     return kFALSE;
352   }
353
354   if (strcmp(aParticle->GetName(),"XXX") == 0)
355   {
356     AliDebug(AliLog::kDebug, Form("WARNING: There is a particle named XXX."));
357     return kFALSE;
358   }
359
360   TParticlePDG* pdgPart = aParticle->GetPDG();
361
362   if (strcmp(pdgPart->ParticleClass(),"Unknown") == 0)
363   {
364     AliDebug(AliLog::kDebug, Form("WARNING: There is a particle with an unknown particle class (pdg code %d).", pdgCode));
365     return kFALSE;
366   }
367
368   if (pdgPart->Charge() == 0)
369   {
370     return kFALSE;
371     AliDebug(AliLog::kDebug+1, "Dropping particle because it is not charged.");
372   }
373
374   return kTRUE;
375 }