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) :
52 AliCFGridSparse(name,title,nVarIn,nBinIn),
62 //____________________________________________________________________
63 AliCFEffGrid::AliCFEffGrid(const Char_t* name, const Char_t* title, const AliCFContainer &c) :
64 AliCFGridSparse(name,title,c.GetNVar(),c.GetNBins()),
73 //assign the container;
75 for (Int_t iVar=0; iVar<GetNVar(); iVar++) {
76 Int_t nbins = c.GetNBins(iVar);
77 Double_t* array=new Double_t[nbins+1] ;
78 c.GetBinLimits(iVar,array);
79 SetBinLimits(iVar,array);
82 for (Int_t iVar=0; iVar<GetNVar(); iVar++) SetVarTitle(iVar,c.GetVarTitle(iVar));
84 //____________________________________________________________________
85 AliCFEffGrid::AliCFEffGrid(const AliCFEffGrid& eff) :
94 ((AliCFEffGrid &)eff).Copy(*this);
97 //____________________________________________________________________
98 AliCFEffGrid::~AliCFEffGrid()
105 //____________________________________________________________________
106 AliCFEffGrid &AliCFEffGrid::operator=(const AliCFEffGrid &eff)
109 // assigment operator
111 if (this != &eff) eff.Copy(*this);
115 //____________________________________________________________________
116 void AliCFEffGrid::CalculateEfficiency(Int_t istep1,Int_t istep2, Option_t *option)
119 // Calculate the efficiency matrix and its error between selection
120 // Steps istep1 and istep2
122 // 'option' is used as an argument for THnSparse::Divide
123 // default is "B" : binomial error calculation
128 AliCFGridSparse *num=GetNum();
129 AliCFGridSparse *den=GetDen();
133 this->Divide(num,den,1.,1.,option);
134 SetTitle(Form("Efficiency: %s / %s",fContainer->GetStepTitle(istep1),fContainer->GetStepTitle(istep2)));
136 AliInfo(Form("Efficiency calculated for steps %i and %i.",fSelNum,fSelDen));
138 //_____________________________________________________________________
139 Double_t AliCFEffGrid::GetAverage() const
142 // Get the average efficiency
149 THnSparse* num = ((AliCFGridSparse*)GetNum())->GetGrid() ;
150 THnSparse* den = ((AliCFGridSparse*)GetDen())->GetGrid() ;
152 for (Long_t iBin=0; iBin<num->GetNbins(); iBin++) valnum+=num->GetBinContent(iBin);
153 for (Long_t iBin=0; iBin<den->GetNbins(); iBin++) valden+=den->GetBinContent(iBin);
154 if (valden>0) val=valnum/valden;
155 AliInfo(Form(" The Average Efficiency = %f ",val));
158 //___________________________________________________________________
159 TH1* AliCFEffGrid::Project(Int_t ivar1, Int_t ivar2, Int_t ivar3) const
162 // Make a projection along variable ivar1 (and ivar2 (and ivar3))
165 if (fSelNum<0 || fSelDen<0) {
166 AliError("You must call CalculateEfficiency() first !");
169 const Int_t nDim = 3 ;
170 Int_t dim[nDim] = {ivar1,ivar2,ivar3} ;
172 THnSparse *hNum, *hDen, *ratio;
177 hNum = ((AliCFGridSparse*)GetNum())->GetGrid()->Projection(nDim-2,dim);
178 hDen = ((AliCFGridSparse*)GetDen())->GetGrid()->Projection(nDim-2,dim);
179 ratio = (THnSparse*)hNum->Clone();
180 ratio->Divide(hNum,hDen,1.,1.,"B");
181 h = ratio->Projection(0);
184 hNum = ((AliCFGridSparse*)GetNum())->GetGrid()->Projection(nDim-1,dim);
185 hDen = ((AliCFGridSparse*)GetDen())->GetGrid()->Projection(nDim-1,dim);
186 ratio = (THnSparse*)hNum->Clone();
187 ratio->Divide(hNum,hDen,1.,1.,"B");
188 h = ratio->Projection(1,0);
192 hNum = ((AliCFGridSparse*)GetNum())->GetGrid()->Projection(nDim,dim);
193 hDen = ((AliCFGridSparse*)GetDen())->GetGrid()->Projection(nDim,dim);
194 ratio = (THnSparse*)hNum->Clone();
195 ratio->Divide(hNum,hDen,1.,1.,"B");
196 h = ratio->Projection(0,1,2);
199 delete hNum; delete hDen; delete ratio;
202 //___________________________________________________________________
203 AliCFEffGrid* AliCFEffGrid::MakeSlice(Int_t nVars, const Int_t* vars, const Double_t* varMin, const Double_t* varMax, Bool_t useBins) const {
205 // returns a slice of the efficiency grid (slice is actually done on the container, and efficiency recomputed)
208 AliCFContainer* cont = fContainer->MakeSlice(nVars,vars,varMin,varMax,useBins);
209 AliCFEffGrid * eff = new AliCFEffGrid(Form("%s_sliced",GetName()), Form("%s_sliced",GetTitle()), *cont);
210 eff->CalculateEfficiency(fSelNum,fSelDen);