]> git.uio.no Git - u/mrichter/AliRoot.git/blame - STEER/AliAODInputHandler.cxx
Fixing RESOURCE_LEAK defect reported by Coverity
[u/mrichter/AliRoot.git] / STEER / AliAODInputHandler.cxx
CommitLineData
397596ed 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
933fd60f 23#include <TTree.h>
26772015 24#include <TList.h>
25#include <TNamed.h>
fb0cfe69 26#include <TFile.h>
70908d05 27#include <TH2.h>
397596ed 28
29#include "AliAODInputHandler.h"
30#include "AliAODEvent.h"
70908d05 31#include "AliVCuts.h"
397596ed 32
33ClassImp(AliAODInputHandler)
34
c2b6979d 35static Option_t *gAODDataType = "AOD";
36
397596ed 37//______________________________________________________________________________
38AliAODInputHandler::AliAODInputHandler() :
90e04a88 39 AliInputEventHandler(),
4195c9c9 40 fEvent(0),
04a79fa0 41 fMCEvent(new AliMCEvent()),
1f842495 42 fFriends(new TList()),
43 fMergeEvents(kFALSE),
44 fFileToMerge(0),
45 fTreeToMerge(0),
04daa8bf 46 fAODEventToMerge(0),
47 fMergeOffset(0)
397596ed 48{
26772015 49 // Default constructor
70908d05 50 fHistStatistics[0] = fHistStatistics[1] = NULL;
397596ed 51}
52
53//______________________________________________________________________________
26772015 54AliAODInputHandler::AliAODInputHandler(const char* name, const char* title):
55 AliInputEventHandler(name, title),
56 fEvent(0),
04a79fa0 57 fMCEvent(new AliMCEvent()),
1f842495 58 fFriends(new TList()),
59 fMergeEvents(kFALSE),
60 fFileToMerge(0),
61 fTreeToMerge(0),
04daa8bf 62 fAODEventToMerge(0),
63 fMergeOffset(0)
397596ed 64{
26772015 65 // Constructor
70908d05 66 fHistStatistics[0] = fHistStatistics[1] = NULL;
397596ed 67}
68
69//______________________________________________________________________________
26772015 70AliAODInputHandler::~AliAODInputHandler()
397596ed 71{
26772015 72// Destructor
70908d05 73 fFriends->Delete();
74 if (fHistStatistics[0]) {
75 delete fHistStatistics[0];
76 fHistStatistics[0] = 0;
77 }
78 if (fHistStatistics[1]) {
79 delete fHistStatistics[1];
80 fHistStatistics[1] = 0;
81 }
397596ed 82}
83
70908d05 84//______________________________________________________________________________
b890a10d 85Bool_t AliAODInputHandler::Init(TTree* tree, Option_t* opt)
397596ed 86{
300d5701 87 // Initialisation necessary for each new tree
70908d05 88 if (!fMergeEvents) {
89 fTree = tree;
90 TIter next(fFriends);
91 TNamed* obj;
1f842495 92
70908d05 93 if (!fTree) return kFALSE;
94 fTree->GetEntry(0);
95 TString aodTreeFName,aodFriendTreeFName;
96 TTree *ttree = fTree->GetTree();
97 if (!ttree) ttree = fTree;
98 aodTreeFName = ttree->GetCurrentFile()->GetName();
99
100 while((obj = (TNamed*)next())) {
101 aodFriendTreeFName = aodTreeFName;
102 aodFriendTreeFName.ReplaceAll("AliAOD.root",obj->GetName());
103 aodFriendTreeFName.ReplaceAll("AliAODs.root",obj->GetName());
104 ttree->AddFriend("aodTree", aodFriendTreeFName.Data());
4195c9c9 105 }
70908d05 106 } else {
107 // Friends have to be merged
108 TNamed* filename = (TNamed*) (fFriends->At(0));
109 fFileToMerge = new TFile(filename->GetName());
110 if (fFileToMerge) {
111 fFileToMerge->GetObject("aodTree", fTreeToMerge);
112 if (!fAODEventToMerge) fAODEventToMerge = new AliAODEvent();
113 fAODEventToMerge->ReadFromTree(fTreeToMerge);
114 }
115 }
d329cad3 116
70908d05 117 SwitchOffBranches();
118 SwitchOnBranches();
4195c9c9 119
70908d05 120 // Get pointer to AOD event
121 if (!fEvent) fEvent = new AliAODEvent();
300d5701 122
70908d05 123 fEvent->ReadFromTree(fTree);
124
125 if (fMixingHandler) fMixingHandler->Init(tree, opt);
04a79fa0 126
70908d05 127 return kTRUE;
397596ed 128}
129
70908d05 130//______________________________________________________________________________
1f842495 131Bool_t AliAODInputHandler::BeginEvent(Long64_t entry)
fbb264e0 132{
133 //
04a79fa0 134 TClonesArray* mcParticles = (TClonesArray*) (fEvent->FindListObject("mcparticles"));
135 if (mcParticles) fMCEvent->SetParticleArray(mcParticles);
04daa8bf 136 if (fTreeToMerge) fTreeToMerge->GetEntry(entry + fMergeOffset);
1f842495 137
0c6c629b 138 fIsSelectedResult = fEvent->GetHeader()->GetOfflineTrigger();
b890a10d 139
140 if (fMixingHandler) fMixingHandler->BeginEvent(entry);
0c6c629b 141
fbb264e0 142 return kTRUE;
143}
144
70908d05 145//______________________________________________________________________________
b890a10d 146Bool_t AliAODInputHandler::Notify(const char* path)
147{
148 // Notifaction of directory change
149 if (fMixingHandler) fMixingHandler->Notify(path);
70908d05 150 TTree *ttree = fTree->GetTree();
151 if (!ttree) ttree = fTree;
152 TString statFname = ttree->GetCurrentFile()->GetName();
153 statFname.ReplaceAll("AliAOD.root", "EventStat_temp.root");
154 TFile *statFile = TFile::Open(statFname, "READ");
155 if (statFile) {
156 TList *list = (TList*)statFile->Get("cstatsout");
157 if (list) {
158 AliVCuts *physSel = (AliVCuts*)list->At(0);
159 if (physSel) {
160 TH2F *hAll = dynamic_cast<TH2F*>(physSel->GetStatistics("ALL"));
161 TH2F *hBin0 = dynamic_cast<TH2F*>(physSel->GetStatistics("BIN0"));
162 if (fHistStatistics[0] && hAll) {
163 TList tmplist;
164 tmplist.Add(hAll);
165 fHistStatistics[0]->Merge(&tmplist);
166 tmplist.Clear();
167 tmplist.Add(hBin0);
168 if (fHistStatistics[1] && hBin0) fHistStatistics[1]->Merge(&tmplist);
169 } else {
170 fHistStatistics[0] = hAll;
171 fHistStatistics[1] = hBin0;
172 }
173 }
174 }
b8047d30 175 delete statFile;
70908d05 176 }
b890a10d 177 return kTRUE;
178}
179
70908d05 180//______________________________________________________________________________
b890a10d 181Bool_t AliAODInputHandler::FinishEvent()
182{
183 // Finish event
184 if (fMixingHandler) fMixingHandler->FinishEvent();
185 return kTRUE;
186}
187
70908d05 188//______________________________________________________________________________
26772015 189void AliAODInputHandler::AddFriend(char* filename)
190{
191 // Add a friend tree
192 TNamed* obj = new TNamed(filename, filename);
193 fFriends->Add(obj);
194}
c2b6979d 195
70908d05 196//______________________________________________________________________________
c2b6979d 197Option_t *AliAODInputHandler::GetDataType() const
198{
199// Returns handled data type.
200 return gAODDataType;
201}
70908d05 202
203//______________________________________________________________________________
204TObject *AliAODInputHandler::GetStatistics(Option_t *option) const
205{
206// Get the statistics histogram(s) from the physics selection object. This
207// should be called during FinishTaskOutput(). Option can be empty (default
208// statistics histogram) or BIN0.
209 TString opt(option);
210 opt.ToUpper();
211 if (opt=="BIN0") return fHistStatistics[1];
212 return fHistStatistics[0];
213}