]> git.uio.no Git - u/mrichter/AliRoot.git/blob - STEER/AliMCEventHandler.cxx
adding first version of common HLT track data struct for barrel tracks
[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 "AliPDG.h"
31 #include "AliTrackReference.h"
32 #include "AliHeader.h"
33 #include "AliStack.h"
34 #include "AliLog.h"
35
36 #include <TTree.h>
37 #include <TFile.h>
38 #include <TParticle.h>
39 #include <TString.h>
40 #include <TClonesArray.h>
41 #include <TDirectoryFile.h>
42
43 ClassImp(AliMCEventHandler)
44
45 AliMCEventHandler::AliMCEventHandler() :
46     AliVEventHandler(),
47     fMCEvent(new AliMCEvent()),
48     fFileE(0),
49     fFileK(0),
50     fFileTR(0),
51     fTreeE(0),
52     fTreeK(0),
53     fTreeTR(0),
54     fDirK(0),
55     fDirTR(0),
56     fNEvent(-1),
57     fEvent(-1),
58     fPathName(new TString("./")),
59     fExtension(""),
60     fFileNumber(0),
61     fEventsPerFile(0),
62     fReadTR(kTRUE)
63 {
64   //
65   // Default constructor
66   //
67   // Be sure to add all particles to the PDG database
68   AliPDG::AddParticlesToPdgDataBase();
69 }
70
71 AliMCEventHandler::AliMCEventHandler(const char* name, const char* title) :
72     AliVEventHandler(name, title),
73     fMCEvent(new AliMCEvent()),
74     fFileE(0),
75     fFileK(0),
76     fFileTR(0),
77     fTreeE(0),
78     fTreeK(0),
79     fTreeTR(0),
80     fDirK(0),
81     fDirTR(0),
82     fNEvent(-1),
83     fEvent(-1),
84     fPathName(new TString("./")),
85     fExtension(""),
86     fFileNumber(0),
87     fEventsPerFile(0),
88     fReadTR(kTRUE)
89 {
90   //
91   // Constructor
92   //
93   // Be sure to add all particles to the PDG database
94   AliPDG::AddParticlesToPdgDataBase();
95 }
96 AliMCEventHandler::~AliMCEventHandler()
97
98     // Destructor
99     delete fMCEvent;
100     delete fFileE;
101     delete fFileK;
102     delete fFileTR;
103 }
104
105 Bool_t AliMCEventHandler::Init(Option_t* opt)
106
107     // Initialize input
108     //
109     if (!(strcmp(opt, "proof")) || !(strcmp(opt, "local"))) return kTRUE;
110     //
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()));
113
114     //
115     // Tree E
116     fFileE->GetObject("TE", fTreeE);
117     // Connect Tree E to the MCEvent
118     fMCEvent->ConnectTreeE(fTreeE);
119     fNEvent = fTreeE->GetEntries();
120     //
121     // Tree K
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();
125     //
126     // Tree TR
127     if (fReadTR) {
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()));
130     }
131     //
132     // Reset the event number
133     fEvent      = -1;
134     fFileNumber =  0;
135     AliInfo(Form("Number of events in this directory %5d \n", fNEvent));
136     return kTRUE;
137 }
138
139 Bool_t AliMCEventHandler::GetEvent(Int_t iev)
140 {
141     // Load the event number iev
142     //
143     // Calculate the file number
144     Int_t inew  = iev / fEventsPerFile;
145     if (inew != fFileNumber) {
146         fFileNumber = inew;
147         if (!OpenFile(fFileNumber)){
148             return kFALSE;
149         }
150     }
151     // Folder name
152     char folder[20];
153     sprintf(folder, "Event%d", iev);
154     // TreeE
155     fTreeE->GetEntry(iev);
156     // Tree K
157     fFileK->GetObject(folder, fDirK);
158     if (!fDirK) {
159         AliWarning(Form("AliMCEventHandler: Event #%5d not found\n", iev));
160         return kFALSE;
161     }
162     fDirK ->GetObject("TreeK", fTreeK);
163     // Connect TreeK to MCEvent
164     fMCEvent->ConnectTreeK(fTreeK);
165     //Tree TR 
166     if (fFileTR) {
167         // Check which format has been read
168         fFileTR->GetObject(folder, fDirTR);
169         fDirTR->GetObject("TreeTR", fTreeTR);
170         //
171         // Connect TR to MCEvent
172         fMCEvent->ConnectTreeTR(fTreeTR);
173     }
174     //
175     return kTRUE;
176 }
177
178 Bool_t AliMCEventHandler::OpenFile(Int_t i)
179 {
180     // Open file i
181     Bool_t ok = kTRUE;
182     if (i > 0) {
183         fExtension = Form("%d", i);
184     } else {
185         fExtension = "";
186     }
187     
188     
189     delete fFileK;
190     fFileK = TFile::Open(Form("%sKinematics%s.root", fPathName->Data(), fExtension));
191     if (!fFileK) {
192         AliFatal(Form("AliMCEventHandler:Kinematics%s.root not found in directory %s ! \n", fExtension, fPathName->Data()));
193         ok = kFALSE;
194     }
195     
196     delete fFileTR;
197     fFileTR = TFile::Open(Form("%sTrackRefs%s.root", fPathName->Data(), fExtension));
198     if (!fFileTR) {
199         AliWarning(Form("AliMCEventHandler:TrackRefs%s.root not found in directory %s ! \n", fExtension, fPathName->Data()));
200         ok = kFALSE;
201     }
202     
203     return ok;
204 }
205
206 Bool_t AliMCEventHandler::BeginEvent(Long64_t entry)
207
208     // Read the next event
209     if (entry == -1) {
210         fEvent++;
211         entry = fEvent;
212     } else {
213         fEvent = entry;
214     }
215
216     if (entry >= fNEvent) {
217         AliWarning(Form("AliMCEventHandler: Event number out of range %5d %5d\n", entry,fNEvent));
218         return kFALSE;
219     }
220     return GetEvent(entry);
221 }
222
223 Int_t AliMCEventHandler::GetParticleAndTR(Int_t i, TParticle*& particle, TClonesArray*& trefs)
224 {
225     // Retrieve entry i
226     return (fMCEvent->GetParticleAndTR(i, particle, trefs));
227 }
228
229 void AliMCEventHandler::DrawCheck(Int_t i, Int_t search)
230 {
231     // Retrieve entry i and draw momentum vector and hits
232     fMCEvent->DrawCheck(i, search);
233 }
234
235 Bool_t AliMCEventHandler::Notify(const char *path)
236 {
237   // Notify about directory change
238   // The directory is taken from the 'path' argument
239   // Reconnect trees
240     TString fileName(path);
241     if(fileName.Contains("AliESDs.root")){
242         fileName.ReplaceAll("AliESDs.root", "");
243     }
244     else if(fileName.Contains("AliAOD.root")){
245         fileName.ReplaceAll("AliAOD.root", "");
246     }
247     else if(fileName.Contains("galice.root")){
248         // for running with galice and kinematics alone...
249         fileName.ReplaceAll("galice.root", "");
250     }
251     
252     *fPathName = fileName;
253     AliInfo(Form("Notify() Path: %s\n", fPathName->Data()));
254     
255     ResetIO();
256     InitIO("");
257
258     return kTRUE;
259 }
260
261 void AliMCEventHandler::ResetIO()
262 {
263 //  Clear header and stack
264     fMCEvent->Clean();
265     
266 // Delete Tree E
267     delete fTreeE; fTreeE = 0;
268
269 // Reset files
270     if (fFileE)  {delete fFileE;  fFileE  = 0;}
271     if (fFileK)  {delete fFileK;  fFileK  = 0;}
272     if (fFileTR) {delete fFileTR; fFileTR = 0;}
273     fExtension="";
274 }
275
276                             
277 Bool_t AliMCEventHandler::FinishEvent()
278 {
279     // Clean-up after each event
280     delete fDirTR;  fDirTR = 0;
281     delete fDirK;   fDirK  = 0;    
282     fMCEvent->FinishEvent();
283     return kTRUE;
284 }
285
286 Bool_t AliMCEventHandler::Terminate()
287
288     // Dummy 
289     return kTRUE;
290 }
291
292 Bool_t AliMCEventHandler::TerminateIO()
293
294     // Dummy
295     return kTRUE;
296 }
297     
298
299 void AliMCEventHandler::SetInputPath(const char* fname)
300 {
301     // Set the input path name
302     delete fPathName;
303     fPathName = new TString(fname);
304 }