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() :
39 fExclOffEntriesInProj(kTRUE),
43 // default constructor
46 //____________________________________________________________________
47 AliCFContainer::AliCFContainer(const Char_t* name, const Char_t* title) :
48 AliCFFrame(name,title),
50 fExclOffEntriesInProj(kTRUE),
53 // default constructor
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),
60 fExclOffEntriesInProj(kTRUE),
67 // The selection steps
71 fGrid = new AliCFVGrid*[fNStep]; //the grids at the various selection steps
73 for(Int_t istep=0;istep<fNStep;istep++){
74 sprintf(gname,"%s%s%i",GetName(),"_SelStep", istep);
76 fGrid[istep] = new AliCFGrid(gname,title,nVarIn,nBinIn,binLimitsIn);
79 fGrid[istep] = new AliCFGridSparse(gname,title,nVarIn,nBinIn,binLimitsIn);
81 fGrid[istep]->SumW2();
84 //____________________________________________________________________
85 AliCFContainer::AliCFContainer(const AliCFContainer& c) :
88 fExclOffEntriesInProj(c.fExclOffEntriesInProj),
94 ((AliCFContainer &)c).Copy(*this);
96 //____________________________________________________________________
97 AliCFContainer::~AliCFContainer()
102 if(fGrid)delete [] fGrid;
105 //____________________________________________________________________
106 AliCFContainer &AliCFContainer::operator=(const AliCFContainer &c)
109 // assigment operator
112 ((AliCFContainer &) c).Copy(*this);
115 //____________________________________________________________________
116 void AliCFContainer::SetBinLimits(Int_t varindex, Double_t *array)
119 // setting the arrays containing the bin limits
121 Int_t nbins=fNVarBins[varindex]+1;
122 for(Int_t i=0;i<nbins;i++){
123 fVarBinLimits[fOffset[varindex]+i] =array[i];
125 for(Int_t istep=0;istep<fNStep;istep++){
126 fGrid[istep]->SetBinLimits(varindex,array);
129 //____________________________________________________________________
130 void AliCFContainer::Copy(TObject& c) const
135 AliCFContainer& target = (AliCFContainer &) c;
136 target.fNStep=fNStep;
137 target.fExclOffEntriesInProj=fExclOffEntriesInProj;
140 target.fNVarBinLimits=fNVarBinLimits;
142 target.fNVarBins = fNVarBins;
144 target.fVarBinLimits = fVarBinLimits;
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));
153 //____________________________________________________________________
154 void AliCFContainer::Fill(Double_t *var, Int_t istep, Double_t weight)
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)
160 if(istep >= fNStep || istep < 0){
161 AliError("Non-existent selection step, grid was not filled");
164 fGrid[istep]->Fill(var,weight);
166 //___________________________________________________________________
167 TH1D *AliCFContainer::ShowProjection(Int_t ivar, Int_t istep) const
170 // returns 1-D projection along variable ivar at selection step istep
172 if(istep >= fNStep || istep < 0){
173 AliError("Non-existent selection step, return NULL");
176 fGrid[istep]->SetExcludeOffEntriesInProj(fExclOffEntriesInProj);
177 return fGrid[istep]->Project(ivar);
179 //___________________________________________________________________
180 TH2D *AliCFContainer::ShowProjection(Int_t ivar1, Int_t ivar2, Int_t istep) const
183 // returns 2-D projection along variables ivar1,ivar2 at selection step istep
185 if(istep >= fNStep || istep < 0){
186 AliError("Non-existent selection step, return NULL");
189 fGrid[istep]->SetExcludeOffEntriesInProj(fExclOffEntriesInProj);
190 return fGrid[istep]->Project(ivar1,ivar2);
192 //___________________________________________________________________
193 TH3D *AliCFContainer::ShowProjection(Int_t ivar1, Int_t ivar2, Int_t ivar3, Int_t istep) const
196 // returns 3-D projection along variables ivar1,ivar2,ivar3
197 // at selection step istep
199 if(istep >= fNStep || istep < 0){
200 AliError("Non-existent selection step, return NULL");
203 fGrid[istep]->SetExcludeOffEntriesInProj(fExclOffEntriesInProj);
204 return fGrid[istep]->Project(ivar1,ivar2,ivar3);
206 //___________________________________________________________________
207 TH1D *AliCFContainer::ShowSlice(Int_t ivar, Double_t *varMin, Double_t* varMax, Int_t istep) const
210 // Make a slice along variable ivar at selection level istep in range [varMin,varMax]
212 if(istep >= fNStep || istep < 0){
213 AliError("Non-existent selection step, return NULL");
216 return (TH1D*)fGrid[istep]->Slice(ivar,varMin,varMax);
218 //____________________________________________________________________
219 Long64_t AliCFContainer::Merge(TCollection* list)
221 // Merge a list of AliCorrection objects with this (needed for
223 // Returns the number of merged objects (including this).
231 TIterator* iter = list->MakeIterator();
235 while ((obj = iter->Next())) {
236 AliCFContainer* entry = dynamic_cast<AliCFContainer*> (obj);
246 //____________________________________________________________________
247 void AliCFContainer::Add(AliCFContainer* aContainerToAdd, Double_t c)
250 //add the content of container aContainerToAdd to the current one
252 if( (aContainerToAdd->GetNStep()!=fNStep)
254 (aContainerToAdd->GetNVar()!=fNVar)
256 (aContainerToAdd->GetNDim()!=fNDim)){
257 AliError("Different number of steps/sensitive variables/grid elements: cannot add the containers");
260 for(Int_t istep=0;istep<fNStep;istep++){
261 fGrid[istep]->Add(aContainerToAdd->GetGrid(istep),c);
264 //____________________________________________________________________
265 Float_t AliCFContainer::GetOverFlows( Int_t ivar, Int_t istep) const {
267 // Get overflows in variable var at selection level istep
269 if(istep >= fNStep || istep < 0){
270 AliError("Non-existent selection step, return -1");
273 return fGrid[istep]->GetOverFlows(ivar);
275 //____________________________________________________________________
276 Float_t AliCFContainer::GetUnderFlows( Int_t ivar, Int_t istep) const {
278 // Get underflows in variable var at selection level istep
280 if(istep >= fNStep || istep < 0){
281 AliError("Non-existent selection step, return -1");
284 return fGrid[istep]->GetUnderFlows(ivar);
286 //____________________________________________________________________
287 Float_t AliCFContainer::GetEntries( Int_t istep) const {
289 // Get total entries in variable var at selection level istep
291 if(istep >= fNStep || istep < 0){
292 AliError("Non-existent selection step, return -1");
295 return fGrid[istep]->GetEntries();
297 //____________________________________________________________________
298 Int_t AliCFContainer::GetEmptyBins( Int_t istep) const {
300 // Get empty bins in variable var at selection level istep
302 if(istep >= fNStep || istep < 0){
303 AliError("Non-existent selection step, return -1");
306 return fGrid[istep]->GetEmptyBins();
308 //____________________________________________________________________
309 Int_t AliCFContainer::GetEmptyBins( Int_t istep, Double_t *varMin, Double_t* varMax) const {
311 // Get empty bins in a range in variable var at selection level istep
313 if(istep >= fNStep || istep < 0){
314 AliError("Non-existent selection step, return -1");
317 return fGrid[istep]->GetEmptyBins(varMin,varMax);
319 //_____________________________________________________________________
320 Double_t AliCFContainer::GetIntegral( Int_t istep) const
323 // Get Integral over the grid at selection level istep
325 if(istep >= fNStep || istep < 0){
326 AliError("Non-existent selection step, return -1");
329 return fGrid[istep]->GetIntegral();
331 //_____________________________________________________________________
332 Double_t AliCFContainer::GetIntegral( Int_t istep, Double_t *varMin, Double_t* varMax ) const
335 // Get Integral over the grid in a range at selection level istep
337 if(istep >= fNStep || istep < 0){
338 AliError("Non-existent selection step, return -1");
341 return fGrid[istep]->GetIntegral(varMin,varMax);