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