#ifndef ALIMULTIDIMVECTOR_H #define ALIMULTIDIMVECTOR_H /* Copyright(c) 2007-2009, ALICE Experiment at CERN, All rights reserved. * * See cxx source for full Copyright notice */ /* $Id: $ */ /////////////////////////////////////////////////////////////////// // // // Class to store number of signal and background candidates // // in bins of cut variables // // 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 "TArrayF.h" #include "TArrayI.h" #include "TNamed.h" #include "TH2.h" #include "TMath.h" #include "TString.h" class AliMultiDimVector : public TNamed{ public: AliMultiDimVector(); AliMultiDimVector(const AliMultiDimVector &mv); 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); virtual ~AliMultiDimVector(){}; ULong64_t GetNTotCells() const {return fNTotCells;} Int_t GetNVariables() const {return fNVariables;} Int_t GetNPtBins() const {return fNPtBins;} Int_t GetNCutSteps(Int_t iVar) const {return fNCutSteps[iVar];} Float_t GetMinLimit(Int_t iVar) const {return fMinLimits[iVar];} Float_t GetMaxLimit(Int_t iVar) const {return fMaxLimits[iVar];} Float_t GetCutStep(Int_t iVar) const {return (fMaxLimits[iVar]-fMinLimits[iVar])/(Float_t)fNCutSteps[iVar];} TString GetAxisTitle(Int_t iVar) const {return fAxisTitles[iVar];} Bool_t IsIntegrated() const {return fIsIntegrated;} void CopyStructure(const AliMultiDimVector* mv); Float_t GetCutValue(Int_t iVar, Int_t iCell) const{ if(fGreaterThan[iVar]) return fMinLimits[iVar]+(Float_t)iCell*GetCutStep(iVar); else return fMaxLimits[iVar]-(Float_t)iCell*GetCutStep(iVar); } Float_t GetElement(ULong64_t globadd) const {return fVett[globadd];} Float_t GetElement(const Int_t *ind, Int_t ptbin) const { ULong64_t elem=GetGlobalAddressFromIndices(ind,ptbin); return fVett[elem]; } Float_t GetPtLimit(Int_t i) const{return fPtLimits[i];} Int_t GetPtBin(const Float_t pt) const{ Int_t theBin=TMath::BinarySearch(fNPtBins+1,fPtLimits,pt); if(theBin>=fNPtBins) theBin=-1; return theBin; } void GetEntireMultiDimVector(Float_t *vett) const { for(ULong64_t i=0; i=0) return GetGlobalAddressesAboveCuts(values,theBin,nVals); else return 0x0; } ULong64_t* GetGlobalAddressesAboveCuts(const Float_t *values, Int_t ptbin, Int_t& nVals) const; Bool_t GetGreaterThan(Int_t iVar) const {return fGreaterThan[iVar];} void SetElement(ULong64_t globadd,Float_t val) {fVett[globadd]=val;} void SetElement(Int_t *ind, Int_t ptbin, Float_t val){ ULong64_t elem=GetGlobalAddressFromIndices(ind,ptbin); if(elem>fNTotCells){ printf("SetElement: indices %d %d %d ptbin %d elem %d\n",ind[0],ind[1],ind[2],ptbin,(Int_t)elem); } fVett[elem]=val; } void IncrementElement(Int_t *ind, Int_t ptbin){ SetElement(ind,ptbin,GetElement(ind,ptbin)+1); } void IncrementElement(ULong64_t globadd){ SetElement(globadd,GetElement(globadd)+1.); } void Fill(Float_t* values, Int_t ptbin); void FillAndIntegrate(Float_t* values, Int_t ptbin); void Integrate(); void Reset(){ for(ULong64_t i=0; i or <) TString fAxisTitles[fgkMaxNVariables]; // titles for variables TArrayF fVett; // array with n. of candidates vs. cuts ULong64_t fNTotCells; // total number of matrix elements Bool_t fIsIntegrated; // flag for integrated matrix ClassDef(AliMultiDimVector,2); // a multi-dimensional vector class }; #endif