Made these classes derive from AliCFGridSparse.
[u/mrichter/AliRoot.git] / CORRFW / AliCFDataGrid.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 // AliCFDataGrid Class                                        //
19 // Class to handle observed data and correct them                     // 
20 //                                                                    //
21 // -- Author : S.Arcelli                                              //
22 //                                                                    //
23 //                                                                    //
24 //                                                                    //
25 //--------------------------------------------------------------------//
26 //
27 //
28 #include "TMath.h"
29 #include "AliLog.h"
30 #include "AliCFDataGrid.h"
31
32 //____________________________________________________________________
33 ClassImp(AliCFDataGrid)
34
35 //____________________________________________________________________
36 AliCFDataGrid::AliCFDataGrid() : 
37   AliCFGridSparse(),
38   fSelData(-1),
39   fContainer(0x0)
40 {
41   //
42   // default constructor
43   //
44   SumW2(); //errors saved
45 }
46
47 //____________________________________________________________________
48 AliCFDataGrid::AliCFDataGrid(const Char_t* name,const Char_t* title) : 
49   AliCFGridSparse(name,title),
50   fSelData(-1),
51   fContainer(0x0)
52 {
53   //
54   // default constructor
55   //
56   SumW2(); //errors saved
57 }
58
59 //____________________________________________________________________
60 AliCFDataGrid::AliCFDataGrid(const Char_t* name, const Char_t* title, const Int_t nVarIn, const Int_t * nBinIn, const Double_t *binLimitsIn) :  
61   AliCFGridSparse(name,title,nVarIn,nBinIn,binLimitsIn),
62   fSelData(-1),
63   fContainer(0x0)
64 {
65   //
66   // main constructor
67   //
68   SumW2();// errors saved
69 }
70 //____________________________________________________________________
71 AliCFDataGrid::AliCFDataGrid(const Char_t* name, const Char_t* title, const AliCFContainer &c) :  
72   AliCFGridSparse(name,title,c.GetNVar(),c.GetNBins(),c.GetBinLimits()),
73   fSelData(-1),
74   fContainer(0x0)
75 {
76   //
77   // main constructor
78   //
79   SumW2();
80    //assign the container;
81   fContainer=&c;
82
83 }
84 //____________________________________________________________________
85 AliCFDataGrid::AliCFDataGrid(const AliCFDataGrid& data) :   AliCFGridSparse(),
86   fSelData(-1),
87   fContainer(0x0)
88 {
89   //
90   // copy constructor
91   //
92   ((AliCFDataGrid &)data).Copy(*this);
93 }
94
95 //____________________________________________________________________
96 AliCFDataGrid::~AliCFDataGrid()
97 {
98   //
99   // destructor
100   //
101 }
102 //____________________________________________________________________
103 AliCFDataGrid &AliCFDataGrid::operator=(const AliCFDataGrid &c)
104 {
105   //
106   // assigment operator
107   //
108   if (this != &c)
109     ((AliCFDataGrid &) c).Copy(*this);
110   return *this;
111
112 //____________________________________________________________________
113
114 void AliCFDataGrid::SetMeasured(Int_t istep)
115 {
116   //
117   // Deposit observed data over the grid
118   //
119   Int_t nEmptyBins=0;
120   fSelData=istep;
121   //Initially, set the corrected data to the measured data
122   for(Int_t i=0;i<fNDim;i++){
123     Float_t meas=fContainer->GetGrid(fSelData)->GetElement(i);
124     Float_t dmeas=fContainer->GetGrid(fSelData)->GetElementError(i);
125     SetElement(i,meas);
126     SetElementError(i,dmeas);
127     if(meas <=0)nEmptyBins++;
128   }
129
130   //fNentriesTot=fNDim;
131   GetGrid()->SetEntries(GetData()->GetEntries());
132   //
133
134   AliInfo(Form("retrieving measured data from Container %s at selection step %i: %i empty bins were found.",fContainer->GetName(),fSelData,nEmptyBins));
135
136 //____________________________________________________________________
137 void AliCFDataGrid::ApplyEffCorrection(const AliCFEffGrid &c)
138 {
139
140   //
141   // Apply the efficiency correction
142   //
143   if(c.GetNVar()!=fNVar){
144     AliInfo("Different number of variables, cannot apply correction");
145     return;
146   }
147   if(c.GetNDim()!=fNDim){
148     AliInfo("Different number of dimension, cannot apply correction");
149     return;
150   }
151
152   //Get the data
153   Int_t ncorr=0;    
154   Int_t nnocorr=0;    
155   Float_t eff,deff,unc,dunc,corr,dcorr;
156   //Apply the correction
157   for(Int_t i=0;i<fNDim;i++){
158     eff =c.GetElement(i);    
159     deff =c.GetElementError(i);    
160     unc =GetElement(i);    
161     dunc =GetElementError(i);    
162     
163     if(eff>0 && unc>0){      
164       ncorr++;
165       corr=unc/eff;
166       dcorr=TMath::Sqrt(dunc*dunc/unc/unc+deff*deff/eff/eff)*corr;
167       SetElement(i,corr);
168       SetElementError(i,dcorr);
169     } else{
170       if(unc>0)nnocorr++;
171       SetElement(i,0);
172       SetElementError(i,0);
173     }
174   }
175   AliInfo(Form("correction applied for %i cells in correction matrix of Container %s, having entries in Data Container %s.",ncorr,c.GetName(),GetName()));
176   AliInfo(Form("No correction applied for %i empty bins in correction matrix of Container %s, having entries in Data Container %s. Their content in the corrected data container was set to zero",nnocorr,c.GetName(),GetName()));
177 }
178 //____________________________________________________________________
179 void AliCFDataGrid::ApplyBGCorrection(const AliCFDataGrid &c)
180 {
181
182   //
183   // Apply correction for background
184   //
185   if(c.GetNVar()!=fNVar){
186     AliInfo("Different number of variables, cannot apply correction");
187     return;
188   }
189   if(c.GetNDim()!=fNDim){
190     AliInfo("Different number of dimension, cannot apply correction");
191     return;
192   }
193
194   //Get the data
195   Float_t bkg,dbkg,unc,dunc,corr,dcorr;
196
197   //Apply the correction
198
199   for(Int_t i=0;i<fNDim;i++){
200     bkg =c.GetElement(i);    
201     dbkg =c.GetElementError(i);    
202     unc =GetElement(i);    
203     dunc =GetElementError(i);    
204     corr=unc-bkg;
205     dcorr=TMath::Sqrt(unc+bkg); //stat err only...
206     SetElement(i,corr);
207     SetElementError(i,dcorr);
208       
209   }
210 }
211 //____________________________________________________________________
212 void AliCFDataGrid::Copy(TObject& eff) const
213 {
214   // copy function
215
216   Copy(eff);
217   AliCFDataGrid& target = (AliCFDataGrid &) eff;
218   target.fContainer=fContainer;
219   target.fSelData=fSelData;
220
221 }