ROOT logo
/* $Id$ */
/**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
//--------------------------------------------------------------------//
//                                                                    //
// AliCFEffGrid Class                                                 //
// Class to handle efficiency grids                                   // 
//                                                                    //
// -- Author : S.Arcelli                                              //
//                                                                    //
//                                                                    //
//                                                                    //
//--------------------------------------------------------------------//
//
//
#include "TMath.h"
#include "AliLog.h"
#include "AliCFEffGrid.h"
#include "TH1D.h"
#include "TH2D.h"
#include "TH3D.h"

//____________________________________________________________________
ClassImp(AliCFEffGrid)

//____________________________________________________________________
AliCFEffGrid::AliCFEffGrid() : 
  AliCFGridSparse(),
  fContainer(0x0),
  fSelNum(-1),
  fSelDen(-1)
{
  //
  // default constructor
  //
}

//____________________________________________________________________
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)
{
  //
  // ctor
  //
  SumW2();
}
//____________________________________________________________________
AliCFEffGrid::AliCFEffGrid(const Char_t* name, const Char_t* title, const AliCFContainer &c) :  
  AliCFGridSparse(name,title,c.GetNVar(),c.GetNBins()),
  fContainer(NULL),
  fSelNum(-1),
  fSelDen(-1)
{
  //
  // main constructor
  //
  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(eff),
  fContainer(0x0),
  fSelNum(-1),
  fSelDen(-1)
{
  //
  // copy constructor
  //
  ((AliCFEffGrid &)eff).Copy(*this);
}

//____________________________________________________________________
AliCFEffGrid::~AliCFEffGrid()
{
  //
  // destructor
  //
}

//____________________________________________________________________
AliCFEffGrid &AliCFEffGrid::operator=(const AliCFEffGrid &eff)
{
  //
  // assigment operator
  //
  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;
  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)));

  AliInfo(Form("Efficiency calculated for steps %i and %i.",fSelNum,fSelDen));
} 
//_____________________________________________________________________
Double_t AliCFEffGrid::GetAverage() const 
{
  //
  // Get the average efficiency 
  //

  Double_t val=0;
  Double_t valnum=0;
  Double_t valden=0;

  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;
} 
//___________________________________________________________________
TH1* AliCFEffGrid::Project(Int_t ivar1, Int_t ivar2, Int_t ivar3) const
{
  //
  // Make a projection along variable ivar1 (and ivar2 (and ivar3))
  //

  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} ;
  
  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);
    }
    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);
    }
  }
  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 ;
} 
//___________________________________________________________________
AliCFEffGrid* AliCFEffGrid::MakeSlice(Int_t nVars, const Int_t* vars, const Double_t* varMin, const Double_t* varMax, Bool_t useBins) const {
  //
  // returns a slice of the efficiency grid (slice is actually done on the container, and efficiency recomputed)
  //
  
  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;
}
 AliCFEffGrid.cxx:1
 AliCFEffGrid.cxx:2
 AliCFEffGrid.cxx:3
 AliCFEffGrid.cxx:4
 AliCFEffGrid.cxx:5
 AliCFEffGrid.cxx:6
 AliCFEffGrid.cxx:7
 AliCFEffGrid.cxx:8
 AliCFEffGrid.cxx:9
 AliCFEffGrid.cxx:10
 AliCFEffGrid.cxx:11
 AliCFEffGrid.cxx:12
 AliCFEffGrid.cxx:13
 AliCFEffGrid.cxx:14
 AliCFEffGrid.cxx:15
 AliCFEffGrid.cxx:16
 AliCFEffGrid.cxx:17
 AliCFEffGrid.cxx:18
 AliCFEffGrid.cxx:19
 AliCFEffGrid.cxx:20
 AliCFEffGrid.cxx:21
 AliCFEffGrid.cxx:22
 AliCFEffGrid.cxx:23
 AliCFEffGrid.cxx:24
 AliCFEffGrid.cxx:25
 AliCFEffGrid.cxx:26
 AliCFEffGrid.cxx:27
 AliCFEffGrid.cxx:28
 AliCFEffGrid.cxx:29
 AliCFEffGrid.cxx:30
 AliCFEffGrid.cxx:31
 AliCFEffGrid.cxx:32
 AliCFEffGrid.cxx:33
 AliCFEffGrid.cxx:34
 AliCFEffGrid.cxx:35
 AliCFEffGrid.cxx:36
 AliCFEffGrid.cxx:37
 AliCFEffGrid.cxx:38
 AliCFEffGrid.cxx:39
 AliCFEffGrid.cxx:40
 AliCFEffGrid.cxx:41
 AliCFEffGrid.cxx:42
 AliCFEffGrid.cxx:43
 AliCFEffGrid.cxx:44
 AliCFEffGrid.cxx:45
 AliCFEffGrid.cxx:46
 AliCFEffGrid.cxx:47
 AliCFEffGrid.cxx:48
 AliCFEffGrid.cxx:49
 AliCFEffGrid.cxx:50
 AliCFEffGrid.cxx:51
 AliCFEffGrid.cxx:52
 AliCFEffGrid.cxx:53
 AliCFEffGrid.cxx:54
 AliCFEffGrid.cxx:55
 AliCFEffGrid.cxx:56
 AliCFEffGrid.cxx:57
 AliCFEffGrid.cxx:58
 AliCFEffGrid.cxx:59
 AliCFEffGrid.cxx:60
 AliCFEffGrid.cxx:61
 AliCFEffGrid.cxx:62
 AliCFEffGrid.cxx:63
 AliCFEffGrid.cxx:64
 AliCFEffGrid.cxx:65
 AliCFEffGrid.cxx:66
 AliCFEffGrid.cxx:67
 AliCFEffGrid.cxx:68
 AliCFEffGrid.cxx:69
 AliCFEffGrid.cxx:70
 AliCFEffGrid.cxx:71
 AliCFEffGrid.cxx:72
 AliCFEffGrid.cxx:73
 AliCFEffGrid.cxx:74
 AliCFEffGrid.cxx:75
 AliCFEffGrid.cxx:76
 AliCFEffGrid.cxx:77
 AliCFEffGrid.cxx:78
 AliCFEffGrid.cxx:79
 AliCFEffGrid.cxx:80
 AliCFEffGrid.cxx:81
 AliCFEffGrid.cxx:82
 AliCFEffGrid.cxx:83
 AliCFEffGrid.cxx:84
 AliCFEffGrid.cxx:85
 AliCFEffGrid.cxx:86
 AliCFEffGrid.cxx:87
 AliCFEffGrid.cxx:88
 AliCFEffGrid.cxx:89
 AliCFEffGrid.cxx:90
 AliCFEffGrid.cxx:91
 AliCFEffGrid.cxx:92
 AliCFEffGrid.cxx:93
 AliCFEffGrid.cxx:94
 AliCFEffGrid.cxx:95
 AliCFEffGrid.cxx:96
 AliCFEffGrid.cxx:97
 AliCFEffGrid.cxx:98
 AliCFEffGrid.cxx:99
 AliCFEffGrid.cxx:100
 AliCFEffGrid.cxx:101
 AliCFEffGrid.cxx:102
 AliCFEffGrid.cxx:103
 AliCFEffGrid.cxx:104
 AliCFEffGrid.cxx:105
 AliCFEffGrid.cxx:106
 AliCFEffGrid.cxx:107
 AliCFEffGrid.cxx:108
 AliCFEffGrid.cxx:109
 AliCFEffGrid.cxx:110
 AliCFEffGrid.cxx:111
 AliCFEffGrid.cxx:112
 AliCFEffGrid.cxx:113
 AliCFEffGrid.cxx:114
 AliCFEffGrid.cxx:115
 AliCFEffGrid.cxx:116
 AliCFEffGrid.cxx:117
 AliCFEffGrid.cxx:118
 AliCFEffGrid.cxx:119
 AliCFEffGrid.cxx:120
 AliCFEffGrid.cxx:121
 AliCFEffGrid.cxx:122
 AliCFEffGrid.cxx:123
 AliCFEffGrid.cxx:124
 AliCFEffGrid.cxx:125
 AliCFEffGrid.cxx:126
 AliCFEffGrid.cxx:127
 AliCFEffGrid.cxx:128
 AliCFEffGrid.cxx:129
 AliCFEffGrid.cxx:130
 AliCFEffGrid.cxx:131
 AliCFEffGrid.cxx:132
 AliCFEffGrid.cxx:133
 AliCFEffGrid.cxx:134
 AliCFEffGrid.cxx:135
 AliCFEffGrid.cxx:136
 AliCFEffGrid.cxx:137
 AliCFEffGrid.cxx:138
 AliCFEffGrid.cxx:139
 AliCFEffGrid.cxx:140
 AliCFEffGrid.cxx:141
 AliCFEffGrid.cxx:142
 AliCFEffGrid.cxx:143
 AliCFEffGrid.cxx:144
 AliCFEffGrid.cxx:145
 AliCFEffGrid.cxx:146
 AliCFEffGrid.cxx:147
 AliCFEffGrid.cxx:148
 AliCFEffGrid.cxx:149
 AliCFEffGrid.cxx:150
 AliCFEffGrid.cxx:151
 AliCFEffGrid.cxx:152
 AliCFEffGrid.cxx:153
 AliCFEffGrid.cxx:154
 AliCFEffGrid.cxx:155
 AliCFEffGrid.cxx:156
 AliCFEffGrid.cxx:157
 AliCFEffGrid.cxx:158
 AliCFEffGrid.cxx:159
 AliCFEffGrid.cxx:160
 AliCFEffGrid.cxx:161
 AliCFEffGrid.cxx:162
 AliCFEffGrid.cxx:163
 AliCFEffGrid.cxx:164
 AliCFEffGrid.cxx:165
 AliCFEffGrid.cxx:166
 AliCFEffGrid.cxx:167
 AliCFEffGrid.cxx:168
 AliCFEffGrid.cxx:169
 AliCFEffGrid.cxx:170
 AliCFEffGrid.cxx:171
 AliCFEffGrid.cxx:172
 AliCFEffGrid.cxx:173
 AliCFEffGrid.cxx:174
 AliCFEffGrid.cxx:175
 AliCFEffGrid.cxx:176
 AliCFEffGrid.cxx:177
 AliCFEffGrid.cxx:178
 AliCFEffGrid.cxx:179
 AliCFEffGrid.cxx:180
 AliCFEffGrid.cxx:181
 AliCFEffGrid.cxx:182
 AliCFEffGrid.cxx:183
 AliCFEffGrid.cxx:184
 AliCFEffGrid.cxx:185
 AliCFEffGrid.cxx:186
 AliCFEffGrid.cxx:187
 AliCFEffGrid.cxx:188
 AliCFEffGrid.cxx:189
 AliCFEffGrid.cxx:190
 AliCFEffGrid.cxx:191
 AliCFEffGrid.cxx:192
 AliCFEffGrid.cxx:193
 AliCFEffGrid.cxx:194
 AliCFEffGrid.cxx:195
 AliCFEffGrid.cxx:196
 AliCFEffGrid.cxx:197
 AliCFEffGrid.cxx:198
 AliCFEffGrid.cxx:199
 AliCFEffGrid.cxx:200
 AliCFEffGrid.cxx:201
 AliCFEffGrid.cxx:202
 AliCFEffGrid.cxx:203
 AliCFEffGrid.cxx:204
 AliCFEffGrid.cxx:205
 AliCFEffGrid.cxx:206
 AliCFEffGrid.cxx:207
 AliCFEffGrid.cxx:208
 AliCFEffGrid.cxx:209
 AliCFEffGrid.cxx:210
 AliCFEffGrid.cxx:211
 AliCFEffGrid.cxx:212