1 /************************************************************************* * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved *
3 * Author: The ALICE Off-line Project. *
4 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
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.
22 // Origin: Andreas Morsch, CERN, andreas.morsch@cern.ch
23 //---------------------------------------------------------------------------------
27 #include "AliMCEventHandler.h"
28 #include "AliMCEvent.h"
30 #include "AliTrackReference.h"
31 #include "AliHeader.h"
37 #include <TParticle.h>
39 #include <TClonesArray.h>
40 #include <TDirectoryFile.h>
42 ClassImp(AliMCEventHandler)
44 AliMCEventHandler::AliMCEventHandler() :
46 fMCEvent(new AliMCEvent()),
59 fPathName(new TString("./")),
67 // Default constructor
69 // Be sure to add all particles to the PDG database
70 AliPDG::AddParticlesToPdgDataBase();
73 AliMCEventHandler::AliMCEventHandler(const char* name, const char* title) :
74 AliVEventHandler(name, title),
75 fMCEvent(new AliMCEvent()),
88 fPathName(new TString("./")),
98 // Be sure to add all particles to the PDG database
99 AliPDG::AddParticlesToPdgDataBase();
101 AliMCEventHandler::~AliMCEventHandler()
110 Bool_t AliMCEventHandler::Init(Option_t* opt)
114 if (!(strcmp(opt, "proof")) || !(strcmp(opt, "local"))) return kTRUE;
116 fFileE = TFile::Open(Form("%sgalice.root", fPathName->Data()));
118 AliError(Form("AliMCEventHandler:galice.root not found in directory %s ! \n", fPathName->Data()));
125 fFileE->GetObject("TE", fTreeE);
126 // Connect Tree E to the MCEvent
127 fMCEvent->ConnectTreeE(fTreeE);
128 fNEvent = fTreeE->GetEntries();
131 fFileK = TFile::Open(Form("%sKinematics%s.root", fPathName->Data(), fExtension));
133 AliError(Form("AliMCEventHandler:Kinematics.root not found in directory %s ! \n", fPathName));
138 fEventsPerFile = fFileK->GetNkeys() - fFileK->GetNProcessIDs();
142 fFileTR = TFile::Open(Form("%sTrackRefs%s.root", fPathName->Data(), fExtension));
144 AliError(Form("AliMCEventHandler:TrackRefs.root not found in directory %s ! \n", fPathName->Data()));
150 // Reset the event number
153 AliInfo(Form("Number of events in this directory %5d \n", fNEvent));
158 Bool_t AliMCEventHandler::GetEvent(Int_t iev)
160 // Load the event number iev
162 // Calculate the file number
163 if (!fInitOk) return kFALSE;
165 Int_t inew = iev / fEventsPerFile;
166 if (inew != fFileNumber) {
168 if (!OpenFile(fFileNumber)){
174 sprintf(folder, "Event%d", iev);
176 fTreeE->GetEntry(iev);
178 fFileK->GetObject(folder, fDirK);
180 AliWarning(Form("AliMCEventHandler: Event #%5d not found\n", iev));
183 fDirK ->GetObject("TreeK", fTreeK);
184 // Connect TreeK to MCEvent
185 fMCEvent->ConnectTreeK(fTreeK);
188 // Check which format has been read
189 fFileTR->GetObject(folder, fDirTR);
190 fDirTR->GetObject("TreeTR", fTreeTR);
192 // Connect TR to MCEvent
193 fMCEvent->ConnectTreeTR(fTreeTR);
199 Bool_t AliMCEventHandler::OpenFile(Int_t i)
203 fExtension = Form("%d", i);
210 fFileK = TFile::Open(Form("%sKinematics%s.root", fPathName->Data(), fExtension));
212 AliError(Form("AliMCEventHandler:Kinematics%s.root not found in directory %s ! \n", fExtension, fPathName->Data()));
219 fFileTR = TFile::Open(Form("%sTrackRefs%s.root", fPathName->Data(), fExtension));
221 AliWarning(Form("AliMCEventHandler:TrackRefs%s.root not found in directory %s ! \n", fExtension, fPathName->Data()));
231 Bool_t AliMCEventHandler::BeginEvent(Long64_t entry)
233 fParticleSelected.Delete();
235 // Read the next event
243 if (entry >= fNEvent) {
244 AliWarning(Form("AliMCEventHandler: Event number out of range %5d %5d\n", entry,fNEvent));
247 return GetEvent(entry);
250 void AliMCEventHandler::SelectParticle(Int_t i){
251 // taking the absolute values here, need to take care
252 // of negative daughter and mother
254 if(!IsParticleSelected(TMath::Abs(i)))fParticleSelected.Add(TMath::Abs(i),1);
257 Bool_t AliMCEventHandler::IsParticleSelected(Int_t i) {
258 // taking the absolute values here, need to take
259 // care with negative daughter and mother
261 return (fParticleSelected.GetValue(TMath::Abs(i))==1);
265 void AliMCEventHandler::CreateLabelMap(){
268 // this should be called once all selections where done
273 fParticleSelected.Delete();
277 VerifySelectedParticles();
278 AliStack *pStack = fMCEvent->Stack();
281 for(int i = 0;i < pStack->GetNtrack();++i){
282 if(IsParticleSelected(i)){
283 fLabelMap.Add(i,iNew);
289 Int_t AliMCEventHandler::GetNewLabel(Int_t i) {
290 // Gets the labe from the new created Map
291 // Call CreatLabelMap before
292 // otherwise only 0 returned
293 return fLabelMap.GetValue(TMath::Abs(i));
296 void AliMCEventHandler::VerifySelectedParticles(){
299 // Make sure that each particle has at least it's predecessors
300 // selected so that we have the complete ancestry tree
301 // Private, should be only called by CreateLabelMap
304 fParticleSelected.Delete();
307 AliStack *pStack = fMCEvent->Stack();
309 Int_t nprim = pStack->GetNprimary();
311 for(int i = 0;i < pStack->GetNtrack();++i){
313 SelectParticle(i);// take all primaries
316 if(!IsParticleSelected(i))continue;
317 TParticle *part = pStack->Particle(i);
318 Int_t imo = part->GetFirstMother();
319 while((imo >= nprim)&&!IsParticleSelected(imo)){
320 // Mother not yet selected
322 TParticle *mother = pStack->Particle(imo);
323 imo = mother->GetFirstMother();
325 // after last step we may have a unselected primary
328 if(!IsParticleSelected(imo))
331 }// loop over all tracks
334 Int_t AliMCEventHandler::GetParticleAndTR(Int_t i, TParticle*& particle, TClonesArray*& trefs)
340 return (fMCEvent->GetParticleAndTR(i, particle, trefs));
344 void AliMCEventHandler::DrawCheck(Int_t i, Int_t search)
346 // Retrieve entry i and draw momentum vector and hits
347 fMCEvent->DrawCheck(i, search);
350 Bool_t AliMCEventHandler::Notify(const char *path)
352 // Notify about directory change
353 // The directory is taken from the 'path' argument
355 TString fileName(path);
356 if(fileName.Contains("AliESDs.root")){
357 fileName.ReplaceAll("AliESDs.root", "");
359 else if(fileName.Contains("AliAOD.root")){
360 fileName.ReplaceAll("AliAOD.root", "");
362 else if(fileName.Contains("galice.root")){
363 // for running with galice and kinematics alone...
364 fileName.ReplaceAll("galice.root", "");
367 *fPathName = fileName;
368 AliInfo(Form("Notify() Path: %s\n", fPathName->Data()));
376 void AliMCEventHandler::ResetIO()
378 // Clear header and stack
379 if (fInitOk) fMCEvent->Clean();
382 delete fTreeE; fTreeE = 0;
385 if (fFileE) {delete fFileE; fFileE = 0;}
386 if (fFileK) {delete fFileK; fFileK = 0;}
387 if (fFileTR) {delete fFileTR; fFileTR = 0;}
393 Bool_t AliMCEventHandler::FinishEvent()
395 // Clean-up after each event
396 delete fDirTR; fDirTR = 0;
397 delete fDirK; fDirK = 0;
398 if (fInitOk) fMCEvent->FinishEvent();
402 Bool_t AliMCEventHandler::Terminate()
408 Bool_t AliMCEventHandler::TerminateIO()
415 void AliMCEventHandler::SetInputPath(const char* fname)
417 // Set the input path name
419 fPathName = new TString(fname);