]> git.uio.no Git - u/mrichter/AliRoot.git/blame_incremental - STEER/AliMCEventHandler.cxx
POI's and RP's for LeeYang Zeroes eventplane
[u/mrichter/AliRoot.git] / STEER / AliMCEventHandler.cxx
... / ...
CommitLineData
1/************************************************************************* * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved *
2 * *
3 * Author: The ALICE Off-line Project. *
4 * Contributors are mentioned in the code where appropriate. *
5 * *
6 * Permission to use, copy, modify and distribute this software and its *
7 * documentation strictly for non-commercial purposes is hereby granted *
8 * without fee, provided that the above copyright notice appears in all *
9 * copies and that both the copyright notice and this permission notice *
10 * appear in the supporting documentation. The authors make no claims *
11 * about the suitability of this software for any purpose. It is *
12 * provided "as is" without express or implied warranty. *
13 **************************************************************************/
14
15/* $Id$ */
16//---------------------------------------------------------------------------------
17// Class AliMCEventHandler
18// This class gives access to MC truth during the analysis.
19// Monte Carlo truth is containe in the kinematics tree (produced particles) and
20// the tree of reference hits.
21//
22// Origin: Andreas Morsch, CERN, andreas.morsch@cern.ch
23//---------------------------------------------------------------------------------
24
25
26
27#include "AliMCEventHandler.h"
28#include "AliMCEvent.h"
29#include "AliPDG.h"
30#include "AliTrackReference.h"
31#include "AliHeader.h"
32#include "AliStack.h"
33#include "AliLog.h"
34
35#include <TTree.h>
36#include <TFile.h>
37#include <TParticle.h>
38#include <TString.h>
39#include <TClonesArray.h>
40#include <TDirectoryFile.h>
41
42ClassImp(AliMCEventHandler)
43
44AliMCEventHandler::AliMCEventHandler() :
45 AliVEventHandler(),
46 fMCEvent(new AliMCEvent()),
47 fFileE(0),
48 fFileK(0),
49 fFileTR(0),
50 fTreeE(0),
51 fTreeK(0),
52 fTreeTR(0),
53 fDirK(0),
54 fDirTR(0),
55 fParticleSelected(0),
56 fLabelMap(0),
57 fNEvent(-1),
58 fEvent(-1),
59 fPathName(new TString("./")),
60 fExtension(""),
61 fFileNumber(0),
62 fEventsPerFile(0),
63 fReadTR(kTRUE),
64 fInitOk(kFALSE)
65{
66 //
67 // Default constructor
68 //
69 // Be sure to add all particles to the PDG database
70 AliPDG::AddParticlesToPdgDataBase();
71}
72
73AliMCEventHandler::AliMCEventHandler(const char* name, const char* title) :
74 AliVEventHandler(name, title),
75 fMCEvent(new AliMCEvent()),
76 fFileE(0),
77 fFileK(0),
78 fFileTR(0),
79 fTreeE(0),
80 fTreeK(0),
81 fTreeTR(0),
82 fDirK(0),
83 fDirTR(0),
84 fParticleSelected(0),
85 fLabelMap(0),
86 fNEvent(-1),
87 fEvent(-1),
88 fPathName(new TString("./")),
89 fExtension(""),
90 fFileNumber(0),
91 fEventsPerFile(0),
92 fReadTR(kTRUE),
93 fInitOk(kFALSE)
94{
95 //
96 // Constructor
97 //
98 // Be sure to add all particles to the PDG database
99 AliPDG::AddParticlesToPdgDataBase();
100}
101AliMCEventHandler::~AliMCEventHandler()
102{
103 // Destructor
104 delete fMCEvent;
105 delete fFileE;
106 delete fFileK;
107 delete fFileTR;
108}
109
110Bool_t AliMCEventHandler::Init(Option_t* opt)
111{
112 // Initialize input
113 //
114 if (!(strcmp(opt, "proof")) || !(strcmp(opt, "local"))) return kTRUE;
115 //
116 fFileE = TFile::Open(Form("%sgalice.root", fPathName->Data()));
117 if (!fFileE) {
118 AliError(Form("AliMCEventHandler:galice.root not found in directory %s ! \n", fPathName->Data()));
119 fInitOk = kFALSE;
120 return kFALSE;
121 }
122
123 //
124 // Tree E
125 fFileE->GetObject("TE", fTreeE);
126 // Connect Tree E to the MCEvent
127 fMCEvent->ConnectTreeE(fTreeE);
128 fNEvent = fTreeE->GetEntries();
129 //
130 // Tree K
131 fFileK = TFile::Open(Form("%sKinematics%s.root", fPathName->Data(), fExtension));
132 if (!fFileK) {
133 AliError(Form("AliMCEventHandler:Kinematics.root not found in directory %s ! \n", fPathName));
134 fInitOk = kFALSE;
135 return kTRUE;
136 }
137
138 fEventsPerFile = fFileK->GetNkeys() - fFileK->GetNProcessIDs();
139 //
140 // Tree TR
141 if (fReadTR) {
142 fFileTR = TFile::Open(Form("%sTrackRefs%s.root", fPathName->Data(), fExtension));
143 if (!fFileTR) {
144 AliError(Form("AliMCEventHandler:TrackRefs.root not found in directory %s ! \n", fPathName->Data()));
145 fInitOk = kFALSE;
146 return kTRUE;
147 }
148 }
149 //
150 // Reset the event number
151 fEvent = -1;
152 fFileNumber = 0;
153 AliInfo(Form("Number of events in this directory %5d \n", fNEvent));
154 fInitOk = kTRUE;
155 return kTRUE;
156}
157
158Bool_t AliMCEventHandler::GetEvent(Int_t iev)
159{
160 // Load the event number iev
161 //
162 // Calculate the file number
163 if (!fInitOk) return kFALSE;
164
165 Int_t inew = iev / fEventsPerFile;
166 if (inew != fFileNumber) {
167 fFileNumber = inew;
168 if (!OpenFile(fFileNumber)){
169 return kFALSE;
170 }
171 }
172 // Folder name
173 char folder[20];
174 sprintf(folder, "Event%d", iev);
175 // TreeE
176 fTreeE->GetEntry(iev);
177 // Tree K
178 fFileK->GetObject(folder, fDirK);
179 if (!fDirK) {
180 AliWarning(Form("AliMCEventHandler: Event #%5d not found\n", iev));
181 return kFALSE;
182 }
183
184 fDirK ->GetObject("TreeK", fTreeK);
185 // Connect TreeK to MCEvent
186 fMCEvent->ConnectTreeK(fTreeK);
187 //Tree TR
188 if (fFileTR) {
189 // Check which format has been read
190 fFileTR->GetObject(folder, fDirTR);
191 fDirTR->GetObject("TreeTR", fTreeTR);
192 //
193 // Connect TR to MCEvent
194 fMCEvent->ConnectTreeTR(fTreeTR);
195 }
196 //
197 return kTRUE;
198}
199
200Bool_t AliMCEventHandler::OpenFile(Int_t i)
201{
202 // Open file i
203 if (i > 0) {
204 fExtension = Form("%d", i);
205 } else {
206 fExtension = "";
207 }
208
209
210 delete fFileK;
211 fFileK = TFile::Open(Form("%sKinematics%s.root", fPathName->Data(), fExtension));
212 if (!fFileK) {
213 AliError(Form("AliMCEventHandler:Kinematics%s.root not found in directory %s ! \n", fExtension, fPathName->Data()));
214 fInitOk = kFALSE;
215 return kFALSE;
216 }
217
218 if (fReadTR) {
219 delete fFileTR;
220 fFileTR = TFile::Open(Form("%sTrackRefs%s.root", fPathName->Data(), fExtension));
221 if (!fFileTR) {
222 AliWarning(Form("AliMCEventHandler:TrackRefs%s.root not found in directory %s ! \n", fExtension, fPathName->Data()));
223 fInitOk = kFALSE;
224 return kFALSE;
225 }
226 }
227
228 fInitOk = kTRUE;
229 return kTRUE;
230}
231
232Bool_t AliMCEventHandler::BeginEvent(Long64_t entry)
233{
234 fParticleSelected.Delete();
235 fLabelMap.Delete();
236 // Read the next event
237 if (entry == -1) {
238 fEvent++;
239 entry = fEvent;
240 } else {
241 fEvent = entry;
242 }
243
244 if (entry >= fNEvent) {
245 AliWarning(Form("AliMCEventHandler: Event number out of range %5d %5d\n", entry,fNEvent));
246 return kFALSE;
247 }
248 return GetEvent(entry);
249}
250
251void AliMCEventHandler::SelectParticle(Int_t i){
252 // taking the absolute values here, need to take care
253 // of negative daughter and mother
254 // IDs when setting!
255 if(!IsParticleSelected(TMath::Abs(i)))fParticleSelected.Add(TMath::Abs(i),1);
256}
257
258Bool_t AliMCEventHandler::IsParticleSelected(Int_t i) {
259 // taking the absolute values here, need to take
260 // care with negative daughter and mother
261 // IDs when setting!
262 return (fParticleSelected.GetValue(TMath::Abs(i))==1);
263}
264
265
266void AliMCEventHandler::CreateLabelMap(){
267
268 //
269 // this should be called once all selections where done
270 //
271
272 fLabelMap.Delete();
273 if(!fMCEvent){
274 fParticleSelected.Delete();
275 return;
276 }
277
278 VerifySelectedParticles();
279 AliStack *pStack = fMCEvent->Stack();
280
281 Int_t iNew = 0;
282 for(int i = 0;i < pStack->GetNtrack();++i){
283 if(IsParticleSelected(i)){
284 fLabelMap.Add(i,iNew);
285 iNew++;
286 }
287 }
288}
289
290Int_t AliMCEventHandler::GetNewLabel(Int_t i) {
291 // Gets the labe from the new created Map
292 // Call CreatLabelMap before
293 // otherwise only 0 returned
294 return fLabelMap.GetValue(TMath::Abs(i));
295}
296
297void AliMCEventHandler::VerifySelectedParticles(){
298
299 //
300 // Make sure that each particle has at least it's predecessors
301 // selected so that we have the complete ancestry tree
302 // Private, should be only called by CreateLabelMap
303
304 if(!fMCEvent){
305 fParticleSelected.Delete();
306 return;
307 }
308 AliStack *pStack = fMCEvent->Stack();
309
310 Int_t nprim = pStack->GetNprimary();
311
312 for(int i = 0;i < pStack->GetNtrack();++i){
313 if(i<nprim){
314 SelectParticle(i);// take all primaries
315 continue;
316 }
317 if(!IsParticleSelected(i))continue;
318 TParticle *part = pStack->Particle(i);
319 Int_t imo = part->GetFirstMother();
320 while((imo >= nprim)&&!IsParticleSelected(imo)){
321 // Mother not yet selected
322 SelectParticle(imo);
323 TParticle *mother = pStack->Particle(imo);
324 imo = mother->GetFirstMother();
325 }
326 // after last step we may have a unselected primary
327 // mother
328 if(imo>=0){
329 if(!IsParticleSelected(imo))
330 SelectParticle(imo);
331 }
332 }// loop over all tracks
333}
334
335Int_t AliMCEventHandler::GetParticleAndTR(Int_t i, TParticle*& particle, TClonesArray*& trefs)
336{
337 // Retrieve entry i
338 if (!fInitOk) {
339 return 0;
340 } else {
341 return (fMCEvent->GetParticleAndTR(i, particle, trefs));
342 }
343}
344
345void AliMCEventHandler::DrawCheck(Int_t i, Int_t search)
346{
347 // Retrieve entry i and draw momentum vector and hits
348 fMCEvent->DrawCheck(i, search);
349}
350
351Bool_t AliMCEventHandler::Notify(const char *path)
352{
353 // Notify about directory change
354 // The directory is taken from the 'path' argument
355 // Reconnect trees
356 TString fileName(path);
357 if(fileName.Contains("AliESDs.root")){
358 fileName.ReplaceAll("AliESDs.root", "");
359 }
360 else if(fileName.Contains("AliAOD.root")){
361 fileName.ReplaceAll("AliAOD.root", "");
362 }
363 else if(fileName.Contains("galice.root")){
364 // for running with galice and kinematics alone...
365 fileName.ReplaceAll("galice.root", "");
366 }
367 else if (fileName.BeginsWith("root:")) {
368 fileName.Append("?ZIP=");
369 }
370 *fPathName = fileName;
371 AliInfo(Form("Notify() Path: %s\n", fPathName->Data()));
372
373 ResetIO();
374 InitIO("");
375
376 return kTRUE;
377}
378
379void AliMCEventHandler::ResetIO()
380{
381// Clear header and stack
382
383 if (fInitOk) fMCEvent->Clean();
384
385// Delete Tree E
386 delete fTreeE; fTreeE = 0;
387
388// Reset files
389 if (fFileE) {delete fFileE; fFileE = 0;}
390 if (fFileK) {delete fFileK; fFileK = 0;}
391 if (fFileTR) {delete fFileTR; fFileTR = 0;}
392 fExtension="";
393 fInitOk = kFALSE;
394}
395
396
397Bool_t AliMCEventHandler::FinishEvent()
398{
399 // Clean-up after each event
400 delete fDirTR; fDirTR = 0;
401 delete fDirK; fDirK = 0;
402 if (fInitOk) fMCEvent->FinishEvent();
403 return kTRUE;
404}
405
406Bool_t AliMCEventHandler::Terminate()
407{
408 // Dummy
409 return kTRUE;
410}
411
412Bool_t AliMCEventHandler::TerminateIO()
413{
414 // Dummy
415 return kTRUE;
416}
417
418
419void AliMCEventHandler::SetInputPath(const char* fname)
420{
421 // Set the input path name
422 delete fPathName;
423 fPathName = new TString(fname);
424}