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"
34 ClassImp(AliAODInputHandler)
36 static Option_t *gAODDataType = "AOD";
38 //______________________________________________________________________________
39 AliAODInputHandler::AliAODInputHandler() :
40 AliInputEventHandler(),
42 fMCEvent(new AliMCEvent()),
43 fFriends(new TList()),
45 fFriendsConnected(kFALSE),
51 // Default constructor
52 fHistStatistics[0] = fHistStatistics[1] = NULL;
55 //______________________________________________________________________________
56 AliAODInputHandler::AliAODInputHandler(const char* name, const char* title):
57 AliInputEventHandler(name, title),
59 fMCEvent(new AliMCEvent()),
60 fFriends(new TList()),
62 fFriendsConnected(kFALSE),
69 fHistStatistics[0] = fHistStatistics[1] = NULL;
72 //______________________________________________________________________________
73 AliAODInputHandler::~AliAODInputHandler()
77 if (fHistStatistics[0]) {
78 delete fHistStatistics[0];
79 fHistStatistics[0] = 0;
81 if (fHistStatistics[1]) {
82 delete fHistStatistics[1];
83 fHistStatistics[1] = 0;
87 //______________________________________________________________________________
88 Bool_t AliAODInputHandler::Init(TTree* tree, Option_t* opt)
90 // Initialisation necessary for each new tree
92 if (!fTree) return kFALSE;
99 // Get pointer to AOD event
100 if (!fEvent) fEvent = new AliAODEvent();
102 fEvent->ReadFromTree(fTree);
104 if (fMixingHandler) fMixingHandler->Init(tree, opt);
109 //______________________________________________________________________________
110 Bool_t AliAODInputHandler::BeginEvent(Long64_t entry)
113 TClonesArray* mcParticles = (TClonesArray*) (fEvent->FindListObject("mcparticles"));
114 if (mcParticles) fMCEvent->SetParticleArray(mcParticles);
115 if (fTreeToMerge) fTreeToMerge->GetEntry(entry + fMergeOffset);
117 fIsSelectedResult = fEvent->GetHeader()->GetOfflineTrigger();
119 if (fMixingHandler) fMixingHandler->BeginEvent(entry);
124 //______________________________________________________________________________
125 Bool_t AliAODInputHandler::Notify(const char* path)
127 // Notifaction of directory change
128 if (fMixingHandler) fMixingHandler->Notify(path);
129 if (!fFriendsConnected) {
131 fEvent->ReadFromTree(fTree, "reconnect");
133 fFriendsConnected = kFALSE;
135 TTree *ttree = fTree->GetTree();
136 if (!ttree) ttree = fTree;
137 TString statFname(gSystem->DirName(ttree->GetCurrentFile()->GetName()));
138 statFname += "/EventStat_temp.root";
139 TFile *statFile = TFile::Open(statFname, "READ");
141 TList *list = (TList*)statFile->Get("cstatsout");
143 AliVCuts *physSel = (AliVCuts*)list->At(0);
145 TH2F *hAll = dynamic_cast<TH2F*>(physSel->GetStatistics("ALL"));
146 TH2F *hBin0 = dynamic_cast<TH2F*>(physSel->GetStatistics("BIN0"));
147 if (fHistStatistics[0] && hAll) {
150 fHistStatistics[0]->Merge(&tmplist);
153 if (fHistStatistics[1] && hBin0) fHistStatistics[1]->Merge(&tmplist);
155 fHistStatistics[0] = static_cast<TH2F*>(hAll->Clone());
156 fHistStatistics[1] = static_cast<TH2F*>(hBin0->Clone());
157 fHistStatistics[0]->SetDirectory(0);
158 fHistStatistics[1]->SetDirectory(0);
168 //______________________________________________________________________________
169 Bool_t AliAODInputHandler::FinishEvent()
172 if (fMixingHandler) fMixingHandler->FinishEvent();
176 //______________________________________________________________________________
177 void AliAODInputHandler::AddFriend(char* filename)
180 TNamed* obj = new TNamed(filename, filename);
184 //______________________________________________________________________________
185 Option_t *AliAODInputHandler::GetDataType() const
187 // Returns handled data type.
191 //______________________________________________________________________________
192 TObject *AliAODInputHandler::GetStatistics(Option_t *option) const
194 // Get the statistics histogram(s) from the physics selection object. This
195 // should be called during FinishTaskOutput(). Option can be empty (default
196 // statistics histogram) or BIN0.
199 if (opt=="BIN0") return fHistStatistics[1];
200 return fHistStatistics[0];
203 void AliAODInputHandler::ConnectFriends()
205 // Connect the friend trees
207 TIter next(fFriends);
209 TString aodTreeFName,aodFriendTreeFName;
210 TTree *ttree = fTree->GetTree();
211 if (!ttree) ttree = fTree;
212 aodTreeFName = ttree->GetCurrentFile()->GetName();
214 while((obj = (TNamed*)next())) {
215 aodFriendTreeFName = aodTreeFName;
216 aodFriendTreeFName.ReplaceAll("AliAOD.root",obj->GetName());
217 aodFriendTreeFName.ReplaceAll("AliAODs.root",obj->GetName());
218 ttree->AddFriend("aodTree", aodFriendTreeFName.Data());
221 // Friends have to be merged
222 TNamed* filename = (TNamed*) (fFriends->At(0));
223 fFileToMerge = new TFile(filename->GetName());
225 fFileToMerge->GetObject("aodTree", fTreeToMerge);
226 if (!fAODEventToMerge) fAODEventToMerge = new AliAODEvent();
227 fAODEventToMerge->ReadFromTree(fTreeToMerge);
230 fFriendsConnected = kTRUE;