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