2 /**************************************************************************
3 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
5 * Author: The ALICE Off-line Project. *
6 * Contributors are mentioned in the code where appropriate. *
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 //--------------------------------------------------------------------//
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 //
23 // -- Author : S.Arcelli //
24 //--------------------------------------------------------------------//
28 #include "AliCFGrid.h"
29 #include "AliCFGridSparse.h"
30 #include "AliCFContainer.h"
32 //____________________________________________________________________
33 ClassImp(AliCFContainer)
35 //____________________________________________________________________
36 AliCFContainer::AliCFContainer() :
42 // default constructor
45 //____________________________________________________________________
46 AliCFContainer::AliCFContainer(const Char_t* name, const Char_t* title) :
47 AliCFFrame(name,title),
51 // default constructor
54 //____________________________________________________________________
55 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) :
56 AliCFFrame(name,title,nVarIn,nBinIn,binLimitsIn),
64 // The selection steps
68 fGrid = new AliCFVGrid*[fNStep]; //the grids at the various selection steps
70 for(Int_t istep=0;istep<fNStep;istep++){
71 sprintf(gname,"%s%s%i",GetName(),"_SelStep", istep);
73 fGrid[istep] = new AliCFGrid(gname,title,nVarIn,nBinIn,binLimitsIn);
76 fGrid[istep] = new AliCFGridSparse(gname,title,nVarIn,nBinIn,binLimitsIn);
78 fGrid[istep]->SumW2();
81 //____________________________________________________________________
82 AliCFContainer::AliCFContainer(const AliCFContainer& c) :
90 ((AliCFContainer &)c).Copy(*this);
92 //____________________________________________________________________
93 AliCFContainer::~AliCFContainer()
98 if(fGrid)delete [] fGrid;
101 //____________________________________________________________________
102 AliCFContainer &AliCFContainer::operator=(const AliCFContainer &c)
105 // assigment operator
108 ((AliCFContainer &) c).Copy(*this);
111 //____________________________________________________________________
112 void AliCFContainer::SetBinLimits(Int_t varindex, Double_t *array)
115 // setting the arrays containing the bin limits
117 Int_t nbins=fNVarBins[varindex]+1;
118 for(Int_t i=0;i<nbins;i++){
119 fVarBinLimits[fOffset[varindex]+i] =array[i];
121 for(Int_t istep=0;istep<fNStep;istep++){
122 fGrid[istep]->SetBinLimits(varindex,array);
125 //____________________________________________________________________
126 void AliCFContainer::Copy(TObject& c) const
131 AliCFContainer& target = (AliCFContainer &) c;
132 target.fNStep=fNStep;
135 target.fNVarBinLimits=fNVarBinLimits;
137 target.fNVarBins = fNVarBins;
139 target.fVarBinLimits = fVarBinLimits;
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));
148 //____________________________________________________________________
149 void AliCFContainer::Fill(Double_t *var, Int_t istep, Double_t weight)
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)
155 if(istep >= fNStep || istep < 0){
156 AliError("Non-existent selection step, grid was not filled");
159 fGrid[istep]->Fill(var,weight);
161 //___________________________________________________________________
162 TH1D *AliCFContainer::ShowProjection(Int_t ivar, Int_t istep) const
165 // returns 1-D projection along variable ivar at selection step istep
167 if(istep >= fNStep || istep < 0){
168 AliError("Non-existent selection step, return NULL");
171 if(ivar >= fNVar || ivar < 0){
172 AliError("Non-existent selection step, return NULL");
176 return fGrid[istep]->Project(ivar);
178 //___________________________________________________________________
179 TH2D *AliCFContainer::ShowProjection(Int_t ivar1, Int_t ivar2, Int_t istep) const
182 // returns 2-D projection along variables ivar1,ivar2 at selection step istep
184 if(istep >= fNStep || istep < 0){
185 AliError("Non-existent selection step, return NULL");
188 if(ivar1 >= fNVar || ivar1 < 0 || ivar2 >= fNVar || ivar2 < 0){
189 AliError("Non-existent selection step, return NULL");
193 return fGrid[istep]->Project(ivar1,ivar2);
195 //___________________________________________________________________
196 TH3D *AliCFContainer::ShowProjection(Int_t ivar1, Int_t ivar2, Int_t ivar3, Int_t istep) const
199 // returns 3-D projection along variables ivar1,ivar2,ivar3
200 // at selection step istep
202 if(istep >= fNStep || istep < 0){
203 AliError("Non-existent selection step, return NULL");
206 if(ivar1 >= fNVar || ivar1 < 0 ||
207 ivar2 >= fNVar || ivar2 < 0 ||
208 ivar3 >= fNVar || ivar3 < 0 ) {
209 AliError("Non-existent selection step, return NULL");
213 return fGrid[istep]->Project(ivar1,ivar2,ivar3);
215 //___________________________________________________________________
216 TH1D *AliCFContainer::ShowSlice(Int_t ivar, Double_t *varMin, Double_t* varMax, Int_t istep) const
219 // Make a slice along variable ivar at selection level istep in range [varMin,varMax]
221 if(istep >= fNStep || istep < 0){
222 AliError("Non-existent selection step, return NULL");
225 if (ivar >= fNVar || ivar < 0) {
226 AliError("Non-existent variable, return NULL");
229 return (TH1D*)fGrid[istep]->Slice(ivar,varMin,varMax);
231 //___________________________________________________________________
232 TH2D *AliCFContainer::ShowSlice(Int_t ivar1, Int_t ivar2, Double_t *varMin, Double_t* varMax, Int_t istep) const
235 // Make a slice along variables ivar1 and ivar2 at selection level istep in range [varMin,varMax]
237 if(istep >= fNStep || istep < 0){
238 AliError("Non-existent selection step, return NULL");
241 if (ivar1 >= fNVar || ivar1 < 0 || ivar2 >= fNVar || ivar2 < 0) {
242 AliError("Non-existent variable, return NULL");
245 return (TH2D*)fGrid[istep]->Slice(ivar1,ivar2,varMin,varMax);
247 //___________________________________________________________________
248 TH3D *AliCFContainer::ShowSlice(Int_t ivar1, Int_t ivar2, Int_t ivar3, Double_t *varMin, Double_t* varMax, Int_t istep) const
251 // Make a slice along variables ivar1, ivar2and ivar3 at selection level istep in range [varMin,varMax]
253 if(istep >= fNStep || istep < 0){
254 AliError("Non-existent selection step, return NULL");
257 if (ivar1 >= fNVar || ivar1 < 0 || ivar2 >= fNVar || ivar2 < 0 || ivar3 >= fNVar || ivar3 < 0) {
258 AliError("Non-existent variable, return NULL");
261 return (TH3D*)fGrid[istep]->Slice(ivar1,ivar2,ivar3,varMin,varMax);
263 //____________________________________________________________________
264 AliCFContainer* AliCFContainer::MakeSlice(Int_t nVars, Int_t* vars, Double_t* varMin, Double_t* varMax) const
267 // Makes a slice along the "nVars" variables defined in the array "vars[nVars]" for all the container steps.
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.
271 Int_t* steps = new Int_t[fNStep];
272 for (Int_t iStep=0;iStep<fNStep;iStep++) steps[iStep]=iStep;
273 AliCFContainer* out = MakeSlice(nVars,vars,varMin,varMax,fNStep,steps);
278 //____________________________________________________________________
279 AliCFContainer* AliCFContainer::MakeSlice(Int_t nVars, Int_t* vars, Double_t* varMin, Double_t* varMax, Int_t nSteps, Int_t* steps) const
282 // Makes a slice along the "nVars" variables defined in the array "vars[nVars]" for the given "nSteps" defined in "steps[nSteps]".
283 // The ranges of ALL the container variables must be defined in the array varMin[fNVar] and varMax[fNVar]
284 // The function returns a new container of nVars variables.
287 if (nVars < 1 || nVars > fNVar) AliError("Bad number of dimensions required for the slice");
288 if (nSteps< 1 || nSteps> fNStep) AliError("Bad number of steps required for the slice");
290 AliInfo(Form("Making a slice in %d dimension(s)",nVars));
292 // create the output grids
293 AliCFVGrid** grids = new AliCFVGrid*[nSteps] ;
294 for (Int_t iStep=0; iStep<nSteps; iStep++) grids[iStep] = fGrid[steps[iStep]]->Project(nVars,vars,varMin,varMax);
296 TAxis ** axis = new TAxis*[nVars];
297 for (Int_t iVar=0; iVar<nVars; iVar++) axis[iVar] = ((AliCFGridSparse*)grids[0])->GetGrid()->GetAxis(iVar); //same axis for every grid
299 //define new binning for new container
300 Int_t* bins=new Int_t[nVars];
301 for (Int_t iVar=0; iVar<nVars; iVar++) bins[iVar] = axis[iVar]->GetNbins();
303 AliCFContainer* out = new AliCFContainer(fName,fTitle,nSteps,nVars,bins);
306 for (Int_t iVar=0; iVar<nVars; iVar++) {
307 Int_t nBins = bins[iVar];
308 Double_t *array = new Double_t[nBins+1];
309 for (Int_t iBin=1; iBin<=nBins; iBin++) {
310 array[iBin-1] = axis[iVar]->GetBinLowEdge(iBin);
312 array[nBins] = axis[iVar]->GetBinUpEdge(nBins);
313 out->SetBinLimits(iVar,array);
317 //set grid for the given steps
318 for (Int_t iStep=0; iStep<nSteps; iStep++) out->SetGrid(iStep,grids[iStep]);
325 //____________________________________________________________________
326 Long64_t AliCFContainer::Merge(TCollection* list)
328 // Merge a list of AliCorrection objects with this (needed for
330 // Returns the number of merged objects (including this).
338 TIterator* iter = list->MakeIterator();
342 while ((obj = iter->Next())) {
343 AliCFContainer* entry = dynamic_cast<AliCFContainer*> (obj);
353 //____________________________________________________________________
354 void AliCFContainer::Add(AliCFContainer* aContainerToAdd, Double_t c)
357 //add the content of container aContainerToAdd to the current one
359 if( (aContainerToAdd->GetNStep()!=fNStep)
361 (aContainerToAdd->GetNVar()!=fNVar)
363 (aContainerToAdd->GetNDim()!=fNDim)){
364 AliError("Different number of steps/sensitive variables/grid elements: cannot add the containers");
367 for(Int_t istep=0;istep<fNStep;istep++){
368 fGrid[istep]->Add(aContainerToAdd->GetGrid(istep),c);
371 //____________________________________________________________________
372 Float_t AliCFContainer::GetOverFlows( Int_t ivar, Int_t istep) const {
374 // Get overflows in variable var at selection level istep
376 if(istep >= fNStep || istep < 0){
377 AliError("Non-existent selection step, return -1");
380 return fGrid[istep]->GetOverFlows(ivar);
382 //____________________________________________________________________
383 Float_t AliCFContainer::GetUnderFlows( Int_t ivar, Int_t istep) const {
385 // Get underflows in variable var at selection level istep
387 if(istep >= fNStep || istep < 0){
388 AliError("Non-existent selection step, return -1");
391 return fGrid[istep]->GetUnderFlows(ivar);
393 //____________________________________________________________________
394 Float_t AliCFContainer::GetEntries( Int_t istep) const {
396 // Get total entries in variable var at selection level istep
398 if(istep >= fNStep || istep < 0){
399 AliError("Non-existent selection step, return -1");
402 return fGrid[istep]->GetEntries();
404 //____________________________________________________________________
405 Int_t AliCFContainer::GetEmptyBins( Int_t istep) const {
407 // Get empty bins in variable var at selection level istep
409 if(istep >= fNStep || istep < 0){
410 AliError("Non-existent selection step, return -1");
413 return fGrid[istep]->GetEmptyBins();
415 //____________________________________________________________________
416 Int_t AliCFContainer::GetEmptyBins( Int_t istep, Double_t *varMin, Double_t* varMax) const {
418 // Get empty bins in a range in variable var at selection level istep
420 if(istep >= fNStep || istep < 0){
421 AliError("Non-existent selection step, return -1");
424 return fGrid[istep]->GetEmptyBins(varMin,varMax);
426 //_____________________________________________________________________
427 Double_t AliCFContainer::GetIntegral( Int_t istep) const
430 // Get Integral over the grid at selection level istep
432 if(istep >= fNStep || istep < 0){
433 AliError("Non-existent selection step, return -1");
436 return fGrid[istep]->GetIntegral();
438 //_____________________________________________________________________
439 Double_t AliCFContainer::GetIntegral( Int_t istep, Double_t *varMin, Double_t* varMax ) const
442 // Get Integral over the grid in a range at selection level istep
444 if(istep >= fNStep || istep < 0){
445 AliError("Non-existent selection step, return -1");
448 return fGrid[istep]->GetIntegral(varMin,varMax);
450 //_____________________________________________________________________
451 void AliCFContainer::SetRangeUser(Int_t ivar, Double_t varMin, Double_t varMax, Int_t istep)
454 // set axis range at step istep
456 if ( strcmp(fGrid[istep]->ClassName(),"AliCFGrid") ==0 ) {
457 AliWarning("Could not AliCFGrid::SetRangeUser(), function not implemented");
460 if (istep >= fNStep || istep < 0){
461 AliError("Non-existent selection step");
464 if (ivar >= fNVar || ivar < 0){
465 AliError("Non-existent selection var");
468 ((AliCFGridSparse*)fGrid[istep])->SetRangeUser(ivar,varMin,varMax);
471 //_____________________________________________________________________
472 void AliCFContainer::SetRangeUser(Double_t* varMin, Double_t* varMax, Int_t istep)
475 // set all axis ranges at step istep according to varMin and varMax values
477 if ( strcmp(fGrid[istep]->ClassName(),"AliCFGrid") ==0 ) {
478 AliWarning("Could not AliCFGrid::SetRangeUser(), function not implemented");
481 if (istep >= fNStep || istep < 0){
482 AliError("Non-existent selection step");
485 ((AliCFGridSparse*)fGrid[istep])->SetRangeUser(varMin,varMax);