1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
17 //---------------------------------------------------------------------------------
18 // Class AliMCEventHandler
19 // This class gives access to MC truth during the analysis.
20 // Monte Carlo truth is containe in the kinematics tree (produced particles) and
21 // the tree of reference hits.
23 // Origin: Andreas Morsch, CERN, andreas.morsch@cern.ch
24 //---------------------------------------------------------------------------------
28 #include "AliMCEventHandler.h"
29 #include "AliMCEvent.h"
31 #include "AliTrackReference.h"
32 #include "AliHeader.h"
38 #include <TParticle.h>
40 #include <TClonesArray.h>
41 #include <TDirectoryFile.h>
43 ClassImp(AliMCEventHandler)
45 AliMCEventHandler::AliMCEventHandler() :
47 fMCEvent(new AliMCEvent()),
58 fPathName(new TString("./")),
65 // Default constructor
67 // Be sure to add all particles to the PDG database
68 AliPDG::AddParticlesToPdgDataBase();
71 AliMCEventHandler::AliMCEventHandler(const char* name, const char* title) :
72 AliVEventHandler(name, title),
73 fMCEvent(new AliMCEvent()),
84 fPathName(new TString("./")),
93 // Be sure to add all particles to the PDG database
94 AliPDG::AddParticlesToPdgDataBase();
96 AliMCEventHandler::~AliMCEventHandler()
105 Bool_t AliMCEventHandler::Init(Option_t* opt)
109 if (!(strcmp(opt, "proof")) || !(strcmp(opt, "local"))) return kTRUE;
111 fFileE = TFile::Open(Form("%sgalice.root", fPathName->Data()));
112 if (!fFileE) AliFatal(Form("AliMCEventHandler:galice.root not found in directory %s ! \n", fPathName->Data()));
116 fFileE->GetObject("TE", fTreeE);
117 // Connect Tree E to the MCEvent
118 fMCEvent->ConnectTreeE(fTreeE);
119 fNEvent = fTreeE->GetEntries();
122 fFileK = TFile::Open(Form("%sKinematics%s.root", fPathName->Data(), fExtension));
123 if (!fFileK) AliFatal(Form("AliMCEventHandler:Kinematics.root not found in directory %s ! \n", fPathName));
124 fEventsPerFile = fFileK->GetNkeys() - fFileK->GetNProcessIDs();
128 fFileTR = TFile::Open(Form("%sTrackRefs%s.root", fPathName->Data(), fExtension));
129 if (!fFileTR) AliWarning(Form("AliMCEventHandler:TrackRefs.root not found in directory %s ! \n", fPathName->Data()));
132 // Reset the event number
135 printf("AliMCEvenHandler::Init() %d\n",__LINE__);
136 AliInfo(Form("AliMCEventHandler:Number of events in this directory %5d \n", fNEvent));
140 Bool_t AliMCEventHandler::GetEvent(Int_t iev)
142 // Load the event number iev
144 // Calculate the file number
145 Int_t inew = iev / fEventsPerFile;
146 if (inew != fFileNumber) {
148 if (!OpenFile(fFileNumber)){
154 sprintf(folder, "Event%d", iev);
156 fTreeE->GetEntry(iev);
158 fFileK->GetObject(folder, fDirK);
160 AliWarning(Form("AliMCEventHandler: Event #%5d not found\n", iev));
163 fDirK ->GetObject("TreeK", fTreeK);
164 // Connect TreeK to MCEvent
165 fMCEvent->ConnectTreeK(fTreeK);
168 // Check which format has been read
169 fFileTR->GetObject(folder, fDirTR);
170 fDirTR->GetObject("TreeTR", fTreeTR);
172 // Connect TR to MCEvent
173 fMCEvent->ConnectTreeTR(fTreeTR);
179 Bool_t AliMCEventHandler::OpenFile(Int_t i)
184 fExtension = Form("%d", i);
191 fFileK = TFile::Open(Form("%sKinematics%s.root", fPathName->Data(), fExtension));
193 AliFatal(Form("AliMCEventHandler:Kinematics%s.root not found in directory %s ! \n", fExtension, fPathName->Data()));
198 fFileTR = TFile::Open(Form("%sTrackRefs%s.root", fPathName->Data(), fExtension));
200 AliWarning(Form("AliMCEventHandler:TrackRefs%s.root not found in directory %s ! \n", fExtension, fPathName->Data()));
207 Bool_t AliMCEventHandler::BeginEvent(Long64_t entry)
209 // Read the next event
217 if (entry >= fNEvent) {
218 AliWarning(Form("AliMCEventHandler: Event number out of range %5d %5d\n", entry,fNEvent));
221 return GetEvent(entry);
224 Int_t AliMCEventHandler::GetParticleAndTR(Int_t i, TParticle*& particle, TClonesArray*& trefs)
227 return (fMCEvent->GetParticleAndTR(i, particle, trefs));
230 void AliMCEventHandler::DrawCheck(Int_t i, Int_t search)
232 // Retrieve entry i and draw momentum vector and hits
233 fMCEvent->DrawCheck(i, search);
236 Bool_t AliMCEventHandler::Notify(const char *path)
238 // Notify about directory change
239 // The directory is taken from the 'path' argument
241 TString fileName(path);
242 if(fileName.Contains("AliESDs.root")){
243 fileName.ReplaceAll("AliESDs.root", "");
245 else if(fileName.Contains("AliAOD.root")){
246 fileName.ReplaceAll("AliAOD.root", "");
248 else if(fileName.Contains("galice.root")){
249 // for running with galice and kinematics alone...
250 fileName.ReplaceAll("galice.root", "");
253 *fPathName = fileName;
254 printf("AliMCEventHandler::Notify() Path: %s\n", fPathName->Data());
262 void AliMCEventHandler::ResetIO()
264 // Clear header and stack
268 delete fTreeE; fTreeE = 0;
271 if (fFileE) {delete fFileE; fFileE = 0;}
272 if (fFileK) {delete fFileK; fFileK = 0;}
273 if (fFileTR) {delete fFileTR; fFileTR = 0;}
278 Bool_t AliMCEventHandler::FinishEvent()
280 // Clean-up after each event
281 delete fDirTR; fDirTR = 0;
282 delete fDirK; fDirK = 0;
283 fMCEvent->FinishEvent();
287 Bool_t AliMCEventHandler::Terminate()
293 Bool_t AliMCEventHandler::TerminateIO()
300 void AliMCEventHandler::SetInputPath(const char* fname)
302 // Set the input path name
304 fPathName = new TString(fname);