1 /**************************************************************************
2 * Copyright(c) 1998-2007, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
18 //-------------------------------------------------------------------------
19 // Event handler for AOD input
20 // Author: Andreas Morsch, CERN
21 //-------------------------------------------------------------------------
30 #include "AliAODInputHandler.h"
31 #include "AliAODEvent.h"
33 #include "AliMCEvent.h"
34 #include "AliAODpidUtil.h"
36 ClassImp(AliAODInputHandler)
38 static Option_t *gAODDataType = "AOD";
40 //______________________________________________________________________________
41 AliAODInputHandler::AliAODInputHandler() :
42 AliInputEventHandler(),
44 fMCEvent(new AliMCEvent()),
45 fFriends(new TList()),
48 fFriendsConnected(kFALSE),
54 // Default constructor
55 fHistStatistics[0] = fHistStatistics[1] = NULL;
58 //______________________________________________________________________________
59 AliAODInputHandler::AliAODInputHandler(const char* name, const char* title):
60 AliInputEventHandler(name, title),
62 fMCEvent(new AliMCEvent()),
63 fFriends(new TList()),
66 fFriendsConnected(kFALSE),
73 fHistStatistics[0] = fHistStatistics[1] = NULL;
76 //______________________________________________________________________________
77 AliAODInputHandler::~AliAODInputHandler()
81 if (fHistStatistics[0]) {
82 delete fHistStatistics[0];
83 fHistStatistics[0] = 0;
85 if (fHistStatistics[1]) {
86 delete fHistStatistics[1];
87 fHistStatistics[1] = 0;
92 //______________________________________________________________________________
93 Bool_t AliAODInputHandler::Init(TTree* tree, Option_t* opt)
95 // Initialisation necessary for each new tree
97 if (!fTree) return kFALSE;
104 // Get pointer to AOD event
105 if (!fEvent) fEvent = new AliAODEvent();
107 fEvent->ReadFromTree(fTree);
109 if (fMixingHandler) fMixingHandler->Init(tree, opt);
114 //______________________________________________________________________________
115 Bool_t AliAODInputHandler::BeginEvent(Long64_t entry)
118 TClonesArray* mcParticles = (TClonesArray*) (fEvent->FindListObject("mcparticles"));
119 if (mcParticles) fMCEvent->SetParticleArray(mcParticles);
120 if (fTreeToMerge) fTreeToMerge->GetEntry(entry + fMergeOffset);
122 fIsSelectedResult = fEvent->GetHeader()->GetOfflineTrigger();
124 if (fMixingHandler) fMixingHandler->BeginEvent(entry);
129 //______________________________________________________________________________
130 Bool_t AliAODInputHandler::Notify(const char* path)
132 // Notifaction of directory change
133 if (fMixingHandler) fMixingHandler->Notify(path);
134 if (!fFriendsConnected) {
136 fEvent->ReadFromTree(fTree, "reconnect");
138 fFriendsConnected = kFALSE;
140 TTree *ttree = fTree->GetTree();
141 if (!ttree) ttree = fTree;
142 TString statFname(ttree->GetCurrentFile()->GetName());
143 Int_t indarchive = statFname.Index("#");
145 statFname = gSystem->DirName(statFname);
148 statFname.Remove(indarchive+1);
150 statFname += "EventStat_temp.root";
152 if (IsCheckStatistics()) statFile = TFile::Open(statFname, "READ");
154 TList *list = (TList*)statFile->Get("cstatsout");
156 AliVCuts *physSel = (AliVCuts*)list->At(0);
158 TH2F *hAll = dynamic_cast<TH2F*>(physSel->GetStatistics("ALL"));
159 TH2F *hBin0 = dynamic_cast<TH2F*>(physSel->GetStatistics("BIN0"));
160 if (fHistStatistics[0] && hAll) {
163 fHistStatistics[0]->Merge(&tmplist);
166 if (fHistStatistics[1] && hBin0) fHistStatistics[1]->Merge(&tmplist);
169 fHistStatistics[0] = static_cast<TH2F*>(hAll->Clone());
170 fHistStatistics[1] = static_cast<TH2F*>(hBin0->Clone());
171 fHistStatistics[0]->SetDirectory(0);
172 fHistStatistics[1]->SetDirectory(0);
183 //______________________________________________________________________________
184 Bool_t AliAODInputHandler::FinishEvent()
187 if (fMixingHandler) fMixingHandler->FinishEvent();
191 //______________________________________________________________________________
192 void AliAODInputHandler::AddFriend(char* filename)
195 TNamed* obj = new TNamed(filename, filename);
199 //______________________________________________________________________________
200 Option_t *AliAODInputHandler::GetDataType() const
202 // Returns handled data type.
206 //______________________________________________________________________________
207 TObject *AliAODInputHandler::GetStatistics(Option_t *option) const
209 // Get the statistics histogram(s) from the physics selection object. This
210 // should be called during FinishTaskOutput(). Option can be empty (default
211 // statistics histogram) or BIN0.
214 if (opt=="BIN0") return fHistStatistics[1];
215 return fHistStatistics[0];
218 void AliAODInputHandler::ConnectFriends()
220 // Connect the friend trees
222 TIter next(fFriends);
224 TString aodTreeFName,aodFriendTreeFName;
225 TTree *ttree = fTree->GetTree();
226 if (!ttree) ttree = fTree;
227 aodTreeFName = ttree->GetCurrentFile()->GetName();
229 while((obj = (TNamed*)next())) {
230 aodFriendTreeFName = aodTreeFName;
231 aodFriendTreeFName.ReplaceAll("AliAOD.root",obj->GetName());
232 aodFriendTreeFName.ReplaceAll("AliAODs.root",obj->GetName());
233 ttree->AddFriend("aodTree", aodFriendTreeFName.Data());
236 // Friends have to be merged
237 TNamed* filename = (TNamed*) (fFriends->At(0));
238 fFileToMerge = new TFile(filename->GetName());
240 fFileToMerge->GetObject("aodTree", fTreeToMerge);
241 if (!fAODEventToMerge) fAODEventToMerge = new AliAODEvent();
242 fAODEventToMerge->ReadFromTree(fTreeToMerge);
245 fFriendsConnected = kTRUE;
248 //______________________________________________________________________________
249 void AliAODInputHandler::CreatePIDResponse(Bool_t isMC/*=kFALSE*/)
252 // create the pid response object if it does not exist yet
254 if (fAODpidUtil) return;
255 fAODpidUtil=new AliAODpidUtil(isMC);