Take the correct weight for different pT hard bins from the task output
[u/mrichter/AliRoot.git] / CORRFW / AliCFContainer.cxx
CommitLineData
563113d0 1/* $Id$ */
1e9dad92 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 **************************************************************************/
563113d0 16//--------------------------------------------------------------------//
17// //
9105291d 18// AliCFContainer Class //
19// Class to accumulate data on an N-dimensional grids, at different //
563113d0 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"
db6722a5 29#include "AliCFGridSparse.h"
563113d0 30#include "AliCFContainer.h"
c8df672e 31#include "TAxis.h"
563113d0 32//____________________________________________________________________
33ClassImp(AliCFContainer)
34
35//____________________________________________________________________
36AliCFContainer::AliCFContainer() :
37 AliCFFrame(),
38 fNStep(0),
39 fGrid(0x0)
40{
41 //
42 // default constructor
43 //
44}
45//____________________________________________________________________
46AliCFContainer::AliCFContainer(const Char_t* name, const Char_t* title) :
47 AliCFFrame(name,title),
48 fNStep(0),
49 fGrid(0x0)
50{
51 // default constructor
52}
53
54//____________________________________________________________________
db6722a5 55AliCFContainer::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) :
563113d0 56 AliCFFrame(name,title,nVarIn,nBinIn,binLimitsIn),
57 fNStep(0),
58 fGrid(0x0)
59{
60 //
61 // main constructor
62 //
63
64 // The selection steps
65 fNStep=nSelSteps;
66
67 // The grids
1e9dad92 68 fGrid = new AliCFVGrid*[fNStep]; //the grids at the various selection steps
563113d0 69 char gname[30];
70 for(Int_t istep=0;istep<fNStep;istep++){
71 sprintf(gname,"%s%s%i",GetName(),"_SelStep", istep);
db6722a5 72 if(!useSparse){
73 fGrid[istep] = new AliCFGrid(gname,title,nVarIn,nBinIn,binLimitsIn);
74 }
75 else{
76 fGrid[istep] = new AliCFGridSparse(gname,title,nVarIn,nBinIn,binLimitsIn);
77 }
1e9dad92 78 fGrid[istep]->SumW2();
563113d0 79 }
80}
81//____________________________________________________________________
82AliCFContainer::AliCFContainer(const AliCFContainer& c) :
83 AliCFFrame(),
318f64b1 84 fNStep(c.fNStep),
318f64b1 85 fGrid(c.fGrid)
563113d0 86{
87 //
88 // copy constructor
89 //
90 ((AliCFContainer &)c).Copy(*this);
91}
92//____________________________________________________________________
93AliCFContainer::~AliCFContainer()
94{
95 //
96 // destructor
97 //
98 if(fGrid)delete [] fGrid;
99
100}
101//____________________________________________________________________
102AliCFContainer &AliCFContainer::operator=(const AliCFContainer &c)
103{
104 //
105 // assigment operator
106 //
107 if (this != &c)
108 ((AliCFContainer &) c).Copy(*this);
109 return *this;
110}
111//____________________________________________________________________
1e9dad92 112void AliCFContainer::SetBinLimits(Int_t varindex, Double_t *array)
563113d0 113{
114 //
115 // setting the arrays containing the bin limits
116 //
117 Int_t nbins=fNVarBins[varindex]+1;
118 for(Int_t i=0;i<nbins;i++){
119 fVarBinLimits[fOffset[varindex]+i] =array[i];
120 }
121 for(Int_t istep=0;istep<fNStep;istep++){
122 fGrid[istep]->SetBinLimits(varindex,array);
123 }
124}
125//____________________________________________________________________
126void AliCFContainer::Copy(TObject& c) const
127{
128 //
129 // copy function
130 //
131 AliCFContainer& target = (AliCFContainer &) c;
132 target.fNStep=fNStep;
133 target.fNVar=fNVar;
134 target.fNDim=fNDim;
135 target.fNVarBinLimits=fNVarBinLimits;
136 if (fNVarBins)
137 target.fNVarBins = fNVarBins;
138 if (fVarBinLimits)
139 target.fVarBinLimits = fVarBinLimits;
140 if (fGrid)
141 target.fGrid = fGrid;
142 for(Int_t istep=0;istep<fNStep;istep++){
143 for(Int_t iel=0;iel<fNDim;iel++){
144 target.fGrid[istep]->SetElement(iel,fGrid[istep]->GetElement(iel));
145 }
146 }
147}
148//____________________________________________________________________
1e9dad92 149void AliCFContainer::Fill(Double_t *var, Int_t istep, Double_t weight)
563113d0 150{
151 //
152 // Fills the grid at selection step istep for a set of values of the
153 // input variables, with a given weight (by default w=1)
154 //
a2255142 155 if(istep >= fNStep || istep < 0){
156 AliError("Non-existent selection step, grid was not filled");
157 return;
158 }
563113d0 159 fGrid[istep]->Fill(var,weight);
160}
161//___________________________________________________________________
1e9dad92 162TH1D *AliCFContainer::ShowProjection(Int_t ivar, Int_t istep) const
563113d0 163{
164 //
165 // returns 1-D projection along variable ivar at selection step istep
166 //
a2255142 167 if(istep >= fNStep || istep < 0){
168 AliError("Non-existent selection step, return NULL");
169 return 0x0;
170 }
9105291d 171 if(ivar >= fNVar || ivar < 0){
172 AliError("Non-existent selection step, return NULL");
173 return 0x0;
174 }
175
563113d0 176 return fGrid[istep]->Project(ivar);
177}
178//___________________________________________________________________
1e9dad92 179TH2D *AliCFContainer::ShowProjection(Int_t ivar1, Int_t ivar2, Int_t istep) const
563113d0 180{
181 //
182 // returns 2-D projection along variables ivar1,ivar2 at selection step istep
183 //
a2255142 184 if(istep >= fNStep || istep < 0){
185 AliError("Non-existent selection step, return NULL");
186 return 0x0;
187 }
9105291d 188 if(ivar1 >= fNVar || ivar1 < 0 || ivar2 >= fNVar || ivar2 < 0){
189 AliError("Non-existent selection step, return NULL");
190 return 0x0;
191 }
192
563113d0 193 return fGrid[istep]->Project(ivar1,ivar2);
194}
195//___________________________________________________________________
1e9dad92 196TH3D *AliCFContainer::ShowProjection(Int_t ivar1, Int_t ivar2, Int_t ivar3, Int_t istep) const
563113d0 197{
198 //
199 // returns 3-D projection along variables ivar1,ivar2,ivar3
200 // at selection step istep
201 //
a2255142 202 if(istep >= fNStep || istep < 0){
203 AliError("Non-existent selection step, return NULL");
204 return 0x0;
205 }
9105291d 206 if(ivar1 >= fNVar || ivar1 < 0 ||
207 ivar2 >= fNVar || ivar2 < 0 ||
208 ivar3 >= fNVar || ivar3 < 0 ) {
209 AliError("Non-existent selection step, return NULL");
210 return 0x0;
211 }
212
563113d0 213 return fGrid[istep]->Project(ivar1,ivar2,ivar3);
214}
215//___________________________________________________________________
1e9dad92 216TH1D *AliCFContainer::ShowSlice(Int_t ivar, Double_t *varMin, Double_t* varMax, Int_t istep) const
563113d0 217{
218 //
219 // Make a slice along variable ivar at selection level istep in range [varMin,varMax]
220 //
a2255142 221 if(istep >= fNStep || istep < 0){
222 AliError("Non-existent selection step, return NULL");
223 return 0x0;
224 }
c8df672e 225 if (ivar >= fNVar || ivar < 0) {
226 AliError("Non-existent variable, return NULL");
227 return 0x0;
228 }
1e9dad92 229 return (TH1D*)fGrid[istep]->Slice(ivar,varMin,varMax);
563113d0 230}
c8df672e 231//___________________________________________________________________
232TH2D *AliCFContainer::ShowSlice(Int_t ivar1, Int_t ivar2, Double_t *varMin, Double_t* varMax, Int_t istep) const
233{
234 //
235 // Make a slice along variables ivar1 and ivar2 at selection level istep in range [varMin,varMax]
236 //
237 if(istep >= fNStep || istep < 0){
238 AliError("Non-existent selection step, return NULL");
239 return 0x0;
240 }
241 if (ivar1 >= fNVar || ivar1 < 0 || ivar2 >= fNVar || ivar2 < 0) {
242 AliError("Non-existent variable, return NULL");
243 return 0x0;
244 }
245 return (TH2D*)fGrid[istep]->Slice(ivar1,ivar2,varMin,varMax);
246}
247//___________________________________________________________________
248TH3D *AliCFContainer::ShowSlice(Int_t ivar1, Int_t ivar2, Int_t ivar3, Double_t *varMin, Double_t* varMax, Int_t istep) const
249{
250 //
251 // Make a slice along variables ivar1, ivar2and ivar3 at selection level istep in range [varMin,varMax]
252 //
253 if(istep >= fNStep || istep < 0){
254 AliError("Non-existent selection step, return NULL");
255 return 0x0;
256 }
257 if (ivar1 >= fNVar || ivar1 < 0 || ivar2 >= fNVar || ivar2 < 0 || ivar3 >= fNVar || ivar3 < 0) {
258 AliError("Non-existent variable, return NULL");
259 return 0x0;
260 }
261 return (TH3D*)fGrid[istep]->Slice(ivar1,ivar2,ivar3,varMin,varMax);
262}
563113d0 263//____________________________________________________________________
9105291d 264AliCFContainer* AliCFContainer::MakeSlice(Int_t nVars, Int_t* vars, Double_t* varMin, Double_t* varMax) const
265{
266 //
a8b83c87 267 // Makes a slice along the "nVars" variables defined in the array vars[nVars].
268 // The ranges of ALL the container variables must be defined in the array varMin[fNVar] and varMax[fNVar]
269 // The function returns a new container of nVars variables.
9105291d 270 //
271
272 if (nVars < 1 || nVars > fNVar) AliError("Bad number of dimensions required for the slice");
273
274 //define new binning for new container
275 Int_t* bins=new Int_t[nVars];
276 for (Int_t iVar=0; iVar<nVars; iVar++) bins[iVar] = fNVarBins[vars[iVar]];
277 AliCFContainer* out = new AliCFContainer(fName,fTitle,fNStep,nVars,bins);
278
279 //set the bin limits
280 for (Int_t iVar=0; iVar<nVars; iVar++) {
281 Double_t *array = new Double_t[fNVarBins[vars[iVar]]+1];
282 GetBinLimits(vars[iVar],array);
283 out->SetBinLimits(iVar,array);
284 delete array;
285 }
286
287 //set grid for each step
288 AliInfo(Form("Making a slice in %d dimension(s)",nVars));
289 for (Int_t iStep=0; iStep<fNStep; iStep++) out->SetGrid(iStep,fGrid[iStep]->Project(nVars,vars,varMin,varMax));
290
291 delete bins;
292 return out;
293}
294
295//____________________________________________________________________
563113d0 296Long64_t AliCFContainer::Merge(TCollection* list)
297{
298 // Merge a list of AliCorrection objects with this (needed for
299 // PROOF).
300 // Returns the number of merged objects (including this).
301
302 if (!list)
303 return 0;
304
305 if (list->IsEmpty())
306 return 1;
307
308 TIterator* iter = list->MakeIterator();
309 TObject* obj;
310
311 Int_t count = 0;
312 while ((obj = iter->Next())) {
313 AliCFContainer* entry = dynamic_cast<AliCFContainer*> (obj);
314 if (entry == 0)
315 continue;
316 this->Add(entry);
317 count++;
318 }
319
320 return count+1;
321}
322
323//____________________________________________________________________
1e9dad92 324void AliCFContainer::Add(AliCFContainer* aContainerToAdd, Double_t c)
563113d0 325{
326 //
327 //add the content of container aContainerToAdd to the current one
328 //
a2255142 329 if( (aContainerToAdd->GetNStep()!=fNStep)
330 ||
331 (aContainerToAdd->GetNVar()!=fNVar)
332 ||
333 (aContainerToAdd->GetNDim()!=fNDim)){
334 AliError("Different number of steps/sensitive variables/grid elements: cannot add the containers");
335 return;
336 }
563113d0 337 for(Int_t istep=0;istep<fNStep;istep++){
338 fGrid[istep]->Add(aContainerToAdd->GetGrid(istep),c);
339 }
340}
341//____________________________________________________________________
342Float_t AliCFContainer::GetOverFlows( Int_t ivar, Int_t istep) const {
343 //
344 // Get overflows in variable var at selection level istep
345 //
a2255142 346 if(istep >= fNStep || istep < 0){
347 AliError("Non-existent selection step, return -1");
348 return -1.;
349 }
563113d0 350 return fGrid[istep]->GetOverFlows(ivar);
351}
352//____________________________________________________________________
563113d0 353Float_t AliCFContainer::GetUnderFlows( Int_t ivar, Int_t istep) const {
354 //
a2255142 355 // Get underflows in variable var at selection level istep
563113d0 356 //
a2255142 357 if(istep >= fNStep || istep < 0){
358 AliError("Non-existent selection step, return -1");
359 return -1.;
360 }
563113d0 361 return fGrid[istep]->GetUnderFlows(ivar);
362}
363//____________________________________________________________________
563113d0 364Float_t AliCFContainer::GetEntries( Int_t istep) const {
365 //
a2255142 366 // Get total entries in variable var at selection level istep
563113d0 367 //
a2255142 368 if(istep >= fNStep || istep < 0){
369 AliError("Non-existent selection step, return -1");
370 return -1.;
371 }
563113d0 372 return fGrid[istep]->GetEntries();
373}
374//____________________________________________________________________
375Int_t AliCFContainer::GetEmptyBins( Int_t istep) const {
376 //
a2255142 377 // Get empty bins in variable var at selection level istep
563113d0 378 //
a2255142 379 if(istep >= fNStep || istep < 0){
380 AliError("Non-existent selection step, return -1");
381 return -1;
382 }
563113d0 383 return fGrid[istep]->GetEmptyBins();
384}
385//____________________________________________________________________
1e9dad92 386Int_t AliCFContainer::GetEmptyBins( Int_t istep, Double_t *varMin, Double_t* varMax) const {
563113d0 387 //
a2255142 388 // Get empty bins in a range in variable var at selection level istep
563113d0 389 //
a2255142 390 if(istep >= fNStep || istep < 0){
391 AliError("Non-existent selection step, return -1");
392 return -1;
393 }
563113d0 394 return fGrid[istep]->GetEmptyBins(varMin,varMax);
395}
396//_____________________________________________________________________
1e9dad92 397Double_t AliCFContainer::GetIntegral( Int_t istep) const
563113d0 398{
399 //
a2255142 400 // Get Integral over the grid at selection level istep
563113d0 401 //
a2255142 402 if(istep >= fNStep || istep < 0){
403 AliError("Non-existent selection step, return -1");
404 return -1.;
405 }
563113d0 406 return fGrid[istep]->GetIntegral();
407}
408//_____________________________________________________________________
1e9dad92 409Double_t AliCFContainer::GetIntegral( Int_t istep, Double_t *varMin, Double_t* varMax ) const
563113d0 410{
411 //
a2255142 412 // Get Integral over the grid in a range at selection level istep
563113d0 413 //
a2255142 414 if(istep >= fNStep || istep < 0){
415 AliError("Non-existent selection step, return -1");
416 return -1.;
417 }
563113d0 418 return fGrid[istep]->GetIntegral(varMin,varMax);
419}
c8df672e 420//_____________________________________________________________________
421void AliCFContainer::SetRangeUser(Int_t ivar, Double_t varMin, Double_t varMax, Int_t istep)
422{
423 //
424 // set axis range at step istep
425 //
426 if ( strcmp(fGrid[istep]->ClassName(),"AliCFGrid") ==0 ) {
427 AliWarning("Could not AliCFGrid::SetRangeUser(), function not implemented");
428 return;
429 }
430 if (istep >= fNStep || istep < 0){
431 AliError("Non-existent selection step");
432 return ;
433 }
434 if (ivar >= fNVar || ivar < 0){
435 AliError("Non-existent selection var");
436 return ;
437 }
9105291d 438 ((AliCFGridSparse*)fGrid[istep])->SetRangeUser(ivar,varMin,varMax);
439}
440
441//_____________________________________________________________________
442void AliCFContainer::SetRangeUser(Double_t* varMin, Double_t* varMax, Int_t istep)
443{
444 //
445 // set all axis ranges at step istep according to varMin and varMax values
446 //
447 if ( strcmp(fGrid[istep]->ClassName(),"AliCFGrid") ==0 ) {
448 AliWarning("Could not AliCFGrid::SetRangeUser(), function not implemented");
449 return;
450 }
451 if (istep >= fNStep || istep < 0){
452 AliError("Non-existent selection step");
453 return ;
454 }
455 ((AliCFGridSparse*)fGrid[istep])->SetRangeUser(varMin,varMax);
c8df672e 456}