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"
35 #include "AliAODMCHeader.h"
37 ClassImp(AliAODInputHandler)
39 static Option_t *gAODDataType = "AOD";
41 //______________________________________________________________________________
42 AliAODInputHandler::AliAODInputHandler() :
43 AliInputEventHandler(),
50 fMergeEMCALClusters(kTRUE),
51 fMergePHOSClusters(kTRUE),
52 fMergeEMCALCells(kTRUE),
53 fMergePHOSCells(kTRUE),
54 fMergeEMCALTrigger(kTRUE),
55 fMergePHOSTrigger(kTRUE),
56 fMergeHMPIDrings(kTRUE),
57 fFriendsConnected(kFALSE),
63 // Default constructor
64 fHistStatistics[0] = fHistStatistics[1] = NULL;
67 //______________________________________________________________________________
68 AliAODInputHandler::AliAODInputHandler(const char* name, const char* title):
69 AliInputEventHandler(name, title),
71 fMCEvent(new AliMCEvent()),
72 fFriends(new TList()),
76 fMergeEMCALClusters(kTRUE),
77 fMergePHOSClusters(kTRUE),
78 fMergeEMCALCells(kTRUE),
79 fMergePHOSCells(kTRUE),
80 fMergeEMCALTrigger(kTRUE),
81 fMergePHOSTrigger(kTRUE),
82 fMergeHMPIDrings(kTRUE),
83 fFriendsConnected(kFALSE),
90 fHistStatistics[0] = fHistStatistics[1] = NULL;
93 //______________________________________________________________________________
94 AliAODInputHandler::~AliAODInputHandler()
97 if (fFriends) fFriends->Delete();
99 delete fHistStatistics[0];
100 delete fHistStatistics[1];
104 //______________________________________________________________________________
105 Bool_t AliAODInputHandler::Init(TTree* tree, Option_t* opt)
107 // Initialisation necessary for each new tree
109 if (!fTree) return kFALSE;
116 // Get pointer to AOD event
117 if (!fEvent) fEvent = new AliAODEvent();
119 fEvent->ReadFromTree(fTree);
121 if (fMixingHandler) fMixingHandler->Init(tree, opt);
126 //______________________________________________________________________________
127 Bool_t AliAODInputHandler::BeginEvent(Long64_t entry)
130 static Int_t prevRunNumber = -1;
131 if (prevRunNumber != fEvent->GetRunNumber() && NeedField()) {
132 fEvent->InitMagneticField();
133 prevRunNumber = fEvent->GetRunNumber();
135 TClonesArray* mcParticles = (TClonesArray*) (fEvent->FindListObject("mcparticles"));
137 if (!fMCEvent) fMCEvent = new AliMCEvent();
138 fMCEvent->SetParticleArray(mcParticles);
141 AliAODMCHeader* mcHeader = (AliAODMCHeader*) fEvent->GetList()->FindObject(AliAODMCHeader::StdBranchName());
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);
149 fIsSelectedResult = fEventCuts->GetSelectionMask(fEvent);
151 fIsSelectedResult = fEvent->GetHeader()->GetOfflineTrigger();
153 if (fMixingHandler) fMixingHandler->BeginEvent(entry);
155 // set transient pointer to event inside tracks
156 fEvent->ConnectTracks();
161 //______________________________________________________________________________
162 Bool_t AliAODInputHandler::Notify(const char* path)
164 // Notifaction of directory change
165 if (fMixingHandler) fMixingHandler->Notify(path);
166 if (!fFriendsConnected) {
168 fEvent->ReadFromTree(fTree, "reconnect");
170 fFriendsConnected = kFALSE;
171 fUserInfo=fTree->GetTree()->GetUserInfo();
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("#");
179 statFname = gSystem->DirName(statFname);
182 statFname.Remove(indarchive+1);
184 statFname += "EventStat_temp.root";
186 if (IsCheckStatistics()) statFile = TFile::Open(statFname, "READ");
188 TList *list = (TList*)statFile->Get("cstatsout");
190 AliVCuts *physSel = (AliVCuts*)list->At(0);
192 TH2F *hAll = dynamic_cast<TH2F*>(physSel->GetStatistics("ALL"));
193 TH2F *hBin0 = dynamic_cast<TH2F*>(physSel->GetStatistics("BIN0"));
194 if (fHistStatistics[0] && hAll) {
197 fHistStatistics[0]->Merge(&tmplist);
200 if (fHistStatistics[1] && hBin0) fHistStatistics[1]->Merge(&tmplist);
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);
217 //______________________________________________________________________________
218 Bool_t AliAODInputHandler::FinishEvent()
221 if (fMixingHandler) fMixingHandler->FinishEvent();
222 if (fEvent) fEvent->Reset();
226 //______________________________________________________________________________
227 void AliAODInputHandler::AddFriend(char* filename)
230 TNamed* obj = new TNamed(filename, filename);
231 if (!fFriends) fFriends = new TList();
235 //______________________________________________________________________________
236 Option_t *AliAODInputHandler::GetDataType() const
238 // Returns handled data type.
242 //______________________________________________________________________________
243 TObject *AliAODInputHandler::GetStatistics(Option_t *option) const
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.
250 if (opt=="BIN0") return fHistStatistics[1];
251 return fHistStatistics[0];
254 void AliAODInputHandler::ConnectFriends()
256 // Connect the friend trees
257 if (!fFriends) return;
259 TIter next(fFriends);
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");
268 aodTreeFName = ttree->GetCurrentFile()->GetName();
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());
278 // Friends have to be merged
279 TNamed* filename = (TNamed*) (fFriends->At(0));
280 fFileToMerge = TFile::Open(filename->GetName());
282 fFileToMerge->GetObject("aodTree", fTreeToMerge);
283 if (!fAODEventToMerge) fAODEventToMerge = new AliAODEvent();
284 fAODEventToMerge->ReadFromTree(fTreeToMerge);
287 fFriendsConnected = kTRUE;
290 //______________________________________________________________________________
291 void AliAODInputHandler::CreatePIDResponse(Bool_t isMC/*=kFALSE*/)
294 // create the pid response object if it does not exist yet
296 if (fAODpidUtil) return;
297 fAODpidUtil=new AliAODpidUtil(isMC);