]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGLF/FORWARD/analysis2/AliMCAuxHandler.cxx
Merge branch 'feature-movesplit'
[u/mrichter/AliRoot.git] / PWGLF / FORWARD / analysis2 / AliMCAuxHandler.cxx
CommitLineData
2e658fb9 1#include "AliMCAuxHandler.h"
2#include "AliAnalysisManager.h"
3#include <TError.h>
4#include <AliLog.h>
5#include <TFile.h>
6#include <TClonesArray.h>
7#include <TROOT.h>
0b7de667 8#include <TSystem.h>
2e658fb9 9#include <AliStack.h>
10#include <AliMCEvent.h>
11
12ClassImp(AliMCAuxHandler)
13#if 0 // For Emacs - do not remove
14;
15#endif
16
17//____________________________________________________________________
18AliMCAuxHandler::AliMCAuxHandler(const char* name,
19 const char* what,
20 AliMCEventHandler* parent)
21 : AliMCEventHandler(name, what),
22 fParent(parent),
23 fFile(0),
24 fTree(0),
25 fDir(0),
26 fArray(0),
27 fNEvents(0),
28 fNEventsPerFile(0),
29 fNEventsInContainer(0),
30 fEvent(0),
31 fFileNumber(0),
32 fTreeName(""),
33 fFileBase("")
34{
35 // Constructor
36 //
37 // Parameters:
38 // name The name
39}
40
41//____________________________________________________________________
42TString*
43AliMCAuxHandler::GetParentPath() const
44{
45 if (!fParent) {
46 AliWarning("No parent");
47 return 0;
48 }
49 return fParent->GetInputPath();
50}
51
52//____________________________________________________________________
53Bool_t
54AliMCAuxHandler::Init(Option_t* opt)
55{
56 // Initialize the input
57 //
58 // @param opt Options
59 //
60 // @return true on success
61 AliDebugF(10,"AliMCAuxHandler::Init(\"%s\")", opt);
0b7de667 62 // Info("","AliMCAuxHandler::Init(\"%s\") - detector: %s, class: %s",
63 // opt, GetName(), GetTitle());
2e658fb9 64
65 TString option(opt);
0b7de667 66 if (option.EqualTo("proof") ||
67 option.EqualTo("local") ||
68 option.EqualTo("lite")) return true;
2e658fb9 69
70 TString t = "Tree";
71 TString b = "";
72 TClass* cl = gROOT->GetClass(GetTitle());
73 if (cl) {
74 if (cl->InheritsFrom("AliHit")) {
75 t += "H";
76 b = "Hits";
77 }
78 else if (cl->InheritsFrom("AliSDigit")) {
79 t += "S";
80 b = "SDigits";
81 }
82 else if (cl->InheritsFrom("AliDigit")) {
83 t += "D";
84 b = "Digits";
85 }
86 else
87 t = "";
88 }
0b7de667 89 else {
90 AliWarningF("Couldn't get the class description of %s", GetTitle());
91 AliWarning("The list of loaded libraries is");
92 gSystem->ListLibraries("");
93 return false;
94 }
95
96 // Info("Init", "Tree-name: %s, file-base: %s", t.Data(), b.Data());
2e658fb9 97 if (!t.IsNull()) fTreeName = t;
98 if (!b.IsNull()) fFileBase = b;
99
100
101 fArray = new TClonesArray(GetTitle());
102
103 TTree* treeE = fParent->GetTree();
104 if (!treeE) {
105 AliError("Parent does not have an events tree");
106 return false;
107 }
108
109 // Get number of events in this directory
110 fNEventsPerFile = -1;
111 fNEvents = treeE->GetEntries();
112 fEvent = 0;
113 fFileNumber = 0;
114
115 if (!OpenFile(fFileNumber)) return false;
116
117 return true;
118}
119//____________________________________________________________________
120Bool_t
121AliMCAuxHandler::BeginEvent(Long64_t entry)
122{
123 // Called at the beginning of an event
124 //
125 // @param entry Entry in tree
126 //
127 // @return true on success
128 AliDebugF(10,"AliMCAuxHandler::BeginEvent(%lld)", entry);
0b7de667 129 // Info("","AliMCAuxHandler::BeginEvent(%lld)", entry);
2e658fb9 130
131 if (entry == -1)
132 fEvent++;
133 else
134 fEvent = entry;
135
136 if (fEvent >= fNEvents) {
137 AliWarningF("Event number out of range %d/%d", fEvent, fNEvents);
138 return false;
139 }
140
141 if (fNEventsPerFile < 0) {
142 TTree* treeK = fParent->TreeK();
143 if (!treeK) {
144 AliError("Parent does not have a kinematics tree");
145 return false;
146 }
147
148 TFile* fileK = treeK->GetCurrentFile();
149 if (!fileK) {
150 AliError("Kinematics tree has no associated file");
151 return false;
152 }
153 // Get the number of events per file
154 fNEventsPerFile = fileK->GetNkeys() - fileK->GetNProcessIDs();
155 }
156 return LoadEvent(fEvent);
157}
158//____________________________________________________________________
159Bool_t
160AliMCAuxHandler::Notify(const char* path)
161{
162 // Called when the input file is changed
163 //
164 // @param path New path
165 //
166 // @return true on success
167 AliDebugF(10,"AliMCAuxHandler::Notify(\"%s\")", path);
0b7de667 168 // Info("","AliMCAuxHandler::Notify(\"%s\")", path);
2e658fb9 169 return true;
170}
171//____________________________________________________________________
172Bool_t
173AliMCAuxHandler::FinishEvent()
174{
175 // Called at the end of an event
176 //
177 // @return true on success
0b7de667 178 // AliDebug(10,"AliMCAuxHandler::FinishEvent()");
2e658fb9 179 return true;
180}
181//____________________________________________________________________
182Bool_t
183AliMCAuxHandler::Terminate()
184{
185 // Called at the end of a job
186 //
187 // @return true on success
188 AliDebug(10,"AliMCAuxHandler::Terminate()");
189 return true;
190}
191//____________________________________________________________________
192Bool_t
193AliMCAuxHandler::TerminateIO()
194{
195 // Called at the end of a sub-job
196 //
197 // @return true on success
198 AliDebug(10,"AliMCAuxHandler::TerminateIO()");
199 return true;
200}
201
202//____________________________________________________________________
203void
204AliMCAuxHandler::ResetIO()
205{
206 // Reset the I/O
207 //
208 //
209 AliDebug(10,"AliMCAuxHandler::ResetIO()");
210
211 TString* path = GetParentPath();
212 AliDebugF(10,"Got parent path %s", path ? path->Data() : "null");
0b7de667 213 // Info("ResetIO","Got parent path %s", path ? path->Data() : "null");
2e658fb9 214
215 if (fFile) {
216 delete fFile;
217 fFile = 0;
218 }
219}
220//____________________________________________________________________
221Bool_t
222AliMCAuxHandler::OpenFile(Int_t fileNo)
223{
224 TString* path = GetParentPath();
225 AliDebugF(10,"Got parent path %s", path ? path->Data() : "null");
0b7de667 226 // Info("OpenFile","Got parent path %s", path ? path->Data() : "null");
2e658fb9 227 if (!path) return false;
228
229 TString ext("");
230 if (fileNo > 0) ext = TString::Format("%d", fileNo);
231
232 TString w(GetTitle());
233 if (w.EndsWith("s")) w.Chop();
234
235 TString fn = TString::Format("%s%s.%s%s.root",
236 path->Data(), GetName(),
237 fFileBase.Data(), ext.Data());
0b7de667 238 AliDebugF(10,"Opening %s", fn.Data());
239 // Info("OpenFile", "Opening %s", fn.Data());
2e658fb9 240 fFile = TFile::Open(fn, "READ");
241 if (!fFile) {
242 AliErrorF("Failed to open %s", fn.Data());
243 return false;
244 }
245
246 return true;
247}
248
249//____________________________________________________________________
250Bool_t
251AliMCAuxHandler::LoadEvent(Int_t iev)
252{
253 // Load an event
254 //
255 // @param iev Event number
256 //
257 // @return true on success
258 AliDebugF(10,"AliMCAuxHandler::LoadEvent(%d)", iev);
0b7de667 259 // Info("","AliMCAuxHandler::LoadEvent(%d)", iev);
2e658fb9 260
261 Int_t iNew = iev / fNEventsPerFile;
262 if (iNew != fFileNumber) {
263 fFileNumber = iNew;
264 if (!OpenFile(fFileNumber)) return false;
265 }
266 if (!fFile) return false;
267
268 TString folder = TString::Format("Event%d", iev);
269 fFile->GetObject(folder, fDir);
270 if (!fDir) {
271 AliWarningF("Folder %s not found in file", folder.Data());
272 return false;
273 }
274
275 fDir->GetObject(fTreeName, fTree);
276 if (!fTree) {
277 AliWarningF("Folder %s does not contain the %s tree %s",
278 folder.Data(), GetTitle(), fTreeName.Data());
279 return false;
280 }
281
282 fTree->SetBranchAddress(GetName(), &fArray);
283 return true;
284}
285
286//____________________________________________________________________
287Int_t
288AliMCAuxHandler::GetNEntry() const
289{
290 if (!fTree) return 0;
291 return fTree->GetEntries();
292}
293
294//____________________________________________________________________
295TClonesArray*
296AliMCAuxHandler::GetEntryArray(Int_t entry)
297{
298 if (!fTree) return 0;
299 if (!fArray) return 0;
300 if (entry < 0 || entry >= fTree->GetEntries()) {
301 AliErrorF("Entry # %d out of bounds [0,%lld]",
302 entry, fTree->GetEntries());
303 return 0;
304 }
305 fArray->Clear();
306
307 if (fTree->GetEntry(entry) <= 0) return 0;
308
309 return fArray;
310}
311
312
313//____________________________________________________________________
314AliMCAuxHandler*
315AliMCAuxHandler::Create(const char* name, const char* what)
316{
317 AliAnalysisManager* mgr = AliAnalysisManager::GetAnalysisManager();
318 if (!mgr) {
319 ::Error("AliMCAuxHandler::Create", "No analysis manager");
320 return 0;
321 }
322
323 AliVEventHandler* vmc = mgr->GetMCtruthEventHandler();
324 if (!vmc) {
325 ::Error("AliMCAuxHandler::Create", "No MC truth handler");
326 return 0;
327 }
328
329 AliMCEventHandler* mc = dynamic_cast<AliMCEventHandler*>(vmc);
330 if (!mc) {
331 ::Error("AliMCAuxHandler::Create",
332 "MC truth handler not a AliMCEventHandler, but %s",
333 vmc->ClassName());
334 return 0;
335 }
336
337 AliMCAuxHandler* ret = new AliMCAuxHandler(name, what, mc);
338 mc->AddSubsidiaryHandler(ret);
339
340 return ret;
341}
342
343//____________________________________________________________________
344TClonesArray*
345AliMCAuxHandler::GetParticleArray(AliMCAuxHandler* handler,
346 Int_t particle)
347{
348 if (!handler) {
349 ::Error("AliMCAuxHandler::GetArray", "No handler passed");
350 return 0;
351 }
352
353 AliMCEventHandler* mc = handler->GetParent();
354 if (!mc) {
355 ::Error("AliMCAuxHandler::GetArray", "Handler has no parent");
356 return 0;
357 }
358
359 AliMCEvent* event = mc->MCEvent();
360 if (!event) {
361 ::Error("AliMCAuxHandler::GetArray", "No MC event");
362 return 0;
363 }
364
365 AliStack* stack = event->Stack();
289715c8 366 if (!stack) {
2e658fb9 367 ::Error("AliMCAuxHandler::GetArray", "Event has no stack");
368 return 0;
369 }
370
371 handler->GetArray()->Clear();
372 TTree* tree = handler->GetTree();
373 if (!tree) {
374 ::Error("AliMCAuxHandler::GetArray", "Handler has no tree");
375 return 0;
376 }
377
378 Int_t treeIdx = stack->TreeKEntry(particle);
379 if (treeIdx < 0 || treeIdx >= tree->GetEntries()) {
380 ::Error("AliMCAuxHandler::GetArray",
381 "Index %d of %d out of bounds [0,%lld]", treeIdx, particle,
382 tree->GetEntries()-1);
383 return 0;
384 }
385
386 tree->GetEntry(treeIdx);
387
388 return handler->GetArray();
389}
390
391
392
393//____________________________________________________________________
394//
395// EOF
396//