45using std::string, std::vector, std::pair, std::map;
70 TString options,
double rho,
double nSigma,
bool rotate,
bool sortInput)
71 :
RooAbsPdf(
name, title), _varList(
"varList",
"List of variables", this),
72 _rhoList(
"rhoList",
"List of rho parameters", this), _options(options), _widthFactor(rho),
73 _nSigma(nSigma), _rotate(rotate), _sortInput(sortInput), _nAdpt(1)
84 TString options,
double rho,
double nSigma,
bool rotate,
bool sortInput)
85 :
RooAbsPdf(
name, title), _varList(
"varList",
"List of variables", this),
86 _rhoList(
"rhoList",
"List of rho parameters", this),
87 _options(options), _widthFactor(rho), _nSigma(nSigma), _rotate(rotate),
88 _sortInput(sortInput), _nAdpt(1)
99 const TVectorD &rho,
TString options,
double nSigma,
bool rotate,
bool sortInput)
100 :
RooAbsPdf(
name, title), _varList(
"varList",
"List of variables", this),
101 _rhoList(
"rhoList",
"List of rho parameters", this), _options(options), _widthFactor(-1.0),
102 _nSigma(nSigma), _rotate(rotate), _sortInput(sortInput), _nAdpt(1)
108 coutE(InputArguments)
109 <<
"ERROR: RooNDKeysPdf::RooNDKeysPdf() : The vector-size of rho is different from that of varList."
110 <<
"Unable to create the PDF." << std::endl;
130 const RooArgList &rhoList,
TString options,
double nSigma,
bool rotate,
bool sortInput)
131 :
RooAbsPdf(
name, title), _varList(
"varList",
"List of variables", this),
132 _rhoList(
"rhoList",
"List of rho parameters", this), _options(options), _widthFactor(-1.0),
133 _nSigma(nSigma), _rotate(rotate), _sortInput(sortInput), _nAdpt(1)
137 _rho.resize(rhoList.size(), 1.0);
139 for (
unsigned int i=0; i < rhoList.size(); ++i) {
140 const auto rho = rhoList.at(i);
142 coutE(InputArguments) <<
"RooNDKeysPdf::ctor(" <<
GetName() <<
") ERROR: parameter " << rho->GetName()
143 <<
" is not of type RooRealVar" << std::endl;
152 coutE(InputArguments) <<
"ERROR: RooNDKeysPdf::RooNDKeysPdf() : The size of rhoList is different from varList."
153 <<
"Unable to create the PDF." << std::endl;
168 const RooArgList &rhoList,
TString options,
double nSigma,
bool rotate,
bool sortInput)
169 :
RooAbsPdf(
name, title), _varList(
"varList",
"List of variables", this),
170 _rhoList(
"rhoList",
"List of rho parameters", this),
171 _options(options), _widthFactor(-1), _nSigma(nSigma), _rotate(rotate), _sortInput(sortInput),
177 _rho.resize(rhoList.size(), 1.0);
179 for (
unsigned int i=0; i < rhoList.size(); ++i) {
180 const auto rho = rhoList.at(i);
182 coutE(InputArguments) <<
"RooNDKeysPdf::ctor(" <<
GetName() <<
") ERROR: parameter " << rho->GetName()
183 <<
" is not of type RooRealVar" << std::endl;
191 coutE(InputArguments) <<
"ERROR: RooNDKeysPdf::RooNDKeysPdf() : The size of rhoList is different from varList."
192 <<
"Unable to create the PDF." << std::endl;
207 double rho,
double nSigma,
bool rotate,
bool sortInput)
208 :
RooAbsPdf(
name, title), _varList(
"varList",
"List of variables", this),
209 _rhoList(
"rhoList",
"List of rho parameters", this), _options(
"a"), _widthFactor(rho),
210 _nSigma(nSigma), _rotate(rotate), _sortInput(sortInput), _nAdpt(1)
216 coutW(InputArguments) <<
"RooNDKeysPdf::RooNDKeysPdf() : Warning : asymmetric mirror(s) no longer supported."
230 TString options,
double rho,
double nSigma,
bool rotate,
bool sortInput)
231 :
RooAbsPdf(
name, title), _varList(
"varList",
"List of variables", this),
232 _rhoList(
"rhoList",
"List of rho parameters", this), _options(options), _widthFactor(rho),
233 _nSigma(nSigma), _rotate(rotate), _sortInput(sortInput), _nAdpt(1)
245 _varList(
"varList", this, other._varList),
246 _rhoList(
"rhoList", this, other._rhoList),
247 _options(other._options),
248 _widthFactor(other._widthFactor),
249 _nSigma(other._nSigma),
250 _fixedShape(other._fixedShape),
251 _mirror(other._mirror),
252 _debug(other._debug),
253 _verbose(other._verbose),
255 _nEvents(other._nEvents),
256 _nEventsM(other._nEventsM),
257 _nEventsW(other._nEventsW),
260 _dataPts(other._dataPts),
261 _dataPtsR(other._dataPtsR),
262 _weights0(other._weights0),
263 _weights1(other._weights1),
264 _weights(_options.Contains(
"a") ? &_weights1 : &_weights0),
265 _sortTVIdcs(other._sortTVIdcs),
272 _sigma(other._sigma),
273 _xDatLo(other._xDatLo),
274 _xDatHi(other._xDatHi),
275 _xDatLo3s(other._xDatLo3s),
276 _xDatHi3s(other._xDatHi3s),
277 _netFluxZ(other._netFluxZ),
278 _nEventsBW(other._nEventsBW),
279 _nEventsBMSW(other._nEventsBMSW),
280 _xVarLo(other._xVarLo),
281 _xVarHi(other._xVarHi),
282 _xVarLoM3s(other._xVarLoM3s),
283 _xVarLoP3s(other._xVarLoP3s),
284 _xVarHiM3s(other._xVarHiM3s),
285 _xVarHiP3s(other._xVarHiP3s),
286 _bpsIdcs(other._bpsIdcs),
287 _ibNoSort(other._ibNoSort),
288 _sIdcs(other._sIdcs),
289 _bIdcs(other._bIdcs),
290 _bmsIdcs(other._bmsIdcs),
291 _rangeBoxInfo(other._rangeBoxInfo),
292 _fullBoxInfo(other._fullBoxInfo),
294 _minWeight(other._minWeight),
295 _maxWeight(other._maxWeight),
299 _rotMat(new
TMatrixD(*other._rotMat)),
300 _sigmaR(new
TVectorD(*other._sigmaR)),
302 _sigmaAvgR(other._sigmaAvgR),
303 _rotate(other._rotate),
304 _sortInput(other._sortInput),
305 _nAdpt(other._nAdpt),
306 _tracker(other._tracker != nullptr ? new
RooChangeTracker(*other._tracker) : nullptr)
381 cxcoutD(InputArguments) <<
"RooNDKeysPdf::setOptions() options = " <<
_options
384 <<
"\n\tdebug = " <<
_debug
389 coutW(InputArguments) <<
"RooNDKeysPdf::setOptions() : Warning : nSigma = " <<
_nSigma <<
" < 2.0. "
390 <<
"Calculated normalization could be too large."
417 coutE(InputArguments) <<
"ERROR: RooNDKeysPdf::initialize() : The observable list is empty. "
418 <<
"Unable to begin generating the PDF." << std::endl;
423 coutE(InputArguments) <<
"ERROR: RooNDKeysPdf::initialize() : The input data set is empty. "
424 <<
"Unable to begin generating the PDF." << std::endl;
428 _d =
static_cast<double>(
_nDim);
430 std::vector<double> dummy(
_nDim,0.);
493 vector<RooRealVar*> dVars(
_nDim);
504 std::vector<double>& point =
_dataPts[i];
507 double myweight =
data.weight();
513 mat(j,k) += dVars[j]->getVal() * dVars[k]->getVal() * myweight;
517 point[j] = pointV[j] = dVars[j]->getVal();
519 _x0[j] += 1. * myweight;
520 _x1[j] += point[j] * myweight ;
521 _x2[j] += point[j] * point[j] * myweight ;
522 if (
_x2[j]!=
_x2[j]) exit(3);
554 TVectorD sigmaRraw = evCalculator.GetEigenValues();
555 for (
Int_t j=0; j<
_nDim; j++) { sigmaRraw[j] = sqrt(sigmaRraw[j]); }
564 *
_rotMat = evCalculator.GetEigenVectors();
594 coutI(Contents) <<
"RooNDKeysPdf::loadDataSet(" <<
this <<
")"
595 <<
"\n Number of events in dataset: " <<
_nEvents
596 <<
"\n Weighted number of events in dataset: " <<
_nEventsW << std::endl;
616 vector<double> dummy(
_nDim,0.);
623 vector<vector<double> > mpoints(
size,dummy);
624 vector<vector<Int_t> > mjdcs(
size);
629 vector<Int_t>& mjdxK = mjdcs[0];
630 vector<double>& mpointK = mpoints[0];
642 vector<Int_t>& mjdx0 = mjdcs[0];
644 if (
size==1 && mjdx0.empty())
continue;
648 vector<Int_t>& mjdx = mjdcs[0];
649 vector<double>& mpoint = mpoints[0];
652 Int_t eMir = 1 << mjdx.size();
653 vector<vector<double> > epoints(eMir,
x);
660 epoints[
l] = epoints[
l-size1];
662 vector<double>& epoint = epoints[
l];
663 epoint[mjdx[
Int_t(mjdx.size()-1)-
m]] = mpoint[mjdx[
Int_t(mjdx.size()-1)-
m]];
669 epoints.erase(epoints.begin());
678 for (
Int_t j=0; j<
_nDim; j++) { pointR[j] = (epoints[
m])[j]; }
701 double myweight =
data.weight();
707 coutI(Contents) <<
"RooNDKeysPdf::loadWeightSet(" <<
this <<
") : Number of weighted events : " <<
_wMap.size() << std::endl;
719 bi->netFluxZ = bi->netFluxZ &&
true;
720 }
else { bi->netFluxZ =
false; }
734 for (
const auto& wMapItr :
_wMap) {
735 Int_t i = wMapItr.first;
738 bool inVarRange(
true);
739 bool inVarRangePlusShell(
true);
743 if (
x[j]>bi->xVarLo[j] &&
x[j]<bi->xVarHi[j]) {
744 inVarRange = inVarRange &&
true;
745 }
else { inVarRange = inVarRange &&
false; }
747 if (
x[j]>bi->xVarLoM3s[j] &&
x[j]<bi->xVarHiP3s[j]) {
748 inVarRangePlusShell = inVarRangePlusShell &&
true;
749 }
else { inVarRangePlusShell = inVarRangePlusShell &&
false; }
754 bi->bIdcs.push_back(i);
758 if (inVarRangePlusShell) {
759 bi->bpsIdcs[i] =
true;
762 if ((
x[j]>bi->xVarLoM3s[j] &&
x[j]<bi->xVarLoP3s[j]) &&
x[j]<(bi->xVarLo[j]+bi->xVarHi[j])/2.) {
764 }
else if ((
x[j]>bi->xVarHiM3s[j] &&
x[j]<bi->xVarHiP3s[j]) &&
x[j]>(bi->xVarLo[j]+bi->xVarHi[j])/2.) {
768 if (inShell) bi->sIdcs.push_back(i);
770 bi->bmsIdcs.push_back(i);
775 coutI(Contents) <<
"RooNDKeysPdf::calculateShell() : "
776 <<
"\n Events in shell " << bi->sIdcs.size()
777 <<
"\n Events in box " << bi->bIdcs.size()
778 <<
"\n Events in box and shell " << bi->bpsIdcs.size()
789 for (
Int_t i=0; i<
Int_t(bi->bmsIdcs.size()); i++)
790 bi->nEventsBMSW +=
_wMap.at(bi->bmsIdcs[i]);
793 for (
Int_t i=0; i<
Int_t(bi->bIdcs.size()); i++)
794 bi->nEventsBW +=
_wMap.at(bi->bIdcs[i]);
796 cxcoutD(Eval) <<
"RooNDKeysPdf::calculatePreNorm() : "
797 <<
"\n nEventsBMSW " << bi->nEventsBMSW
798 <<
"\n nEventsBW " << bi->nEventsBW
810 for (
unsigned int i = 0; i <
_dataPtsR.size(); ++i) {
817 vector<TVectorD>::iterator dpRItr =
_dataPtsR.begin();
820 if (bi->bpsIdcs.find(i) != bi->bpsIdcs.end()) {
822 itrVecR.push_back(
itPair(i, dpRItr));
825 itrVecR.push_back(
itPair(i, dpRItr));
831 sort(itrVecR.begin(), itrVecR.end(), [=](
const itPair&
a,
const itPair&
b) {
832 return (*a.second)[j] < (*b.second)[j];
838 cxcoutD(Eval) <<
"RooNDKeysPdf::sortDataIndices() : Number of sorted events : " <<
_sortTVIdcs[j].size() << std::endl;
846 cxcoutD(Eval) <<
"RooNDKeysPdf::calculateBandWidth()" << std::endl;
857 cxcoutD(Eval) <<
"RooNDKeysPdf::calculateBandWidth() Using static bandwidth." << std::endl;
864 weight[j] =
_n * (*_sigmaR)[j];
871 cxcoutD(Eval) <<
"RooNDKeysPdf::calculateBandWidth() Using adaptive bandwidth." << std::endl;
873 double sqrt12 = sqrt(12.);
876 vector<double> dummy(
_nDim, 0.);
879 std::vector<std::vector<double>> *weights_prev(
nullptr);
880 std::vector<std::vector<double>> *weights_new(
nullptr);
901 vector<double> &weight = (*weights_new)[i];
903 double norm = (
_n * (*_sigmaR)[j]) / sqrtSigmaAvgR;
904 weight[j] = norm *
f / sqrt12;
923 std::vector<int> indices;
934 indices.push_back(ibMapItr.first);
938 for (
const auto& i : indices) {
945 const vector<double> &point =
_dataPts[i];
946 const vector<double> &weight = weights[
_idx[i]];
949 (*_dx)[j] =
x[j] - point[j];
957 double r = (*_dx)[j];
958 double c = 1. / (2. * weight[j] * weight[j]);
962 g *= exp(-
c *
r *
r);
963 g *= 1. / (sqrt2pi * weight[j]);
980 xRm[j] = xRp[j] =
x[j];
988 xRm[j] -=
_nSigma * (
_n * (*_sigmaR)[j]);
989 xRp[j] +=
_nSigma * (
_n * (*_sigmaR)[j]);
992 std::vector<TVectorD> xvecRm(1,xRm);
993 std::vector<TVectorD> xvecRp(1,xRp);
996 std::vector<Int_t> ibMapRT;
1001 return (*
a.second)[j] < (*
b.second)[j];
1013 auto&
m =
_nDim==1 ? ibMap : ibMapRT;
1014 m.reserve(std::distance(lo,
hi));
1015 for (it=lo; it!=
hi; ++it) {
1016 m.push_back(it->first);
1019 std::sort(
m.begin(),
m.end());
1025 for (it=lo; it!=
hi; ++it) {
1027 auto found = std::lower_bound(ibMapRT.begin(), ibMapRT.end(), it->first);
1028 if (found != ibMapRT.end() && !(it->first < *found)) {
1029 ibMap.push_back(it->first);
1033 std::sort(ibMap.begin(), ibMap.end());
1036 if (j!=
_nDim-1) { ibMapRT = std::move(ibMap); }
1044 vector<bool> doInt(
_nDim,
true);
1048 bi->xVarLo.resize(
_nDim,0.);
1049 bi->xVarHi.resize(
_nDim,0.);
1050 bi->xVarLoM3s.resize(
_nDim,0.);
1051 bi->xVarLoP3s.resize(
_nDim,0.);
1052 bi->xVarHiM3s.resize(
_nDim,0.);
1053 bi->xVarHiP3s.resize(
_nDim,0.);
1055 bi->netFluxZ =
true;
1056 bi->bpsIdcs.clear();
1059 bi->bmsIdcs.clear();
1067 bi->xVarLo[j] = var->
getMin(rangeName);
1068 bi->xVarHi[j] = var->getMax(rangeName);
1070 bi->xVarLo[j] = var->getVal() ;
1071 bi->xVarHi[j] = var->getVal() ;
1089 _x[j] = var->getVal(nset);
1106 if (rangeName)
return 0 ;
1121 cxcoutD(Eval) <<
"Calling RooNDKeysPdf::analyticalIntegral(" <<
GetName() <<
") with code " << code
1122 <<
" and rangeName " << (rangeName?rangeName:
"<none>") << std::endl;
1128 vector<bool> doInt(
_nDim,
true);
1134 string rangeNameStr(rangeName) ;
1144 bool newBounds(
false);
1147 if ((var->getMin(rangeName)-bi->xVarLo[j]!=0) ||
1148 (var->getMax(rangeName)-bi->xVarHi[j]!=0)) {
1155 cxcoutD(Eval) <<
"RooNDKeysPdf::analyticalIntegral() : Found new boundaries ... " << (rangeName?rangeName:
"<none>") << std::endl;
1160 if (!bi->filled || newBounds) {
1169 double norm=bi->nEventsBW;
1171 if (
_mirror && bi->netFluxZ) {
1173 cxcoutD(Eval) <<
"RooNDKeysPdf::analyticalIntegral() : Using mirrored normalization : " << bi->nEventsBW << std::endl;
1174 return bi->nEventsBW;
1179 norm = bi->nEventsBMSW;
1180 if (norm<0.) norm=0.;
1182 for (
Int_t sIdx : bi->sIdcs) {
1184 const vector<double>&
x =
_dataPts[sIdx];
1185 const vector<double>& weight = (*_weights)[
_idx[sIdx]];
1187 vector<double> chi(
_nDim,100.);
1190 if(!doInt[j])
continue;
1192 if ((
x[j] > bi->xVarLoM3s[j] &&
x[j] < bi->xVarLoP3s[j]) &&
x[j] < (bi->xVarLo[j] + bi->xVarHi[j]) / 2.) {
1193 chi[j] = (
x[j] - bi->xVarLo[j]) / weight[j];
1194 }
else if ((
x[j] > bi->xVarHiM3s[j] &&
x[j] < bi->xVarHiP3s[j]) &&
x[j] > (bi->xVarLo[j] + bi->xVarHi[j]) / 2.) {
1195 chi[j] = (bi->xVarHi[j] -
x[j]) / weight[j];
1199 prob *= (0.5 + std::erf(std::abs(chi[j]) / sqrt(2.)) / 2.);
1201 prob *= (0.5 - std::erf(std::abs(chi[j]) / sqrt(2.)) / 2.);
1208 cxcoutD(Eval) <<
"RooNDKeysPdf::analyticalIntegral() : Final normalization : " << norm <<
" " << bi->nEventsBW << std::endl;
1219 std::vector<RooRealVar *> varVec;
1221 for (
const auto var : varList) {
1223 coutE(InputArguments) <<
"RooNDKeysPdf::createDatasetFromHist(" <<
GetName() <<
") WARNING: variable "
1224 << var->GetName() <<
" is not of type RooRealVar. Skip." << std::endl;
1227 varVec.push_back(
static_cast<RooRealVar *
>(var));
1231 unsigned int histndim(0);
1232 std::string classname = hist.
ClassName();
1233 if (classname.find(
"TH1") == 0) {
1235 }
else if (classname.find(
"TH2") == 0) {
1237 }
else if (classname.find(
"TH3") == 0) {
1240 assert(histndim == varVec.size());
1242 if (histndim > 3 || histndim <= 0) {
1243 coutE(InputArguments) <<
"RooNDKeysPdf::createDatasetFromHist(" <<
GetName()
1244 <<
") ERROR: input histogram dimension not between [1-3]: " << histndim << std::endl;
1252 for (
int i = 1; i <= hist.
GetXaxis()->GetNbins(); ++i) {
1256 varVec[0]->setVal(xval);
1258 if (varVec.size() == 1) {
1260 dataFromHist->add(varSet, fval);
1263 for (
int j = 1; j <= hist.
GetYaxis()->GetNbins(); ++j) {
1265 varVec[1]->setVal(yval);
1267 if (varVec.size() == 2) {
1269 dataFromHist->add(varSet, fval);
1272 for (
int k = 1; k <= hist.
GetZaxis()->GetNbins(); ++k) {
1274 varVec[2]->setVal(zval);
1277 dataFromHist->add(varSet, fval);
1284 return dataFromHist;
1296 cxcoutD(Eval) <<
"RooNDKeysPdf::getWeights() Return evaluated weights." << std::endl;
1304 const vector<double>& weight = (*_weights)[i];
1305 mref(i,
_nDim) = weight[k];
1316 _rho[j] = rho->getVal();
1323 covMatRho(j, k) = (*_covMat)(j, k) *
_rho[j] *
_rho[k];
1328 *
_sigmaR = evCalculatorRho.GetEigenValues();
1330 (*_sigmaR)[j] = sqrt((*
_sigmaR)[j]);
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
std::vector< itPair > itVec
std::pair< Int_t, VecTVecDouble::iterator > itPair
int Int_t
Signed integer 4 bytes (int)
#define R__ASSERT(e)
Checks condition e and reports a fatal error if it's false.
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void data
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t r
TMatrixTSym< Double_t > TMatrixDSym
TMatrixT< Double_t > TMatrixD
TVectorT< Double_t > TVectorD
Storage_t::size_type size() const
bool addTyped(const RooAbsCollection &list, bool silent=false)
Adds elements of a given RooAbsCollection to the container if they match the specified type.
RooAbsArg * find(const char *name) const
Find object with given name in list.
Abstract interface for all probability density functions.
const RooArgSet * nset() const
Abstract base class for objects that represent a real value that may appear on the left hand side of ...
virtual double getMin(const char *name=nullptr) const
Get minimum of currently defined range.
Abstract base class for objects that represent a real value and implements functionality common to al...
bool matchArgs(const RooArgSet &allDeps, RooArgSet &analDeps, const RooArgProxy &a, const Proxies &... proxies) const
RooArgList is a container object that can hold multiple RooAbsArg objects.
RooAbsArg * at(Int_t idx) const
Return object at given index, or nullptr if index is out of range.
RooArgSet is a container object that can hold multiple RooAbsArg objects.
Meta object that tracks value changes in a given set of RooAbsArgs by registering itself as value cli...
bool hasChanged(bool clearState)
Returns true if state has changed since last call with clearState=true.
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...
Container class to hold unbinned data.
Generic N-dimensional implementation of a kernel estimation p.d.f.
std::map< Int_t, bool > _ibNoSort
std::vector< std::vector< double > > _weights0
double analyticalIntegral(Int_t code, const char *rangeName=nullptr) const override
Implements the actual analytical integral(s) advertised by getAnalyticalIntegral.
void calculatePreNorm(BoxInfo *bi) const
bi->nEventsBMSW=0.; bi->nEventsBW=0.;
std::vector< double > _xDatHi
std::vector< std::vector< double > > * _weights
! Weights to be used. Points either to _weights0 or _weights1
void createPdf(bool firstCall, RooDataSet const &data)
evaluation order of constructor.
double evaluate() const override
Evaluate this PDF / function / constant. Needs to be overridden by all derived classes.
void loopRange(std::vector< double > &x, std::vector< Int_t > &indices) const
determine closest points to x, to loop over in evaluate()
std::vector< double > _xDatLo
void initialize(RooDataSet const &data)
initialization
std::map< Int_t, double > _wMap
void sortDataIndices(BoxInfo *bi=nullptr)
sort entries, as needed for loopRange()
void loadDataSet(bool firstCall, RooDataSet const &data)
copy the dataset and calculate some useful variables
std::vector< TVectorD > _dataPtsR
std::vector< double > _mean
void calculateShell(BoxInfo *bi) const
determine points in +/- nSigma shell around the box determined by the variable ranges.
void calculateBandWidth()
std::vector< double > _xDatLo3s
std::vector< double > _x1
std::vector< std::vector< double > > _dataPts
std::vector< double > _x0
std::vector< double > _x2
double gauss(std::vector< double > &x, std::vector< std::vector< double > > &weights) const
loop over all closest point to x, as determined by loopRange()
std::vector< double > _rho
void loadWeightSet(RooDataSet const &data)
std::vector< itVec > _sortTVIdcs
!
void boxInfoInit(BoxInfo *bi, const char *rangeName, Int_t code) const
std::map< std::pair< std::string, int >, BoxInfo * > _rangeBoxInfo
std::vector< Int_t > _idx
Int_t getAnalyticalIntegral(RooArgSet &allVars, RooArgSet &analVars, const char *rangeName=nullptr) const override
Interface function getAnalyticalIntergral advertises the analytical integrals that are supported.
std::vector< std::vector< double > > _weights1
std::vector< double > _xDatHi3s
TMatrixD getWeights(const int &k) const
Return evaluated weights.
std::vector< double > _sigma
void mirrorDataSet()
determine mirror dataset.
void setOptions()
set the configuration
RooDataSet * createDatasetFromHist(const RooArgList &varList, const TH1 &hist) const
void checkInitWeights() const
RooChangeTracker * _tracker
Variable that can be changed from the outside.
virtual Double_t GetBinCenter(Int_t bin) const
Return center of bin.
TH1 is the base class of all histogram classes in ROOT.
virtual Double_t GetBinContent(Int_t bin) const
Return content of bin number bin.
virtual TMatrixTBase< Element > & Zero()
Set matrix elements to zero.
void Print(Option_t *name="") const override
Print the matrix as a table of elements.
TMatrixT< Element > & T()
const char * GetName() const override
Returns name of object.
virtual const char * ClassName() const
Returns name of class to which the object belongs.
void ToLower()
Change string to lower-case.
const char * Data() const
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
TVectorT< Element > & Zero()
Set vector elements to zero.
void Print(Option_t *option="") const override
Print the vector as a list of elements.
void box(Int_t pat, Double_t x1, Double_t y1, Double_t x2, Double_t y2)
RooCmdArg WeightVar(const char *name="weight", bool reinterpretAsWeight=false)
constexpr Double_t TwoPi()