/************************************************************************** * Copyright(c) 2007-2009, ALICE Experiment at CERN, All rights reserved. * * * * Author: The ALICE Off-line Project. * * Contributors are mentioned in the code where appropriate. * * * * Permission to use, copy, modify and distribute this software and its * * documentation strictly for non-commercial purposes is hereby granted * * without fee, provided that the above copyright notice appears in all * * copies and that both the copyright notice and this permission notice * * appear in the supporting documentation. The authors make no claims * * about the suitability of this software for any purpose. It is * * provided "as is" without express or implied warranty. * **************************************************************************/ /* $Id$ */ /////////////////////////////////////////////////////////////////// // // // Implementation of the class to store the number of signal // // and background events in bins of the cut values // // Origin: Elena Bruna (bruna@to.infn.it) // // Updated: Sergey Senyukov (senyukov@to.infn.it) // // Francesco Prino (prino@to.infn.it) // // Last Updated: Giacomo Ortona (ortona@to.infn.it) // // // /////////////////////////////////////////////////////////////////// #include #include #include "TH2.h" #include "AliMultiDimVector.h" #include "AliLog.h" #include "TString.h" ClassImp(AliMultiDimVector) //___________________________________________________________________________ AliMultiDimVector::AliMultiDimVector():TNamed("AliMultiDimVector","default"), fNVariables(0), fNPtBins(0), fVett(0), fNTotCells(0), fIsIntegrated(0) { // default constructor } //___________________________________________________________________________ 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), fNVariables(npars), fNPtBins(nptbins), fVett(0), fNTotCells(0), fIsIntegrated(0){ // standard constructor ULong64_t ntot=1; for(Int_t i=0;iGetNVariables(); fNPtBins=mv->GetNPtBins(); fNTotCells=mv->GetNTotCells(); fIsIntegrated=mv->IsIntegrated(); for(Int_t i=0;iGetNCutSteps(i); fMinLimits[i]=mv->GetMinLimit(i); fMaxLimits[i]=mv->GetMaxLimit(i); fGreaterThan[i]=mv->GetGreaterThan(i); fAxisTitles[i]=mv->GetAxisTitle(i); } for(Int_t ipt=0;iptGetPtLimit(ipt); fVett.Set(fNTotCells); } //______________________________________________________________________ Bool_t AliMultiDimVector::GetIndicesFromGlobalAddress(ULong64_t globadd, Int_t *ind, Int_t &ptbin) const { // returns matrix element indices and Pt bin from global index if(globadd>=fNTotCells) return kFALSE; ULong64_t r=globadd; Int_t prod=1; Int_t nOfCellsPlusLevel[fgkMaxNVariables+1]; for(Int_t k=0;k=GetNCutSteps(i)) ind[i]=GetNCutSteps(i)-1; }else{ if(values[i]>GetMaxLimit(i)) return kFALSE; ind[i]=(Int_t)((fMaxLimits[i]-values[i])/GetCutStep(i)); if(ind[i]>=GetNCutSteps(i)) ind[i]=GetNCutSteps(i)-1; } } return kTRUE; } //______________________________________________________________________ ULong64_t AliMultiDimVector::GetGlobalAddressFromValues(const Float_t *values, Int_t ptbin) const { // Returns the global index of the cell in the matrix Int_t ind[fgkMaxNVariables]; Bool_t retcode=GetIndicesFromValues(values,ind); if(retcode) return GetGlobalAddressFromIndices(ind,ptbin); else{ AliError("Values out of range"); return fNTotCells+999; } } //_____________________________________________________________________________ void AliMultiDimVector::MultiplyBy(Float_t factor){ // multiply the AliMultiDimVector by a constant factor for(ULong64_t i=0;i0.) fVett.AddAt(fVett.At(i)*factor,i); else fVett.AddAt(-1,i); } } //_____________________________________________________________________________ void AliMultiDimVector::Multiply(const AliMultiDimVector* mv,Float_t factor){ // Sets AliMultiDimVector=mv*constant factor for(ULong64_t i=0;iGetElement(i)>0.) fVett.AddAt(mv->GetElement(i)*factor,i); else fVett.AddAt(-1,i); } } //_____________________________________________________________________________ void AliMultiDimVector::Multiply(const AliMultiDimVector* mv1, const AliMultiDimVector* mv2){ // Sets AliMultiDimVector=mv1*mv2 for(ULong64_t i=0;iGetElement(i)>0. && mv2->GetElement(i)>0.) fVett.AddAt(mv1->GetElement(i)*mv2->GetElement(i),i); else fVett.AddAt(-1,i); } } //_____________________________________________________________________________ void AliMultiDimVector::Add(const AliMultiDimVector* mv){ // Sums contents of mv to AliMultiDimVector if (mv->GetNTotCells()!=fNTotCells){ AliError("Different dimension of the vectors!!"); }else{ for(ULong64_t i=0;iGetElement(i)>0. && fVett.At(i)>0.) fVett.AddAt(fVett.At(i)+mv->GetElement(i),i); else fVett.AddAt(-1,i); } } //_____________________________________________________________________________ void AliMultiDimVector::Sum(const AliMultiDimVector* mv1, const AliMultiDimVector* mv2){ // Sets AliMultiDimVector=mv1+mv2 if (fNTotCells!=mv1->GetNTotCells()&&mv1->GetNTotCells()!=mv2->GetNTotCells()) { AliError("Different dimension of the vectors!!"); } else{ for(ULong64_t i=0;iGetNTotCells();i++) { if(mv1->GetElement(i)>0. && mv2->GetElement(i)>0.) fVett.AddAt(mv1->GetElement(i)+mv2->GetElement(i),i); else fVett.AddAt(-1,i); } } } //_____________________________________________________________________________ void AliMultiDimVector::LinearComb(const AliMultiDimVector* mv1, Float_t norm1, const AliMultiDimVector* mv2, Float_t norm2){ // Sets AliMultiDimVector=n1*mv1+n2*mv2 if (fNTotCells!=mv1->GetNTotCells()&&mv1->GetNTotCells()!=mv2->GetNTotCells()) { AliError("Different dimension of the vectors!!"); } else{ for(ULong64_t i=0;iGetNTotCells();i++) { if(mv1->GetElement(i)>0. && mv2->GetElement(i)>0.) fVett.AddAt(norm1*mv1->GetElement(i)+norm2*mv2->GetElement(i),i); else fVett.AddAt(-1,i); } } } //_____________________________________________________________________________ void AliMultiDimVector::DivideBy(const AliMultiDimVector* mv){ // Divide AliMulivector by mv if (mv->GetNTotCells()!=fNTotCells) { AliError("Different dimension of the vectors!!"); } else{ for(ULong64_t i=0;iGetElement(i)!=0 &&mv->GetElement(i)>0. && fVett.At(i)>0.) fVett.AddAt(fVett.At(i)/mv->GetElement(i),i); else fVett.AddAt(-1,i); } } //_____________________________________________________________________________ void AliMultiDimVector::Divide(const AliMultiDimVector* mv1, const AliMultiDimVector* mv2){ // Sets AliMultiDimVector=mv1/mv2 if (fNTotCells!=mv1->GetNTotCells()&&mv1->GetNTotCells()!=mv2->GetNTotCells()) { AliError("Different dimension of the vectors!!"); } else{ for(ULong64_t i=0;iGetNTotCells();i++) if(mv2->GetElement(i)!=0&& mv2->GetElement(i)>0.&& mv1->GetElement(i)>0.) { fVett.AddAt(mv1->GetElement(i)/mv2->GetElement(i),i); } else fVett.AddAt(-1,i); } } //_____________________________________________________________________________ void AliMultiDimVector::Sqrt(){ // Sqrt of elements of AliMultiDimVector for(ULong64_t i=0;i=0) fVett.AddAt(TMath::Sqrt(fVett.At(i)),i); else { fVett.AddAt(-1,i); } } } //_____________________________________________________________________________ void AliMultiDimVector::Sqrt(const AliMultiDimVector* mv){ // Sets AliMultiDimVector=sqrt(mv) for(ULong64_t i=0;iGetElement(i)>=0) fVett.AddAt(TMath::Sqrt(mv->GetElement(i)),i); else fVett.AddAt(-1,i); } //_____________________________________________________________________________ void AliMultiDimVector::FindMaximum(Float_t& maxValue, Int_t *ind , Int_t ptbin){ // finds the element with maximum contents const ULong64_t nelem=fNTotCells/fNPtBins; TArrayF vett; vett.Set(nelem); ULong64_t runningAddress; for(ULong64_t i=0;ifNVariables)cout<<"AliMultiDimVector::FindLocalMaximum:ERROR! too many variables"<=GetNCutSteps(iv)){ indMax[iv]=0; cout<<"AliMultiDimVector::FindLocalMaximum:ERROR! called fixed ind "<< indFixed[nfixed]<<" but "<maxValue){ maxValue=fVett[iga]; // GetIndicesFromGlobalAddress(iga,indMax,dummyptbin); for(Int_t inv=0;invSetBinContent(bin1,bin2,cont); } } return h2; } //_____________________________________________________________________________ void AliMultiDimVector::GetIntegrationLimits(Int_t iVar, Int_t iCell, Int_t& minbin, Int_t& maxbin) const { // computes bin limits for integrating the AliMultiDimVector minbin=0; maxbin=0; if(iVarGetElement(i)<0.00000001) fVett.AddAt(0,i); } //_____________________________________________________________________________ AliMultiDimVector* AliMultiDimVector:: ShrinkPtBins(Int_t firstBin, Int_t lastBin){ // sums the elements of pt bins between firstBin and lastBin if(firstBin<0 || lastBin>=fNPtBins || firstBin>=lastBin){ AliError("Bad numbers of Pt bins to be shrinked"); return 0; } Int_t nofcells[fgkMaxNVariables]; Float_t loosecuts[fgkMaxNVariables]; Float_t tightcuts[fgkMaxNVariables]; TString axisTitles[fgkMaxNVariables]; for(Int_t j=0;jSetElement(addressNew,fVett[addressOld]); } } npb=firstBin; for(ULong64_t k=0;kSetElement(addressNew,summedValue); } for(npb=firstBin+1;npbSetElement(addressNew,fVett[addressOld]); } } return shrinkedMV; } //_____________________________________________________________________________ void AliMultiDimVector::SetNewLimits(Float_t* loose,Float_t* tight){ for(Int_t i=0;i