/************************************************************************** * 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) // // Last updated: Francesco Prino (prino@to.infn.it) // // // /////////////////////////////////////////////////////////////////// #include "TH2.h" #include "AliMultiDimVector.h" #include "AliLog.h" #include "TMath.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 npars, Int_t nptbins, Int_t *nofcells, Float_t *loosecuts, Float_t *tightcuts, 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); } 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(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;iGetElement(i)!=-1) fVett.AddAt(mv->GetElement(i)*factor,i); else fVett.AddAt(-1,i); } } //_____________________________________________________________________________ void AliMultiDimVector::Multiply(AliMultiDimVector* mv1,AliMultiDimVector* mv2){ // Sets AliMultiDimVector=mv1*mv2 for(ULong64_t i=0;iGetElement(i)!=-1 && mv2->GetElement(i)!=-1) fVett.AddAt(mv1->GetElement(i)*mv2->GetElement(i),i); else fVett.AddAt(-1,i); } } //_____________________________________________________________________________ void AliMultiDimVector::Add(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)!=-1 && fVett.At(i)!=-1) fVett.AddAt(fVett.At(i)+mv->GetElement(i),i); else fVett.AddAt(-1,i); } } //_____________________________________________________________________________ void AliMultiDimVector::Sum(AliMultiDimVector* mv1,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)!=-1 && mv2->GetElement(i)!=-1) fVett.AddAt(mv1->GetElement(i)+mv2->GetElement(i),i); else fVett.AddAt(-1,i); } } } //_____________________________________________________________________________ void AliMultiDimVector::LinearComb(AliMultiDimVector* mv1, Float_t norm1, 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)!=-1 && mv2->GetElement(i)!=-1) fVett.AddAt(norm1*mv1->GetElement(i)+norm2*mv2->GetElement(i),i); else fVett.AddAt(-1,i); } } } //_____________________________________________________________________________ void AliMultiDimVector::DivideBy(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)!=-1 && fVett.At(i)!=-1) fVett.AddAt(fVett.At(i)/mv->GetElement(i),i); else fVett.AddAt(-1,i); } } //_____________________________________________________________________________ void AliMultiDimVector::Divide(AliMultiDimVector* mv1,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)!=-1&& mv1->GetElement(i)!=-1) { 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(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;iSetBinContent(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) 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 i=0;iSetElement(addressNew,fVett[addressOld]); } } npb=firstBin; for(ULong64_t k=0;kSetElement(addressNew,summedValue); } for(npb=firstBin+1;npbSetElement(addressNew,fVett[addressOld]); } } return shrinkedMV; }