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()),
50 // Default constructor
51 fHistStatistics[0] = fHistStatistics[1] = NULL;
54 //______________________________________________________________________________
55 AliAODInputHandler::AliAODInputHandler(const char* name, const char* title):
56 AliInputEventHandler(name, title),
58 fMCEvent(new AliMCEvent()),
59 fFriends(new TList()),
67 fHistStatistics[0] = fHistStatistics[1] = NULL;
70 //______________________________________________________________________________
71 AliAODInputHandler::~AliAODInputHandler()
75 if (fHistStatistics[0]) {
76 delete fHistStatistics[0];
77 fHistStatistics[0] = 0;
79 if (fHistStatistics[1]) {
80 delete fHistStatistics[1];
81 fHistStatistics[1] = 0;
85 //______________________________________________________________________________
86 Bool_t AliAODInputHandler::Init(TTree* tree, Option_t* opt)
88 // Initialisation necessary for each new tree
94 if (!fTree) return kFALSE;
96 // fTree->GetEntry(0);
97 TString aodTreeFName,aodFriendTreeFName;
98 TTree *ttree = fTree->GetTree();
99 if (!ttree) ttree = fTree;
100 aodTreeFName = ttree->GetCurrentFile()->GetName();
102 while((obj = (TNamed*)next())) {
103 aodFriendTreeFName = aodTreeFName;
104 aodFriendTreeFName.ReplaceAll("AliAOD.root",obj->GetName());
105 aodFriendTreeFName.ReplaceAll("AliAODs.root",obj->GetName());
106 ttree->AddFriend("aodTree", aodFriendTreeFName.Data());
109 // Friends have to be merged
110 TNamed* filename = (TNamed*) (fFriends->At(0));
111 fFileToMerge = new TFile(filename->GetName());
113 fFileToMerge->GetObject("aodTree", fTreeToMerge);
114 if (!fAODEventToMerge) fAODEventToMerge = new AliAODEvent();
115 fAODEventToMerge->ReadFromTree(fTreeToMerge);
122 // Get pointer to AOD event
123 if (!fEvent) fEvent = new AliAODEvent();
125 fEvent->ReadFromTree(fTree);
127 if (fMixingHandler) fMixingHandler->Init(tree, opt);
132 //______________________________________________________________________________
133 Bool_t AliAODInputHandler::BeginEvent(Long64_t entry)
136 TClonesArray* mcParticles = (TClonesArray*) (fEvent->FindListObject("mcparticles"));
137 if (mcParticles) fMCEvent->SetParticleArray(mcParticles);
138 if (fTreeToMerge) fTreeToMerge->GetEntry(entry + fMergeOffset);
140 fIsSelectedResult = fEvent->GetHeader()->GetOfflineTrigger();
142 if (fMixingHandler) fMixingHandler->BeginEvent(entry);
147 //______________________________________________________________________________
148 Bool_t AliAODInputHandler::Notify(const char* path)
150 // Notifaction of directory change
151 if (fMixingHandler) fMixingHandler->Notify(path);
152 TTree *ttree = fTree->GetTree();
153 if (!ttree) ttree = fTree;
154 TString statFname(gSystem->DirName(ttree->GetCurrentFile()->GetName()));
155 statFname += "/EventStat_temp.root";
156 TFile *statFile = TFile::Open(statFname, "READ");
158 TList *list = (TList*)statFile->Get("cstatsout");
160 AliVCuts *physSel = (AliVCuts*)list->At(0);
162 TH2F *hAll = dynamic_cast<TH2F*>(physSel->GetStatistics("ALL"));
163 TH2F *hBin0 = dynamic_cast<TH2F*>(physSel->GetStatistics("BIN0"));
164 if (fHistStatistics[0] && hAll) {
167 fHistStatistics[0]->Merge(&tmplist);
170 if (fHistStatistics[1] && hBin0) fHistStatistics[1]->Merge(&tmplist);
172 fHistStatistics[0] = static_cast<TH2F*>(hAll->Clone());
173 fHistStatistics[1] = static_cast<TH2F*>(hBin0->Clone());
174 fHistStatistics[0]->SetDirectory(0);
175 fHistStatistics[1]->SetDirectory(0);
185 //______________________________________________________________________________
186 Bool_t AliAODInputHandler::FinishEvent()
189 if (fMixingHandler) fMixingHandler->FinishEvent();
193 //______________________________________________________________________________
194 void AliAODInputHandler::AddFriend(char* filename)
197 TNamed* obj = new TNamed(filename, filename);
201 //______________________________________________________________________________
202 Option_t *AliAODInputHandler::GetDataType() const
204 // Returns handled data type.
208 //______________________________________________________________________________
209 TObject *AliAODInputHandler::GetStatistics(Option_t *option) const
211 // Get the statistics histogram(s) from the physics selection object. This
212 // should be called during FinishTaskOutput(). Option can be empty (default
213 // statistics histogram) or BIN0.
216 if (opt=="BIN0") return fHistStatistics[1];
217 return fHistStatistics[0];