]> git.uio.no Git - u/mrichter/AliRoot.git/blob - STEER/AOD/AliAODInputHandler.cxx
Added versioning metadata to 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
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     
159   TTree *ttree = fTree->GetTree();
160   if (!ttree) ttree = fTree;
161   TString statFname(ttree->GetCurrentFile()->GetName());
162   AliInfo(Form("Moving to file %s", statFname.Data()));
163   Int_t indarchive = statFname.Index("#");
164   if (indarchive<0) {
165      statFname = gSystem->DirName(statFname);
166      statFname += "/";
167   } else {
168      statFname.Remove(indarchive+1);
169   }   
170   statFname += "EventStat_temp.root";
171   TFile *statFile = 0;
172   if (IsCheckStatistics()) statFile = TFile::Open(statFname, "READ");
173   if (statFile) {
174      TList *list = (TList*)statFile->Get("cstatsout");
175      if (list) {
176         AliVCuts *physSel = (AliVCuts*)list->At(0);
177         if (physSel) {
178            TH2F *hAll = dynamic_cast<TH2F*>(physSel->GetStatistics("ALL"));
179            TH2F *hBin0 = dynamic_cast<TH2F*>(physSel->GetStatistics("BIN0"));
180            if (fHistStatistics[0] && hAll) {
181               TList tmplist;
182               tmplist.Add(hAll);
183               fHistStatistics[0]->Merge(&tmplist);
184               tmplist.Clear();
185               tmplist.Add(hBin0);
186               if (fHistStatistics[1] && hBin0) fHistStatistics[1]->Merge(&tmplist);
187            } else {
188              if (hAll && hBin0) {
189                 fHistStatistics[0] = static_cast<TH2F*>(hAll->Clone());
190                 fHistStatistics[1] = static_cast<TH2F*>(hBin0->Clone());
191                 fHistStatistics[0]->SetDirectory(0);
192                 fHistStatistics[1]->SetDirectory(0);
193              }   
194            }   
195         }
196         delete list;
197      }
198      delete statFile;
199   }
200   return kTRUE;
201 }
202
203 //______________________________________________________________________________
204 Bool_t AliAODInputHandler::FinishEvent()
205 {
206   // Finish event
207   if (fMixingHandler) fMixingHandler->FinishEvent();
208   if (fEvent) fEvent->Reset();
209   return kTRUE;
210 }
211
212 //______________________________________________________________________________
213 void AliAODInputHandler::AddFriend(char* filename)
214 {
215     // Add a friend tree 
216     TNamed* obj = new TNamed(filename, filename);
217     if (!fFriends) fFriends = new TList();
218     fFriends->Add(obj);
219 }
220
221 //______________________________________________________________________________
222 Option_t *AliAODInputHandler::GetDataType() const
223 {
224 // Returns handled data type.
225    return gAODDataType;
226 }
227
228 //______________________________________________________________________________
229 TObject *AliAODInputHandler::GetStatistics(Option_t *option) const
230 {
231 // Get the statistics histogram(s) from the physics selection object. This
232 // should be called during FinishTaskOutput(). Option can be empty (default
233 // statistics histogram) or BIN0.
234    TString opt(option);
235    opt.ToUpper();
236    if (opt=="BIN0") return fHistStatistics[1];
237    return fHistStatistics[0];
238 }   
239
240 void AliAODInputHandler::ConnectFriends()
241 {
242     // Connect the friend trees 
243     if (!fFriends) return;
244     if (!fMergeEvents) {
245         TIter next(fFriends);
246         TNamed* obj;
247         TString aodTreeFName,aodFriendTreeFName;
248         TTree *ttree = fTree->GetTree();
249         if (!ttree) ttree = fTree;
250         aodTreeFName = ttree->GetCurrentFile()->GetName();
251         
252         while((obj = (TNamed*)next())) {
253             aodFriendTreeFName = aodTreeFName;
254             aodFriendTreeFName.ReplaceAll("AliAOD.root",obj->GetName());
255             aodFriendTreeFName.ReplaceAll("AliAODs.root",obj->GetName());
256             ttree->AddFriend("aodTree", aodFriendTreeFName.Data());
257         }
258     } else {
259         // Friends have to be merged
260         TNamed* filename = (TNamed*) (fFriends->At(0));
261         fFileToMerge = TFile::Open(filename->GetName());
262         if (fFileToMerge) {
263             fFileToMerge->GetObject("aodTree", fTreeToMerge);
264             if (!fAODEventToMerge) fAODEventToMerge = new AliAODEvent();
265             fAODEventToMerge->ReadFromTree(fTreeToMerge);
266         }
267     }
268     fFriendsConnected = kTRUE;
269 }
270
271 //______________________________________________________________________________
272 void AliAODInputHandler::CreatePIDResponse(Bool_t isMC/*=kFALSE*/)
273 {
274   //
275   // create the pid response object if it does not exist yet
276   //
277   if (fAODpidUtil) return;
278   fAODpidUtil=new AliAODpidUtil(isMC);
279   
280 }
281