]> git.uio.no Git - u/mrichter/AliRoot.git/blob - STEER/AOD/AliAODInputHandler.cxx
Additional fixes
[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     TClonesArray* mcParticles = (TClonesArray*) (fEvent->FindListObject("mcparticles"));
130     if (mcParticles) {
131        if (!fMCEvent) fMCEvent = new AliMCEvent();
132        fMCEvent->SetParticleArray(mcParticles);
133     }
134     // When merging, get current event number from GetReadEntry(), 
135     // entry gives the events in the current file
136     if (fTreeToMerge) fTreeToMerge->GetEntry(GetReadEntry() + fMergeOffset);
137   
138     if (fEventCuts)
139       fIsSelectedResult = fEventCuts->GetSelectionMask(fEvent);
140     else
141       fIsSelectedResult = fEvent->GetHeader()->GetOfflineTrigger();
142
143     if (fMixingHandler) fMixingHandler->BeginEvent(entry);
144     
145     return kTRUE;
146 }
147
148 //______________________________________________________________________________
149 Bool_t AliAODInputHandler::Notify(const char* path)
150 {
151   // Notifaction of directory change
152   if (fMixingHandler) fMixingHandler->Notify(path);
153   if (!fFriendsConnected) {
154       ConnectFriends();
155       fEvent->ReadFromTree(fTree, "reconnect");
156   }
157   fFriendsConnected = kFALSE;
158   fUserInfo=fTree->GetTree()->GetUserInfo();
159     
160   TTree *ttree = fTree->GetTree();
161   if (!ttree) ttree = fTree;
162   TString statFname(ttree->GetCurrentFile()->GetName());
163   AliInfo(Form("Moving to file %s", statFname.Data()));
164   Int_t indarchive = statFname.Index("#");
165   if (indarchive<0) {
166      statFname = gSystem->DirName(statFname);
167      statFname += "/";
168   } else {
169      statFname.Remove(indarchive+1);
170   }   
171   statFname += "EventStat_temp.root";
172   TFile *statFile = 0;
173   if (IsCheckStatistics()) statFile = TFile::Open(statFname, "READ");
174   if (statFile) {
175      TList *list = (TList*)statFile->Get("cstatsout");
176      if (list) {
177         AliVCuts *physSel = (AliVCuts*)list->At(0);
178         if (physSel) {
179            TH2F *hAll = dynamic_cast<TH2F*>(physSel->GetStatistics("ALL"));
180            TH2F *hBin0 = dynamic_cast<TH2F*>(physSel->GetStatistics("BIN0"));
181            if (fHistStatistics[0] && hAll) {
182               TList tmplist;
183               tmplist.Add(hAll);
184               fHistStatistics[0]->Merge(&tmplist);
185               tmplist.Clear();
186               tmplist.Add(hBin0);
187               if (fHistStatistics[1] && hBin0) fHistStatistics[1]->Merge(&tmplist);
188            } else {
189              if (hAll && hBin0) {
190                 fHistStatistics[0] = static_cast<TH2F*>(hAll->Clone());
191                 fHistStatistics[1] = static_cast<TH2F*>(hBin0->Clone());
192                 fHistStatistics[0]->SetDirectory(0);
193                 fHistStatistics[1]->SetDirectory(0);
194              }   
195            }   
196         }
197         delete list;
198      }
199      delete statFile;
200   }
201   return kTRUE;
202 }
203
204 //______________________________________________________________________________
205 Bool_t AliAODInputHandler::FinishEvent()
206 {
207   // Finish event
208   if (fMixingHandler) fMixingHandler->FinishEvent();
209   if (fEvent) fEvent->Reset();
210   return kTRUE;
211 }
212
213 //______________________________________________________________________________
214 void AliAODInputHandler::AddFriend(char* filename)
215 {
216     // Add a friend tree 
217     TNamed* obj = new TNamed(filename, filename);
218     if (!fFriends) fFriends = new TList();
219     fFriends->Add(obj);
220 }
221
222 //______________________________________________________________________________
223 Option_t *AliAODInputHandler::GetDataType() const
224 {
225 // Returns handled data type.
226    return gAODDataType;
227 }
228
229 //______________________________________________________________________________
230 TObject *AliAODInputHandler::GetStatistics(Option_t *option) const
231 {
232 // Get the statistics histogram(s) from the physics selection object. This
233 // should be called during FinishTaskOutput(). Option can be empty (default
234 // statistics histogram) or BIN0.
235    TString opt(option);
236    opt.ToUpper();
237    if (opt=="BIN0") return fHistStatistics[1];
238    return fHistStatistics[0];
239 }   
240
241 void AliAODInputHandler::ConnectFriends()
242 {
243     // Connect the friend trees 
244     if (!fFriends) return;
245     if (!fMergeEvents) {
246         TIter next(fFriends);
247         TNamed* obj;
248         TString aodTreeFName,aodFriendTreeFName;
249         TTree *ttree = fTree->GetTree();
250         if (!ttree) ttree = fTree;
251    if(!ttree->GetCurrentFile()){
252      AliWarning("Couldn't get current AOD file, not connecting friends");
253      return;
254    }
255         aodTreeFName = ttree->GetCurrentFile()->GetName();
256         
257         while((obj = (TNamed*)next())) {
258             aodFriendTreeFName = aodTreeFName;
259        if (strlen(GetInputFileName())) aodFriendTreeFName.ReplaceAll(GetInputFileName(),obj->GetName());
260             aodFriendTreeFName.ReplaceAll("AliAOD.root",obj->GetName());
261             aodFriendTreeFName.ReplaceAll("AliAODs.root",obj->GetName());
262             ttree->AddFriend("aodTree", aodFriendTreeFName.Data());
263         }
264     } else {
265         // Friends have to be merged
266         TNamed* filename = (TNamed*) (fFriends->At(0));
267         fFileToMerge = TFile::Open(filename->GetName());
268         if (fFileToMerge) {
269             fFileToMerge->GetObject("aodTree", fTreeToMerge);
270             if (!fAODEventToMerge) fAODEventToMerge = new AliAODEvent();
271             fAODEventToMerge->ReadFromTree(fTreeToMerge);
272         }
273     }
274     fFriendsConnected = kTRUE;
275 }
276
277 //______________________________________________________________________________
278 void AliAODInputHandler::CreatePIDResponse(Bool_t isMC/*=kFALSE*/)
279 {
280   //
281   // create the pid response object if it does not exist yet
282   //
283   if (fAODpidUtil) return;
284   fAODpidUtil=new AliAODpidUtil(isMC);
285   
286 }
287