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