1 /**************************************************************************
2 * Copyright(c) 2007-2009, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 ///////////////////////////////////////////////////////////////////
20 // Implementation of the class to store the number of signal //
21 // and background events in bins of the cut values //
22 // Origin: Elena Bruna (bruna@to.infn.it) //
23 // Updated: Sergey Senyukov (senyukov@to.infn.it) //
24 // Francesco Prino (prino@to.infn.it) //
25 // Last Updated: Giacomo Ortona (ortona@to.infn.it) //
27 ///////////////////////////////////////////////////////////////////
30 #include <Riostream.h>
32 #include "AliMultiDimVector.h"
36 ClassImp(AliMultiDimVector)
37 //___________________________________________________________________________
38 AliMultiDimVector::AliMultiDimVector():TNamed("AliMultiDimVector","default"),
45 // default constructor
47 for(Int_t i=0; i<fgkMaxNVariables; i++) {
51 fGreaterThan[i]=kTRUE;
54 for(Int_t i=0; i<fgkMaxNPtBins+1; i++) {
58 //___________________________________________________________________________
59 AliMultiDimVector::AliMultiDimVector(const char *name,const char *title, const Int_t nptbins, const Float_t* ptlimits, const Int_t npars, const Int_t *nofcells,const Float_t *loosecuts, const Float_t *tightcuts, const TString *axisTitles):TNamed(name,title),
65 // standard constructor
67 for(Int_t i=0; i<fgkMaxNVariables; i++) {
71 fGreaterThan[i]=kTRUE;
74 for(Int_t i=0; i<fgkMaxNPtBins+1; i++) {
79 for(Int_t i=0;i<fNVariables;i++){
81 fNCutSteps[i]=nofcells[i];
82 if(loosecuts[i] == tightcuts[i]){
84 printf("AliMultiDimVector::AliMultiDimVector: WARNING! same tight/loose variable for variable number %d. AliMultiDimVector with run with the following values: loose: %f; tight: %f\n",i,tightcuts[i]-0.1*tightcuts[i],tightcuts[i]);
85 fMinLimits[i]=tightcuts[i]-0.1*tightcuts[i];
86 fMaxLimits[i]=tightcuts[i];
91 fGreaterThan[i]=kTRUE;
93 if(loosecuts[i] < tightcuts[i]){
94 fMinLimits[i]=loosecuts[i];
95 fMaxLimits[i]=tightcuts[i];
96 fGreaterThan[i]=kTRUE;
98 fMinLimits[i]=tightcuts[i];
99 fMaxLimits[i]=loosecuts[i];
100 fGreaterThan[i]=kFALSE;
102 fAxisTitles[i]=axisTitles[i].Data();
104 fNTotCells=ntot*fNPtBins;
105 fVett.Set(fNTotCells);
106 for(Int_t ipt=0;ipt<fNPtBins+1;ipt++) fPtLimits[ipt]=ptlimits[ipt];
107 for(Int_t ipt=fNPtBins+1;ipt<fgkMaxNPtBins+1;ipt++) fPtLimits[ipt]=999.;
108 for (ULong64_t j=0;j<fNTotCells;j++) fVett.AddAt(0,j);
110 //___________________________________________________________________________
111 AliMultiDimVector::AliMultiDimVector(const AliMultiDimVector &mv):TNamed(mv.GetName(),mv.GetTitle()),
112 fNVariables(mv.fNVariables),
113 fNPtBins(mv.fNPtBins),
115 fNTotCells(mv.fNTotCells),
116 fIsIntegrated(mv.fIsIntegrated)
120 for(Int_t i=0; i<fgkMaxNVariables; i++) {
124 fGreaterThan[i]=kTRUE;
127 for(Int_t i=0; i<fgkMaxNPtBins+1; i++) {
132 for(Int_t i=0;i<fNVariables;i++){
133 fNCutSteps[i]=mv.GetNCutSteps(i);
134 fMinLimits[i]=mv.GetMinLimit(i);
135 fMaxLimits[i]=mv.GetMaxLimit(i);
136 fGreaterThan[i]=mv.GetGreaterThan(i);
137 fAxisTitles[i]=mv.GetAxisTitle(i);
139 fVett.Set(fNTotCells);
141 for(Int_t ipt=0;ipt<fNPtBins+1;ipt++) fPtLimits[ipt]=mv.GetPtLimit(ipt);
142 for(ULong64_t i=0;i<fNTotCells;i++) fVett[i]=mv.GetElement(i);
144 //___________________________________________________________________________
145 AliMultiDimVector &AliMultiDimVector::operator=(const AliMultiDimVector &mv)
147 // assignment operator
149 if(&mv == this) return *this;
151 TNamed::operator=(mv);
153 fNVariables=mv.fNVariables;
154 fNPtBins=mv.fNPtBins;
155 fNTotCells=mv.fNTotCells;
156 fIsIntegrated=mv.fIsIntegrated;
159 for(Int_t i=0; i<fgkMaxNVariables; i++) {
163 fGreaterThan[i]=kTRUE;
166 for(Int_t i=0; i<fgkMaxNPtBins+1; i++) {
171 for(Int_t i=0;i<fNVariables;i++){
172 fNCutSteps[i]=mv.GetNCutSteps(i);
173 fMinLimits[i]=mv.GetMinLimit(i);
174 fMaxLimits[i]=mv.GetMaxLimit(i);
175 fGreaterThan[i]=mv.GetGreaterThan(i);
176 fAxisTitles[i]=mv.GetAxisTitle(i);
178 fVett.Set(fNTotCells);
180 for(Int_t ipt=0;ipt<fNPtBins+1;ipt++) fPtLimits[ipt]=mv.GetPtLimit(ipt);
181 for(ULong64_t i=0;i<fNTotCells;i++) fVett[i]=mv.GetElement(i);
183 //___________________________________________________________________________
184 void AliMultiDimVector::CopyStructure(const AliMultiDimVector* mv){
185 // Sets dimensions and limit from mv
186 fNVariables=mv->GetNVariables();
187 fNPtBins=mv->GetNPtBins();
188 fNTotCells=mv->GetNTotCells();
189 fIsIntegrated=mv->IsIntegrated();
190 for(Int_t i=0;i<fNVariables;i++){
191 fNCutSteps[i]=mv->GetNCutSteps(i);
192 fMinLimits[i]=mv->GetMinLimit(i);
193 fMaxLimits[i]=mv->GetMaxLimit(i);
194 fGreaterThan[i]=mv->GetGreaterThan(i);
195 fAxisTitles[i]=mv->GetAxisTitle(i);
197 for(Int_t ipt=0;ipt<fNPtBins+1;ipt++) fPtLimits[ipt]=mv->GetPtLimit(ipt);
198 fVett.Set(fNTotCells);
200 //______________________________________________________________________
201 Bool_t AliMultiDimVector::GetIndicesFromGlobalAddress(ULong64_t globadd, Int_t *ind, Int_t &ptbin) const {
202 // returns matrix element indices and Pt bin from global index
203 if(globadd>=fNTotCells) return kFALSE;
206 Int_t nOfCellsPlusLevel[fgkMaxNVariables+1];
207 for(Int_t k=0;k<fNVariables;k++) nOfCellsPlusLevel[k]=fNCutSteps[k];
208 nOfCellsPlusLevel[fNVariables]=fNPtBins;
210 for(Int_t i=0;i<fNVariables+1;i++) prod*=nOfCellsPlusLevel[i];
211 for(Int_t i=0;i<fNVariables+1;i++){
212 prod/=nOfCellsPlusLevel[i];
213 if(i<fNVariables) ind[i]=r/prod;
219 //______________________________________________________________________
220 Bool_t AliMultiDimVector::GetCutValuesFromGlobalAddress(ULong64_t globadd, Float_t *cuts, Int_t &ptbin) const {
221 Int_t ind[fgkMaxNVariables];
222 Bool_t retcode=GetIndicesFromGlobalAddress(globadd,ind,ptbin);
223 if(!retcode) return kFALSE;
224 for(Int_t i=0;i<fNVariables;i++) cuts[i]=GetCutValue(i,ind[i]);
227 //______________________________________________________________________
228 ULong64_t AliMultiDimVector::GetGlobalAddressFromIndices(const Int_t *ind, Int_t ptbin) const {
229 // Returns the global index of the cell in the matrix
232 Int_t indexPlusLevel[fgkMaxNVariables+1];
233 Int_t nOfCellsPlusLevel[fgkMaxNVariables+1];
234 for(Int_t i=0;i<fNVariables;i++){
235 indexPlusLevel[i]=ind[i];
236 nOfCellsPlusLevel[i]=fNCutSteps[i];
238 indexPlusLevel[fNVariables]=ptbin;
239 nOfCellsPlusLevel[fNVariables]=fNPtBins;
241 for(Int_t i=0;i<fNVariables+1;i++){
242 prod=indexPlusLevel[i];
244 for(Int_t j=i+1;j<fNVariables+1;j++){
245 prod*=nOfCellsPlusLevel[j];
252 //______________________________________________________________________
253 Bool_t AliMultiDimVector::GetIndicesFromValues(const Float_t *values, Int_t *ind) const {
254 // Fills the array of matrix indices strating from variable values
255 for(Int_t i=0;i<fNVariables;i++){
257 if(values[i]<GetMinLimit(i)) return kFALSE;
258 ind[i]=(Int_t)((values[i]-fMinLimits[i])/GetCutStep(i));
259 if(ind[i]>=GetNCutSteps(i)) ind[i]=GetNCutSteps(i)-1;
261 if(values[i]>GetMaxLimit(i)) return kFALSE;
262 ind[i]=(Int_t)((fMaxLimits[i]-values[i])/GetCutStep(i));
263 if(ind[i]>=GetNCutSteps(i)) ind[i]=GetNCutSteps(i)-1;
268 //______________________________________________________________________
269 ULong64_t AliMultiDimVector::GetGlobalAddressFromValues(const Float_t *values, Int_t ptbin) const {
270 // Returns the global index of the cell in the matrix
271 Int_t ind[fgkMaxNVariables];
272 Bool_t retcode=GetIndicesFromValues(values,ind);
273 if(retcode) return GetGlobalAddressFromIndices(ind,ptbin);
275 AliError("Values out of range");
276 return fNTotCells+999;
279 //_____________________________________________________________________________
280 void AliMultiDimVector::MultiplyBy(Float_t factor){
281 // multiply the AliMultiDimVector by a constant factor
282 for(ULong64_t i=0;i<fNTotCells;i++){
284 fVett.AddAt(fVett.At(i)*factor,i);
285 else fVett.AddAt(-1,i);
289 //_____________________________________________________________________________
290 void AliMultiDimVector::Multiply(const AliMultiDimVector* mv,Float_t factor){
291 // Sets AliMultiDimVector=mv*constant factor
292 for(ULong64_t i=0;i<fNTotCells;i++){
293 if(mv->GetElement(i)>0.)
294 fVett.AddAt(mv->GetElement(i)*factor,i);
295 else fVett.AddAt(-1,i);
298 //_____________________________________________________________________________
299 void AliMultiDimVector::Multiply(const AliMultiDimVector* mv1, const AliMultiDimVector* mv2){
300 // Sets AliMultiDimVector=mv1*mv2
301 for(ULong64_t i=0;i<fNTotCells;i++){
302 if(mv1->GetElement(i)>0. && mv2->GetElement(i)>0.)
303 fVett.AddAt(mv1->GetElement(i)*mv2->GetElement(i),i);
304 else fVett.AddAt(-1,i);
307 //_____________________________________________________________________________
308 void AliMultiDimVector::Add(const AliMultiDimVector* mv){
309 // Sums contents of mv to AliMultiDimVector
310 if (mv->GetNTotCells()!=fNTotCells){
311 AliError("Different dimension of the vectors!!");
313 for(ULong64_t i=0;i<fNTotCells;i++)
314 if(mv->GetElement(i)>0. && fVett.At(i)>0.)
315 fVett.AddAt(fVett.At(i)+mv->GetElement(i),i);
316 else fVett.AddAt(-1,i);
319 //_____________________________________________________________________________
320 void AliMultiDimVector::Sum(const AliMultiDimVector* mv1, const AliMultiDimVector* mv2){
321 // Sets AliMultiDimVector=mv1+mv2
322 if (fNTotCells!=mv1->GetNTotCells()&&mv1->GetNTotCells()!=mv2->GetNTotCells()) {
323 AliError("Different dimension of the vectors!!");
326 for(ULong64_t i=0;i<mv1->GetNTotCells();i++) {
327 if(mv1->GetElement(i)>0. && mv2->GetElement(i)>0.)
328 fVett.AddAt(mv1->GetElement(i)+mv2->GetElement(i),i);
329 else fVett.AddAt(-1,i);
333 //_____________________________________________________________________________
334 void AliMultiDimVector::LinearComb(const AliMultiDimVector* mv1, Float_t norm1, const AliMultiDimVector* mv2, Float_t norm2){
335 // Sets AliMultiDimVector=n1*mv1+n2*mv2
336 if (fNTotCells!=mv1->GetNTotCells()&&mv1->GetNTotCells()!=mv2->GetNTotCells()) {
337 AliError("Different dimension of the vectors!!");
340 for(ULong64_t i=0;i<mv1->GetNTotCells();i++) {
341 if(mv1->GetElement(i)>0. && mv2->GetElement(i)>0.)
342 fVett.AddAt(norm1*mv1->GetElement(i)+norm2*mv2->GetElement(i),i);
343 else fVett.AddAt(-1,i);
347 //_____________________________________________________________________________
348 void AliMultiDimVector::DivideBy(const AliMultiDimVector* mv){
349 // Divide AliMulivector by mv
350 if (mv->GetNTotCells()!=fNTotCells) {
351 AliError("Different dimension of the vectors!!");
354 for(ULong64_t i=0;i<fNTotCells;i++)
355 if(mv->GetElement(i)!=0 &&mv->GetElement(i)>0. && fVett.At(i)>0.)
356 fVett.AddAt(fVett.At(i)/mv->GetElement(i),i);
357 else fVett.AddAt(-1,i);
361 //_____________________________________________________________________________
362 void AliMultiDimVector::Divide(const AliMultiDimVector* mv1, const AliMultiDimVector* mv2){
363 // Sets AliMultiDimVector=mv1/mv2
364 if (fNTotCells!=mv1->GetNTotCells()&&mv1->GetNTotCells()!=mv2->GetNTotCells()) {
365 AliError("Different dimension of the vectors!!");
368 for(ULong64_t i=0;i<mv1->GetNTotCells();i++)
369 if(mv2->GetElement(i)!=0&& mv2->GetElement(i)>0.&& mv1->GetElement(i)>0.)
371 fVett.AddAt(mv1->GetElement(i)/mv2->GetElement(i),i);
373 else fVett.AddAt(-1,i);
376 //_____________________________________________________________________________
377 void AliMultiDimVector::Sqrt(){
378 // Sqrt of elements of AliMultiDimVector
379 for(ULong64_t i=0;i<fNTotCells;i++) {
380 if(fVett.At(i)>=0) fVett.AddAt(TMath::Sqrt(fVett.At(i)),i);
386 //_____________________________________________________________________________
387 void AliMultiDimVector::Sqrt(const AliMultiDimVector* mv){
388 // Sets AliMultiDimVector=sqrt(mv)
389 for(ULong64_t i=0;i<fNTotCells;i++)
390 if(mv->GetElement(i)>=0) fVett.AddAt(TMath::Sqrt(mv->GetElement(i)),i);
391 else fVett.AddAt(-1,i);
393 //_____________________________________________________________________________
394 void AliMultiDimVector::FindMaximum(Float_t& maxValue, Int_t *ind , Int_t ptbin){
395 // finds the element with maximum contents
396 const ULong64_t nelem=fNTotCells/fNPtBins;
399 ULong64_t runningAddress;
400 for(ULong64_t i=0;i<nelem;i++){
401 runningAddress=ptbin+i*fNPtBins;
402 vett.AddAt(fVett[runningAddress],i);
404 maxValue=TMath::MaxElement(nelem,vett.GetArray());
405 ULong64_t maxAddress=TMath::LocMax(nelem,vett.GetArray());
406 ULong64_t maxGlobalAddress=ptbin+maxAddress*fNPtBins;
408 GetIndicesFromGlobalAddress(maxGlobalAddress,ind,checkedptbin);
411 //_____________________________________________________________________________
412 //Int_t* AliMultiDimVector::FindLocalMaximum(Float_t& maxValue, Bool_t *isFree,Int_t* indFixed, Int_t ptbin){
413 Int_t* AliMultiDimVector::FindLocalMaximum(Float_t& maxValue, Int_t *numFixed,Int_t* indFixed, Int_t nfixed,Int_t ptbin){
414 //return the elements with maximum content (maxValue) given fixed step for not free variables
415 //numFixed[nfixed] is the indices of the fixed variables in the cuts array [fNVariables]={kTRUE,kTRUE,...,kFALSE,...,kFALSE,...,kTRUE}
416 //indFixed[nfixed]={1,2} //nfixed is the number of false in isFree; indFixed contains the step for the i-th variable
417 //!!take care of deleting the array of index returned!!
419 // Int_t nfixed=0,nfree=0;
420 //Int_t indtmp[fNVariables];
421 if(nfixed>fNVariables)cout<<"AliMultiDimVector::FindLocalMaximum:ERROR! too many variables"<<endl;
423 Int_t* indMax=new Int_t[fNVariables];
424 //Get the number of fixed vars
426 for (Int_t iv=0;iv<fNVariables;iv++){
429 nelem*=fNCutSteps[iv];
433 indMax[iv]=indFixed[nfixed];
434 if(indFixed[nfixed]>=GetNCutSteps(iv)){
436 cout<<"AliMultiDimVector::FindLocalMaximum:ERROR! called fixed ind "<< indFixed[nfixed]<<" but "<<iv<<" var has only "<<GetNCutSteps(iv)<<" steps"<<endl;
442 for (Int_t iv=0;iv<fNVariables;iv++)indMax[iv]=0;
443 for(Int_t i=0;i<nfixed;i++){
444 indMax[numFixed[i]]=indFixed[i];
446 //Get position of fixed vars
448 Int_t fixedIndexes[nfixed];
450 for (Int_t iv=0;iv<fNVariables;iv++){
452 fixedIndexes[iforfixed]=iv;
460 ULong64_t first=fNTotCells/fNPtBins*ptbin;
461 ULong64_t last=first+fNTotCells/fNPtBins;
464 maxValue=fVett[GetGlobalAddressFromIndices(indMax,ptbin)];
465 Int_t tmpInd[fNVariables];
467 //loop on multidimvector global addresses
468 for(ULong64_t iga=first;iga<last;iga++){
469 GetIndicesFromGlobalAddress(iga,tmpInd,dummyptbin);
470 Bool_t goodCell=kTRUE;
471 for(Int_t ifix=0;ifix<nfixed&&goodCell;ifix++){
472 // if(indFixed[ifix]!=indMax[fixedIndexes[ifix]])goodCell=kFALSE;
473 if(indFixed[ifix]!=tmpInd[numFixed[ifix]])goodCell=kFALSE;
476 if(fVett[iga]>maxValue){
478 // GetIndicesFromGlobalAddress(iga,indMax,dummyptbin);
479 for(Int_t inv=0;inv<fNVariables;inv++)indMax[inv]=tmpInd[inv];
487 //_____________________________________________________________________________
488 TH2F* AliMultiDimVector::Project(Int_t firstVar, Int_t secondVar, const Int_t* fixedVars, Int_t ptbin, Float_t norm){
489 // Project the AliMultiDimVector on a 2D histogram
491 TString hisName=Form("hproj%s%dv%d",GetName(),secondVar,firstVar);
492 TString hisTit=Form("%s vs. %s",fAxisTitles[secondVar].Data(),fAxisTitles[firstVar].Data());
493 TH2F* h2=new TH2F(hisName.Data(),hisTit.Data(),fNCutSteps[firstVar],fMinLimits[firstVar],fMaxLimits[firstVar],fNCutSteps[secondVar],fMinLimits[secondVar],fMaxLimits[secondVar]);
495 Int_t index[fgkMaxNVariables];
496 for(Int_t i=0;i<fNVariables;i++){
497 index[i]=fixedVars[i];
500 for(Int_t i=0;i<fNCutSteps[firstVar];i++){
501 for(Int_t j=0;j<fNCutSteps[secondVar];j++){
504 Float_t cont=GetElement(index,ptbin)/norm;
506 if(!fGreaterThan[firstVar]) bin1=fNCutSteps[firstVar]-i;
508 if(!fGreaterThan[secondVar]) bin2=fNCutSteps[secondVar]-j;
509 h2->SetBinContent(bin1,bin2,cont);
514 //_____________________________________________________________________________
515 void AliMultiDimVector::GetIntegrationLimits(Int_t iVar, Int_t iCell, Int_t& minbin, Int_t& maxbin) const {
516 // computes bin limits for integrating the AliMultiDimVector
519 if(iVar<fNVariables){
521 maxbin=fNCutSteps[iVar]-1;
524 //_____________________________________________________________________________
525 void AliMultiDimVector::GetFillRange(Int_t iVar, Int_t iCell, Int_t& minbin, Int_t& maxbin) const {
526 // computes range of cells passing the cuts for FillAndIntegrate
529 if(iVar<fNVariables){
530 minbin=0; // bin 0 corresponds to loose cuts
534 //_____________________________________________________________________________
535 void AliMultiDimVector::Integrate(){
536 // integrates the matrix
538 AliError("MultiDimVector already integrated");
541 TArrayF integral(fNTotCells);
542 for(ULong64_t i=0;i<fNTotCells;i++) integral[i]=CountsAboveCell(i);
543 for(ULong64_t i=0;i<fNTotCells;i++) fVett[i]= integral[i];
545 }//_____________________________________________________________________________
546 ULong64_t* AliMultiDimVector::GetGlobalAddressesAboveCuts(const Float_t *values, Int_t ptbin, Int_t& nVals) const{
547 // fills an array with global addresses of cells passing the cuts
549 Int_t ind[fgkMaxNVariables];
550 Bool_t retcode=GetIndicesFromValues(values,ind);
555 for(Int_t i=fNVariables; i<fgkMaxNVariables; i++) ind[i]=0;
556 Int_t mink[fgkMaxNVariables];
557 Int_t maxk[fgkMaxNVariables];
559 for(Int_t i=0;i<fgkMaxNVariables;i++){
560 GetFillRange(i,ind[i],mink[i],maxk[i]);
561 size*=(maxk[i]-mink[i]+1);
563 ULong64_t* indexes=new ULong64_t[size];
565 for(Int_t k0=mink[0]; k0<=maxk[0]; k0++){
566 for(Int_t k1=mink[1]; k1<=maxk[1]; k1++){
567 for(Int_t k2=mink[2]; k2<=maxk[2]; k2++){
568 for(Int_t k3=mink[3]; k3<=maxk[3]; k3++){
569 for(Int_t k4=mink[4]; k4<=maxk[4]; k4++){
570 for(Int_t k5=mink[5]; k5<=maxk[5]; k5++){
571 for(Int_t k6=mink[6]; k6<=maxk[6]; k6++){
572 for(Int_t k7=mink[7]; k7<=maxk[7]; k7++){
573 for(Int_t k8=mink[8]; k8<=maxk[8]; k8++){
574 for(Int_t k9=mink[9]; k9<=maxk[9]; k9++){
575 Int_t currentBin[fgkMaxNVariables]={k0,k1,k2,k3,k4,k5,k6,k7,k8,k9};
576 indexes[nVals++]=GetGlobalAddressFromIndices(currentBin,ptbin);
589 //_____________________________________________________________________________
590 Float_t AliMultiDimVector::CountsAboveCell(ULong64_t globadd) const{
591 // integrates the counts of cells above cell with address globadd
592 Int_t ind[fgkMaxNVariables];
594 GetIndicesFromGlobalAddress(globadd,ind,ptbin);
595 for(Int_t i=fNVariables; i<fgkMaxNVariables; i++) ind[i]=0;
596 Int_t mink[fgkMaxNVariables];
597 Int_t maxk[fgkMaxNVariables];
598 for(Int_t i=0;i<fgkMaxNVariables;i++){
599 GetIntegrationLimits(i,ind[i],mink[i],maxk[i]);
602 for(Int_t k0=mink[0]; k0<=maxk[0]; k0++){
603 for(Int_t k1=mink[1]; k1<=maxk[1]; k1++){
604 for(Int_t k2=mink[2]; k2<=maxk[2]; k2++){
605 for(Int_t k3=mink[3]; k3<=maxk[3]; k3++){
606 for(Int_t k4=mink[4]; k4<=maxk[4]; k4++){
607 for(Int_t k5=mink[5]; k5<=maxk[5]; k5++){
608 for(Int_t k6=mink[6]; k6<=maxk[6]; k6++){
609 for(Int_t k7=mink[7]; k7<=maxk[7]; k7++){
610 for(Int_t k8=mink[8]; k8<=maxk[8]; k8++){
611 for(Int_t k9=mink[9]; k9<=maxk[9]; k9++){
612 Int_t currentBin[fgkMaxNVariables]={k0,k1,k2,k3,k4,k5,k6,k7,k8,k9};
613 sumcont+=GetElement(currentBin,ptbin);
626 //_____________________________________________________________________________
627 void AliMultiDimVector::Fill(Float_t* values, Int_t ptbin){
628 // fills the cells of AliMultiDimVector corresponding to values
630 AliError("MultiDimVector already integrated -- Use FillAndIntegrate");
633 Int_t ind[fgkMaxNVariables];
634 Bool_t retcode=GetIndicesFromValues(values,ind);
635 for(Int_t i=fNVariables; i<fgkMaxNVariables; i++) ind[i]=0;
636 if(retcode) IncrementElement(ind,ptbin);
638 //_____________________________________________________________________________
639 void AliMultiDimVector::FillAndIntegrate(Float_t* values, Int_t ptbin){
640 // fills the cells of AliMultiDimVector passing the cuts
641 // The number of nested loops must match fgkMaxNVariables!!!!
643 Int_t ind[fgkMaxNVariables];
644 Bool_t retcode=GetIndicesFromValues(values,ind);
646 for(Int_t i=fNVariables; i<fgkMaxNVariables; i++) ind[i]=0;
647 Int_t mink[fgkMaxNVariables];
648 Int_t maxk[fgkMaxNVariables];
649 for(Int_t i=0;i<fgkMaxNVariables;i++){
650 GetFillRange(i,ind[i],mink[i],maxk[i]);
652 for(Int_t k0=mink[0]; k0<=maxk[0]; k0++){
653 for(Int_t k1=mink[1]; k1<=maxk[1]; k1++){
654 for(Int_t k2=mink[2]; k2<=maxk[2]; k2++){
655 for(Int_t k3=mink[3]; k3<=maxk[3]; k3++){
656 for(Int_t k4=mink[4]; k4<=maxk[4]; k4++){
657 for(Int_t k5=mink[5]; k5<=maxk[5]; k5++){
658 for(Int_t k6=mink[6]; k6<=maxk[6]; k6++){
659 for(Int_t k7=mink[7]; k7<=maxk[7]; k7++){
660 for(Int_t k8=mink[8]; k8<=maxk[8]; k8++){
661 for(Int_t k9=mink[9]; k9<=maxk[9]; k9++){
662 Int_t currentBin[fgkMaxNVariables]={k0,k1,k2,k3,k4,k5,k6,k7,k8,k9};
663 IncrementElement(currentBin,ptbin);
676 //_____________________________________________________________________________
677 void AliMultiDimVector::SuppressZeroBKGEffect(const AliMultiDimVector* mvBKG){
678 // Sets to zero elements for which mvBKG=0
679 for(ULong64_t i=0;i<fNTotCells;i++)
680 if(mvBKG->GetElement(i)<0.00000001) fVett.AddAt(0,i);
682 //_____________________________________________________________________________
683 AliMultiDimVector* AliMultiDimVector:: ShrinkPtBins(Int_t firstBin, Int_t lastBin){
684 // sums the elements of pt bins between firstBin and lastBin
685 if(firstBin<0 || lastBin>=fNPtBins || firstBin>=lastBin){
686 AliError("Bad numbers of Pt bins to be shrinked");
689 Int_t nofcells[fgkMaxNVariables];
690 Float_t loosecuts[fgkMaxNVariables];
691 Float_t tightcuts[fgkMaxNVariables];
692 TString axisTitles[fgkMaxNVariables];
693 for(Int_t j=0;j<fgkMaxNVariables;j++) {
699 for(Int_t i=0;i<fNVariables;i++){
700 nofcells[i]=fNCutSteps[i];
702 loosecuts[i]=fMinLimits[i];
703 tightcuts[i]=fMaxLimits[i];
705 loosecuts[i]=fMaxLimits[i];
706 tightcuts[i]=fMinLimits[i];
708 axisTitles[i]=fAxisTitles[i];
710 Int_t newNptbins=fNPtBins-(lastBin-firstBin);
711 Float_t ptlimits[fgkMaxNPtBins+1];
712 for(Int_t ipt=0; ipt<=firstBin;ipt++) ptlimits[ipt]=fPtLimits[ipt];
713 for(Int_t ipt=firstBin+1; ipt<newNptbins+1;ipt++) ptlimits[ipt]=fPtLimits[ipt+(lastBin-firstBin)];
714 AliMultiDimVector* shrinkedMV=new AliMultiDimVector(GetName(),GetTitle(),newNptbins,ptlimits,fNVariables,nofcells,loosecuts,tightcuts,axisTitles);
716 ULong64_t nOfPointsPerPtbin=fNTotCells/fNPtBins;
717 ULong64_t addressOld,addressNew;
719 for(npb=0;npb<firstBin;npb++){
721 for(ULong64_t k=0;k<nOfPointsPerPtbin;k++){
722 addressOld=opb+k*fNPtBins;
723 addressNew=npb+k*newNptbins;
724 shrinkedMV->SetElement(addressNew,fVett[addressOld]);
728 for(ULong64_t k=0;k<nOfPointsPerPtbin;k++){
729 Float_t summedValue=0.;
730 for(opb=firstBin;opb<=lastBin;opb++){
731 addressOld=opb+k*fNPtBins;
732 summedValue+=fVett[addressOld];
734 addressNew=npb+k*newNptbins;
735 shrinkedMV->SetElement(addressNew,summedValue);
737 for(npb=firstBin+1;npb<newNptbins;npb++){
738 opb=npb+(lastBin-firstBin);
739 for(ULong64_t k=0;k<nOfPointsPerPtbin;k++){
740 addressOld=opb+k*fNPtBins;
741 addressNew=npb+k*newNptbins;
742 shrinkedMV->SetElement(addressNew,fVett[addressOld]);
747 //_____________________________________________________________________________
748 void AliMultiDimVector::SetNewLimits(Float_t* loose,Float_t* tight){
749 for(Int_t i=0;i<fNVariables;i++){
750 if(loose[i] < tight[i]){
751 fMinLimits[i]=loose[i];
752 fMaxLimits[i]=tight[i];
753 fGreaterThan[i]=kTRUE;
755 fMinLimits[i]=tight[i];
756 fMaxLimits[i]=loose[i];
757 fGreaterThan[i]=kFALSE;
761 //_____________________________________________________________________________
762 void AliMultiDimVector::SwapLimits(Int_t ivar){
763 Float_t oldmin = fMinLimits[ivar];
764 fMinLimits[ivar] = fMaxLimits[ivar];
765 fMaxLimits[ivar] = oldmin;
766 if(fGreaterThan[ivar])fGreaterThan[ivar]=kFALSE;
767 else fGreaterThan[ivar]=kTRUE;
769 //_____________________________________________________________________________
770 void AliMultiDimVector::PrintStatus(){
772 printf("Number of Pt bins = %d\n",fNPtBins);
773 printf("Limits of Pt bins = ");
774 for(Int_t ib=0;ib<fNPtBins+1;ib++) printf("%6.2f ",fPtLimits[ib]);
776 printf("Number of cut variables = %d\n",fNVariables);
777 for(Int_t iv=0;iv<fNVariables;iv++){
778 printf("- Variable %d: %s\n",iv,fAxisTitles[iv].Data());
779 printf(" Nsteps= %d Rage = %6.2f %6.2f\n",
780 fNCutSteps[iv],fMinLimits[iv],fMaxLimits[iv]);