adding some cuts for systematic study
[u/mrichter/AliRoot.git] / CORRFW / AliCFEffGrid.cxx
1 /* $Id$ */
2 /**************************************************************************
3  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4  *                                                                        *
5  * Author: The ALICE Off-line Project.                                    *
6  * Contributors are mentioned in the code where appropriate.              *
7  *                                                                        *
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 //--------------------------------------------------------------------//
17 //                                                                    //
18 // AliCFEffGrid Class                                                 //
19 // Class to handle efficiency grids                                   // 
20 //                                                                    //
21 // -- Author : S.Arcelli                                              //
22 //                                                                    //
23 //                                                                    //
24 //                                                                    //
25 //--------------------------------------------------------------------//
26 //
27 //
28 #include "TMath.h"
29 #include "AliLog.h"
30 #include "AliCFEffGrid.h"
31 #include "TH1D.h"
32 #include "TH2D.h"
33 #include "TH3D.h"
34
35 //____________________________________________________________________
36 ClassImp(AliCFEffGrid)
37
38 //____________________________________________________________________
39 AliCFEffGrid::AliCFEffGrid() : 
40   AliCFGridSparse(),
41   fContainer(0x0),
42   fSelNum(-1),
43   fSelDen(-1)
44 {
45   //
46   // default constructor
47   //
48 }
49
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),
53   fContainer(0x0),
54   fSelNum(-1),
55   fSelDen(-1)
56 {
57   //
58   // ctor
59   //
60   SumW2();
61 }
62 //____________________________________________________________________
63 AliCFEffGrid::AliCFEffGrid(const Char_t* name, const Char_t* title, const AliCFContainer &c) :  
64   AliCFGridSparse(name,title,c.GetNVar(),c.GetNBins()),
65   fContainer(NULL),
66   fSelNum(-1),
67   fSelDen(-1)
68 {
69   //
70   // main constructor
71   //
72   SumW2();
73   //assign the container;
74   fContainer=&c;
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);
80     delete [] array ;
81   }
82   for (Int_t iVar=0; iVar<GetNVar(); iVar++) SetVarTitle(iVar,c.GetVarTitle(iVar));
83 }
84 //____________________________________________________________________
85 AliCFEffGrid::AliCFEffGrid(const AliCFEffGrid& eff) : 
86   AliCFGridSparse(eff),
87   fContainer(0x0),
88   fSelNum(-1),
89   fSelDen(-1)
90 {
91   //
92   // copy constructor
93   //
94   ((AliCFEffGrid &)eff).Copy(*this);
95 }
96
97 //____________________________________________________________________
98 AliCFEffGrid::~AliCFEffGrid()
99 {
100   //
101   // destructor
102   //
103 }
104
105 //____________________________________________________________________
106 AliCFEffGrid &AliCFEffGrid::operator=(const AliCFEffGrid &eff)
107 {
108   //
109   // assigment operator
110   //
111   if (this != &eff) eff.Copy(*this);
112   return *this;
113
114
115 //____________________________________________________________________
116 void AliCFEffGrid::CalculateEfficiency(Int_t istep1,Int_t istep2, Option_t *option)
117 {
118   //
119   // Calculate the efficiency matrix and its error between selection
120   // Steps istep1 and istep2
121   //
122   // 'option' is used as an argument for THnSparse::Divide
123   // default is "B" : binomial error calculation
124   //
125
126   fSelNum=istep1;
127   fSelDen=istep2;
128   AliCFGridSparse *num=GetNum();
129   AliCFGridSparse *den=GetDen();
130   num->SumW2();
131   den->SumW2();
132   this->SumW2();
133   this->Divide(num,den,1.,1.,option);
134   SetTitle(Form("Efficiency: %s / %s",fContainer->GetStepTitle(istep1),fContainer->GetStepTitle(istep2)));
135
136   AliInfo(Form("Efficiency calculated for steps %i and %i.",fSelNum,fSelDen));
137
138 //_____________________________________________________________________
139 Double_t AliCFEffGrid::GetAverage() const 
140 {
141   //
142   // Get the average efficiency 
143   //
144
145   Double_t val=0;
146   Double_t valnum=0;
147   Double_t valden=0;
148
149   THnSparse* num = ((AliCFGridSparse*)GetNum())->GetGrid() ;
150   THnSparse* den = ((AliCFGridSparse*)GetDen())->GetGrid() ;
151
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)); 
156   return val;
157
158 //___________________________________________________________________
159 TH1* AliCFEffGrid::Project(Int_t ivar1, Int_t ivar2, Int_t ivar3) const
160 {
161   //
162   // Make a projection along variable ivar1 (and ivar2 (and ivar3))
163   //
164
165   if (fSelNum<0 || fSelDen<0) {
166     AliError("You must call CalculateEfficiency() first !");
167     return 0x0;
168   }
169   const Int_t nDim = 3 ;
170   Int_t dim[nDim] = {ivar1,ivar2,ivar3} ;
171   
172   THnSparse *hNum, *hDen, *ratio;
173   TH1* h ;
174
175   if (ivar3<0) {
176     if (ivar2<0) {
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);
182     }
183     else{
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);
189     }
190   }
191   else {
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);
197   }
198
199   delete hNum; delete hDen; delete ratio;
200   return h ;
201
202 //___________________________________________________________________
203 AliCFEffGrid* AliCFEffGrid::MakeSlice(Int_t nVars, const Int_t* vars, const Double_t* varMin, const Double_t* varMax, Bool_t useBins) const {
204   //
205   // returns a slice of the efficiency grid (slice is actually done on the container, and efficiency recomputed)
206   //
207   
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);
211   return eff;
212 }