]> git.uio.no Git - u/mrichter/AliRoot.git/blob - STEER/AOD/AliAODInputHandler.cxx
62c17ef620529825947dab8d70d66413b2f3049a
[u/mrichter/AliRoot.git] / STEER / AOD / AliAODInputHandler.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 AOD input 
20 //     Author: Andreas Morsch, CERN
21 //-------------------------------------------------------------------------
22
23 #include <TSystem.h>
24 #include <TTree.h>
25 #include <TList.h>
26 #include <TNamed.h>
27 #include <TFile.h>
28 #include <TH2.h>
29
30 #include "AliAODInputHandler.h"
31 #include "AliAODEvent.h"
32 #include "AliVCuts.h"
33 #include "AliMCEvent.h"
34 #include "AliAODpidUtil.h"
35
36 ClassImp(AliAODInputHandler)
37
38 static Option_t *gAODDataType = "AOD";
39
40 //______________________________________________________________________________
41 AliAODInputHandler::AliAODInputHandler() :
42     AliInputEventHandler(),
43     fEvent(0),
44     fMCEvent(0),
45     fFriends(0),
46     fAODpidUtil(0x0),
47     fMergeEvents(kFALSE),
48     fMergeTracks(kTRUE), 
49     fMergeEMCALClusters(kTRUE), 
50     fMergePHOSClusters(kTRUE), 
51     fMergeEMCALCells(kTRUE), 
52         fMergePHOSCells(kTRUE), 
53         fMergeEMCALTrigger(kTRUE), 
54         fMergePHOSTrigger(kTRUE),
55    fMergeHMPIDrings(kTRUE),
56     fFriendsConnected(kFALSE),
57     fFileToMerge(0),
58     fTreeToMerge(0),
59     fAODEventToMerge(0),
60     fMergeOffset(0)
61 {
62   // Default constructor
63   fHistStatistics[0] = fHistStatistics[1] = NULL;
64 }
65
66 //______________________________________________________________________________
67 AliAODInputHandler::AliAODInputHandler(const char* name, const char* title):
68   AliInputEventHandler(name, title),
69   fEvent(0),
70   fMCEvent(new AliMCEvent()),
71   fFriends(new TList()),
72   fAODpidUtil(0x0),
73   fMergeEvents(kFALSE),
74   fMergeTracks(kTRUE), 
75   fMergeEMCALClusters(kTRUE), 
76   fMergePHOSClusters(kTRUE), 
77   fMergeEMCALCells(kTRUE), 
78   fMergePHOSCells(kTRUE),
79   fMergeEMCALTrigger(kTRUE), 
80   fMergePHOSTrigger(kTRUE),
81   fMergeHMPIDrings(kTRUE),
82   fFriendsConnected(kFALSE),
83   fFileToMerge(0),
84   fTreeToMerge(0),
85   fAODEventToMerge(0),
86   fMergeOffset(0)
87 {
88     // Constructor
89   fHistStatistics[0] = fHistStatistics[1] = NULL;
90 }
91
92 //______________________________________________________________________________
93 AliAODInputHandler::~AliAODInputHandler() 
94 {
95 // Destructor
96   if (fFriends) fFriends->Delete();
97   delete fFriends;
98   delete fHistStatistics[0];
99   delete fHistStatistics[1];
100   delete fAODpidUtil;
101 }
102
103 //______________________________________________________________________________
104 Bool_t AliAODInputHandler::Init(TTree* tree, Option_t* opt)
105 {
106     // Initialisation necessary for each new tree
107     fTree = tree;
108     if (!fTree) return kFALSE;
109     fTree->GetEntries();
110     ConnectFriends();
111
112     SwitchOffBranches();
113     SwitchOnBranches();
114     
115     // Get pointer to AOD event
116     if (!fEvent) fEvent = new AliAODEvent();
117     
118     fEvent->ReadFromTree(fTree);
119     
120     if (fMixingHandler) fMixingHandler->Init(tree, opt);
121     
122     return kTRUE;
123 }
124
125 //______________________________________________________________________________
126 Bool_t AliAODInputHandler::BeginEvent(Long64_t entry)
127 {
128     // Begin event
129     static Int_t prevRunNumber = -1;
130     if (prevRunNumber != fEvent->GetRunNumber() && NeedField()) {
131       fEvent->InitMagneticField();
132       prevRunNumber = fEvent->GetRunNumber();
133     } 
134     TClonesArray* mcParticles = (TClonesArray*) (fEvent->FindListObject("mcparticles"));
135     if (mcParticles) {
136        if (!fMCEvent) fMCEvent = new AliMCEvent();
137        fMCEvent->SetParticleArray(mcParticles);
138     }
139     // When merging, get current event number from GetReadEntry(), 
140     // entry gives the events in the current file
141     if (fTreeToMerge) fTreeToMerge->GetEntry(GetReadEntry() + fMergeOffset);
142   
143     if (fEventCuts)
144       fIsSelectedResult = fEventCuts->GetSelectionMask(fEvent);
145     else
146       fIsSelectedResult = fEvent->GetHeader()->GetOfflineTrigger();
147
148     if (fMixingHandler) fMixingHandler->BeginEvent(entry);
149     
150     return kTRUE;
151 }
152
153 //______________________________________________________________________________
154 Bool_t AliAODInputHandler::Notify(const char* path)
155 {
156   // Notifaction of directory change
157   if (fMixingHandler) fMixingHandler->Notify(path);
158   if (!fFriendsConnected) {
159       ConnectFriends();
160       fEvent->ReadFromTree(fTree, "reconnect");
161   }
162   fFriendsConnected = kFALSE;
163   fUserInfo=fTree->GetTree()->GetUserInfo();
164     
165   TTree *ttree = fTree->GetTree();
166   if (!ttree) ttree = fTree;
167   TString statFname(ttree->GetCurrentFile()->GetName());
168   AliInfo(Form("Moving to file %s", statFname.Data()));
169   Int_t indarchive = statFname.Index("#");
170   if (indarchive<0) {
171      statFname = gSystem->DirName(statFname);
172      statFname += "/";
173   } else {
174      statFname.Remove(indarchive+1);
175   }   
176   statFname += "EventStat_temp.root";
177   TFile *statFile = 0;
178   if (IsCheckStatistics()) statFile = TFile::Open(statFname, "READ");
179   if (statFile) {
180      TList *list = (TList*)statFile->Get("cstatsout");
181      if (list) {
182         AliVCuts *physSel = (AliVCuts*)list->At(0);
183         if (physSel) {
184            TH2F *hAll = dynamic_cast<TH2F*>(physSel->GetStatistics("ALL"));
185            TH2F *hBin0 = dynamic_cast<TH2F*>(physSel->GetStatistics("BIN0"));
186            if (fHistStatistics[0] && hAll) {
187               TList tmplist;
188               tmplist.Add(hAll);
189               fHistStatistics[0]->Merge(&tmplist);
190               tmplist.Clear();
191               tmplist.Add(hBin0);
192               if (fHistStatistics[1] && hBin0) fHistStatistics[1]->Merge(&tmplist);
193            } else {
194              if (hAll && hBin0) {
195                 fHistStatistics[0] = static_cast<TH2F*>(hAll->Clone());
196                 fHistStatistics[1] = static_cast<TH2F*>(hBin0->Clone());
197                 fHistStatistics[0]->SetDirectory(0);
198                 fHistStatistics[1]->SetDirectory(0);
199              }   
200            }   
201         }
202         delete list;
203      }
204      delete statFile;
205   }
206   return kTRUE;
207 }
208
209 //______________________________________________________________________________
210 Bool_t AliAODInputHandler::FinishEvent()
211 {
212   // Finish event
213   if (fMixingHandler) fMixingHandler->FinishEvent();
214   if (fEvent) fEvent->Reset();
215   return kTRUE;
216 }
217
218 //______________________________________________________________________________
219 void AliAODInputHandler::AddFriend(char* filename)
220 {
221     // Add a friend tree 
222     TNamed* obj = new TNamed(filename, filename);
223     if (!fFriends) fFriends = new TList();
224     fFriends->Add(obj);
225 }
226
227 //______________________________________________________________________________
228 Option_t *AliAODInputHandler::GetDataType() const
229 {
230 // Returns handled data type.
231    return gAODDataType;
232 }
233
234 //______________________________________________________________________________
235 TObject *AliAODInputHandler::GetStatistics(Option_t *option) const
236 {
237 // Get the statistics histogram(s) from the physics selection object. This
238 // should be called during FinishTaskOutput(). Option can be empty (default
239 // statistics histogram) or BIN0.
240    TString opt(option);
241    opt.ToUpper();
242    if (opt=="BIN0") return fHistStatistics[1];
243    return fHistStatistics[0];
244 }   
245
246 void AliAODInputHandler::ConnectFriends()
247 {
248     // Connect the friend trees 
249     if (!fFriends) return;
250     if (!fMergeEvents) {
251         TIter next(fFriends);
252         TNamed* obj;
253         TString aodTreeFName,aodFriendTreeFName;
254         TTree *ttree = fTree->GetTree();
255         if (!ttree) ttree = fTree;
256    if(!ttree->GetCurrentFile()){
257      AliWarning("Couldn't get current AOD file, not connecting friends");
258      return;
259    }
260         aodTreeFName = ttree->GetCurrentFile()->GetName();
261         
262         while((obj = (TNamed*)next())) {
263             aodFriendTreeFName = aodTreeFName;
264        if (strlen(GetInputFileName())) aodFriendTreeFName.ReplaceAll(GetInputFileName(),obj->GetName());
265             aodFriendTreeFName.ReplaceAll("AliAOD.root",obj->GetName());
266             aodFriendTreeFName.ReplaceAll("AliAODs.root",obj->GetName());
267             ttree->AddFriend("aodTree", aodFriendTreeFName.Data());
268         }
269     } else {
270         // Friends have to be merged
271         TNamed* filename = (TNamed*) (fFriends->At(0));
272         fFileToMerge = TFile::Open(filename->GetName());
273         if (fFileToMerge) {
274             fFileToMerge->GetObject("aodTree", fTreeToMerge);
275             if (!fAODEventToMerge) fAODEventToMerge = new AliAODEvent();
276             fAODEventToMerge->ReadFromTree(fTreeToMerge);
277         }
278     }
279     fFriendsConnected = kTRUE;
280 }
281
282 //______________________________________________________________________________
283 void AliAODInputHandler::CreatePIDResponse(Bool_t isMC/*=kFALSE*/)
284 {
285   //
286   // create the pid response object if it does not exist yet
287   //
288   if (fAODpidUtil) return;
289   fAODpidUtil=new AliAODpidUtil(isMC);
290   
291 }
292