**************************************************************************/
//--------------------------------------------------------------------//
// //
-// AliCFEffGrid Class //
+// AliCFEffGrid Class //
// Class to handle efficiency grids //
// //
// -- Author : S.Arcelli //
}
//____________________________________________________________________
-AliCFEffGrid::AliCFEffGrid(const Char_t* name, const Char_t* title, const Int_t nVarIn, const Int_t * nBinIn, const Double_t *binLimitsIn) :
- AliCFGridSparse(name,title,nVarIn,nBinIn,binLimitsIn),
+AliCFEffGrid::AliCFEffGrid(const Char_t* name, const Char_t* title, const Int_t nVarIn, const Int_t * nBinIn) :
+ AliCFGridSparse(name,title,nVarIn,nBinIn),
fContainer(0x0),
fSelNum(-1),
fSelDen(-1)
}
//____________________________________________________________________
AliCFEffGrid::AliCFEffGrid(const Char_t* name, const Char_t* title, const AliCFContainer &c) :
- AliCFGridSparse(name,title,c.GetNVar(),c.GetNBins(),c.GetBinLimits()),
+ AliCFGridSparse(name,title,c.GetNVar(),c.GetNBins()),
fContainer(NULL),
fSelNum(-1),
fSelDen(-1)
SumW2();
//assign the container;
fContainer=&c;
+ for (Int_t iVar=0; iVar<GetNVar(); iVar++) {
+ Int_t nbins = c.GetNBins(iVar);
+ Double_t* array=new Double_t[nbins+1] ;
+ c.GetBinLimits(iVar,array);
+ SetBinLimits(iVar,array);
+ delete [] array ;
+ }
+ for (Int_t iVar=0; iVar<GetNVar(); iVar++) SetVarTitle(iVar,c.GetVarTitle(iVar));
}
//____________________________________________________________________
-AliCFEffGrid::AliCFEffGrid(const AliCFEffGrid& eff) : AliCFGridSparse(),
+AliCFEffGrid::AliCFEffGrid(const AliCFEffGrid& eff) :
+ AliCFGridSparse(eff),
fContainer(0x0),
fSelNum(-1),
fSelDen(-1)
//
// assigment operator
//
- if (this != &eff)
- ((AliCFEffGrid &) eff).Copy(*this);
+ if (this != &eff) eff.Copy(*this);
return *this;
}
-//____________________________________________________________________
+//____________________________________________________________________
void AliCFEffGrid::CalculateEfficiency(Int_t istep1,Int_t istep2, Option_t *option)
{
//
// Calculate the efficiency matrix and its error between selection
// Steps istep1 and istep2
//
+ // 'option' is used as an argument for THnSparse::Divide
+ // default is "B" : binomial error calculation
+ //
fSelNum=istep1;
fSelDen=istep2;
- AliCFVGrid *num=GetNum();
- AliCFVGrid *den=GetDen();
+ AliCFGridSparse *num=GetNum();
+ AliCFGridSparse *den=GetDen();
num->SumW2();
den->SumW2();
this->SumW2();
this->Divide(num,den,1.,1.,option);
+ SetTitle(Form("Efficiency: %s / %s",fContainer->GetStepTitle(istep1),fContainer->GetStepTitle(istep2)));
- Int_t nEmptyBinsNum=0;
- Int_t nEmptyBinsNumAndDen=0;
- for(Int_t iel=0;iel<fNDim;iel++){
- if(den->GetElement(iel)>0){
- if(num->GetElement(iel)==0)nEmptyBinsNum++; //num==0,den!=0
- }
- else{
- nEmptyBinsNumAndDen++;
- }
- }
- // Some monitoring printout:
- 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));
- AliInfo(Form("The correction map contains %i empty bins ",nEmptyBinsNum+nEmptyBinsNumAndDen));
+ AliInfo(Form("Efficiency calculated for steps %i and %i.",fSelNum,fSelDen));
}
//_____________________________________________________________________
Double_t AliCFEffGrid::GetAverage() const
Double_t val=0;
Double_t valnum=0;
Double_t valden=0;
- for(Int_t i=0;i<fNDim;i++){
- valnum+=GetNum()->GetElement(i);
- valden+=GetDen()->GetElement(i);
- }
- if(valden>0)val=valnum/valden;
- AliInfo(Form(" The Average Efficiency = %f ",val));
+ THnSparse* num = ((AliCFGridSparse*)GetNum())->GetGrid() ;
+ THnSparse* den = ((AliCFGridSparse*)GetDen())->GetGrid() ;
+
+ for (Long_t iBin=0; iBin<num->GetNbins(); iBin++) valnum+=num->GetBinContent(iBin);
+ for (Long_t iBin=0; iBin<den->GetNbins(); iBin++) valden+=den->GetBinContent(iBin);
+ if (valden>0) val=valnum/valden;
+ AliInfo(Form(" The Average Efficiency = %f ",val));
return val;
}
-//_____________________________________________________________________
-Double_t AliCFEffGrid::GetAverage(Double_t *varMin, Double_t* varMax ) const
+//___________________________________________________________________
+TH1* AliCFEffGrid::Project(Int_t ivar1, Int_t ivar2, Int_t ivar3) const
{
//
- // Get ave efficiency in a range
+ // Make a projection along variable ivar1 (and ivar2 (and ivar3))
//
-
- Double_t val=0;
- Int_t *indexMin = new Int_t[fNVar];
- Int_t *indexMax = new Int_t[fNVar];
- Int_t *index = new Int_t[fNVar];
-
- //Find out the min and max bins
-
- for(Int_t i=0;i<fNVar;i++){
- Double_t xmin=varMin[i]; // the min values
- Double_t xmax=varMax[i]; // the max values
- Int_t nbins=fNVarBins[i]+1;
- Double_t *bins=new Double_t[nbins];
- for(Int_t ibin =0;ibin<nbins;ibin++){
- bins[ibin] = fVarBinLimits[ibin+fOffset[i]];
- }
- indexMin[i] = TMath::BinarySearch(nbins,bins,xmin);
- indexMax[i] = TMath::BinarySearch(nbins,bins,xmax);
- if(xmax>=bins[nbins-1]){
- indexMax[i]=indexMax[i]-1;
- }
- delete [] bins;
+ if (fSelNum<0 || fSelDen<0) {
+ AliError("You must call CalculateEfficiency() first !");
+ return 0x0;
}
+ const Int_t nDim = 3 ;
+ Int_t dim[nDim] = {ivar1,ivar2,ivar3} ;
- Double_t valnum=0;
- Double_t valden=0;
- for(Int_t i=0;i<fNDim;i++){
- for (Int_t j=0;j<fNVar;j++)index[j]=GetBinIndex(j,i);
- Bool_t isIn=kTRUE;
- for (Int_t j=0;j<fNVar;j++){
- if(!(index[j]>=indexMin[j] && index[j]<=indexMax[j]))isIn=kFALSE;
+ THnSparse *hNum, *hDen, *ratio;
+ TH1* h ;
+
+ if (ivar3<0) {
+ if (ivar2<0) {
+ hNum = ((AliCFGridSparse*)GetNum())->GetGrid()->Projection(nDim-2,dim);
+ hDen = ((AliCFGridSparse*)GetDen())->GetGrid()->Projection(nDim-2,dim);
+ ratio = (THnSparse*)hNum->Clone();
+ ratio->Divide(hNum,hDen,1.,1.,"B");
+ h = ratio->Projection(0);
}
- if(isIn){
- valnum+=GetNum()->GetElement(i);
- valden+=GetDen()->GetElement(i);
+ else{
+ hNum = ((AliCFGridSparse*)GetNum())->GetGrid()->Projection(nDim-1,dim);
+ hDen = ((AliCFGridSparse*)GetDen())->GetGrid()->Projection(nDim-1,dim);
+ ratio = (THnSparse*)hNum->Clone();
+ ratio->Divide(hNum,hDen,1.,1.,"B");
+ h = ratio->Projection(1,0);
}
- }
- delete [] index;
- delete [] indexMin;
- delete [] indexMax;
- if(valden>0)val=valnum/valden;
- AliInfo(Form(" the Average Efficiency = %f ",val));
- return val;
-}
-//____________________________________________________________________
-void AliCFEffGrid::Copy(TObject& eff) const
-{
- //
- // copy function
- //
- Copy(eff);
- AliCFEffGrid& target = (AliCFEffGrid &) eff;
-
- target.fSelNum=fSelNum;
- target.fSelDen=fSelDen;
- if(fContainer)
- target.fContainer=fContainer;
-}
-//___________________________________________________________________
-TH1D *AliCFEffGrid::Project(Int_t ivar) const
-{
- //
- // Make a 1D projection along variable ivar
- //
-
- const Int_t nDim = 1 ;
- Int_t dim[nDim] = {ivar} ;
- THnSparse* hNum = ((AliCFGridSparse*)GetNum())->GetGrid()->Projection(nDim,dim);
- THnSparse* hDen = ((AliCFGridSparse*)GetDen())->GetGrid()->Projection(nDim,dim);
- THnSparse* ratio = (THnSparse*)hNum->Clone();
- ratio->Divide(hNum,hDen,1.,1.,"B");
- delete hNum; delete hDen;
- return ratio->Projection(ivar);
+ }
+ else {
+ hNum = ((AliCFGridSparse*)GetNum())->GetGrid()->Projection(nDim,dim);
+ hDen = ((AliCFGridSparse*)GetDen())->GetGrid()->Projection(nDim,dim);
+ ratio = (THnSparse*)hNum->Clone();
+ ratio->Divide(hNum,hDen,1.,1.,"B");
+ h = ratio->Projection(0,1,2);
+ }
+
+ delete hNum; delete hDen; delete ratio;
+ return h ;
}
//___________________________________________________________________
-TH2D *AliCFEffGrid::Project(Int_t ivar1,Int_t ivar2) const
-{
+AliCFEffGrid* AliCFEffGrid::MakeSlice(Int_t nVars, const Int_t* vars, const Double_t* varMin, const Double_t* varMax, Bool_t useBins) const {
//
- // Make a 2D projection along variable ivar1,ivar2
+ // returns a slice of the efficiency grid (slice is actually done on the container, and efficiency recomputed)
//
- const Int_t nDim = 2 ;
- Int_t dim[nDim] = {ivar1,ivar2} ;
- THnSparse* hNum = ((AliCFGridSparse*)GetNum())->GetGrid()->Projection(nDim,dim);
- THnSparse* hDen = ((AliCFGridSparse*)GetDen())->GetGrid()->Projection(nDim,dim);
- THnSparse* ratio = (THnSparse*)hNum->Clone();
- ratio->Divide(hNum,hDen,1.,1.,"B");
- delete hNum; delete hDen;
- return ratio->Projection(ivar1,ivar2);
-}
-//___________________________________________________________________
-TH3D *AliCFEffGrid::Project(Int_t ivar1, Int_t ivar2, Int_t ivar3) const
-{
- //
- // Make a 3D projection along variable ivar1,ivar2,ivar3
- //
-
- const Int_t nDim = 3 ;
- Int_t dim[nDim] = {ivar1,ivar2,ivar3} ;
- THnSparse* hNum = ((AliCFGridSparse*)GetNum())->GetGrid()->Projection(nDim,dim);
- THnSparse* hDen = ((AliCFGridSparse*)GetDen())->GetGrid()->Projection(nDim,dim);
- THnSparse* ratio = (THnSparse*)hNum->Clone();
- ratio->Divide(hNum,hDen,1.,1.,"B");
- delete hNum; delete hDen;
- return ratio->Projection(ivar1,ivar2,ivar3);
-}
-
+ AliCFContainer* cont = fContainer->MakeSlice(nVars,vars,varMin,varMax,useBins);
+ AliCFEffGrid * eff = new AliCFEffGrid(Form("%s_sliced",GetName()), Form("%s_sliced",GetTitle()), *cont);
+ eff->CalculateEfficiency(fSelNum,fSelDen);
+ return eff;
+}