]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - CORRFW/AliCFEffGrid.cxx
Create DA RPM
[u/mrichter/AliRoot.git] / CORRFW / AliCFEffGrid.cxx
index 53f42c037a81cfc2de59f9149bb6ccc9927a5f14..5477610d67a7b8876c686372fb45417bff3dec9c 100644 (file)
@@ -15,7 +15,7 @@
  **************************************************************************/
 //--------------------------------------------------------------------//
 //                                                                    //
-// AliCFEffGrid Class                                              //
+// AliCFEffGrid Class                                                 //
 // Class to handle efficiency grids                                   // 
 //                                                                    //
 // -- Author : S.Arcelli                                              //
@@ -48,8 +48,8 @@ AliCFEffGrid::AliCFEffGrid() :
 }
 
 //____________________________________________________________________
-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)
@@ -61,7 +61,7 @@ AliCFEffGrid::AliCFEffGrid(const Char_t* name, const Char_t* title, const Int_t
 }
 //____________________________________________________________________
 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)
@@ -72,9 +72,18 @@ AliCFEffGrid::AliCFEffGrid(const Char_t* name, const Char_t* title, const AliCFC
   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)
@@ -99,41 +108,32 @@ AliCFEffGrid &AliCFEffGrid::operator=(const AliCFEffGrid &eff)
   //
   // 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 
@@ -145,126 +145,68 @@ 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;
+}