diff --git a/roofit/histfactory/inc/RooStats/HistFactory/ParamHistFunc.h b/roofit/histfactory/inc/RooStats/HistFactory/ParamHistFunc.h index 18ac2c9cb8d57e57a3fe1f1d3d0a58c76346d39c..1c11d8a1b501f1abbad22e84872683aef5945cd6 100644 --- a/roofit/histfactory/inc/RooStats/HistFactory/ParamHistFunc.h +++ b/roofit/histfactory/inc/RooStats/HistFactory/ParamHistFunc.h @@ -12,8 +12,6 @@ #ifndef ROO_PARAMHISTFUNC #define ROO_PARAMHISTFUNC -#include <map> -#include <vector> #include <list> #include <string> @@ -97,7 +95,18 @@ protected: //RooAbsBinning* _binning; // Holds the binning of the dataVar (at construction time) Int_t _numBins; - mutable std::vector<int> _binMapVector; //! + struct NumBins { + NumBins() {} + NumBins(int nx, int ny, int nz) : x{nx}, y{ny}, z{nz}, xy{x*y}, xz{x*z}, yz{y*z}, xyz{xy*z} {} + int x = 0; + int y = 0; + int z = 0; + int xy = 0; + int xz = 0; + int yz = 0; + int xyz = 0; + }; + mutable NumBins _numBinsPerDim; //! mutable RooDataHist _dataSet; //Bool_t _normalized; @@ -111,7 +120,7 @@ protected: Double_t evaluate() const; private: - std::vector<int> const& getParamSetBinMap() const; + static NumBins getNumBinsPerDim(RooArgSet const& vars); ClassDef(ParamHistFunc,6) // Sum of RooAbsReal objects }; diff --git a/roofit/histfactory/src/ParamHistFunc.cxx b/roofit/histfactory/src/ParamHistFunc.cxx index 335f70dff208e863441cef8e5125b3afc393ce2a..cfdf491845321babfa5820a2e1d3bd0ca4217ad7 100644 --- a/roofit/histfactory/src/ParamHistFunc.cxx +++ b/roofit/histfactory/src/ParamHistFunc.cxx @@ -150,16 +150,15 @@ ParamHistFunc::ParamHistFunc(const char* name, const char* title, // Add the parameters (with checking) addVarSet( vars ); addParamSet( paramSet ); - } Int_t ParamHistFunc::GetNumBins( const RooArgSet& vars ) { - + // A helper method to get the number of bins - + if( vars.getSize() == 0 ) return 0; - + Int_t numBins = 1; for (auto comp : vars) { @@ -174,7 +173,7 @@ Int_t ParamHistFunc::GetNumBins( const RooArgSet& vars ) { Int_t varNumBins = var->numBins(); numBins *= varNumBins; } - + return numBins; } @@ -187,7 +186,6 @@ ParamHistFunc::ParamHistFunc(const ParamHistFunc& other, const char* name) : _dataVars("!dataVars", this, other._dataVars ), _paramSet("!paramSet", this, other._paramSet), _numBins( other._numBins ), - _binMapVector( other._binMapVector ), _dataSet( other._dataSet ) { _dataSet.removeSelfFromDir(); // files must not delete _dataSet. @@ -227,7 +225,19 @@ Int_t ParamHistFunc::getCurrentBin() const { /// into the TH1 style index (which is how they are stored /// internally in the '_paramSet' vector RooRealVar& ParamHistFunc::getParameter( Int_t index ) const { - return static_cast<RooRealVar&>(_paramSet[getParamSetBinMap()[index]]); + + auto const& n = _numBinsPerDim; + + // check if _numBins needs to be filled + if(n.x == 0) { + _numBinsPerDim = getNumBinsPerDim(_dataVars); + } + + int i = index / n.yz ; + int j = (index % n.y) / n.z; + int k = index % (n.yz); + + return static_cast<RooRealVar&>(_paramSet[i + j * n.x + k * n.xy]); } @@ -508,40 +518,19 @@ RooArgList ParamHistFunc::createParamSet(const std::string& Prefix, Int_t numBin } -/// Fill the mapping between RooDataHist bins and TH1 Bins. -std::vector<int> const& ParamHistFunc::getParamSetBinMap() const { - - if(!_binMapVector.empty()) { - return _binMapVector; - } - - int numVars = _dataVars.size(); +ParamHistFunc::NumBins ParamHistFunc::getNumBinsPerDim(RooArgSet const& vars) { + int numVars = vars.size(); if (numVars > 3 || numVars < 1) { std::cout << "ParamHistFunc() - Only works for 1-3 variables (1d-3d)" << std::endl; throw -1; } - int numBinsX = numVars >= 1 ? static_cast<RooRealVar const&>(_dataVars[0]).numBins() : 1; - int numBinsY = numVars >= 2 ? static_cast<RooRealVar const&>(_dataVars[1]).numBins() : 1; - int numBinsZ = numVars >= 3 ? static_cast<RooRealVar const&>(_dataVars[2]).numBins() : 1; - - // Fill the map - _binMapVector.resize(numBinsX * numBinsY * numBinsZ); - for( int i = 0; i < numBinsX; ++i ) { - for( int j = 0; j < numBinsY; ++j ) { - for( int k = 0; k < numBinsZ; ++k ) { + int numBinsX = numVars >= 1 ? static_cast<RooRealVar const&>(*vars[0]).numBins() : 1; + int numBinsY = numVars >= 2 ? static_cast<RooRealVar const&>(*vars[1]).numBins() : 1; + int numBinsZ = numVars >= 3 ? static_cast<RooRealVar const&>(*vars[2]).numBins() : 1; - int rooDataSetBin = k + j*numBinsZ + i*numBinsY*numBinsZ; - int histBin = i + j*numBinsX + k*numBinsX*numBinsY; - - _binMapVector[rooDataSetBin] = histBin; - - } - } - } - - return _binMapVector; + return {numBinsX, numBinsY, numBinsZ}; } @@ -575,7 +564,7 @@ Int_t ParamHistFunc::addParamSet( const RooArgList& params ) { // Check that the supplied list has // the right number of arguments: - Int_t numVarBins = _numBins; + Int_t numVarBins = GetNumBins(_dataVars); Int_t numElements = params.getSize(); if( numVarBins != numElements ) {