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
114 // 'option' is used as an argument for THnSparse::Divide
115 // default is "B" : binomial error calculation
120 AliCFVGrid *num=GetNum();
121 AliCFVGrid *den=GetDen();
125 this->Divide(num,den,1.,1.,option);
127 AliInfo(Form("Efficiency calculated for steps %i and %i.",fSelNum,fSelDen));
129 //_____________________________________________________________________
130 Double_t AliCFEffGrid::GetAverage() const
133 // Get the average efficiency
140 THnSparse* num = ((AliCFGridSparse*)GetNum())->GetGrid() ;
141 THnSparse* den = ((AliCFGridSparse*)GetDen())->GetGrid() ;
143 for (Long_t iBin=0; iBin<num->GetNbins(); iBin++) valnum+=num->GetBinContent(iBin);
144 for (Long_t iBin=0; iBin<den->GetNbins(); iBin++) valden+=den->GetBinContent(iBin);
145 if (valden>0) val=valnum/valden;
146 AliInfo(Form(" The Average Efficiency = %f ",val));
149 //_____________________________________________________________________
150 Double_t AliCFEffGrid::GetAverage(Double_t *varMin, Double_t* varMax ) const
153 // Get ave efficiency in a range
154 // (may not work properly, should be modified)
157 Int_t *indexMin = new Int_t[fNVar];
158 Int_t *indexMax = new Int_t[fNVar];
159 Int_t *index = new Int_t[fNVar];
161 //Find out the min and max bins
163 for(Int_t i=0;i<fNVar;i++){
164 Double_t xmin=varMin[i]; // the min values
165 Double_t xmax=varMax[i]; // the max values
166 Int_t nbins=fNVarBins[i]+1;
167 Double_t *bins=new Double_t[nbins];
168 for(Int_t ibin =0;ibin<nbins;ibin++){
169 bins[ibin] = fVarBinLimits[ibin+fOffset[i]];
171 indexMin[i] = TMath::BinarySearch(nbins,bins,xmin);
172 indexMax[i] = TMath::BinarySearch(nbins,bins,xmax);
173 if(xmax>=bins[nbins-1]){
174 indexMax[i]=indexMax[i]-1;
181 for(Int_t i=0;i<fNDim;i++){
182 for (Int_t j=0;j<fNVar;j++)index[j]=GetBinIndex(j,i);
184 for (Int_t j=0;j<fNVar;j++){
185 if(!(index[j]>=indexMin[j] && index[j]<=indexMax[j]))isIn=kFALSE;
188 valnum+=GetNum()->GetElement(i);
189 valden+=GetDen()->GetElement(i);
195 if(valden>0)val=valnum/valden;
196 AliInfo(Form(" the Average Efficiency = %f ",val));
199 //____________________________________________________________________
200 void AliCFEffGrid::Copy(TObject& eff) const
206 AliCFEffGrid& target = (AliCFEffGrid &) eff;
208 target.fSelNum=fSelNum;
209 target.fSelDen=fSelDen;
211 target.fContainer=fContainer;
213 //___________________________________________________________________
214 TH1D *AliCFEffGrid::Project(Int_t ivar) const
217 // Make a 1D projection along variable ivar
220 const Int_t nDim = 1 ;
221 Int_t dim[nDim] = {ivar} ;
222 THnSparse* hNum = ((AliCFGridSparse*)GetNum())->GetGrid()->Projection(nDim,dim);
223 THnSparse* hDen = ((AliCFGridSparse*)GetDen())->GetGrid()->Projection(nDim,dim);
224 THnSparse* ratio = (THnSparse*)hNum->Clone();
225 ratio->Divide(hNum,hDen,1.,1.,"B");
226 delete hNum; delete hDen;
227 return ratio->Projection(0);
229 //___________________________________________________________________
230 TH2D *AliCFEffGrid::Project(Int_t ivar1,Int_t ivar2) const
233 // Make a 2D projection along variable ivar1,ivar2
236 const Int_t nDim = 2 ;
237 Int_t dim[nDim] = {ivar1,ivar2} ;
238 THnSparse* hNum = ((AliCFGridSparse*)GetNum())->GetGrid()->Projection(nDim,dim);
239 THnSparse* hDen = ((AliCFGridSparse*)GetDen())->GetGrid()->Projection(nDim,dim);
240 THnSparse* ratio = (THnSparse*)hNum->Clone();
241 ratio->Divide(hNum,hDen,1.,1.,"B");
242 delete hNum; delete hDen;
243 return ratio->Projection(0,1);
245 //___________________________________________________________________
246 TH3D *AliCFEffGrid::Project(Int_t ivar1, Int_t ivar2, Int_t ivar3) const
249 // Make a 3D projection along variable ivar1,ivar2,ivar3
252 const Int_t nDim = 3 ;
253 Int_t dim[nDim] = {ivar1,ivar2,ivar3} ;
254 THnSparse* hNum = ((AliCFGridSparse*)GetNum())->GetGrid()->Projection(nDim,dim);
255 THnSparse* hDen = ((AliCFGridSparse*)GetDen())->GetGrid()->Projection(nDim,dim);
256 THnSparse* ratio = (THnSparse*)hNum->Clone();
257 ratio->Divide(hNum,hDen,1.,1.,"B");
258 delete hNum; delete hDen;
259 return ratio->Projection(0,1,2);
261 //___________________________________________________________________
262 AliCFEffGrid* AliCFEffGrid::MakeSlice(Int_t nVars, Int_t* vars, Double_t* varMin, Double_t* varMax, Int_t numStep, Int_t denStep) const {
264 // Makes a slice along the "nVars" variables defined in the array "vars[nVars]" for all the container steps.
265 // The ranges of ALL the container variables must be defined in the array varMin[fNVar] and varMax[fNVar].
266 // This function returns the effiency relative to this new 'sliced' container, between steps defined in numStep and denStep
268 AliCFContainer* cont = fContainer->MakeSlice(nVars,vars,varMin,varMax);
269 AliCFEffGrid * eff = new AliCFEffGrid(Form("%s_sliced",GetName()), Form("%s_sliced",GetTitle()), *cont);
270 eff->CalculateEfficiency(numStep,denStep);