//____________________________________________________________________
AliCFEffGrid::AliCFEffGrid(const Char_t* name, const Char_t* title, const AliCFContainer &c) :
AliCFGridSparse(name,title,c.GetNVar(),c.GetNBins(),c.GetBinLimits()),
- fContainer(0x0),
+ fContainer(NULL),
fSelNum(-1),
fSelDen(-1)
{
}
//____________________________________________________________________
-void AliCFEffGrid::CalculateEfficiency(Int_t istep1,Int_t istep2)
+void AliCFEffGrid::CalculateEfficiency(Int_t istep1,Int_t istep2, Option_t *option)
{
//
// Calculate the efficiency matrix and its error between selection
fSelNum=istep1;
fSelDen=istep2;
- AliCFVGrid *num=fContainer->GetGrid(fSelNum);
- AliCFVGrid *den=fContainer->GetGrid(fSelDen);
+ AliCFVGrid *num=GetNum();
+ AliCFVGrid *den=GetDen();
num->SumW2();
den->SumW2();
this->SumW2();
- this->Divide(num,den,1.,1.,"B");
+ this->Divide(num,den,1.,1.,option);
Int_t nEmptyBinsNum=0;
Int_t nEmptyBinsNumAndDen=0;
Double_t valnum=0;
Double_t valden=0;
for(Int_t i=0;i<fNDim;i++){
- valnum+=fContainer->GetGrid(fSelNum)->GetElement(i);
- valden+=fContainer->GetGrid(fSelDen)->GetElement(i);
+ valnum+=GetNum()->GetElement(i);
+ valden+=GetDen()->GetElement(i);
}
if(valden>0)val=valnum/valden;
AliInfo(Form(" The Average Efficiency = %f ",val));
if(!(index[j]>=indexMin[j] && index[j]<=indexMax[j]))isIn=kFALSE;
}
if(isIn){
- valnum+=fContainer->GetGrid(fSelNum)->GetElement(i);
- valden+=fContainer->GetGrid(fSelDen)->GetElement(i);
+ valnum+=GetNum()->GetElement(i);
+ valden+=GetDen()->GetElement(i);
}
}
delete [] index;
// Make a 1D projection along variable ivar
//
- TH1D *proj1D=0;
- Int_t nbins =fNVarBins[ivar];
- Float_t *bins = new Float_t[nbins+1];
- for(Int_t ibin =0;ibin<nbins+1;ibin++){
- bins[ibin] = fVarBinLimits[ibin+fOffset[ivar]];
- }
-
- char pname[30];
- sprintf(pname,"%s%s%i%i%s%i",GetName(),"_SelStep",fSelNum,fSelDen,"_proj1D_var", ivar);
- char htitle[30];
- sprintf(htitle,"%s%s%i%i%s%i",GetName(),"_SelStep",fSelNum,fSelDen,"_proj1D_var", ivar);
-
- if(!proj1D){
- proj1D =new TH1D(pname,htitle, nbins, bins);
- }
-
- proj1D->Sumw2();
- proj1D->Divide(fContainer->GetGrid(fSelNum)->Project(ivar),fContainer->GetGrid(fSelDen)->Project(ivar),1.,1.,"B");
-
- delete [] bins;
- return proj1D;
+ 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);
}
//___________________________________________________________________
TH2D *AliCFEffGrid::Project(Int_t ivar1,Int_t ivar2) const
//
// Make a 2D projection along variable ivar1,ivar2
//
-
- TH2D *proj2D=0;
-
- Int_t nbins1 =fNVarBins[ivar1];
- Float_t *bins1 = new Float_t[nbins1+1];
- Int_t nbins2 =fNVarBins[ivar2];
- Float_t *bins2 = new Float_t[nbins2+1];
- for(Int_t ibin1 =0;ibin1<nbins1+1;ibin1++){
- bins1[ibin1] = fVarBinLimits[ibin1+fOffset[ivar1]];
- }
- for(Int_t ibin2 =0;ibin2<nbins2+1;ibin2++){
- bins2[ibin2] = fVarBinLimits[ibin2+fOffset[ivar2]];
- }
-
- char pname[30];
- sprintf(pname,"%s%s%i%i%s%i%i",GetName(),"_SelStep",fSelNum,fSelDen,"_proj2D_var", ivar1,ivar2);
- char htitle[30];
- sprintf(htitle,"%s%s%i%i%s%i%i",GetName(),"_SelStep",fSelNum,fSelDen,"_proj2D_var",ivar1,ivar2);
-
- if(!proj2D){
- proj2D =new TH2D(pname,htitle, nbins1,bins1,nbins2,bins2);
- }
-
- proj2D->Sumw2();
- proj2D->Divide(fContainer->GetGrid(fSelNum)->Project(ivar1,ivar2),fContainer->GetGrid(fSelDen)->Project(ivar1,ivar2),1.,1.,"B");
- delete [] bins1;
- delete [] bins2;
- return proj2D;
+ 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
//
- TH3D *proj3D=0;
-
- Int_t nbins1 =fNVarBins[ivar1];
- Int_t nbins2 =fNVarBins[ivar2];
- Int_t nbins3 =fNVarBins[ivar3];
-
- Float_t *bins1 = new Float_t[nbins1+1];
- Float_t *bins2 = new Float_t[nbins2+1];
- Float_t *bins3 = new Float_t[nbins3+1];
-
- for(Int_t ibin =0;ibin<nbins1+1;ibin++){
- bins1[ibin] = fVarBinLimits[ibin+fOffset[ivar1]];
- }
- for(Int_t ibin =0;ibin<nbins2+1;ibin++){
- bins2[ibin] = fVarBinLimits[ibin+fOffset[ivar2]];
- }
- for(Int_t ibin =0;ibin<nbins3+1;ibin++){
- bins3[ibin] = fVarBinLimits[ibin+fOffset[ivar3]];
- }
-
- char pname[30];
- sprintf(pname,"%s%s%i%i%s%i%i%i",GetName(),"_SelStep",fSelNum,fSelDen,"_proj3D_var",ivar1,ivar2,ivar3);
- char htitle[30];
- sprintf(htitle,"%s%s%i%i%s%i%i%i",GetName(),"_SelStep",fSelNum,fSelDen,"_proj3D_var",ivar1,ivar2,ivar3);
-
-
- if(!proj3D){
- proj3D =new TH3D(pname,htitle, nbins1, bins1,nbins2,bins2,nbins3,bins3);
- }
-
- proj3D->Sumw2();
- proj3D->Divide(fContainer->GetGrid(fSelNum)->Project(ivar1,ivar2,ivar3),fContainer->GetGrid(fSelDen)->Project(ivar1,ivar2,ivar3),1.,1.,"B");
-
- delete [] bins1;
- delete [] bins2;
- delete [] bins3;
-
- return proj3D;
+ 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);
}
+