57 _pdfObsList(
"pdfObs",
"List of p.d.f. observables",this),
68 coutE(InputArguments) <<
"RooHistPdf::ctor(" <<
GetName()
69 <<
") ERROR variable list and RooDataHist must contain the same variables." << std::endl ;
72 for (
const auto arg : vars) {
73 if (!dvars->
find(arg->GetName())) {
74 coutE(InputArguments) <<
"RooHistPdf::ctor(" <<
GetName()
75 <<
") ERROR variable list and RooDataHist must contain the same variables." << std::endl ;
106 _pdfObsList(
"pdfObs",
"List of p.d.f. observables",this),
116 if (histObs.
size()!=dvars->
size()) {
117 coutE(InputArguments) <<
"RooHistPdf::ctor(" <<
GetName()
118 <<
") ERROR histogram variable list and RooDataHist must contain the same variables." << std::endl ;
119 throw(std::string(
"RooHistPdf::ctor() ERROR: histogram variable list and RooDataHist must contain the same variables")) ;
122 for (
const auto arg : histObs) {
123 if (!dvars->
find(arg->GetName())) {
124 coutE(InputArguments) <<
"RooHistPdf::ctor(" <<
GetName()
125 <<
") ERROR variable list and RooDataHist must contain the same variables." << std::endl ;
126 throw(std::string(
"RooHistPdf::ctor() ERROR: histogram variable list and RooDataHist must contain the same variables")) ;
128 if (!arg->isFundamental()) {
129 coutE(InputArguments) <<
"RooHistPdf::ctor(" <<
GetName()
130 <<
") ERROR all elements of histogram observables set must be of type RooRealVar or RooCategory." << std::endl ;
131 throw(std::string(
"RooHistPdf::ctor() ERROR all elements of histogram observables set must be of type RooRealVar or RooCategory.")) ;
154 std::unique_ptr<RooDataHist> dhist,
int intOrder)
166 _pdfObsList(
"pdfObs",this,other._pdfObsList),
167 _dataHist(other._dataHist),
168 _codeReg(other._codeReg),
169 _intOrder(other._intOrder),
170 _cdfBoundaries(other._cdfBoundaries),
171 _totVolume(other._totVolume),
172 _unitNorm(other._unitNorm)
222 return std::max(ret, 0.0);
229 if (intOrder != 0 && !(!cdfBoundaries && !correctForBinSize && intOrder == 1 && obs.
size() == 1)) {
230 ooccoutE(klass, InputArguments) <<
"RooHistPdf::weight(" << klass->
GetName()
231 <<
") ERROR: Code Squashing currently only supports non-interpolation cases."
285 if (!_x || !_y)
return false;
286 if (!range || !strlen(range) || !_x->
hasRange(range) ||
300 if(lobs ==
nullptr)
return false;
302 bool isOkayForAnalyticalInt =
false;
306 if(!lobs->isJacobianOK(*var))
return false;
307 isOkayForAnalyticalInt =
true;
311 return isOkayForAnalyticalInt;
319 const char* rangeName,
329 for (
unsigned int n=0;
n < pdfObsList.
size() &&
n < histObsList.
size(); ++
n) {
330 const auto pa = pdfObsList[
n];
331 const auto ha = histObsList[
n];
333 if (okayForAnalytical(*pa, allVars)) {
336 if (fullRange(*pa, *ha, rangeName)) {
342 if (code == frcode) {
351 if (intOrder > 1 && !(code & 1)) {
355 return (code >= 2) ? code : 0;
360 const char* rangeName,
366 if (((2 << histObsList.
size()) - 1) == code) {
373 std::map<const RooAbsArg*, std::pair<double, double> > ranges;
374 for (
unsigned int n=0;
n < pdfObsList.
size() &&
n < histObsList.
size(); ++
n) {
375 const auto pa = pdfObsList[
n];
376 const auto ha = histObsList[
n];
378 if (code & (2 <<
n)) {
388 ha->copyCache(pa,
true);
392 double ret = (code & 1) ?
dataHist.
sum(intSet,histObsList,
true,!histFuncMode) :
393 dataHist.
sum(intSet,histObsList,
true,!histFuncMode, ranges);
401 if (((2 << obs.
size()) - 1) != code) {
403 <<
"RooHistPdf::integral(" << klass->
GetName()
404 <<
") ERROR: AD currently only supports integrating over all histogram observables." << std::endl;
407 return std::to_string(
dataHist->
sum(histFuncMode));
442 bool isOkayForAnalyticalInt =
false;
449 if(!(lvalue && lvalue->isJacobianOK(dep)))
return false;
450 isOkayForAnalyticalInt =
true;
454 return isOkayForAnalyticalInt;
490 for (
unsigned int i=0; i < pdfObsList.
size(); ++i) {
510 std::span<const double> boundaries{binning->
array(),
static_cast<std::size_t
>(binning->
numBoundaries())};
538 double* boundaries = binning->
array() ;
540 auto hint =
new std::list<double> ;
545 if (boundaries[i]>=xlo && boundaries[i]<=xhi) {
546 hint->push_back(boundaries[i]) ;
579 if (wgt>max) max=wgt ;
633 coutE(ObjectHandling) <<
" RooHistPdf::importWorkspaceHook(" <<
GetName() <<
") unable to import clone of underlying RooDataHist with unique name " << uniqueName <<
", abort" << std::endl ;
645 coutE(ObjectHandling) <<
" RooHistPdf::importWorkspaceHook(" <<
GetName() <<
") unable to import clone of underlying RooDataHist with unique name " << uniqueName <<
", abort" << std::endl ;
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void data
Common abstract base class for objects that represent a value and a "shape" in RooFit.
virtual void copyCache(const RooAbsArg *source, bool valueOnly=false, bool setValDirty=true)=0
bool dependsOn(const RooAbsCollection &serverList, const RooAbsArg *ignoreArg=nullptr, bool valueOnly=false) const
Test whether we depend on (ie, are served by) any object in the specified collection.
virtual void syncCache(const RooArgSet *nset=nullptr)=0
friend void RooRefArray::Streamer(TBuffer &)
virtual bool inRange(const char *) const
Abstract base class for RooRealVar binning definitions.
Int_t numBins() const
Return number of bins.
virtual bool isParameterized() const
Interface function.
virtual double highBound() const =0
virtual double lowBound() const =0
virtual Int_t numBoundaries() const =0
virtual double * array() const =0
Int_t numTypes(const char *=nullptr) const
Return number of types defined (in range named rangeName if rangeName!=nullptr)
virtual void removeAll()
Remove all arguments from our set, deleting them if we own them.
virtual bool add(const RooAbsArg &var, bool silent=false)
Add the specified argument to list.
Storage_t::size_type size() const
virtual RooAbsArg * addClone(const RooAbsArg &var, bool silent=false)
Add a clone of the specified argument to list.
RooAbsArg * find(const char *name) const
Find object with given name in list.
Abstract base class for binned and unbinned datasets.
virtual Int_t numEntries() const
Return number of entries in dataset, i.e., count unweighted entries.
Abstract base class for objects that are lvalues, i.e.
virtual const RooAbsBinning * getBinningPtr(const char *rangeName) const =0
Abstract interface for all probability density functions.
Abstract base class for objects that represent a real value that may appear on the left hand side of ...
virtual double getMax(const char *name=nullptr) const
Get maximum of currently defined range.
virtual double getMin(const char *name=nullptr) const
Get minimum of currently defined range.
const RooAbsBinning * getBinningPtr(const char *rangeName) const override
bool hasRange(const char *name) const override
Check if variable has a binning with given name.
virtual void doEval(RooFit::EvalContext &) const
Base function for computing multiple values of a RooAbsReal.
virtual double offset() const
RooArgList is a container object that can hold multiple RooAbsArg objects.
RooArgSet is a container object that can hold multiple RooAbsArg objects.
RooArgSet * selectCommon(const RooAbsCollection &refColl) const
Use RooAbsCollection::selecCommon(), but return as RooArgSet.
Object to represent discrete states.
bool add(const RooAbsArg &var, bool valueServer, bool shapeServer, bool silent)
Overloaded RooCollection_t::add() method insert object into set and registers object as server to own...
static std::list< double > * plotSamplingHintForBinBoundaries(std::span< const double > boundaries, double xlo, double xhi)
Returns sampling hints for a histogram with given boundaries.
Container class to hold N-dimensional binned data.
double sum(bool correctForBinSize, bool inverseCorr=false) const
Return the sum of the weights of all bins in the histogram.
void weights(double *output, std::span< double const > xVals, int intOrder, bool correctForBinSize, bool cdfBoundaries)
A vectorized version of RooDataHist::weight() for one dimensional histograms with up to one dimension...
std::vector< std::unique_ptr< const RooAbsBinning > > const & getBinnings() const
TObject * Clone(const char *newname="") const override
Make a clone of an object using the Streamer facility.
std::string calculateTreeIndexForCodeSquash(RooAbsArg const *klass, RooFit::Detail::CodeSquashContext &ctx, const RooAbsCollection &coords, bool reverse=false) const
double weight(std::size_t i) const
Return weight of i-th bin.
double weightFast(const RooArgSet &bin, int intOrder, bool correctForBinSize, bool cdfBoundaries)
A faster version of RooDataHist::weight that assumes the passed arguments are aligned with the histog...
std::string declWeightArrayForCodeSquash(RooFit::Detail::CodeSquashContext &ctx, bool correctForBinSize) const
const RooArgSet * get() const override
Get bin centre of current bin.
double sumEntries() const override
Sum the weights of all bins.
A class to maintain the context for squashing of RooFit models into code.
std::string buildCall(std::string const &funcname, Args_t const &...args)
Build the code to call the function with name funcname, passing some arguments.
void addResult(RooAbsArg const *key, std::string const &value)
A function to save an expression that includes/depends on the result of the input node.
std::span< const double > at(RooAbsArg const *arg, RooAbsArg const *caller=nullptr)
std::span< double > output()
A propability density function sampled from a multidimensional histogram.
RooArgSet _histObsList
List of observables defining dimensions of histogram.
Int_t _intOrder
Interpolation order.
bool forceAnalyticalInt(const RooAbsArg &dep) const override
bool areIdentical(const RooDataHist &dh1, const RooDataHist &dh2)
RooDataHist * _dataHist
Unowned pointer to underlying histogram.
bool _cdfBoundaries
Use boundary conditions for CDFs.
static std::string rooHistIntegralTranslateImpl(int code, RooAbsArg const *klass, RooDataHist const *dataHist, const RooArgSet &obs, bool histFuncMode)
std::list< double > * binBoundaries(RooAbsRealLValue &, double, double) const override
Return sampling hint for making curves of (projections) of this function as the recursive division st...
double totVolume() const
Return the total volume spanned by the observables of the RooHistPdf.
void initializeOwnedDataHist(std::unique_ptr< RooDataHist > &&dataHist)
bool importWorkspaceHook(RooWorkspace &ws) override
Check if our datahist is already in the workspace.
std::string buildCallToAnalyticIntegral(int code, const char *rangeName, RooFit::Detail::CodeSquashContext &ctx) const override
This function defines the analytical integral translation for the class.
RooSetProxy _pdfObsList
List of observables mapped onto histogram observables.
double maxVal(Int_t code) const override
Return maximum value for set of observables identified by code assigned in getMaxVal.
double analyticalIntegral(Int_t code, const char *rangeName=nullptr) const override
Return integral identified by 'code'.
void translate(RooFit::Detail::CodeSquashContext &ctx) const override
This function defines a translation for each RooAbsReal based object that can be used to express the ...
std::list< double > * plotSamplingHint(RooAbsRealLValue &obs, double xlo, double xhi) const override
Return sampling hint for making curves of (projections) of this function as the recursive division st...
Int_t getMaxVal(const RooArgSet &vars) const override
Only handle case of maximum in all variables.
double _totVolume
! Total volume of space (product of ranges of observables)
RooDataHist * cloneAndOwnDataHist(const char *newname="")
Replaces underlying RooDataHist with a clone, which is now owned, and returns the clone.
std::unique_ptr< RooDataHist > _ownedDataHist
! Owned pointer to underlying histogram
void doEval(RooFit::EvalContext &) const override
Base function for computing multiple values of a RooAbsReal.
static void rooHistTranslateImpl(RooAbsArg const *klass, RooFit::Detail::CodeSquashContext &ctx, int intOrder, RooDataHist const *dataHist, const RooArgSet &obs, bool correctForBinSize, bool cdfBoundaries)
Int_t getAnalyticalIntegral(RooArgSet &allVars, RooArgSet &analVars, const char *rangeName=nullptr) const override
Determine integration scenario.
double evaluate() const override
Return the current value: The value of the bin enclosing the current coordinates of the observables,...
bool _unitNorm
Assume contents is unit normalized (for use as pdf cache)
Variable that can be changed from the outside.
void setRange(const char *name, double min, double max)
Set a fit or plotting range.
Persistable container for RooFit projects.
RooAbsData * embeddedData(RooStringView name) const
Retrieve dataset (binned or unbinned) with given name. A null pointer is returned if not found.
std::list< RooAbsData * > allData() const
Return list of all dataset in the workspace.
bool import(const RooAbsArg &arg, const RooCmdArg &arg1={}, const RooCmdArg &arg2={}, const RooCmdArg &arg3={}, const RooCmdArg &arg4={}, const RooCmdArg &arg5={}, const RooCmdArg &arg6={}, const RooCmdArg &arg7={}, const RooCmdArg &arg8={}, const RooCmdArg &arg9={})
Import a RooAbsArg object, e.g.
Buffer base class used for serializing objects.
virtual Int_t ReadClassBuffer(const TClass *cl, void *pointer, const TClass *onfile_class=nullptr)=0
virtual Int_t WriteClassBuffer(const TClass *cl, void *pointer)=0
const char * GetName() const override
Returns name of object.
RooCmdArg Rename(const char *suffix)
RooCmdArg Embedded(bool flag=true)
std::pair< double, double > getRangeOrBinningInterval(RooAbsArg const *arg, const char *rangeName)