30 #include <Riostream.h> 65 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),
88 if(loosecuts[i] == tightcuts[i]){
90 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]);
99 if(loosecuts[i] < tightcuts[i]){
112 for(
Int_t ipt=0;ipt<fNPtBins+1;ipt++)
fPtLimits[ipt]=ptlimits[ipt];
113 for(
Int_t ipt=fNPtBins+1;ipt<fgkMaxNPtBins+1;ipt++)
fPtLimits[ipt]=999.;
155 if(&mv ==
this)
return *
this;
157 TNamed::operator=(mv);
218 for(
Int_t i=0;i<fNVariables+1;i++) prod*=nOfCellsPlusLevel[i];
219 for(
Int_t i=0;i<fNVariables+1;i++){
220 prod/=nOfCellsPlusLevel[i];
221 if(i<fNVariables) ind[i]=r/
prod;
231 if(!retcode)
return kFALSE;
243 indexPlusLevel[i]=ind[i];
249 for(
Int_t i=0;i<fNVariables+1;i++){
250 prod=indexPlusLevel[i];
252 for(
Int_t j=i+1;j<fNVariables+1;j++){
253 prod*=nOfCellsPlusLevel[j];
283 AliError(
"Values out of range");
293 else fVett.AddAt(-1,i);
303 else fVett.AddAt(-1,i);
312 else fVett.AddAt(-1,i);
319 AliError(
"Different dimension of the vectors!!");
324 else fVett.AddAt(-1,i);
331 AliError(
"Different dimension of the vectors!!");
337 else fVett.AddAt(-1,i);
345 AliError(
"Different dimension of the vectors!!");
351 else fVett.AddAt(-1,i);
359 AliError(
"Different dimension of the vectors!!");
365 else fVett.AddAt(-1,i);
373 AliError(
"Different dimension of the vectors!!");
381 else fVett.AddAt(-1,i);
399 else fVett.AddAt(-1,i);
407 ULong64_t runningAddress;
408 for(ULong64_t i=0;i<nelem;i++){
410 vett.AddAt(
fVett[runningAddress],i);
412 maxValue=TMath::MaxElement(nelem,vett.GetArray());
413 ULong64_t maxAddress=TMath::LocMax(nelem,vett.GetArray());
414 ULong64_t maxGlobalAddress=ptbin+maxAddress*
fNPtBins;
429 if(nfixed>
fNVariables)cout<<
"AliMultiDimVector::FindLocalMaximum:ERROR! too many variables"<<endl;
451 for(
Int_t i=0;i<nfixed;i++){
452 indMax[numFixed[i]]=indFixed[i];
476 for(ULong64_t iga=first;iga<last;iga++){
479 for(
Int_t ifix=0;ifix<nfixed&&goodCell;ifix++){
481 if(indFixed[ifix]!=tmpInd[numFixed[ifix]])goodCell=kFALSE;
484 if(
fVett[iga]>maxValue){
499 TString hisName=Form(
"hproj%s%dv%d",GetName(),secondVar,firstVar);
505 index[i]=fixedVars[i];
508 for(
Int_t i=0;i<fNCutSteps[firstVar];i++){
509 for(
Int_t j=0;j<fNCutSteps[secondVar];j++){
514 if(!
fGreaterThan[firstVar]) bin1=fNCutSteps[firstVar]-i;
516 if(!
fGreaterThan[secondVar]) bin2=fNCutSteps[secondVar]-j;
517 h2->SetBinContent(bin1,bin2,cont);
546 AliError(
"MultiDimVector already integrated");
569 size*=(maxk[i]-mink[i]+1);
571 ULong64_t* indexes=
new ULong64_t[size];
573 for(
Int_t k0=mink[0]; k0<=maxk[0]; k0++){
574 for(
Int_t k1=mink[1]; k1<=maxk[1]; k1++){
575 for(
Int_t k2=mink[2]; k2<=maxk[2]; k2++){
576 for(
Int_t k3=mink[3]; k3<=maxk[3]; k3++){
577 for(
Int_t k4=mink[4]; k4<=maxk[4]; k4++){
578 for(
Int_t k5=mink[5]; k5<=maxk[5]; k5++){
579 for(
Int_t k6=mink[6]; k6<=maxk[6]; k6++){
580 for(
Int_t k7=mink[7]; k7<=maxk[7]; k7++){
581 for(
Int_t k8=mink[8]; k8<=maxk[8]; k8++){
582 for(
Int_t k9=mink[9]; k9<=maxk[9]; k9++){
610 for(
Int_t k0=mink[0]; k0<=maxk[0]; k0++){
611 for(
Int_t k1=mink[1]; k1<=maxk[1]; k1++){
612 for(
Int_t k2=mink[2]; k2<=maxk[2]; k2++){
613 for(
Int_t k3=mink[3]; k3<=maxk[3]; k3++){
614 for(
Int_t k4=mink[4]; k4<=maxk[4]; k4++){
615 for(
Int_t k5=mink[5]; k5<=maxk[5]; k5++){
616 for(
Int_t k6=mink[6]; k6<=maxk[6]; k6++){
617 for(
Int_t k7=mink[7]; k7<=maxk[7]; k7++){
618 for(
Int_t k8=mink[8]; k8<=maxk[8]; k8++){
619 for(
Int_t k9=mink[9]; k9<=maxk[9]; k9++){
638 AliError(
"MultiDimVector already integrated -- Use FillAndIntegrate");
660 for(
Int_t k0=mink[0]; k0<=maxk[0]; k0++){
661 for(
Int_t k1=mink[1]; k1<=maxk[1]; k1++){
662 for(
Int_t k2=mink[2]; k2<=maxk[2]; k2++){
663 for(
Int_t k3=mink[3]; k3<=maxk[3]; k3++){
664 for(
Int_t k4=mink[4]; k4<=maxk[4]; k4++){
665 for(
Int_t k5=mink[5]; k5<=maxk[5]; k5++){
666 for(
Int_t k6=mink[6]; k6<=maxk[6]; k6++){
667 for(
Int_t k7=mink[7]; k7<=maxk[7]; k7++){
668 for(
Int_t k8=mink[8]; k8<=maxk[8]; k8++){
669 for(
Int_t k9=mink[9]; k9<=maxk[9]; k9++){
693 if(firstBin<0 || lastBin>=
fNPtBins || firstBin>=lastBin){
694 AliError(
"Bad numbers of Pt bins to be shrinked");
720 for(
Int_t ipt=0; ipt<=firstBin;ipt++) ptlimits[ipt]=
fPtLimits[ipt];
721 for(
Int_t ipt=firstBin+1; ipt<newNptbins+1;ipt++) ptlimits[ipt]=
fPtLimits[ipt+(lastBin-firstBin)];
725 ULong64_t addressOld,addressNew;
727 for(npb=0;npb<firstBin;npb++){
729 for(ULong64_t k=0;k<nOfPointsPerPtbin;k++){
731 addressNew=npb+k*newNptbins;
736 for(ULong64_t k=0;k<nOfPointsPerPtbin;k++){
738 for(opb=firstBin;opb<=lastBin;opb++){
740 summedValue+=
fVett[addressOld];
742 addressNew=npb+k*newNptbins;
743 shrinkedMV->
SetElement(addressNew,summedValue);
745 for(npb=firstBin+1;npb<newNptbins;npb++){
746 opb=npb+(lastBin-firstBin);
747 for(ULong64_t k=0;k<nOfPointsPerPtbin;k++){
749 addressNew=npb+k*newNptbins;
758 if(loose[i] < tight[i]){
780 printf(
"Number of Pt bins = %d\n",
fNPtBins);
781 printf(
"Limits of Pt bins = ");
784 printf(
"Number of cut variables = %d\n",
fNVariables);
787 printf(
" Nsteps= %d Rage = %6.2f %6.2f\n",
static const Int_t fgkMaxNVariables
ULong64_t fNTotCells
array with n. of candidates vs. cuts
void FillAndIntegrate(Float_t *values, Int_t ptbin)
Bool_t fGreaterThan[fgkMaxNVariables]
higher cut value for each variable
void SuppressZeroBKGEffect(const AliMultiDimVector *BKG)
void LinearComb(const AliMultiDimVector *mv1, Float_t norm1, const AliMultiDimVector *mv2, Float_t norm2)
Float_t fMinLimits[fgkMaxNVariables]
n. of cut step for each variable
Int_t fNPtBins
n. of selection variables
void DivideBy(const AliMultiDimVector *mv)
Float_t fPtLimits[fgkMaxNPtBins+1]
n. of pt bins
Bool_t IsIntegrated() const
Bool_t fIsIntegrated
total number of matrix elements
Int_t GetNVariables() const
void SetElement(ULong64_t globadd, Float_t val)
Int_t fNVariables
max. n. of Pt bins
void CopyStructure(const AliMultiDimVector *mv)
Float_t GetCutStep(Int_t iVar) const
static const Int_t fgkMaxNPtBins
max. n. of selection variables
ULong64_t GetGlobalAddressFromValues(const Float_t *values, Int_t ptbin) const
Float_t GetPtLimit(Int_t i) const
void FindMaximum(Float_t &max_value, Int_t *ind, Int_t ptbin)
Bool_t GetCutValuesFromGlobalAddress(ULong64_t globadd, Float_t *cuts, Int_t &ptbin) const
void SetNewLimits(Float_t *loose, Float_t *tight)
void MultiplyBy(Float_t factor)
void IncrementElement(Int_t *ind, Int_t ptbin)
Bool_t GetGreaterThan(Int_t iVar) const
TH2F * Project(Int_t firstVar, Int_t secondVar, const Int_t *fixedVars, Int_t ptbin, Float_t norm=1.)
Float_t GetCutValue(Int_t iVar, Int_t iCell) const
void SwapLimits(Int_t ilim)
void Add(const AliMultiDimVector *mv)
ULong64_t * GetGlobalAddressesAboveCuts(const Float_t *values, Float_t pt, Int_t &nVals) const
Float_t fMaxLimits[fgkMaxNVariables]
void Sum(const AliMultiDimVector *mv1, const AliMultiDimVector *mv2)
ULong64_t GetGlobalAddressFromIndices(const Int_t *ind, Int_t ptbin) const
void Multiply(const AliMultiDimVector *mv, Float_t factor)
void Divide(const AliMultiDimVector *mv1, const AliMultiDimVector *mv2)
Bool_t Data(TH1F *h, Double_t *rangefit, Bool_t writefit, Double_t &sgn, Double_t &errsgn, Double_t &bkg, Double_t &errbkg, Double_t &sgnf, Double_t &errsgnf, Double_t &sigmafit, Int_t &status)
Float_t GetMaxLimit(Int_t iVar) const
ULong64_t GetNTotCells() const
Int_t GetNCutSteps(Int_t iVar) const
void Fill(Float_t *values, Int_t ptbin)
Int_t * FindLocalMaximum(Float_t &maxValue, Int_t *numFixed, Int_t *indFixed, Int_t nfixed, Int_t ptbin)
AliMultiDimVector & operator=(const AliMultiDimVector &mv)
Bool_t GetIndicesFromValues(const Float_t *values, Int_t *ind) const
AliMultiDimVector * ShrinkPtBins(Int_t firstBin, Int_t lastBin)
TString fAxisTitles[fgkMaxNVariables]
sign of the cut (> or <)
TString GetAxisTitle(Int_t iVar) const
Float_t CountsAboveCell(ULong64_t globadd) const
Int_t fNCutSteps[fgkMaxNVariables]
limits of pt bins
void GetFillRange(Int_t iVar, Int_t iCell, Int_t &minbin, Int_t &maxbin) const
Float_t GetMinLimit(Int_t iVar) const
void GetIntegrationLimits(Int_t iVar, Int_t iCell, Int_t &minbin, Int_t &maxbin) const
Bool_t GetIndicesFromGlobalAddress(ULong64_t globadd, Int_t *ind, Int_t &ptbin) const
Float_t GetElement(ULong64_t globadd) const
TString prod[]
productions to be compared, directory name
TArrayF fVett
titles for variables