71 TString options,
double rho,
double nSigma,
bool rotate,
bool sortInput)
72 :
RooAbsPdf(
name, title), _varList(
"varList",
"List of variables", this),
73 _rhoList(
"rhoList",
"List of rho parameters", this), _data(&
data), _options(options), _widthFactor(rho),
74 _nSigma(nSigma), _rotate(rotate), _sortInput(sortInput), _nAdpt(1)
78 for (
const auto var : varList) {
80 coutE(InputArguments) <<
"RooNDKeysPdf::ctor(" <<
GetName() <<
") ERROR: variable " << var->
GetName()
81 <<
" is not of type RooAbsReal" << endl ;
95 TString options,
double rho,
double nSigma,
bool rotate,
bool sortInput)
96 :
RooAbsPdf(
name, title), _varList(
"varList",
"List of variables", this),
97 _rhoList(
"rhoList",
"List of rho parameters", this), _ownedData(createDatasetFromHist(varList, hist)), _data(_ownedData.get()),
98 _options(options), _widthFactor(rho), _nSigma(nSigma), _rotate(rotate),
99 _sortInput(sortInput), _nAdpt(1)
101 for (
const auto var : varList) {
103 coutE(InputArguments) <<
"RooNDKeysPdf::ctor(" <<
GetName() <<
") ERROR: variable " << var->
GetName()
104 <<
" is not of type RooAbsReal" << endl;
118 const TVectorD &rho,
TString options,
double nSigma,
bool rotate,
bool sortInput)
119 :
RooAbsPdf(
name, title), _varList(
"varList",
"List of variables", this),
120 _rhoList(
"rhoList",
"List of rho parameters", this), _data(&
data), _options(options), _widthFactor(-1.0),
121 _nSigma(nSigma), _rotate(rotate), _sortInput(sortInput), _nAdpt(1)
123 for (
const auto var : varList) {
125 coutE(InputArguments) <<
"RooNDKeysPdf::ctor(" <<
GetName() <<
") ERROR: variable " << var->
GetName()
126 <<
" is not of type RooAbsReal" << endl;
135 coutE(InputArguments)
136 <<
"ERROR: RooNDKeysPdf::RooNDKeysPdf() : The vector-size of rho is different from that of varList."
137 <<
"Unable to create the PDF." << endl;
157 const RooArgList &rhoList,
TString options,
double nSigma,
bool rotate,
bool sortInput)
158 :
RooAbsPdf(
name, title), _varList(
"varList",
"List of variables", this),
159 _rhoList(
"rhoList",
"List of rho parameters", this), _data(&
data), _options(options), _widthFactor(-1.0),
160 _nSigma(nSigma), _rotate(rotate), _sortInput(sortInput), _nAdpt(1)
162 for (
const auto var : varList) {
164 coutE(InputArguments) <<
"RooNDKeysPdf::ctor(" <<
GetName() <<
") ERROR: variable " << var->
GetName()
165 <<
" is not of type RooAbsReal" << endl;
174 for (
unsigned int i=0; i < rhoList.
size(); ++i) {
175 const auto rho = rhoList.
at(i);
177 coutE(InputArguments) <<
"RooNDKeysPdf::ctor(" <<
GetName() <<
") ERROR: parameter " << rho->
GetName()
178 <<
" is not of type RooRealVar" << endl;
187 coutE(InputArguments) <<
"ERROR: RooNDKeysPdf::RooNDKeysPdf() : The size of rhoList is different from varList."
188 <<
"Unable to create the PDF." << endl;
203 const RooArgList &rhoList,
TString options,
double nSigma,
bool rotate,
bool sortInput)
204 :
RooAbsPdf(
name, title), _varList(
"varList",
"List of variables", this),
205 _rhoList(
"rhoList",
"List of rho parameters", this), _ownedData(createDatasetFromHist(varList, hist)), _data(_ownedData.get()),
206 _options(options), _widthFactor(-1), _nSigma(nSigma), _rotate(rotate), _sortInput(sortInput),
209 for (
const auto var : varList) {
211 coutE(InputArguments) <<
"RooNDKeysPdf::ctor(" <<
GetName() <<
") ERROR: variable " << var->
GetName()
212 <<
" is not of type RooAbsReal" << endl;
222 for (
unsigned int i=0; i < rhoList.
size(); ++i) {
223 const auto rho = rhoList.
at(i);
225 coutE(InputArguments) <<
"RooNDKeysPdf::ctor(" <<
GetName() <<
") ERROR: parameter " << rho->
GetName()
226 <<
" is not of type RooRealVar" << endl;
234 coutE(InputArguments) <<
"ERROR: RooNDKeysPdf::RooNDKeysPdf() : The size of rhoList is different from varList."
235 <<
"Unable to create the PDF." << endl;
250 double rho,
double nSigma,
bool rotate,
bool sortInput)
251 :
RooAbsPdf(
name, title), _varList(
"varList",
"List of variables", this),
252 _rhoList(
"rhoList",
"List of rho parameters", this), _data(&
data), _options(
"a"), _widthFactor(rho),
253 _nSigma(nSigma), _rotate(rotate), _sortInput(sortInput), _nAdpt(1)
260 coutW(InputArguments) <<
"RooNDKeysPdf::RooNDKeysPdf() : Warning : asymmetric mirror(s) no longer supported."
273 TString options,
double rho,
double nSigma,
bool rotate,
bool sortInput)
274 :
RooAbsPdf(
name, title), _varList(
"varList",
"List of variables", this),
275 _rhoList(
"rhoList",
"List of rho parameters", this), _data(&
data), _options(options), _widthFactor(rho),
276 _nSigma(nSigma), _rotate(rotate), _sortInput(sortInput), _nAdpt(1)
289 :
RooAbsPdf(other,
name), _varList(
"varList", this, other._varList), _rhoList(
"rhoList", this, other._rhoList),
290 _ownedData(other._ownedData ? new
RooDataSet(*other._ownedData) : nullptr),
291 _data(_ownedData ? _ownedData.get() : other._data), _options(other._options), _widthFactor(other._widthFactor),
292 _nSigma(other._nSigma), _rotate(other._rotate), _sortInput(other._sortInput),
430 cxcoutD(InputArguments) <<
"RooNDKeysPdf::setOptions() options = " <<
_options
433 <<
"\n\tdebug = " <<
_debug
438 coutW(InputArguments) <<
"RooNDKeysPdf::setOptions() : Warning : nSigma = " <<
_nSigma <<
" < 2.0. "
439 <<
"Calculated normalization could be too large."
466 coutE(InputArguments) <<
"ERROR: RooNDKeysPdf::initialize() : The observable list is empty. "
467 <<
"Unable to begin generating the PDF." << endl;
472 coutE(InputArguments) <<
"ERROR: RooNDKeysPdf::initialize() : The input data set is empty. "
473 <<
"Unable to begin generating the PDF." << endl;
477 _d =
static_cast<double>(
_nDim);
479 vector<double> dummy(
_nDim,0.);
542 vector<RooRealVar*> dVars(
_nDim);
553 vector<double>& point =
_dataPts[i];
562 mat(j,k) += dVars[j]->getVal() * dVars[k]->getVal() * myweight;
566 point[j] = pointV[j] = dVars[j]->getVal();
568 _x0[j] += 1. * myweight;
569 _x1[j] += point[j] * myweight ;
570 _x2[j] += point[j] * point[j] * myweight ;
571 if (
_x2[j]!=
_x2[j]) exit(3);
604 for (
Int_t j=0; j<
_nDim; j++) { sigmaRraw[j] = sqrt(sigmaRraw[j]); }
643 coutI(Contents) <<
"RooNDKeysPdf::loadDataSet(" <<
this <<
")"
644 <<
"\n Number of events in dataset: " <<
_nEvents
645 <<
"\n Weighted number of events in dataset: " <<
_nEventsW << endl;
665 vector<double> dummy(
_nDim,0.);
672 vector<vector<double> > mpoints(
size,dummy);
673 vector<vector<Int_t> > mjdcs(
size);
678 vector<Int_t>& mjdxK = mjdcs[0];
679 vector<double>& mpointK = mpoints[0];
691 vector<Int_t>& mjdx0 = mjdcs[0];
693 if (
size==1 && mjdx0.empty())
continue;
697 vector<Int_t>& mjdx = mjdcs[0];
698 vector<double>& mpoint = mpoints[0];
701 Int_t eMir = 1 << mjdx.size();
702 vector<vector<double> > epoints(eMir,
x);
709 epoints[
l] = epoints[
l-size1];
711 vector<double>& epoint = epoints[
l];
712 epoint[mjdx[
Int_t(mjdx.size()-1)-
m]] = mpoint[mjdx[
Int_t(mjdx.size()-1)-
m]];
718 epoints.erase(epoints.begin());
727 for (
Int_t j=0; j<
_nDim; j++) { pointR[j] = (epoints[
m])[j]; }
756 coutI(Contents) <<
"RooNDKeysPdf::loadWeightSet(" <<
this <<
") : Number of weighted events : " <<
_wMap.size() << endl;
783 for (
const auto& wMapItr :
_wMap) {
784 Int_t i = wMapItr.first;
787 bool inVarRange(
true);
788 bool inVarRangePlusShell(
true);
793 inVarRange = inVarRange &&
true;
794 }
else { inVarRange = inVarRange &&
false; }
797 inVarRangePlusShell = inVarRangePlusShell &&
true;
798 }
else { inVarRangePlusShell = inVarRangePlusShell &&
false; }
803 bi->
bIdcs.push_back(i);
807 if (inVarRangePlusShell) {
817 if (inShell) bi->
sIdcs.push_back(i);
824 coutI(Contents) <<
"RooNDKeysPdf::calculateShell() : "
825 <<
"\n Events in shell " << bi->
sIdcs.size()
826 <<
"\n Events in box " << bi->
bIdcs.size()
827 <<
"\n Events in box and shell " << bi->
bpsIdcs.size()
845 cxcoutD(Eval) <<
"RooNDKeysPdf::calculatePreNorm() : "
859 for (
unsigned int i = 0; i <
_dataPtsR.size(); ++i) {
866 vector<TVectorD>::iterator dpRItr =
_dataPtsR.begin();
871 itrVecR.push_back(
itPair(i, dpRItr));
873 itrVecR.push_back(
itPair(i, dpRItr));
879 sort(itrVecR.begin(), itrVecR.end(), [=](
const itPair&
a,
const itPair&
b) {
880 return (*a.second)[j] < (*b.second)[j];
886 cxcoutD(Eval) <<
"RooNDKeysPdf::sortDataIndices() : Number of sorted events : " <<
_sortTVIdcs[j].size() << endl;
894 cxcoutD(Eval) <<
"RooNDKeysPdf::calculateBandWidth()" << endl;
905 cxcoutD(Eval) <<
"RooNDKeysPdf::calculateBandWidth() Using static bandwidth." << endl;
912 weight[j] =
_n * (*_sigmaR)[j];
919 cxcoutD(Eval) <<
"RooNDKeysPdf::calculateBandWidth() Using adaptive bandwidth." << endl;
921 double sqrt12 = sqrt(12.);
924 vector<double> dummy(
_nDim, 0.);
927 std::vector<std::vector<double>> *weights_prev(0);
928 std::vector<std::vector<double>> *weights_new(0);
949 vector<double> &weight = (*weights_new)[i];
951 double norm = (
_n * (*_sigmaR)[j]) / sqrtSigmaAvgR;
952 weight[j] = norm *
f / sqrt12;
971 std::vector<int> indices;
982 indices.push_back(ibMapItr.first);
986 for (
const auto& i : indices) {
993 const vector<double> &point =
_dataPts[i];
994 const vector<double> &weight = weights[
_idx[i]];
997 (*_dx)[j] =
x[j] - point[j];
1005 double r = (*_dx)[j];
1006 double c = 1. / (2. * weight[j] * weight[j]);
1010 g *= exp(-
c *
r *
r);
1011 g *= 1. / (sqrt2pi * weight[j]);
1028 xRm[j] = xRp[j] =
x[j];
1036 xRm[j] -=
_nSigma * (
_n * (*_sigmaR)[j]);
1037 xRp[j] +=
_nSigma * (
_n * (*_sigmaR)[j]);
1040 std::vector<TVectorD> xvecRm(1,xRm);
1041 std::vector<TVectorD> xvecRp(1,xRp);
1044 std::vector<Int_t> ibMapRT;
1049 return (*
a.second)[j] < (*
b.second)[j];
1061 auto&
m =
_nDim==1 ? ibMap : ibMapRT;
1062 m.reserve(std::distance(lo,
hi));
1063 for (it=lo; it!=
hi; ++it) {
1064 m.push_back(it->first);
1067 std::sort(
m.begin(),
m.end());
1073 for (it=lo; it!=
hi; ++it) {
1075 auto found = std::lower_bound(ibMapRT.begin(), ibMapRT.end(), it->first);
1076 if (found != ibMapRT.end() && !(it->first < *found)) {
1077 ibMap.push_back(it->first);
1081 std::sort(ibMap.begin(), ibMap.end());
1084 if (j!=
_nDim-1) { ibMapRT = std::move(ibMap); }
1092 vector<bool> doInt(
_nDim,
true);
1115 bi->
xVarLo[j] = var->getMin(rangeName);
1116 bi->
xVarHi[j] = var->getMax(rangeName);
1118 bi->
xVarLo[j] = var->getVal() ;
1119 bi->
xVarHi[j] = var->getVal() ;
1153 if (rangeName)
return 0 ;
1168 cxcoutD(Eval) <<
"Calling RooNDKeysPdf::analyticalIntegral(" <<
GetName() <<
") with code " << code
1169 <<
" and rangeName " << (rangeName?rangeName:
"<none>") << endl;
1175 vector<bool> doInt(
_nDim,
true);
1181 string rangeNameStr(rangeName) ;
1191 bool newBounds(
false);
1194 if ((var->getMin(rangeName)-bi->
xVarLo[j]!=0) ||
1195 (var->getMax(rangeName)-bi->
xVarHi[j]!=0)) {
1202 cxcoutD(Eval) <<
"RooNDKeysPdf::analyticalIntegral() : Found new boundaries ... " << (rangeName?rangeName:
"<none>") << endl;
1207 if (!bi->
filled || newBounds) {
1220 cxcoutD(Eval) <<
"RooNDKeysPdf::analyticalIntegral() : Using mirrored normalization : " << bi->
nEventsBW << endl;
1227 if (norm<0.) norm=0.;
1232 const vector<double>& weight = (*_weights)[
_idx[bi->
sIdcs[i]]];
1234 vector<double> chi(
_nDim,100.);
1237 if(!doInt[j])
continue;
1240 chi[j] = (
x[j]-bi->
xVarLo[j])/weight[j];
1242 chi[j] = (bi->
xVarHi[j]-
x[j])/weight[j];
1245 prob *= (0.5 +
TMath::Erf(std::abs(chi[j])/sqrt(2.))/2.);
1247 prob *= (0.5 -
TMath::Erf(std::abs(chi[j])/sqrt(2.))/2.);
1253 cxcoutD(Eval) <<
"RooNDKeysPdf::analyticalIntegral() : Final normalization : " << norm <<
" " << bi->
nEventsBW << endl;
1264 std::vector<RooRealVar *> varVec;
1266 for (
const auto var : varList) {
1268 coutE(InputArguments) <<
"RooNDKeysPdf::createDatasetFromHist(" <<
GetName() <<
") WARNING: variable "
1269 << var->
GetName() <<
" is not of type RooRealVar. Skip." << endl;
1272 varVec.push_back(
static_cast<RooRealVar *
>(var));
1276 unsigned int histndim(0);
1277 std::string classname = hist.
ClassName();
1278 if (classname.find(
"TH1") == 0) {
1280 }
else if (classname.find(
"TH2") == 0) {
1282 }
else if (classname.find(
"TH3") == 0) {
1285 assert(histndim == varVec.size());
1287 if (histndim > 3 || histndim <= 0) {
1288 coutE(InputArguments) <<
"RooNDKeysPdf::createDatasetFromHist(" <<
GetName()
1289 <<
") ERROR: input histogram dimension not between [1-3]: " << histndim << endl;
1297 for (
int i = 1; i <= hist.
GetXaxis()->GetNbins(); ++i) {
1301 varVec[0]->setVal(xval);
1303 if (varVec.size() == 1) {
1305 dataFromHist->
add(varSet, fval);
1308 for (
int j = 1; j <= hist.
GetYaxis()->GetNbins(); ++j) {
1310 varVec[1]->setVal(yval);
1312 if (varVec.size() == 2) {
1314 dataFromHist->
add(varSet, fval);
1317 for (
int k = 1; k <= hist.
GetZaxis()->GetNbins(); ++k) {
1319 varVec[2]->setVal(zval);
1322 dataFromHist->
add(varSet, fval);
1329 return dataFromHist;
1341 cxcoutD(Eval) <<
"RooNDKeysPdf::getWeights() Return evaluated weights." << endl;
1349 const vector<double>& weight = (*_weights)[i];
1350 mref(i,
_nDim) = weight[k];
1368 covMatRho(j, k) = (*_covMat)(j, k) *
_rho[j] *
_rho[k];
1375 (*_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
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
Int_t getSize() const
Return the number of elements in the collection.
const char * GetName() const override
Returns name of object.
Storage_t::size_type size() const
RooAbsArg * find(const char *name) const
Find object with given name in list.
virtual Int_t numEntries() const
Return number of entries in dataset, i.e., count unweighted entries.
const RooArgSet * nset() const
RooAbsRealLValue is the common abstract base class for objects that represent a real value that may a...
virtual double getMin(const char *name=nullptr) const
Get minimum of currently defined range.
RooAbsReal is the common abstract base class for objects that represent a real value and implements f...
double getVal(const RooArgSet *normalisationSet=nullptr) const
Evaluate object.
bool matchArgs(const RooArgSet &allDeps, RooArgSet &numDeps, const RooArgProxy &a) const
Utility function for use in getAnalyticalIntegral().
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.
RooChangeTracker is a meta object that tracks value changes in a given set of RooAbsArgs by registeri...
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...
RooDataSet is a container class to hold unbinned data.
const RooArgSet * get(Int_t index) const override
Return RooArgSet with coordinates of event 'index'.
void add(const RooArgSet &row, double weight=1.0, double weightError=0.0) override
Add one ore more rows of data.
double weight() const override
Return event weight of current event.
Generic N-dimensional implementation of a kernel estimation p.d.f.
std::vector< double > _xVarLoM3s
std::map< Int_t, bool > _ibNoSort
std::vector< Int_t > _sIdcs
std::vector< std::vector< double > > _weights0
void initialize()
initialization
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
void loadDataSet(bool firstCall)
copy the dataset and calculate some useful variables
std::vector< std::vector< double > > * _weights
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
std::map< Int_t, double > _wMap
void sortDataIndices(BoxInfo *bi=nullptr)
sort entries, as needed for loopRange()
std::vector< double > _xVarHi
std::vector< Int_t > _bIdcs
std::vector< TVectorD > _dataPtsR
std::vector< double > _mean
std::vector< double > _xVarLo
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 > _xVarHiM3s
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
std::vector< Int_t > _bmsIdcs
std::vector< itVec > _sortTVIdcs
Weights to be used. Points either to _weights0 or _weights1.
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< double > _xVarLoP3s
std::vector< std::vector< double > > _weights1
std::vector< double > _xDatHi3s
TString _options
do not persist
std::vector< double > _xVarHiP3s
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
std::vector< std::string > _varName
void checkInitWeights() const
void createPdf(bool firstCall=true)
evaluation order of constructor.
std::map< Int_t, bool > _bpsIdcs
RooChangeTracker * _tracker
RooRealVar represents a 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.
const TVectorD & GetEigenValues() const
const TMatrixD & GetEigenVectors() const
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)
Double_t Erf(Double_t x)
Computation of the error function erf(x).
LongDouble_t Power(LongDouble_t x, LongDouble_t y)
Returns x raised to the power y.
Short_t Abs(Short_t d)
Returns the absolute value of parameter Short_t d.
constexpr Double_t TwoPi()
std::vector< double > xVarHiM3s
std::vector< Int_t > bIdcs
std::vector< double > xVarHiP3s
std::vector< double > xVarLo
std::vector< double > xVarHi
std::map< Int_t, bool > bpsIdcs
std::vector< Int_t > sIdcs
std::vector< double > xVarLoM3s
std::vector< double > xVarLoP3s
std::vector< Int_t > bmsIdcs