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