2 /**************************************************************************
3 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
5 * Author: The ALICE Off-line Project. *
6 * Contributors are mentioned in the code where appropriate. *
8 * Permission to use, copy, modify and distribute this software and its *
9 * documentation strictly for non-commercial purposes is hereby granted *
10 * without fee, provided that the above copyright notice appears in all *
11 * copies and that both the copyright notice and this permission notice *
12 * appear in the supporting documentation. The authors make no claims *
13 * about the suitability of this software for any purpose. It is *
14 * provided "as is" without express or implied warranty. *
15 **************************************************************************/
16 //--------------------------------------------------------------------//
18 // AliCFEffGrid Class //
19 // Class to handle efficiency grids //
21 // -- Author : S.Arcelli //
25 //--------------------------------------------------------------------//
30 #include "AliCFEffGrid.h"
35 //____________________________________________________________________
36 ClassImp(AliCFEffGrid)
38 //____________________________________________________________________
39 AliCFEffGrid::AliCFEffGrid() :
46 // default constructor
50 //____________________________________________________________________
51 AliCFEffGrid::AliCFEffGrid(const Char_t* name, const Char_t* title, const Int_t nVarIn, const Int_t * nBinIn, const Double_t *binLimitsIn) :
52 AliCFGridSparse(name,title,nVarIn,nBinIn,binLimitsIn),
62 //____________________________________________________________________
63 AliCFEffGrid::AliCFEffGrid(const Char_t* name, const Char_t* title, const AliCFContainer &c) :
64 AliCFGridSparse(name,title,c.GetNVar(),c.GetNBins(),c.GetBinLimits()),
73 //assign the container;
76 //____________________________________________________________________
77 AliCFEffGrid::AliCFEffGrid(const AliCFEffGrid& eff) : AliCFGridSparse(),
85 ((AliCFEffGrid &)eff).Copy(*this);
88 //____________________________________________________________________
89 AliCFEffGrid::~AliCFEffGrid()
96 //____________________________________________________________________
97 AliCFEffGrid &AliCFEffGrid::operator=(const AliCFEffGrid &eff)
100 // assigment operator
103 ((AliCFEffGrid &) eff).Copy(*this);
106 //____________________________________________________________________
108 void AliCFEffGrid::CalculateEfficiency(Int_t istep1,Int_t istep2, Option_t *option)
111 // Calculate the efficiency matrix and its error between selection
112 // Steps istep1 and istep2
117 AliCFVGrid *num=GetNum();
118 AliCFVGrid *den=GetDen();
122 this->Divide(num,den,1.,1.,option);
124 Int_t nEmptyBinsNum=0;
125 Int_t nEmptyBinsNumAndDen=0;
126 for(Int_t iel=0;iel<fNDim;iel++){
127 if(den->GetElement(iel)>0){
128 if(num->GetElement(iel)==0)nEmptyBinsNum++; //num==0,den!=0
131 nEmptyBinsNumAndDen++;
134 // Some monitoring printout:
135 AliInfo(Form("Efficiency calculated for steps %i and %i: %i empty bins in the numerator && !denominator and %i empty bins in numerator && denominator were found.",fSelNum,fSelDen,nEmptyBinsNumAndDen,nEmptyBinsNum));
136 AliInfo(Form("The correction map contains %i empty bins ",nEmptyBinsNum+nEmptyBinsNumAndDen));
138 //_____________________________________________________________________
139 Double_t AliCFEffGrid::GetAverage() const
142 // Get the average efficiency
148 for(Int_t i=0;i<fNDim;i++){
149 valnum+=GetNum()->GetElement(i);
150 valden+=GetDen()->GetElement(i);
152 if(valden>0)val=valnum/valden;
153 AliInfo(Form(" The Average Efficiency = %f ",val));
157 //_____________________________________________________________________
158 Double_t AliCFEffGrid::GetAverage(Double_t *varMin, Double_t* varMax ) const
161 // Get ave efficiency in a range
166 Int_t *indexMin = new Int_t[fNVar];
167 Int_t *indexMax = new Int_t[fNVar];
168 Int_t *index = new Int_t[fNVar];
170 //Find out the min and max bins
172 for(Int_t i=0;i<fNVar;i++){
173 Double_t xmin=varMin[i]; // the min values
174 Double_t xmax=varMax[i]; // the max values
175 Int_t nbins=fNVarBins[i]+1;
176 Double_t *bins=new Double_t[nbins];
177 for(Int_t ibin =0;ibin<nbins;ibin++){
178 bins[ibin] = fVarBinLimits[ibin+fOffset[i]];
180 indexMin[i] = TMath::BinarySearch(nbins,bins,xmin);
181 indexMax[i] = TMath::BinarySearch(nbins,bins,xmax);
182 if(xmax>=bins[nbins-1]){
183 indexMax[i]=indexMax[i]-1;
190 for(Int_t i=0;i<fNDim;i++){
191 for (Int_t j=0;j<fNVar;j++)index[j]=GetBinIndex(j,i);
193 for (Int_t j=0;j<fNVar;j++){
194 if(!(index[j]>=indexMin[j] && index[j]<=indexMax[j]))isIn=kFALSE;
197 valnum+=GetNum()->GetElement(i);
198 valden+=GetDen()->GetElement(i);
204 if(valden>0)val=valnum/valden;
205 AliInfo(Form(" the Average Efficiency = %f ",val));
208 //____________________________________________________________________
209 void AliCFEffGrid::Copy(TObject& eff) const
215 AliCFEffGrid& target = (AliCFEffGrid &) eff;
217 target.fSelNum=fSelNum;
218 target.fSelDen=fSelDen;
220 target.fContainer=fContainer;
222 //___________________________________________________________________
223 TH1D *AliCFEffGrid::Project(Int_t ivar) const
226 // Make a 1D projection along variable ivar
229 const Int_t nDim = 1 ;
230 Int_t dim[nDim] = {ivar} ;
231 THnSparse* hNum = ((AliCFGridSparse*)GetNum())->GetGrid()->Projection(nDim,dim);
232 THnSparse* hDen = ((AliCFGridSparse*)GetDen())->GetGrid()->Projection(nDim,dim);
233 THnSparse* ratio = (THnSparse*)hNum->Clone();
234 ratio->Divide(hNum,hDen,1.,1.,"B");
235 delete hNum; delete hDen;
236 return ratio->Projection(ivar);
238 //___________________________________________________________________
239 TH2D *AliCFEffGrid::Project(Int_t ivar1,Int_t ivar2) const
242 // Make a 2D projection along variable ivar1,ivar2
245 const Int_t nDim = 2 ;
246 Int_t dim[nDim] = {ivar1,ivar2} ;
247 THnSparse* hNum = ((AliCFGridSparse*)GetNum())->GetGrid()->Projection(nDim,dim);
248 THnSparse* hDen = ((AliCFGridSparse*)GetDen())->GetGrid()->Projection(nDim,dim);
249 THnSparse* ratio = (THnSparse*)hNum->Clone();
250 ratio->Divide(hNum,hDen,1.,1.,"B");
251 delete hNum; delete hDen;
252 return ratio->Projection(ivar1,ivar2);
254 //___________________________________________________________________
255 TH3D *AliCFEffGrid::Project(Int_t ivar1, Int_t ivar2, Int_t ivar3) const
258 // Make a 3D projection along variable ivar1,ivar2,ivar3
261 const Int_t nDim = 3 ;
262 Int_t dim[nDim] = {ivar1,ivar2,ivar3} ;
263 THnSparse* hNum = ((AliCFGridSparse*)GetNum())->GetGrid()->Projection(nDim,dim);
264 THnSparse* hDen = ((AliCFGridSparse*)GetDen())->GetGrid()->Projection(nDim,dim);
265 THnSparse* ratio = (THnSparse*)hNum->Clone();
266 ratio->Divide(hNum,hDen,1.,1.,"B");
267 delete hNum; delete hDen;
268 return ratio->Projection(ivar1,ivar2,ivar3);