final updates and fixups in the container classes
[u/mrichter/AliRoot.git] / CORRFW / AliCFContainer.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 // AliCFContainer Class                                           //
19 // Class to accumulate data on an N-dimensional grids, at different    //
20 // selection stages. To be used as an input to get corrections for    //
21 // Reconstruction & Trigger efficiency                                // 
22 //                                                                    //
23 // -- Author : S.Arcelli                                              //
24 //--------------------------------------------------------------------//
25 //
26 //
27 #include <AliLog.h>
28 #include "AliCFGrid.h"
29 #include "AliCFGridSparse.h"
30 #include "AliCFContainer.h"
31
32 //____________________________________________________________________
33 ClassImp(AliCFContainer)
34
35 //____________________________________________________________________
36 AliCFContainer::AliCFContainer() : 
37   AliCFFrame(),
38   fNStep(0),
39   fExclOffEntriesInProj(kTRUE),
40   fGrid(0x0)
41 {
42   //
43   // default constructor
44   //
45 }
46 //____________________________________________________________________
47 AliCFContainer::AliCFContainer(const Char_t* name, const Char_t* title) : 
48   AliCFFrame(name,title),
49   fNStep(0),
50   fExclOffEntriesInProj(kTRUE),
51   fGrid(0x0)
52 {
53   // default constructor
54 }
55
56 //____________________________________________________________________
57 AliCFContainer::AliCFContainer(const Char_t* name, const Char_t* title,const Int_t nSelSteps, const Int_t nVarIn, const Int_t * nBinIn, const Double_t *binLimitsIn, const Bool_t useSparse) :  
58   AliCFFrame(name,title,nVarIn,nBinIn,binLimitsIn),
59   fNStep(0),
60   fExclOffEntriesInProj(kTRUE),
61   fGrid(0x0)
62 {
63   //
64   // main constructor
65   //
66
67   // The selection steps
68   fNStep=nSelSteps;
69
70   // The grids 
71   fGrid = new AliCFVGrid*[fNStep]; //the grids at the various selection steps
72   char gname[30];
73   for(Int_t istep=0;istep<fNStep;istep++){
74     sprintf(gname,"%s%s%i",GetName(),"_SelStep", istep);
75     if(!useSparse){
76       fGrid[istep] = new AliCFGrid(gname,title,nVarIn,nBinIn,binLimitsIn); 
77       }
78     else{
79       fGrid[istep] = new AliCFGridSparse(gname,title,nVarIn,nBinIn,binLimitsIn); 
80     }
81     fGrid[istep]->SumW2(); 
82   }
83 }
84 //____________________________________________________________________
85 AliCFContainer::AliCFContainer(const AliCFContainer& c) : 
86   AliCFFrame(),
87   fNStep(c.fNStep),
88   fExclOffEntriesInProj(c.fExclOffEntriesInProj),
89   fGrid(c.fGrid)
90 {
91   //
92   // copy constructor
93   //
94   ((AliCFContainer &)c).Copy(*this);
95 }
96 //____________________________________________________________________
97 AliCFContainer::~AliCFContainer()
98 {
99   //
100   // destructor
101   //
102   if(fGrid)delete [] fGrid;
103
104 }
105 //____________________________________________________________________
106 AliCFContainer &AliCFContainer::operator=(const AliCFContainer &c)
107 {
108   //
109   // assigment operator
110   //
111   if (this != &c)
112     ((AliCFContainer &) c).Copy(*this);
113   return *this;
114
115 //____________________________________________________________________
116 void AliCFContainer::SetBinLimits(Int_t varindex, Double_t *array)
117 {
118   //
119   // setting the arrays containing the bin limits 
120   //
121   Int_t nbins=fNVarBins[varindex]+1;
122   for(Int_t i=0;i<nbins;i++){
123     fVarBinLimits[fOffset[varindex]+i] =array[i];
124   } 
125   for(Int_t istep=0;istep<fNStep;istep++){
126     fGrid[istep]->SetBinLimits(varindex,array);
127   }
128
129 //____________________________________________________________________
130 void AliCFContainer::Copy(TObject& c) const
131 {
132   //
133   // copy function
134   //
135   AliCFContainer& target = (AliCFContainer &) c;
136   target.fNStep=fNStep;
137   target.fExclOffEntriesInProj=fExclOffEntriesInProj;
138   target.fNVar=fNVar;
139   target.fNDim=fNDim;
140   target.fNVarBinLimits=fNVarBinLimits;
141   if (fNVarBins)
142     target.fNVarBins = fNVarBins;
143   if (fVarBinLimits)
144     target.fVarBinLimits = fVarBinLimits;
145   if (fGrid)
146     target.fGrid = fGrid;
147     for(Int_t istep=0;istep<fNStep;istep++){
148       for(Int_t iel=0;iel<fNDim;iel++){
149         target.fGrid[istep]->SetElement(iel,fGrid[istep]->GetElement(iel));
150       } 
151     }  
152 }
153 //____________________________________________________________________
154 void AliCFContainer::Fill(Double_t *var, Int_t istep, Double_t weight)
155 {
156   //
157   // Fills the grid at selection step istep for a set of values of the 
158   // input variables, with a given weight (by default w=1)
159   //
160   fGrid[istep]->Fill(var,weight);
161 }
162 //___________________________________________________________________
163 TH1D *AliCFContainer::ShowProjection(Int_t ivar, Int_t istep) const
164 {
165   //
166   // returns 1-D projection along variable ivar at selection step istep
167   //
168   fGrid[istep]->SetExcludeOffEntriesInProj(fExclOffEntriesInProj);
169   return fGrid[istep]->Project(ivar);
170 }
171 //___________________________________________________________________
172 TH2D *AliCFContainer::ShowProjection(Int_t ivar1, Int_t ivar2, Int_t istep) const
173 {
174   //
175   // returns 2-D projection along variables ivar1,ivar2 at selection step istep
176   //
177   fGrid[istep]->SetExcludeOffEntriesInProj(fExclOffEntriesInProj);
178   return fGrid[istep]->Project(ivar1,ivar2);
179 }
180 //___________________________________________________________________
181 TH3D *AliCFContainer::ShowProjection(Int_t ivar1, Int_t ivar2, Int_t ivar3, Int_t istep) const
182 {
183   //
184   // returns 3-D projection along variables ivar1,ivar2,ivar3 
185   // at selection step istep
186   //
187   fGrid[istep]->SetExcludeOffEntriesInProj(fExclOffEntriesInProj);
188   return fGrid[istep]->Project(ivar1,ivar2,ivar3);
189 }
190 //___________________________________________________________________
191 TH1D *AliCFContainer::ShowSlice(Int_t ivar, Double_t *varMin, Double_t* varMax, Int_t istep) const
192 {
193   //
194   // Make a slice along variable ivar at selection level istep in range [varMin,varMax]
195   //
196   return (TH1D*)fGrid[istep]->Slice(ivar,varMin,varMax);
197 }
198 //____________________________________________________________________
199 Long64_t AliCFContainer::Merge(TCollection* list)
200 {
201   // Merge a list of AliCorrection objects with this (needed for
202   // PROOF). 
203   // Returns the number of merged objects (including this).
204
205   if (!list)
206     return 0;
207   
208   if (list->IsEmpty())
209     return 1;
210
211   TIterator* iter = list->MakeIterator();
212   TObject* obj;
213   
214   Int_t count = 0;
215   while ((obj = iter->Next())) {
216     AliCFContainer* entry = dynamic_cast<AliCFContainer*> (obj);
217     if (entry == 0) 
218       continue;
219     this->Add(entry);
220     count++;
221   }
222
223   return count+1;
224 }
225
226 //____________________________________________________________________
227 void AliCFContainer::Add(AliCFContainer* aContainerToAdd, Double_t c)
228 {
229   //
230   //add the content of container aContainerToAdd to the current one
231   //
232
233   if(aContainerToAdd->GetNStep()!=fNStep)AliError("Different number of steps, cannot add the containers");
234   if(aContainerToAdd->GetNVar()!=fNVar)AliError("Different number of variables, cannot add the containers");
235   if(aContainerToAdd->GetNDim()!=fNDim)AliError("Different number of dimensions, cannot add the containers!");
236   
237   for(Int_t istep=0;istep<fNStep;istep++){
238     fGrid[istep]->Add(aContainerToAdd->GetGrid(istep),c);
239   }
240 }
241 //____________________________________________________________________
242 Float_t AliCFContainer::GetOverFlows( Int_t ivar, Int_t istep) const {
243   //
244   // Get overflows in variable var at selection level istep
245   //
246   return fGrid[istep]->GetOverFlows(ivar);
247
248 //____________________________________________________________________
249 Float_t AliCFContainer::GetUnderFlows( Int_t ivar, Int_t istep) const {
250   //
251   // Get overflows in variable var at selection level istep
252   //
253   return fGrid[istep]->GetUnderFlows(ivar);
254
255 //____________________________________________________________________
256 Float_t AliCFContainer::GetEntries( Int_t istep) const {
257   //
258   // Get overflows in variable var at selection level istep
259   //
260   return fGrid[istep]->GetEntries();
261
262 //____________________________________________________________________
263 Int_t AliCFContainer::GetEmptyBins( Int_t istep) const {
264   //
265   // Get overflows in variable var at selection level istep
266   //
267   return fGrid[istep]->GetEmptyBins();
268
269 //____________________________________________________________________
270 Int_t AliCFContainer::GetEmptyBins( Int_t istep, Double_t *varMin, Double_t* varMax) const {
271   //
272   // Get overflows in variable var at selection level istep
273   //
274   return fGrid[istep]->GetEmptyBins(varMin,varMax);
275
276 //_____________________________________________________________________
277 Double_t AliCFContainer::GetIntegral( Int_t istep) const 
278 {
279   //
280   // Get Integral at selection level istep
281   //
282   return fGrid[istep]->GetIntegral();
283 }
284 //_____________________________________________________________________
285 Double_t AliCFContainer::GetIntegral( Int_t istep, Double_t *varMin, Double_t* varMax ) const 
286 {
287   //
288   // Get Integral at selection level istep
289   //
290   return fGrid[istep]->GetIntegral(varMin,varMax);
291 }