]> git.uio.no Git - u/mrichter/AliRoot.git/blame - STEER/AliESDInputHandler.cxx
More fixes for running on the grid
[u/mrichter/AliRoot.git] / STEER / AliESDInputHandler.cxx
CommitLineData
d3dd3d14 1/**************************************************************************
2 * Copyright(c) 1998-2007, 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//-------------------------------------------------------------------------
19// Event handler for ESD input
20// Author: Andreas Morsch, CERN
21//-------------------------------------------------------------------------
22
933fd60f 23#include <TTree.h>
1aa09fd1 24#include <TChain.h>
25#include <TFile.h>
26#include <TArchiveFile.h>
27#include <TObjArray.h>
28#include <TSystem.h>
300d5701 29#include <TString.h>
30#include <TObjString.h>
80e1b60a 31#include <TProcessID.h>
f0f29480 32#include <TMap.h>
d3dd3d14 33
34#include "AliESDInputHandler.h"
35#include "AliESDEvent.h"
620ad672 36#include "AliESDfriend.h"
b2af62ab 37#include "AliVCuts.h"
d3dd3d14 38#include "AliESD.h"
1aa09fd1 39#include "AliRunTag.h"
40#include "AliEventTag.h"
300d5701 41#include "AliLog.h"
9006fe9c 42#include "AliESDpid.h"
d3dd3d14 43
44ClassImp(AliESDInputHandler)
45
c2b6979d 46static Option_t *gESDDataType = "ESD";
47
d3dd3d14 48//______________________________________________________________________________
6989bff3 49AliESDInputHandler::AliESDInputHandler() :
50 AliInputEventHandler(),
0cd61c1d 51 fEvent(0x0),
620ad672 52 fFriend(0x0),
67675e42 53 fESDpid(0x0),
1aa09fd1 54 fAnalysisType(0),
4d2a7370 55 fNEvents(0),
6ccd727b 56 fHLTEvent(0x0),
57 fHLTTree(0x0),
58 fUseHLT(kFALSE),
f0f29480 59 fTagCutSumm(0x0),
1aa09fd1 60 fUseTags(kFALSE),
61 fChainT(0),
62 fTreeT(0),
98c482f7 63 fRunTag(0),
cec9e119 64 fEventTag(0),
038879cc 65 fReadFriends(0),
b626cd71 66 fFriendFileName("AliESDfriends.root")
d3dd3d14 67{
68 // default constructor
69}
70
71//______________________________________________________________________________
72AliESDInputHandler::~AliESDInputHandler()
73{
1aa09fd1 74 // destructor
cec9e119 75 if (fRunTag) delete fRunTag;
9006fe9c 76 delete fESDpid;
d3dd3d14 77}
78
79//______________________________________________________________________________
80AliESDInputHandler::AliESDInputHandler(const char* name, const char* title):
67675e42 81 AliInputEventHandler(name, title), fEvent(0x0), fFriend(0x0), fESDpid(0x0), fAnalysisType(0),
cec9e119 82 fNEvents(0), fHLTEvent(0x0), fHLTTree(0x0), fUseHLT(kFALSE), fTagCutSumm(0x0), fUseTags(kFALSE), fChainT(0), fTreeT(0), fRunTag(0), fEventTag(0), fReadFriends(0), fFriendFileName("AliESDfriends.root")
d3dd3d14 83{
e12e402c 84 // Constructor
d3dd3d14 85}
86
aaf2d706 87//______________________________________________________________________________
1aa09fd1 88Bool_t AliESDInputHandler::Init(TTree* tree, Option_t* opt)
d3dd3d14 89{
80ce1b4e 90 //
300d5701 91 // Initialisation necessary for each new tree
80ce1b4e 92 //
1aa09fd1 93 fAnalysisType = opt;
7b2a359f 94 fTree = tree;
300d5701 95
6073f8c9 96 if (!fTree) return kFALSE;
cd843abf 97// fTree->GetEntry(0);
6ccd727b 98
b481861d 99
efea3f54 100 if (!fEvent) fEvent = new AliESDEvent();
60996693 101 fEvent->ReadFromTree(fTree);
4d2a7370 102 fNEvents = fTree->GetEntries();
b890a10d 103
7b2a359f 104 if (fMixingHandler) fMixingHandler->Init(tree, opt);
b890a10d 105
d3dd3d14 106 return kTRUE;
107}
108
aaf2d706 109//______________________________________________________________________________
6ccd727b 110Bool_t AliESDInputHandler::BeginEvent(Long64_t entry)
d3dd3d14 111{
9b98c4df 112
d3dd3d14 113 // Copy from old to new format if necessary
aaf2d706 114 static Bool_t called = kFALSE;
115 if (!called && fEventCuts && IsUserCallSelectionMask())
116 AliInfo(Form("The ESD input handler expects that the first task calls AliESDInputHandler::CheckSelectionMask() %s", fEventCuts->ClassName()));
d7749dec 117 AliESD* old = ((AliESDEvent*) fEvent)->GetAliESDOld();
118 if (old) {
cec9e119 119 ((AliESDEvent*)fEvent)->CopyFromOldESD();
120 old->Reset();
d7749dec 121 }
6ccd727b 122
123 if (fHLTTree) {
124 fHLTTree->GetEntry(entry);
125 }
126
f0ee78b0 127 fNewEvent = kTRUE;
b2af62ab 128 //
129 // Event selection
130 //
aaf2d706 131 fIsSelectedResult = 0;
132 if (fEventCuts && !IsUserCallSelectionMask())
133 fIsSelectedResult = fEventCuts->GetSelectionMask((AliESDEvent*)fEvent);
620ad672 134 //
135 // Friends
136 ((AliESDEvent*)fEvent)->SetESDfriend(fFriend);
aaf2d706 137 called = kTRUE;
7b2a359f 138
cec9e119 139 if (fMixingHandler) fMixingHandler->BeginEvent(entry);
140 if (fUseTags && fRunTag) {
141 fEventTag = 0;
142 if (entry >= fRunTag->GetNEvents()) {
143 AliError(Form("Current event %d does not match max range from run tag: 0-%d", (Int_t)entry, fRunTag->GetNEvents()));
144 return kTRUE;
145 }
146 fEventTag = fRunTag->GetEventTag(entry);
147 }
d7749dec 148 return kTRUE;
d3dd3d14 149}
150
aaf2d706 151//______________________________________________________________________________
152void AliESDInputHandler::CheckSelectionMask()
153{
154// This method can be called by a task only if IsUserCallSelectionMask is true.
155 if (!fEventCuts || !IsUserCallSelectionMask()) return;
b2747f93 156 fIsSelectedResult = fEventCuts->GetSelectionMask((AliESDEvent*)fEvent);
aaf2d706 157}
158
159//______________________________________________________________________________
e12e402c 160Bool_t AliESDInputHandler::FinishEvent()
161{
162 // Finish the event
b890a10d 163 if(fEvent)fEvent->Reset();
7b2a359f 164 if (fMixingHandler) fMixingHandler->FinishEvent();
b890a10d 165 return kTRUE;
6989bff3 166}
167
aaf2d706 168//______________________________________________________________________________
1aa09fd1 169Bool_t AliESDInputHandler::Notify(const char* path)
170{
cec9e119 171 // Notify a directory change
172 static Bool_t firsttime = kFALSE;
173 AliInfo(Form("Directory change %s \n", path));
174 //
175 // Handle the friends first
176 //
177 if (!fTree->FindBranch("ESDfriend.") && fReadFriends) {
178 // Try to add ESDfriend. branch as friend
179 TString esdTreeFName, esdFriendTreeFName;
180 esdTreeFName = (fTree->GetCurrentFile())->GetName();
181 esdFriendTreeFName = esdTreeFName;
182 esdFriendTreeFName.ReplaceAll("AliESDs.root", fFriendFileName.Data());
183 TTree* cTree = fTree->GetTree();
184 if (!cTree) cTree = fTree;
185 cTree->AddFriend("esdFriendTree", esdFriendTreeFName.Data());
186 cTree->SetBranchStatus("ESDfriend.", 1);
80ce1b4e 187 fFriend = (AliESDfriend*)(fEvent->FindListObject("AliESDfriend"));
cec9e119 188 if (fFriend) cTree->SetBranchAddress("ESDfriend.", &fFriend);
189 }
190 //
191 //
192 SwitchOffBranches();
193 SwitchOnBranches();
194 fFriend = (AliESDfriend*)(fEvent->FindListObject("AliESDfriend"));
195 //
196 if (fUseHLT) {
197 // Get HLTesdTree from current file
198 TTree* cTree = fTree;
199 if (fTree->GetTree()) cTree = fTree->GetTree();
200 TFile* cFile = cTree->GetCurrentFile();
201 cFile->GetObject("HLTesdTree", fHLTTree);
50aaaf00 202
cec9e119 203 if (fHLTTree) {
204 if (!fHLTEvent) fHLTEvent = new AliESDEvent();
205 fHLTEvent->ReadFromTree(fHLTTree);
50aaaf00 206 }
cec9e119 207 }
50aaaf00 208
cec9e119 209 if (!fUseTags) {
210 if (fMixingHandler) fMixingHandler->Notify(path);
211 return kTRUE;
212 }
1aa09fd1 213
cec9e119 214 Bool_t zip = kFALSE;
1aa09fd1 215
cec9e119 216 // Setup the base path
217 TString pathName(path);
218 Int_t index = pathName.Index("#");
219 if (index>=0) {
220 zip = kTRUE;
221 pathName = pathName(0,index);
222 } else {
223 pathName = gSystem->DirName(pathName);
224 }
225 if (fTree->GetCurrentFile()->GetArchive()) zip = kTRUE;
226 if (pathName.IsNull()) pathName = "./";
227 printf("AliESDInputHandler::Notify() Path: %s\n", pathName.Data());
6ccd727b 228
cec9e119 229 if (fRunTag) {
230 fRunTag->Clear();
231 } else {
232 fRunTag = new AliRunTag();
233 }
1aa09fd1 234
cec9e119 235 const char* tagPattern = "ESD.tag.root";
236 TString sname;
237 TString tagFilename;
238 if (zip) {
239 TObjArray* arr = fTree->GetCurrentFile()->GetArchive()->GetMembers();
240 TIter next(arr);
241 TObject *objarchive;
242 while ((objarchive = next())) {
243 sname = objarchive->GetName();
244 if (sname.Contains(tagPattern)) {
245 tagFilename = pathName;
246 if (index>=0) tagFilename += "#";
247 else tagFilename += "/";
248 tagFilename += sname;
249 AliInfo(Form("Tag file found: %s\n", tagFilename.Data()));
250 break; // There should be only one such file in the archive
251 }//pattern check
252 } // archive file loop
253 } else {
254 void * dirp = gSystem->OpenDirectory(pathName.Data());
255 while(1) {
256 sname = gSystem->GetDirEntry(dirp);
257 if (sname.IsNull()) break;
258 if (sname.Contains(tagPattern)) {
259 tagFilename = pathName;
260 tagFilename += "/";
261 tagFilename += sname;
262 AliInfo(Form("Tag file found: %s\n", tagFilename.Data()));
263 break;
264 }//pattern check
265 }//directory loop
62e57953 266 gSystem->FreeDirectory(dirp);
cec9e119 267 }
268 if (tagFilename.IsNull()) {
269 if (firsttime) AliWarning(Form("Tag file not found in directory: %s", pathName.Data()));
270 firsttime = kFALSE;
271 delete fRunTag; fRunTag = 0;
1aa09fd1 272 return kTRUE;
cec9e119 273 }
274 TFile *tagfile = TFile::Open(tagFilename);
275 if (!tagfile) {
276 AliError(Form("Cannot open tag file: %s", tagFilename.Data()));
277 delete fRunTag; fRunTag = 0;
278 return kTRUE;
279 }
280 fTreeT = (TTree*)tagfile->Get("T"); // file is the owner
281 if (!fTreeT) {
282 AliError(Form("Cannot get tree of tags from file: %s", tagFilename.Data()));
283 delete fRunTag; fRunTag = 0;
284 return kTRUE;
285 }
286
287 fTreeT->SetBranchAddress("AliTAG",&fRunTag);
288 fTreeT->GetEntry(0);
289 delete tagfile;
290 // Notify the mixing handler after the tags are loaded
291 if (fMixingHandler) fMixingHandler->Notify(path);
292 return kTRUE;
1aa09fd1 293}
294
aaf2d706 295//______________________________________________________________________________
c2b6979d 296Option_t *AliESDInputHandler::GetDataType() const
297{
298// Returns handled data type.
299 return gESDDataType;
300}
f0f29480 301
aaf2d706 302//______________________________________________________________________________
f0f29480 303Int_t AliESDInputHandler::GetNEventAcceptedInFile()
304{
305 // Get number of events in file accepted by the tag cuts
306 // return -1 if no info is available
307 if (!fTagCutSumm) {
308 TList *luo = fTree->GetUserInfo();
309 if (!luo) {
310 AliInfo(Form("No user info in input tree - no tag cut summary\n"));
311 return -1;
312 }
313 for (int iluo=0; iluo<luo->GetEntries(); iluo++) {
314 fTagCutSumm = dynamic_cast<TMap *>(luo->At(iluo));
315 if (fTagCutSumm) break;
316 }
317 if (!fTagCutSumm) {
318 AliInfo(Form("No tag summary map in input tree\n"));
319 return -1;
320 }
321 }
322
323 TObjString *ostr = 0;
324 if (fTagCutSumm->FindObject(fTree->GetCurrentFile()->GetName()))
325 ostr = (TObjString *) fTagCutSumm->GetValue(fTree->GetCurrentFile()->GetName());
326 else {
327 AliInfo(Form("No tag cut summary for file %s\n", fTree->GetCurrentFile()->GetName()));
328 return -1;
329 }
330 char *iTagInfo;
331 iTagInfo = strdup(ostr->GetString().Data());
332
333 Int_t iAcc = atoi(strtok(iTagInfo, ","));
334
335 AliInfo(Form("Got %i accepted events for file %s", iAcc, fTree->GetCurrentFile()->GetName()));
336
337 free(iTagInfo);
338
339 return iAcc;
340}
aaf2d706 341
342//______________________________________________________________________________
f0f29480 343Int_t AliESDInputHandler::GetNEventRejectedInFile()
344{
345 // Get number of events in file rejected by the tag cuts
346 // return -1 if no info is available
347 if (!fTagCutSumm) {
348 TList *luo = fTree->GetUserInfo();
349 if (!luo) {
350 AliInfo(Form("No user info in input tree - no tag cut summary\n"));
351 return -1;
352 }
353 for (int iluo=0; iluo<luo->GetEntries(); iluo++) {
354 fTagCutSumm = dynamic_cast<TMap *>(luo->At(iluo));
355 if (fTagCutSumm) break;
356 }
357 if (!fTagCutSumm) {
358 AliInfo(Form("No tag summary map in input tree\n"));
359 return -1;
360 }
361 }
362
363 TObjString *ostr = 0;
364 if (fTagCutSumm->FindObject(fTree->GetCurrentFile()->GetName()))
365 ostr = (TObjString *) fTagCutSumm->GetValue(fTree->GetCurrentFile()->GetName());
366 else {
367 AliInfo(Form("No tag cut summary for file %s\n", fTree->GetCurrentFile()->GetName()));
368 return -1;
369 }
370 char *iTagInfo;
371 iTagInfo = strdup(ostr->GetString().Data());
372
373 strtok(iTagInfo, ",");
374 Int_t iRej = atoi(strtok(NULL, ","));
375
376 AliInfo(Form("Got %i accepted events for file %s", iRej, fTree->GetCurrentFile()->GetName()));
377
378 free(iTagInfo);
379
380 return iRej;
381}
aaf2d706 382
383//______________________________________________________________________________
5e6a3170 384Bool_t AliESDInputHandler::GetCutSummaryForChain(Int_t *aTotal, Int_t *aAccepted, Int_t *aRejected)
c334d0d3 385{
386 // Get number of events in the full chain
387 // Count accepted and rejected events
388 // return kFALSE if no info is available
389 if (!fTagCutSumm) {
390 TList *luo = fTree->GetUserInfo();
391 if (!luo) {
392 AliInfo(Form("No user info in input tree - no tag cut summary\n"));
393 return kFALSE;
394 }
395 for (int iluo=0; iluo<luo->GetEntries(); iluo++) {
396 fTagCutSumm = dynamic_cast<TMap *>(luo->At(iluo));
397 if (fTagCutSumm) break;
398 }
399 if (!fTagCutSumm) {
400 AliInfo(Form("No tag summary map in input tree\n"));
401 return kFALSE;
402 }
403 }
404
405 TMapIter *tIter = new TMapIter(fTagCutSumm);
406
407 Int_t iTotList=0, iAccList=0, iRejList=0;
408
409 TObject *cobj;
9a587f77 410 while ((cobj = tIter->Next())) {
c334d0d3 411 TObjString *kstr = (TObjString *) cobj;
412 TObjString *vstr = (TObjString *) fTagCutSumm->GetValue(kstr->GetString().Data());
413 // printf("Got object value %s %s\n", kstr->GetString().Data(), vstr->GetString().Data());
414 char *iTagInfo;
415 iTagInfo = strdup(vstr->GetString().Data());
416
417 Int_t iAcc = atoi(strtok(iTagInfo, ","));
418 Int_t iRej = atoi(strtok(NULL, ","));
419
420 iAccList += iAcc;
421 iRejList += iRej;
422 iTotList += (iAcc+iRej);
423 }
424
425 *aTotal = iTotList;
426 *aAccepted = iAccList;
427 *aRejected = iRejList;
428
429 return kTRUE;
430}
431
aaf2d706 432//______________________________________________________________________________
c334d0d3 433Int_t AliESDInputHandler::GetNFilesEmpty()
434{
435 // Count number of files in which all events were de-selected
436 // For such files Notify() will NOT be called
437 // return -1 if no info is available
438 if (!fTagCutSumm) {
439 TList *luo = fTree->GetUserInfo();
440 if (!luo) {
441 AliInfo(Form("No user info in input tree - no tag cut summary\n"));
442 return -1;
443 }
444 for (int iluo=0; iluo<luo->GetEntries(); iluo++) {
445 fTagCutSumm = dynamic_cast<TMap *>(luo->At(iluo));
446 if (fTagCutSumm) break;
447 }
448 if (!fTagCutSumm) {
449 AliInfo(Form("No tag summary map in input tree\n"));
450 return -1;
451 }
452 }
453
454 TMapIter *tIter = new TMapIter(fTagCutSumm);
455
456 Int_t iFilesEmpty = 0;
457
458 TObject *cobj;
9a587f77 459 while ((cobj = tIter->Next())) {
c334d0d3 460 TObjString *kstr = (TObjString *) cobj;
461 TObjString *vstr = (TObjString *) fTagCutSumm->GetValue(kstr->GetString().Data());
462 // printf("Got object value %s %s\n", kstr->GetString().Data(), vstr->GetString().Data());
463 char *iTagInfo;
464 iTagInfo = strdup(vstr->GetString().Data());
465
466 Int_t iAcc = atoi(strtok(iTagInfo, ","));
467 Int_t iRej = atoi(strtok(NULL, ","));
468
469 if ((iAcc == 0) && ((iRej+iAcc)>0))
470 iFilesEmpty++;
471 }
472
473 return iFilesEmpty;
474
475}
70908d05 476
477//______________________________________________________________________________
478TObject *AliESDInputHandler::GetStatistics(Option_t *option) const
479{
480// Get the statistics histogram(s) from the physics selection object. This
481// should be called during FinishTaskOutput(). Option can be empty (default
482// statistics histogram) or BIN0.
483 if (!fEventCuts) return NULL;
484 TString opt(option);
485 opt.ToUpper();
486 if (opt=="BIN0") return fEventCuts->GetStatistics("BIN0");
487 else return fEventCuts->GetStatistics("ALL");
488}
9006fe9c 489
490//______________________________________________________________________________
491void AliESDInputHandler::CreatePIDResponse(Bool_t isMC/*=kFALSE*/)
492{
493 //
494 // create the pid response object if it does not exist yet
495 //
496 if (fESDpid) return;
497 fESDpid=new AliESDpid(isMC);
498
499}
500