unused SetLayersNotToSkip() removed
[u/mrichter/AliRoot.git] / STEER / AliMCEventHandler.cxx
CommitLineData
da97a08a 1/************************************************************************* * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved *
5fe09262 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"
415d9f5c 28#include "AliMCEvent.h"
82418625 29#include "AliPDG.h"
5fe09262 30#include "AliTrackReference.h"
31#include "AliHeader.h"
32#include "AliStack.h"
2c36081e 33#include "AliLog.h"
5fe09262 34
35#include <TTree.h>
36#include <TFile.h>
37#include <TParticle.h>
0a05cd41 38#include <TString.h>
5fe09262 39#include <TClonesArray.h>
40#include <TDirectoryFile.h>
5fe09262 41
42ClassImp(AliMCEventHandler)
43
44AliMCEventHandler::AliMCEventHandler() :
d2f1d9ef 45 AliVEventHandler(),
415d9f5c 46 fMCEvent(new AliMCEvent()),
5fe09262 47 fFileE(0),
48 fFileK(0),
49 fFileTR(0),
5fe09262 50 fTreeE(0),
51 fTreeK(0),
52 fTreeTR(0),
5efedd31 53 fDirK(0),
54 fDirTR(0),
da97a08a 55 fParticleSelected(0),
56 fLabelMap(0),
5fe09262 57 fNEvent(-1),
58 fEvent(-1),
0a05cd41 59 fPathName(new TString("./")),
9aea8469 60 fExtension(""),
61 fFileNumber(0),
969c7896 62 fEventsPerFile(0),
c8b7b5d3 63 fReadTR(kTRUE),
64 fInitOk(kFALSE)
5fe09262 65{
82418625 66 //
67 // Default constructor
68 //
69 // Be sure to add all particles to the PDG database
70 AliPDG::AddParticlesToPdgDataBase();
5fe09262 71}
72
73AliMCEventHandler::AliMCEventHandler(const char* name, const char* title) :
d2f1d9ef 74 AliVEventHandler(name, title),
415d9f5c 75 fMCEvent(new AliMCEvent()),
5fe09262 76 fFileE(0),
77 fFileK(0),
78 fFileTR(0),
5fe09262 79 fTreeE(0),
80 fTreeK(0),
81 fTreeTR(0),
5efedd31 82 fDirK(0),
83 fDirTR(0),
da97a08a 84 fParticleSelected(0),
85 fLabelMap(0),
5fe09262 86 fNEvent(-1),
87 fEvent(-1),
0a05cd41 88 fPathName(new TString("./")),
9aea8469 89 fExtension(""),
90 fFileNumber(0),
0cd61c1d 91 fEventsPerFile(0),
c8b7b5d3 92 fReadTR(kTRUE),
93 fInitOk(kFALSE)
5fe09262 94{
82418625 95 //
96 // Constructor
97 //
98 // Be sure to add all particles to the PDG database
99 AliPDG::AddParticlesToPdgDataBase();
5fe09262 100}
101AliMCEventHandler::~AliMCEventHandler()
102{
103 // Destructor
415d9f5c 104 delete fMCEvent;
5fe09262 105 delete fFileE;
106 delete fFileK;
107 delete fFileTR;
108}
109
300d5701 110Bool_t AliMCEventHandler::Init(Option_t* opt)
5fe09262 111{
112 // Initialize input
113 //
6073f8c9 114 if (!(strcmp(opt, "proof")) || !(strcmp(opt, "local"))) return kTRUE;
115 //
0a05cd41 116 fFileE = TFile::Open(Form("%sgalice.root", fPathName->Data()));
c8b7b5d3 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
415d9f5c 123 //
124 // Tree E
5fe09262 125 fFileE->GetObject("TE", fTreeE);
415d9f5c 126 // Connect Tree E to the MCEvent
127 fMCEvent->ConnectTreeE(fTreeE);
5fe09262 128 fNEvent = fTreeE->GetEntries();
129 //
130 // Tree K
0a05cd41 131 fFileK = TFile::Open(Form("%sKinematics%s.root", fPathName->Data(), fExtension));
c8b7b5d3 132 if (!fFileK) {
133 AliError(Form("AliMCEventHandler:Kinematics.root not found in directory %s ! \n", fPathName));
134 fInitOk = kFALSE;
b72029a3 135 return kTRUE;
c8b7b5d3 136 }
137
9aea8469 138 fEventsPerFile = fFileK->GetNkeys() - fFileK->GetNProcessIDs();
5fe09262 139 //
140 // Tree TR
969c7896 141 if (fReadTR) {
c8b7b5d3 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;
b72029a3 146 return kTRUE;
c8b7b5d3 147 }
969c7896 148 }
5fe09262 149 //
150 // Reset the event number
2c36081e 151 fEvent = -1;
152 fFileNumber = 0;
b544c64d 153 AliInfo(Form("Number of events in this directory %5d \n", fNEvent));
c8b7b5d3 154 fInitOk = kTRUE;
5fe09262 155 return kTRUE;
5fe09262 156}
157
9aea8469 158Bool_t AliMCEventHandler::GetEvent(Int_t iev)
159{
160 // Load the event number iev
2c36081e 161 //
162 // Calculate the file number
c8b7b5d3 163 if (!fInitOk) return kFALSE;
164
415d9f5c 165 Int_t inew = iev / fEventsPerFile;
9aea8469 166 if (inew != fFileNumber) {
167 fFileNumber = inew;
168 if (!OpenFile(fFileNumber)){
169 return kFALSE;
170 }
171 }
2c36081e 172 // Folder name
5fe09262 173 char folder[20];
9aea8469 174 sprintf(folder, "Event%d", iev);
5fe09262 175 // TreeE
9aea8469 176 fTreeE->GetEntry(iev);
5fe09262 177 // Tree K
5efedd31 178 fFileK->GetObject(folder, fDirK);
179 if (!fDirK) {
2c36081e 180 AliWarning(Form("AliMCEventHandler: Event #%5d not found\n", iev));
9aea8469 181 return kFALSE;
182 }
b72029a3 183
5efedd31 184 fDirK ->GetObject("TreeK", fTreeK);
415d9f5c 185 // Connect TreeK to MCEvent
186 fMCEvent->ConnectTreeK(fTreeK);
5fe09262 187 //Tree TR
07bd4750 188 if (fFileTR) {
5efedd31 189 // Check which format has been read
190 fFileTR->GetObject(folder, fDirTR);
191 fDirTR->GetObject("TreeTR", fTreeTR);
415d9f5c 192 //
193 // Connect TR to MCEvent
194 fMCEvent->ConnectTreeTR(fTreeTR);
5fe09262 195 }
5fe09262 196 //
5fe09262 197 return kTRUE;
9aea8469 198}
199
200Bool_t AliMCEventHandler::OpenFile(Int_t i)
201{
202 // Open file i
9aea8469 203 if (i > 0) {
204 fExtension = Form("%d", i);
205 } else {
206 fExtension = "";
207 }
208
209
210 delete fFileK;
0a05cd41 211 fFileK = TFile::Open(Form("%sKinematics%s.root", fPathName->Data(), fExtension));
9aea8469 212 if (!fFileK) {
c8b7b5d3 213 AliError(Form("AliMCEventHandler:Kinematics%s.root not found in directory %s ! \n", fExtension, fPathName->Data()));
214 fInitOk = kFALSE;
215 return kFALSE;
9aea8469 216 }
217
c8b7b5d3 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 }
9aea8469 226 }
227
c8b7b5d3 228 fInitOk = kTRUE;
229 return kTRUE;
9aea8469 230}
231
ed97dc98 232Bool_t AliMCEventHandler::BeginEvent(Long64_t entry)
9aea8469 233{
da97a08a 234 fParticleSelected.Delete();
235 fLabelMap.Delete();
9aea8469 236 // Read the next event
ed97dc98 237 if (entry == -1) {
238 fEvent++;
239 entry = fEvent;
240 } else {
241 fEvent = entry;
242 }
243
244 if (entry >= fNEvent) {
f6065654 245 AliWarning(Form("AliMCEventHandler: Event number out of range %5d %5d\n", entry,fNEvent));
9aea8469 246 return kFALSE;
247 }
ed97dc98 248 return GetEvent(entry);
5fe09262 249}
250
da97a08a 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
5fe09262 335Int_t AliMCEventHandler::GetParticleAndTR(Int_t i, TParticle*& particle, TClonesArray*& trefs)
336{
337 // Retrieve entry i
c8b7b5d3 338 if (!fInitOk) {
339 return 0;
340 } else {
341 return (fMCEvent->GetParticleAndTR(i, particle, trefs));
342 }
5fe09262 343}
344
2d8f26f6 345void AliMCEventHandler::DrawCheck(Int_t i, Int_t search)
5fe09262 346{
347 // Retrieve entry i and draw momentum vector and hits
415d9f5c 348 fMCEvent->DrawCheck(i, search);
5fe09262 349}
350
890126ab 351Bool_t AliMCEventHandler::Notify(const char *path)
5fe09262 352{
53faeca4 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 }
c8b5ce3a 360 else if(fileName.Contains("AliAOD.root")){
361 fileName.ReplaceAll("AliAOD.root", "");
362 }
53faeca4 363 else if(fileName.Contains("galice.root")){
364 // for running with galice and kinematics alone...
365 fileName.ReplaceAll("galice.root", "");
366 }
39734d21 367 else if (fileName.BeginsWith("root:")) {
368 fileName.Append("?ZIP=");
369 }
53faeca4 370 *fPathName = fileName;
b544c64d 371 AliInfo(Form("Notify() Path: %s\n", fPathName->Data()));
53faeca4 372
f6065654 373 ResetIO();
374 InitIO("");
375
5fe09262 376 return kTRUE;
377}
36e82a52 378
5fe09262 379void AliMCEventHandler::ResetIO()
380{
5efedd31 381// Clear header and stack
b72029a3 382
aff49450 383 if (fInitOk) fMCEvent->Clean();
5efedd31 384
36e82a52 385// Delete Tree E
415d9f5c 386 delete fTreeE; fTreeE = 0;
b72029a3 387
5efedd31 388// Reset files
89f249fc 389 if (fFileE) {delete fFileE; fFileE = 0;}
390 if (fFileK) {delete fFileK; fFileK = 0;}
391 if (fFileTR) {delete fFileTR; fFileTR = 0;}
19cfde04 392 fExtension="";
c8b7b5d3 393 fInitOk = kFALSE;
5fe09262 394}
395
396
397Bool_t AliMCEventHandler::FinishEvent()
398{
5efedd31 399 // Clean-up after each event
400 delete fDirTR; fDirTR = 0;
401 delete fDirK; fDirK = 0;
aff49450 402 if (fInitOk) fMCEvent->FinishEvent();
5fe09262 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
0a05cd41 418
0931e76a 419void AliMCEventHandler::SetInputPath(const char* fname)
0a05cd41 420{
421 // Set the input path name
422 delete fPathName;
423 fPathName = new TString(fname);
424}