Pass event number as argument of AliVEventHandler::BeginEvent
[u/mrichter/AliRoot.git] / STEER / AliMCEventHandler.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
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  **************************************************************************/
15
16 /* $Id$ */
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.
22 //      
23 // Origin: Andreas Morsch, CERN, andreas.morsch@cern.ch 
24 //---------------------------------------------------------------------------------
25
26
27
28 #include "AliMCEventHandler.h"
29 #include "AliMCEvent.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
42 ClassImp(AliMCEventHandler)
43
44 AliMCEventHandler::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     fNEvent(-1),
56     fEvent(-1),
57     fPathName(new TString("./")),
58     fExtension(""),
59     fFileNumber(0),
60     fEventsPerFile(0),
61     fReadTR(kTRUE)
62 {
63     // Default constructor
64 }
65
66 AliMCEventHandler::AliMCEventHandler(const char* name, const char* title) :
67     AliVEventHandler(name, title),
68     fMCEvent(new AliMCEvent()),
69     fFileE(0),
70     fFileK(0),
71     fFileTR(0),
72     fTreeE(0),
73     fTreeK(0),
74     fTreeTR(0),
75     fDirK(0),
76     fDirTR(0),
77     fNEvent(-1),
78     fEvent(-1),
79     fPathName(new TString("./")),
80     fExtension(""),
81     fFileNumber(0),
82     fEventsPerFile(0)
83 {
84     // Constructor
85 }
86 AliMCEventHandler::~AliMCEventHandler()
87
88     // Destructor
89     delete fMCEvent;
90     delete fFileE;
91     delete fFileK;
92     delete fFileTR;
93 }
94
95 Bool_t AliMCEventHandler::InitIO(Option_t* opt)
96
97     // Initialize input
98     //
99     if (!(strcmp(opt, "proof")) || !(strcmp(opt, "local"))) return kTRUE;
100     //
101
102     fFileE = TFile::Open(Form("%sgalice.root", fPathName->Data()));
103     if (!fFileE) AliFatal(Form("AliMCEventHandler:galice.root not found in directory %s ! \n", fPathName->Data()));
104
105     //
106     // Tree E
107     fFileE->GetObject("TE", fTreeE);
108     // Connect Tree E to the MCEvent
109     fMCEvent->ConnectTreeE(fTreeE);
110     fNEvent = fTreeE->GetEntries();
111     //
112     // Tree K
113     fFileK = TFile::Open(Form("%sKinematics%s.root", fPathName->Data(), fExtension));
114     if (!fFileK) AliFatal(Form("AliMCEventHandler:Kinematics.root not found in directory %s ! \n", fPathName));
115     fEventsPerFile = fFileK->GetNkeys() - fFileK->GetNProcessIDs();
116     //
117     // Tree TR
118     if (fReadTR) {
119       fFileTR = TFile::Open(Form("%sTrackRefs%s.root", fPathName->Data(), fExtension));
120       if (!fFileTR) AliWarning(Form("AliMCEventHandler:TrackRefs.root not found in directory %s ! \n", fPathName->Data()));
121     }
122     //
123     // Reset the event number
124     fEvent      = -1;
125     fFileNumber =  0;
126     
127     AliInfo(Form("AliMCEventHandler:Number of events in this directory %5d \n", fNEvent));
128     return kTRUE;
129 }
130
131 Bool_t AliMCEventHandler::GetEvent(Int_t iev)
132 {
133     // Load the event number iev
134     //
135     // Calculate the file number
136     Int_t inew  = iev / fEventsPerFile;
137     if (inew != fFileNumber) {
138         fFileNumber = inew;
139         if (!OpenFile(fFileNumber)){
140             return kFALSE;
141         }
142     }
143     // Folder name
144     char folder[20];
145     sprintf(folder, "Event%d", iev);
146     // TreeE
147     fTreeE->GetEntry(iev);
148     // Tree K
149     fFileK->GetObject(folder, fDirK);
150     if (!fDirK) {
151         AliWarning(Form("AliMCEventHandler: Event #%5d not found\n", iev));
152         return kFALSE;
153     }
154     fDirK ->GetObject("TreeK", fTreeK);
155     // Connect TreeK to MCEvent
156     fMCEvent->ConnectTreeK(fTreeK);
157     //Tree TR 
158     if (fFileTR) {
159         // Check which format has been read
160         fFileTR->GetObject(folder, fDirTR);
161         fDirTR->GetObject("TreeTR", fTreeTR);
162         //
163         // Connect TR to MCEvent
164         fMCEvent->ConnectTreeTR(fTreeTR);
165     }
166     //
167     return kTRUE;
168 }
169
170 Bool_t AliMCEventHandler::OpenFile(Int_t i)
171 {
172     // Open file i
173     Bool_t ok = kTRUE;
174     if (i > 0) {
175         fExtension = Form("%d", i);
176     } else {
177         fExtension = "";
178     }
179     
180     
181     delete fFileK;
182     fFileK = TFile::Open(Form("%sKinematics%s.root", fPathName->Data(), fExtension));
183     if (!fFileK) {
184         AliFatal(Form("AliMCEventHandler:Kinematics%s.root not found in directory %s ! \n", fExtension, fPathName->Data()));
185         ok = kFALSE;
186     }
187     
188     delete fFileTR;
189     fFileTR = TFile::Open(Form("%sTrackRefs%s.root", fPathName->Data(), fExtension));
190     if (!fFileTR) {
191         AliWarning(Form("AliMCEventHandler:TrackRefs%s.root not found in directory %s ! \n", fExtension, fPathName->Data()));
192         ok = kFALSE;
193     }
194     
195     return ok;
196 }
197
198 Bool_t AliMCEventHandler::BeginEvent(Long64_t entry)
199
200     // Read the next event
201     if (entry == -1) {
202         fEvent++;
203         entry = fEvent;
204     } else {
205         fEvent = entry;
206     }
207
208     if (entry >= fNEvent) {
209         AliWarning(Form("AliMCEventHandler: Event number out of range %5d\n", entry));
210         return kFALSE;
211     }
212     return GetEvent(entry);
213 }
214
215 Int_t AliMCEventHandler::GetParticleAndTR(Int_t i, TParticle*& particle, TClonesArray*& trefs)
216 {
217     // Retrieve entry i
218     return (fMCEvent->GetParticleAndTR(i, particle, trefs));
219 }
220
221 void AliMCEventHandler::DrawCheck(Int_t i, Int_t search)
222 {
223     // Retrieve entry i and draw momentum vector and hits
224     fMCEvent->DrawCheck(i, search);
225 }
226
227 Bool_t AliMCEventHandler::Notify(const char *path)
228 {
229   // Notify about directory change
230   // The directory is taken from the 'path' argument
231   // Reconnect trees
232     TString fileName(path);
233     if(fileName.Contains("AliESDs.root")){
234         fileName.ReplaceAll("AliESDs.root", "");
235     }
236     else if(fileName.Contains("galice.root")){
237         // for running with galice and kinematics alone...
238         fileName.ReplaceAll("galice.root", "");
239     }
240     
241     *fPathName = fileName;
242     printf("AliMCEventHandler::Notify() Path: %s\n", fPathName->Data());
243     
244     ResetIO();
245     InitIO("");
246     return kTRUE;
247 }
248     
249 void AliMCEventHandler::ResetIO()
250 {
251 //  Clear header and stack
252     fMCEvent->Clean();
253     
254 // Delete Tree E    
255     delete fTreeE; fTreeE = 0;
256     
257 // Reset files
258     if (fFileE)  delete fFileE;
259     if (fFileK)  delete fFileK;
260     if (fFileTR) delete fFileTR;
261 }
262
263                             
264 Bool_t AliMCEventHandler::FinishEvent()
265 {
266     // Clean-up after each event
267     delete fDirTR;  fDirTR = 0;
268     delete fDirK;   fDirK  = 0;    
269     fMCEvent->FinishEvent();
270     return kTRUE;
271 }
272
273 Bool_t AliMCEventHandler::Terminate()
274
275     // Dummy 
276     return kTRUE;
277 }
278
279 Bool_t AliMCEventHandler::TerminateIO()
280
281     // Dummy
282     return kTRUE;
283 }
284     
285
286 void AliMCEventHandler::SetInputPath(char* fname)
287 {
288     // Set the input path name
289     delete fPathName;
290     fPathName = new TString(fname);
291 }