]> git.uio.no Git - u/mrichter/AliRoot.git/blob - STEER/AliMCEventHandler.cxx
fix calling of InitIO, Undo changes
[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     fFileE = TFile::Open(Form("%sgalice.root", fPathName->Data()));
102     if (!fFileE) AliFatal(Form("AliMCEventHandler:galice.root not found in directory %s ! \n", fPathName->Data()));
103
104     //
105     // Tree E
106     fFileE->GetObject("TE", fTreeE);
107     // Connect Tree E to the MCEvent
108     fMCEvent->ConnectTreeE(fTreeE);
109     fNEvent = fTreeE->GetEntries();
110     //
111     // Tree K
112     fFileK = TFile::Open(Form("%sKinematics%s.root", fPathName->Data(), fExtension));
113     if (!fFileK) AliFatal(Form("AliMCEventHandler:Kinematics.root not found in directory %s ! \n", fPathName));
114     fEventsPerFile = fFileK->GetNkeys() - fFileK->GetNProcessIDs();
115     //
116     // Tree TR
117     if (fReadTR) {
118       fFileTR = TFile::Open(Form("%sTrackRefs%s.root", fPathName->Data(), fExtension));
119       if (!fFileTR) AliWarning(Form("AliMCEventHandler:TrackRefs.root not found in directory %s ! \n", fPathName->Data()));
120     }
121     //
122     // Reset the event number
123     fEvent      = -1;
124     fFileNumber =  0;
125     printf("AliMCEvenHandler::Init() %d\n",__LINE__);
126     AliInfo(Form("AliMCEventHandler:Number of events in this directory %5d \n", fNEvent));
127     return kTRUE;
128 }
129
130 Bool_t AliMCEventHandler::GetEvent(Int_t iev)
131 {
132     // Load the event number iev
133     //
134     // Calculate the file number
135     Int_t inew  = iev / fEventsPerFile;
136     if (inew != fFileNumber) {
137         fFileNumber = inew;
138         if (!OpenFile(fFileNumber)){
139             return kFALSE;
140         }
141     }
142     // Folder name
143     char folder[20];
144     sprintf(folder, "Event%d", iev);
145     // TreeE
146     fTreeE->GetEntry(iev);
147     // Tree K
148     fFileK->GetObject(folder, fDirK);
149     if (!fDirK) {
150         AliWarning(Form("AliMCEventHandler: Event #%5d not found\n", iev));
151         return kFALSE;
152     }
153     fDirK ->GetObject("TreeK", fTreeK);
154     // Connect TreeK to MCEvent
155     fMCEvent->ConnectTreeK(fTreeK);
156     //Tree TR 
157     if (fFileTR) {
158         // Check which format has been read
159         fFileTR->GetObject(folder, fDirTR);
160         fDirTR->GetObject("TreeTR", fTreeTR);
161         //
162         // Connect TR to MCEvent
163         fMCEvent->ConnectTreeTR(fTreeTR);
164     }
165     //
166     return kTRUE;
167 }
168
169 Bool_t AliMCEventHandler::OpenFile(Int_t i)
170 {
171     // Open file i
172     Bool_t ok = kTRUE;
173     if (i > 0) {
174         fExtension = Form("%d", i);
175     } else {
176         fExtension = "";
177     }
178     
179     
180     delete fFileK;
181     fFileK = TFile::Open(Form("%sKinematics%s.root", fPathName->Data(), fExtension));
182     if (!fFileK) {
183         AliFatal(Form("AliMCEventHandler:Kinematics%s.root not found in directory %s ! \n", fExtension, fPathName->Data()));
184         ok = kFALSE;
185     }
186     
187     delete fFileTR;
188     fFileTR = TFile::Open(Form("%sTrackRefs%s.root", fPathName->Data(), fExtension));
189     if (!fFileTR) {
190         AliWarning(Form("AliMCEventHandler:TrackRefs%s.root not found in directory %s ! \n", fExtension, fPathName->Data()));
191         ok = kFALSE;
192     }
193     
194     return ok;
195 }
196
197 Bool_t AliMCEventHandler::BeginEvent(Long64_t entry)
198
199     // Read the next event
200     if (entry == -1) {
201         fEvent++;
202         entry = fEvent;
203     } else {
204         fEvent = entry;
205     }
206
207     if (entry >= fNEvent) {
208         AliWarning(Form("AliMCEventHandler: Event number out of range %5d %5d\n", entry,fNEvent));
209         return kFALSE;
210     }
211     return GetEvent(entry);
212 }
213
214 Int_t AliMCEventHandler::GetParticleAndTR(Int_t i, TParticle*& particle, TClonesArray*& trefs)
215 {
216     // Retrieve entry i
217     return (fMCEvent->GetParticleAndTR(i, particle, trefs));
218 }
219
220 void AliMCEventHandler::DrawCheck(Int_t i, Int_t search)
221 {
222     // Retrieve entry i and draw momentum vector and hits
223     fMCEvent->DrawCheck(i, search);
224 }
225
226 Bool_t AliMCEventHandler::Notify(const char *path)
227 {
228   // Notify about directory change
229   // The directory is taken from the 'path' argument
230   // Reconnect trees
231     TString fileName(path);
232     if(fileName.Contains("AliESDs.root")){
233         fileName.ReplaceAll("AliESDs.root", "");
234     }
235     else if(fileName.Contains("galice.root")){
236         // for running with galice and kinematics alone...
237         fileName.ReplaceAll("galice.root", "");
238     }
239     
240     *fPathName = fileName;
241     printf("AliMCEventHandler::Notify() Path: %s\n", fPathName->Data());
242     
243     ResetIO();
244     InitIO("");
245
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; fFileE = 0;
259     if (fFileK)  delete fFileK; fFileK = 0;
260     if (fFileTR) delete fFileTR; fFileTR = 0;
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 }