79using std::string, std::ostream;
91std::unique_ptr<RooAbsDataStore>
95 ?
static_cast<std::unique_ptr<RooAbsDataStore>
>(std::make_unique<RooTreeDataStore>(
name, title, vars))
96 :
static_cast<std::unique_ptr<RooAbsDataStore>
>(std::make_unique<RooVectorDataStore>(
name, title, vars));
168 std::map<string,TH1*> histMap,
double wgt) :
191 std::map<string,RooDataHist*> dhistMap,
double wgt) :
218 std::stringstream errorMsgStream;
219 errorMsgStream <<
"RooDataHist::ctor(" <<
GetName() <<
") ERROR: dimension of input histogram must match "
220 <<
"number of dimension variables";
221 const std::string errorMsg = errorMsgStream.str();
222 coutE(InputArguments) << errorMsg << std::endl;
223 throw std::invalid_argument(errorMsg);
272 RooAbsData(
name,title,
RooArgSet(vars,static_cast<
RooAbsArg*>(
RooCmdConfig::decodeObjOnTheFly(
"RooDataHist::RooDataHist",
"IndexCat",0,nullptr,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8))))
280 pc.
defineInt(
"impDens",
"ImportHisto",0) ;
282 pc.
defineObject(
"impSliceData",
"ImportDataSlice",0,
nullptr,
true) ;
283 pc.
defineString(
"impSliceState",
"ImportDataSlice",0,
"",
true) ;
286 pc.
defineSet(
"glObs",
"GlobalObservables",0,
nullptr) ;
299 throw std::invalid_argument(
"Invalid command arguments passed to RooDataHist constructor!");
305 bool impDens = pc.
getInt(
"impDens") ;
306 double initWgt = pc.
getDouble(
"weight") ;
308 const char* impSliceNames = pc.
getString(
"impSliceState",
"",
true) ;
315 importTH1(vars,*impHist,initWgt, impDens) ;
317 }
else if (indexCat) {
321 std::map<std::string,RooDataHist*> dmap ;
322 std::map<std::string,TH1*> hmap ;
323 auto hiter = impSliceHistos.
begin() ;
324 for (
const auto& token :
ROOT::Split(impSliceNames,
",",
true)) {
327 std::stringstream errorMsgStream;
328 errorMsgStream <<
"RooDataHist::RooDataHist(\"" <<
GetName() <<
"\") "
329 <<
"you are providing import data for the category state \"" << token
330 <<
"\", but the index category \"" << indexCat->
GetName() <<
"\" has no such state!";
331 const std::string errorMsg = errorMsgStream.str();
332 coutE(InputArguments) << errorMsg << std::endl;
333 throw std::invalid_argument(errorMsg);
336 if(
auto dHist =
dynamic_cast<RooDataHist*
>(*hiter)) {
339 if(
auto hHist =
dynamic_cast<TH1*
>(*hiter)) {
344 if(!dmap.empty() && !hmap.empty()) {
345 std::stringstream errorMsgStream;
346 errorMsgStream <<
"RooDataHist::ctor(" <<
GetName() <<
") ERROR: you can't import mix of TH1 and RooDataHist";
347 const std::string errorMsg = errorMsgStream.str();
348 coutE(InputArguments) << errorMsg << std::endl;
349 throw std::invalid_argument(errorMsg);
407 for (iX=0 ; iX < xvar->
getBins() ; iX++) {
410 for (iY=0 ; iY < yvar->
getBins() ; iY++) {
413 for (iz=0 ; iz < zvar->
getBins() ; iz++) {
415 double bv = doDensityCorrection ?
binVolume(vset) : 1;
419 double bv = doDensityCorrection ?
binVolume(vset) : 1;
424 double bv = doDensityCorrection ?
binVolume(vset) : 1 ;
432bool checkConsistentAxes(
const TH1* first,
const TH1* second) {
448 constexpr double tolerance = 1
e-6;
450 auto const& vars1 = *
h1.get();
451 auto const& vars2 = *h2.
get();
454 if(!vars1.hasSameLayout(vars2)) {
458 for(std::size_t iVar = 0; iVar < vars1.size(); ++iVar) {
459 auto * var1 =
dynamic_cast<RooRealVar*
>(vars1[iVar]);
460 auto * var2 =
dynamic_cast<RooRealVar*
>(vars2[iVar]);
463 if((!var1 && var2) || (var1 && !var2))
return false;
470 auto const& bng2 = var2->getBinning();
473 if(bng1.numBins() != bng2.numBins())
return false;
475 std::size_t nBins = bng1.
numBins();
478 for(std::size_t iBin = 0; iBin < nBins; ++iBin) {
479 double v1 = bng1.binLow(iBin);
480 double v2 = bng2.binLow(iBin);
481 if(std::abs((
v1 -
v2) /
v1) > tolerance)
return false;
483 double v1 = bng1.binHigh(nBins - 1);
484 double v2 = bng2.binHigh(nBins - 1);
485 if(std::abs((
v1 -
v2) /
v1) > tolerance)
return false;
501 TH1* histo(
nullptr) ;
503 for (
const auto& hiter : hmap) {
506 histo = hiter.second;
508 if (!checkConsistentAxes(histo, hiter.second)) {
509 coutE(InputArguments) <<
"Axes of histogram " << hiter.second->
GetName() <<
" are not consistent with first processed "
510 <<
"histogram " << histo->
GetName() << std::endl;
511 throw std::invalid_argument(
"Axes of inputs for RooDataHist are inconsistent");
515 if (!indexCat.
hasLabel(hiter.first)) {
517 coutI(InputArguments) <<
"RooDataHist::importTH1Set(" <<
GetName() <<
") defining state \"" << hiter.first <<
"\" in index category " << indexCat.
GetName() << std::endl ;
526 coutE(InputArguments) <<
"RooDataHist::importTH1Set(" <<
GetName() <<
"): dimension of input histogram must match "
527 <<
"number of continuous variables" << std::endl ;
528 throw std::invalid_argument(
"Inputs histograms for RooDataHist are not compatible with dimensions of variables.");
569 for (ic=0 ; ic < icat->
numBins(
nullptr) ; ic++) {
572 for (iX=0 ; iX < xvar->
getBins() ; iX++) {
575 for (iY=0 ; iY < yvar->
getBins() ; iY++) {
578 for (iz=0 ; iz < zvar->
getBins() ; iz++) {
580 double bv = doDensityCorrection ?
binVolume(vset)/avgBV : 1;
584 double bv = doDensityCorrection ?
binVolume(vset)/avgBV : 1;
589 double bv = doDensityCorrection ?
binVolume(vset)/avgBV : 1;
605 std::map<std::string, RooDataHist *> dmap,
double initWgt)
611 for (
const auto &diter : dmap) {
613 std::string
const &label = diter.first;
616 if (!dhistForBinning) {
617 dhistForBinning = dhist;
619 if (!hasConsistentLayoutAndBinning(*dhistForBinning, *dhist)) {
620 coutE(InputArguments) <<
"Layout or binning of histogram " << dhist->
GetName()
621 <<
" is not consistent with first processed "
622 <<
"histogram " << dhistForBinning->
GetName() << std::endl;
623 throw std::invalid_argument(
"Layout or binning of inputs for RooDataHist is inconsistent");
630 coutI(InputArguments) <<
"RooDataHist::importDHistSet(" <<
GetName() <<
") defining state \"" << label
631 <<
"\" in index category " << indexCat.
GetName() << std::endl;
633 if (!icat->hasLabel(label)) {
634 icat->defineType(label);
639 for (
auto *theirVar : dynamic_range_cast<RooRealVar *>(dhistForBinning->
_vars)) {
641 if (!theirVar || !ourVar)
648 for (
const auto &diter : dmap) {
649 std::string
const &label = diter.first;
652 icat->setLabel(label.c_str());
668 const std::string ourVarName(ourVar->
GetName() ? ourVar->
GetName() :
"");
675 coutE(InputArguments) <<
"RooDataHist::adjustBinning(" << ownName <<
") ERROR: dimension " << ourVarName
676 <<
" must be real\n";
677 throw std::logic_error(
"Incorrect type object (" + ourVarName +
678 ") passed as argument to RooDataHist::_adjustBinning. Please report this issue.");
681 const double xlo = theirVar.
getMin();
682 const double xhi = theirVar.
getMax();
685 std::unique_ptr<RooAbsBinning> xbins;
693 const double tolerance = 1
e-6 * xbins->averageBinWidth();
696 const int iBinLo = xbins->binNumber(xlo + tolerance);
697 const int iBinHi = xbins->binNumber(xhi - tolerance);
698 const int nBinsAdj = iBinHi - iBinLo + 1;
699 const double xloAdj = xbins->binLow(iBinLo);
700 const double xhiAdj = xbins->binHigh(iBinHi);
703 xbins = std::make_unique<RooUniformBinning>(xloAdj, xhiAdj, nBinsAdj);
706 xbins->setRange(xloAdj, xhiAdj);
710 if (std::abs(xloAdj - xlo) > tolerance || std::abs(xhiAdj - xhi) > tolerance) {
711 coutI(DataHandling) <<
"RooDataHist::adjustBinning(" << ownName <<
"): fit range of variable " << ourVarName
712 <<
" expanded to nearest bin boundaries: [" << xlo <<
"," << xhi <<
"] --> [" << xloAdj <<
","
757void cloneArray(
double*& ours,
const double* theirs, std::size_t
n) {
758 if (ours)
delete[] ours;
761 ours =
new double[
n];
762 std::copy(theirs, theirs+
n, ours);
766void initArray(
double*& arr, std::size_t
n,
double val) {
767 if (arr)
delete[] arr;
771 std::fill(arr, arr+
n, val);
787 for (
unsigned int i = 0; i <
_vars.
size(); ++i) {
801 if (rrv->getBins() == 0) {
810 const RooAbsBinning* binning = lvarg->getBinningPtr(
nullptr);
811 _lvbins.emplace_back(binning ? binning->
clone() :
nullptr);
820 for (
const auto var :
_vars) {
825 for (
unsigned int i = 0u; i<
n; i++) {
849 if (!fillTree) return ;
858 double theBinVolume(1) ;
863 theBinVolume *= arg2->getBinWidth(idx) ;
865 _binv[ibin] = theBinVolume ;
882 std::vector<double>& bounds =
_binbounds.back();
883 bounds.reserve(2 * it->numBins());
884 for (
Int_t i = 0; i < it->numBins(); ++i) {
885 bounds.push_back(it->binLow(i));
886 bounds.push_back(it->binHigh(i));
897 RooAbsData(other,newname),
RooDirItem(), _arrSize(other._arrSize), _idxMult(other._idxMult), _pbinvCache(other._pbinvCache)
908 for (
const auto rvarg :
_vars) {
912 const RooAbsBinning* binning = lvarg->getBinningPtr(
nullptr);
913 _lvbins.emplace_back(binning ? binning->
clone() :
nullptr) ;
924 std::size_t nStart, std::size_t nStop)
const
929 auto rdh = std::make_unique<RooDataHist>(
GetName(),
GetTitle(), myVarSubset);
932 std::unique_ptr<RooArgSet> tmp;
934 tmp = std::make_unique<RooArgSet>();
937 coutE(DataHandling) <<
"RooDataHist::reduceEng(" <<
GetName() <<
") Couldn't deep-clone cut variable, abort," << std::endl ;
946 const std::size_t nevt = nStop < static_cast<std::size_t>(
numEntries()) ? nStop :
static_cast<std::size_t
>(
numEntries());
947 for (
auto i=nStart; i<nevt ; i++) {
950 bool doSelect(
true) ;
952 for (
const auto arg : *row) {
953 if (!arg->inRange(cutRange)) {
959 if (!doSelect) continue ;
961 if (!cloneVar || cloneVar->
getVal()) {
963 rdh->add(*row,
weight(i),lo*lo) ;
1002 bool correctForBinSize)
const
1004 std::vector<double> vals(
_arrSize);
1005 for (std::size_t i = 0; i < vals.size(); ++i) {
1019 for (std::size_t i = 0; i <
_vars.
size(); ++i) {
1021 std::size_t iVar = reverse ?
_vars.
size() - 1 - i : i;
1027 coutE(InputArguments) <<
"RooHistPdf::weight(" <<
GetName()
1028 <<
") ERROR: Code Squashing currently does not support category values." << std::endl;
1038 idxMult *=
dynamic_cast<RooAbsLValue const *
>(internalVar)->numBins();
1041 return _vars.
size() == 1 ? code :
"(" + code +
")";
1062 if (&
_vars == &coords)
1065 std::size_t masterIdx = 0;
1067 for (
unsigned int i=0; i <
_vars.
size(); ++i) {
1074 const RooAbsArg* theVar = fast ? coords[i] : coords.
find(*internalVar);
1077 theVar = internalVar;
1087 assert(
dynamic_cast<const RooAbsReal*
>(theVar));
1088 const double val =
static_cast<const RooAbsReal*
>(theVar)->getVal();
1094 masterIdx +=
_idxMult[i] * cat->getBin(
static_cast<const char*
>(
nullptr));
1120 <<
":plotOn: frame does not specify a plot variable" << std::endl;
1127 <<
":plotOn: dataset doesn't contain plot frame variable" << std::endl;
1131 o.
bins = &dataVar->getBinning() ;
1152 bool correctForBinSize,
bool cdfBoundaries)
1155 const std::size_t nEvents = xVals.size();
1159 auto binIndices =
reinterpret_cast<int*
>(output + nEvents) - nEvents;
1160 std::fill(binIndices, binIndices + nEvents, 0);
1161 binning.
binNumbers(xVals.data(), binIndices, nEvents);
1166 std::vector<double> coordsExt(nBins+3);
1167 double* binCoords = coordsExt.data() + 2;
1169 for (std::size_t binIdx = 1; binIdx < nBins ; ++binIdx) {
1171 double binWidth =
_binv[0];
1172 binCoords[binIdx] = binIdx*binWidth + binCoords[0];
1175 double binCentDiff = 0.5*
_binv[binIdx-1] + 0.5*
_binv[binIdx];
1176 binCoords[binIdx] = binCoords[binIdx-1] + binCentDiff;
1180 std::vector<double> weightsExt(nBins+3);
1182 for (std::size_t binIdx = 0; binIdx < nBins; ++binIdx) {
1183 weightsExt[binIdx+2] = correctForBinSize ?
_wgt[binIdx] /
_binv[binIdx] :
_wgt[binIdx];
1186 if (cdfBoundaries) {
1187 coordsExt[0] = - 1
e-10 + binning.
lowBound();
1193 coordsExt[nBins+2] = binning.
highBound();
1194 weightsExt[nBins+2] = 1.;
1198 coordsExt[0] = binCoords[1] - 2*
_binv[0] -
_binv[1];
1199 weightsExt[0] = weightsExt[3];
1201 coordsExt[1] = binCoords[0] -
_binv[0];
1202 weightsExt[1] = weightsExt[2];
1204 coordsExt[nBins+2] = binCoords[nBins-1] +
_binv[nBins-1];
1205 weightsExt[nBins+2] = weightsExt[nBins+1];
1210 for (std::size_t i = 0; i < nEvents ; ++i) {
1211 double xVal = xVals[i];
1212 std::size_t binIdx = binIndices[i] + 2;
1216 if (xVal > coordsExt[binIdx]) {
1220 double x1 = coordsExt[binIdx-2];
1221 double y1 = weightsExt[binIdx-2];
1223 double x2 = coordsExt[binIdx-1];
1224 double y2 = weightsExt[binIdx-1];
1226 double x3 = coordsExt[binIdx];
1227 double y3 = weightsExt[binIdx];
1230 double quotient = (x3-
x1) / (
x2-
x1);
1231 double x1Sqrd =
x1*
x1;
1232 double x3Sqrd = x3*x3;
1234 double secondCoeff = (y3 -
y1 - (
y2-
y1) * quotient) / (x3Sqrd - x1Sqrd - (
x2*
x2 - x1Sqrd) * quotient);
1235 double firstCoeff = (y3 -
y1 - secondCoeff*(x3Sqrd - x1Sqrd)) / (x3-
x1);
1236 double zerothCoeff =
y1 - secondCoeff*x1Sqrd - firstCoeff*
x1;
1238 output[i] = secondCoeff * xVal * xVal + firstCoeff * xVal + zerothCoeff;
1259 bool correctForBinSize,
bool cdfBoundaries)
1262 const std::size_t nEvents = xVals.size();
1266 auto binIndices =
reinterpret_cast<int*
>(output + nEvents) - nEvents;
1267 std::fill(binIndices, binIndices + nEvents, 0);
1268 binning.
binNumbers(xVals.data(), binIndices, nEvents);
1273 std::vector<double> coordsExt(nBins+2);
1274 double* binCoords = coordsExt.data() + 1;
1276 for (std::size_t binIdx = 1; binIdx < nBins ; ++binIdx) {
1278 double binWidth =
_binv[0];
1279 binCoords[binIdx] = binIdx*binWidth + binCoords[0];
1282 double binCentDiff = 0.5*
_binv[binIdx-1] + 0.5*
_binv[binIdx];
1283 binCoords[binIdx] = binCoords[binIdx-1] + binCentDiff;
1287 std::vector<double> weightsExt(nBins+2);
1289 for (std::size_t binIdx = 0; binIdx < nBins; ++binIdx) {
1290 weightsExt[binIdx+1] = correctForBinSize ?
_wgt[binIdx] /
_binv[binIdx] :
_wgt[binIdx];
1294 if (cdfBoundaries) {
1297 coordsExt[nBins+1] = binning.
highBound();
1298 weightsExt[nBins+1] = 1.;
1302 coordsExt[0] = binCoords[0] -
_binv[0];
1303 weightsExt[0] = weightsExt[1];
1304 coordsExt[nBins+1] = binCoords[nBins-1] +
_binv[nBins-1];
1305 weightsExt[nBins+1] = weightsExt[nBins];
1310 for (std::size_t i = 0; i < nEvents ; ++i) {
1311 double xVal = xVals[i];
1312 std::size_t binIdx = binIndices[i] + 1;
1316 if (xVal > coordsExt[binIdx]) { binIdx += 1; }
1318 double x1 = coordsExt[binIdx-1];
1319 double y1 = weightsExt[binIdx-1];
1320 double x2 = coordsExt[binIdx];
1321 double y2 = weightsExt[binIdx];
1324 double firstCoeff = (
y2-
y1) / (
x2-
x1);
1325 double zerothCoeff =
y1 - firstCoeff *
x1;
1327 output[i] = firstCoeff * xVal + zerothCoeff;
1346void RooDataHist::weights(
double* output, std::span<double const> xVals,
int intOrder,
bool correctForBinSize,
bool cdfBoundaries)
1348 auto const nEvents = xVals.size();
1350 if (intOrder == 0) {
1354 auto binIndices =
reinterpret_cast<int*
>(output + nEvents) - nEvents;
1355 std::fill(binIndices, binIndices + nEvents, 0);
1356 binning.
binNumbers(xVals.data(), binIndices, nEvents);
1358 for (std::size_t i=0; i < nEvents; ++i) {
1359 auto binIdx = binIndices[i];
1360 output[i] = correctForBinSize ?
_wgt[binIdx] /
_binv[binIdx] :
_wgt[binIdx];
1363 else if (intOrder == 1) {
1366 else if (intOrder == 2) {
1371 coutE(InputArguments) <<
"RooDataHist::weights(" <<
GetName() <<
") interpolation in "
1372 << intOrder <<
" dimensions not yet implemented" << std::endl ;
1374 weights(output, xVals, 1, correctForBinSize, cdfBoundaries);
1400 coutE(InputArguments) <<
"RooDataHist::weight(" <<
GetName() <<
") ERROR: interpolation order must be positive" << std::endl ;
1407 return correctForBinSize ?
_wgt[idx] /
_binv[idx] :
_wgt[idx];
1435 coutE(InputArguments) <<
"RooDataHist::weight(" <<
GetName() <<
") ERROR: interpolation order must be positive" << std::endl ;
1442 return correctForBinSize ?
_wgt[idx] /
_binv[idx] :
_wgt[idx];
1489 double xval = realX.
getVal() ;
1490 double yval = realY.getVal() ;
1502 int ybinLo = ybinC-intOrder/2 - ((yval<binningY.
binCenter(ybinC))?1:0) ;
1503 int ybinM = binningY.
numBins() ;
1506 auto offsetIdx = centralIdx - idxMultY * ybinC;
1510 double * xarr = yarr + intOrder + 1;
1511 for (
int i=ybinLo ; i<=intOrder+ybinLo ; i++) {
1513 if (i>=0 && i<ybinM) {
1516 xarr[i-ybinLo] = binningY.
binCenter(ibin) ;
1517 }
else if (i>=ybinM) {
1519 ibin = 2*ybinM-i-1 ;
1526 auto centralIdxX = offsetIdx + idxMultY * ibin;
1531 std::cout <<
"RooDataHist interpolating data is" << std::endl ;
1532 std::cout <<
"xarr = " ;
1533 for (
int q=0;
q<=intOrder ;
q++) std::cout << xarr[
q] <<
" " ;
1534 std::cout <<
" yarr = " ;
1535 for (
int q=0;
q<=intOrder ;
q++) std::cout << yarr[
q] <<
" " ;
1536 std::cout << std::endl ;
1543 coutE(InputArguments) <<
"RooDataHist::weight(" <<
GetName() <<
") interpolation in "
1544 << varInfo.
nRealVars <<
" dimensions not yet implemented" << std::endl ;
1545 return weightFast(bin,0,correctForBinSize,cdfBoundaries) ;
1579 throw std::invalid_argument(
"RooDataHist::weightError(" + std::string(
GetName()) +
") error type Auto not allowed here");
1583 throw std::invalid_argument(
"RooDataHist::weightError(" + std::string(
GetName()) +
") error type Expected not allowed here");
1644 auto const& binning =
static_cast<RooRealVar&
>(*
_vars[iDim]).getBinning();
1647 int fbinC = binning.binNumber(xval) ;
1648 int fbinLo = fbinC-intOrder/2 - ((xval<binning.binCenter(fbinC))?1:0) ;
1649 int fbinM = binning.numBins() ;
1652 auto offsetIdx = centralIdx - idxMult * fbinC;
1656 double * xarr = yarr + intOrder + 1;
1658 for (
int i=fbinLo ; i<=intOrder+fbinLo ; i++) {
1660 if (i>=0 && i<fbinM) {
1663 xarr[i-fbinLo] = binning.binCenter(ibin) ;
1664 auto idx = offsetIdx + idxMult * ibin;
1665 yarr[i - fbinLo] =
_wgt[idx];
1666 if (correctForBinSize) yarr[i-fbinLo] /=
_binv[idx] ;
1667 }
else if (i>=fbinM) {
1669 ibin = 2*fbinM-i-1 ;
1670 if (cdfBoundaries) {
1671 xarr[i-fbinLo] = binning.highBound()+1
e-10*(i-fbinM+1) ;
1672 yarr[i-fbinLo] = 1.0 ;
1674 auto idx = offsetIdx + idxMult * ibin;
1675 xarr[i-fbinLo] = 2*binning.highBound()-binning.binCenter(ibin) ;
1676 yarr[i - fbinLo] =
_wgt[idx];
1677 if (correctForBinSize)
1678 yarr[i - fbinLo] /=
_binv[idx];
1683 if (cdfBoundaries) {
1684 xarr[i-fbinLo] = binning.lowBound()-ibin*(1
e-10) ;
1685 yarr[i-fbinLo] = 0.0 ;
1687 auto idx = offsetIdx + idxMult * ibin;
1688 xarr[i-fbinLo] = 2*binning.lowBound()-binning.binCenter(ibin) ;
1689 yarr[i - fbinLo] =
_wgt[idx];
1690 if (correctForBinSize)
1691 yarr[i - fbinLo] /=
_binv[idx];
1712 if ((sumw2 > 0. || wgt != 1.) && !
_sumw2) {
1723 if (
_sumw2)
_sumw2[idx] += (sumw2 > 0 ? sumw2 : wgt*wgt);
1761 if (wgtErr > 0. && !
_sumw2) {
1768 _wgt[binNumber] = wgt ;
1782 if (
_curIndex == std::numeric_limits<std::size_t>::max()) {
1809 add(dset,&cutVar,wgt) ;
1823 std::unique_ptr<RooArgSet> tmp;
1826 tmp = std::make_unique<RooArgSet>();
1828 coutE(DataHandling) <<
"RooDataHist::add(" <<
GetName() <<
") Couldn't deep-clone cut variable, abort," << std::endl ;
1832 cloneVar =
static_cast<RooFormulaVar*
>(tmp->find(*cutVar)) ;
1840 if (!cloneVar || cloneVar->
getVal()) {
1869 const double theBinVolume = correctForBinSize ? (inverseBinCor ? 1/
_binv[i] :
_binv[i]) : 1.0 ;
1870 kahanSum +=
_wgt[i] * theBinVolume;
1877 return kahanSum.Sum();
1901 sliceOnlySet.
remove(sumSet,
true,
true) ;
1904 std::vector<double>
const * pbinv =
nullptr;
1906 if(correctForBinSize && inverseBinCor) {
1908 }
else if(correctForBinSize && !inverseBinCor) {
1916 for (
unsigned int i = 0; i <
_vars.
size(); ++i) {
1920 if (sumSet.
find(*arg)) {
1924 refBin[i] = argLv->
getBin();
1932 std::size_t tmpibin = ibin;
1936 for (
unsigned int ivar = 0; !skip && ivar <
_vars.
size(); ++ivar) {
1939 if (
mask[ivar] && idx!=refBin[ivar])
1944 const double theBinVolume = correctForBinSize ? (inverseBinCor ? 1/(*pbinv)[ibin] : (*pbinv)[ibin] ) : 1.0 ;
1971 bool correctForBinSize,
bool inverseBinCor,
1972 const std::map<
const RooAbsArg*, std::pair<double, double> >& ranges,
1973 std::function<
double(
int)> getBinScale)
1981 sliceOnlySet.
remove(sumSet,
true,
true);
1989 std::vector<double> rangeLo(
_vars.
size(), -std::numeric_limits<double>::infinity());
1990 std::vector<double> rangeHi(
_vars.
size(), +std::numeric_limits<double>::infinity());
1992 for (std::size_t i = 0; i <
_vars.
size(); ++i) {
2001 refBin[i] = argLV->
getBin();
2004 auto it = ranges.find(sumsetv ? sumsetv : slicesetv);
2005 if (ranges.end() != it) {
2006 rangeLo[i] = it->second.first;
2007 rangeHi[i] = it->second.second;
2016 for (
int ivar = 0, tmp = ibin; !skip && ivar <
int(
_vars.
size()); ++ivar) {
2019 if (
mask[ivar] && idx!=refBin[ivar]) skip =
true;
2028 double binVolumeSumSetFull = 1.;
2029 double binVolumeSumSetInRange = 1.;
2035 const auto arg =
_vars[ivar];
2036 if (!sumSet.
find(*arg)) {
2041 const double binLo =
_binbounds[ivar][2 * idx];
2042 const double binHi =
_binbounds[ivar][2 * idx + 1];
2043 if (binHi < rangeLo[ivar] || binLo > rangeHi[ivar]) {
2045 binVolumeSumSetInRange = 0.;
2049 binVolumeSumSetFull *= binHi - binLo;
2050 binVolumeSumSetInRange *= std::min(rangeHi[ivar], binHi) - std::max(rangeLo[ivar], binLo);
2052 const double corrPartial = binVolumeSumSetInRange / binVolumeSumSetFull;
2053 if (0. == corrPartial)
continue;
2054 const double corr = correctForBinSize ? (inverseBinCor ? binVolumeSumSetFull /
_binv[ibin] : binVolumeSumSetFull ) : 1.0;
2055 total += getBinScale(ibin)*(
_wgt[ibin] * corr * corrPartial);
2076 for (
auto const&
v :
_vars) {
2077 code += ((dimSet.
find(*
v) ? 1 : 0) << i) ;
2083 if(!pbinv.empty()) {
2090 for (std::size_t i = 0; i < selDim.size(); ++i) {
2091 selDim[i] = (code >> i) & 1 ;
2098 double theBinVolume(1) ;
2099 for (
unsigned int j=0; j <
_lvvars.size(); ++j) {
2109 pbinv[ibin] = theBinVolume ;
2133 if (cutSpec==
nullptr && cutRange==
nullptr) {
2138 std::unique_ptr<RooFormulaEvaluator> select;
2140 select = RooFormulaUtils::makeFormulaEvaluator(
"select", cutSpec, *
get());
2147 if ((select && RooFormulaUtils::evalFormula(*select,
_vars) == 0.) || (cutRange && !
_vars.
allInRange(cutRange)))
2153 return kahanSum.Sum();
2224 coutE(InputArguments) <<
"RooDataHist::sliceIterator() variable " << sliceArg.
GetName() <<
" is not part of this RooDataHist" << std::endl ;
2271 for (
const auto arg :
_vars) {
2277 os << arg->GetName() ;
2290 const double wgt =
_wgt[i];
2292 if (std::abs(std::modf(wgt, &intpart)) > 1.E-10)
2311 os <<
indent <<
" Observables " <<
_vars << std::endl ;
2313 os <<
indent <<
" Observables: " ;
2336 os <<
"Contents of RooDataHist \"" <<
GetName() <<
"\"" << std::endl;
2339 os <<
"(dataset is empty)" << std::endl;
2345 os <<
" Bin " << i <<
": ";
2348 for (
const auto* var : *obs) {
2349 if (!first) os <<
", ";
2352 os << var->GetName() <<
"=";
2353 if (
auto realVar =
dynamic_cast<const RooRealVar*
>(var)) {
2354 os << realVar->getVal();
2355 }
else if (
auto catVar =
dynamic_cast<const RooCategory*
>(var)) {
2356 os << catVar->getCurrentLabel();
2358 os <<
"(unsupported type)";
2364 os <<
", weight=" <<
weight(i) <<
" +/- [" << lo <<
"," <<
hi <<
"]"
2396 TTree* X_tree(
nullptr) ; R__b >> X_tree;
2403 _dstore = std::make_unique<RooTreeDataStore>(X_tree,
_vars);
2474 for (
const auto real :
_vars) {
2476 if(info.nRealVars == 0) info.realVarIdx1 = iVar;
2477 if(info.nRealVars == 1) info.realVarIdx2 = iVar;
2486 for (
unsigned int i=0; i <
_vars.
size(); ++i) {
2495 info.initialized =
true;
int Int_t
Signed integer 4 bytes (int)
short Version_t
Class version identifier (short)
static void indent(ostringstream &buf, int indent_level)
static unsigned int total
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 Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t mask
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 Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h offset
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 Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t UChar_t len
Option_t Option_t TPoint TPoint const char x2
Option_t Option_t TPoint TPoint const char x1
Option_t Option_t TPoint TPoint const char y2
Option_t Option_t TPoint TPoint const char y1
Int_t gDebug
Global variable setting the debug level. Set to 0 to disable, increase it in steps of 1 to increase t...
The Kahan summation is a compensated summation algorithm, which significantly reduces numerical error...
static KahanSum< T, N > Accumulate(Iterator begin, Iterator end, T initialValue=T{})
Iterate over a range and return an instance of a KahanSum.
Common abstract base class for objects that represent a value and a "shape" in RooFit.
void attachDataSet(const RooAbsData &set)
Replace server nodes with names matching the dataset variable names with those data set variables,...
Abstract base class for RooRealVar binning definitions.
int binNumber(double x) const
Returns the bin number corresponding to the value x.
virtual void binNumbers(double const *x, int *bins, std::size_t n, int coef=1) const =0
Compute the bin indices for multiple values of x.
virtual double binCenter(Int_t bin) const =0
Int_t numBins() const
Return number of bins.
virtual bool isUniform() const
virtual double highBound() const =0
virtual double lowBound() const =0
virtual std::string translateBinNumber(RooFit::Experimental::CodegenContext &ctx, RooAbsArg const &var, int coef) const
virtual RooAbsBinning * clone(const char *name=nullptr) const =0
Abstract base class for objects that represent a discrete value that can be set from the outside,...
Int_t numBins(const char *rangeName=nullptr) const override
Return the number of fit bins ( = number of types )
void setBin(Int_t ibin, const char *rangeName=nullptr) override
Set category to i-th fit bin, which is the i-th registered state.
bool hasLabel(const std::string &label) const
Check if a state with name label exists.
virtual const char * getCurrentLabel() const
Return label string of current state.
Abstract container object that can hold multiple RooAbsArg objects.
virtual bool remove(const RooAbsArg &var, bool silent=false, bool matchByNameOnly=false)
Remove the specified argument from our list.
RooAbsCollection & assignValueOnly(const RooAbsCollection &other, bool forceIfSizeOne=false)
Sets the value of any argument in our set that also appears in the other set.
bool allInRange(const char *rangeSpec) const
Return true if all contained object report to have their value inside the specified range.
virtual bool add(const RooAbsArg &var, bool silent=false)
Add the specified argument to list.
void assign(const RooAbsCollection &other) const
Sets the value, cache and constant attribute of any argument in our set that also appears in the othe...
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 double weight() const =0
virtual const RooArgSet * get() const
void printMultiline(std::ostream &os, Int_t contents, bool verbose=false, TString indent="") const override
Interface for detailed printing of object.
void SetName(const char *name) override
Set the name of the TNamed.
void setGlobalObservables(RooArgSet const &globalObservables)
Sets the global observables stored in this data.
static StorageType defaultStorageType
std::unique_ptr< RooAbsDataStore > _dstore
Data storage implementation.
RooArgSet _vars
Dimensions of this data set.
RooArgSet _cachedVars
! External variables cached with this data set
virtual Int_t numEntries() const
Return number of entries in dataset, i.e., count unweighted entries.
virtual double weightSquared() const =0
void Streamer(TBuffer &) override
Stream an object of class RooAbsData.
virtual RooPlot * plotOnImpl(RooPlot *frame, PlotOpt o) const
Create and fill a histogram of the frame's variable and append it to the frame.
Abstract base class for objects that are lvalues, i.e.
virtual Int_t getBin(const char *rangeName=nullptr) const =0
virtual double getBinWidth(Int_t i, const char *rangeName=nullptr) const =0
Abstract base class for objects that represent a real value that may appear on the left hand side of ...
virtual Int_t getBins(const char *name=nullptr) const
Get number of bins of currently defined range.
static constexpr int DefaultNBins
Historical default number of bins, injected by routines that need a concrete bin count when a variabl...
virtual double getMax(const char *name=nullptr) const
Get maximum of currently defined range.
void setBin(Int_t ibin, const char *rangeName=nullptr) override
Set value to center of bin 'ibin' of binning 'rangeName' (or of default binning if no range is specif...
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...
double getVal(const RooArgSet *normalisationSet=nullptr) const
Evaluate object.
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.
RooArgSet * snapshot(bool deepCopy=true) const
Use RooAbsCollection::snapshot(), but return as RooArgSet.
void Streamer(TBuffer &) override
Stream an object of class TObject.
RooArgSet * selectCommon(const RooAbsCollection &refColl) const
Use RooAbsCollection::selecCommon(), but return as RooArgSet.
Object to represent discrete states.
bool defineType(const std::string &label)
Define a state with given name.
Named container for two doubles, two integers two object points and three string pointers that can be...
Configurable parser for RooCmdArg named arguments.
void defineMutex(const char *head, Args_t &&... tail)
Define arguments where any pair is mutually exclusive.
bool process(const RooCmdArg &arg)
Process given RooCmdArg.
double getDouble(const char *name, double defaultValue=0.0) const
Return double property registered with name 'name'.
void defineDependency(const char *refArgName, const char *neededArgName)
Define that processing argument name refArgName requires processing of argument named neededArgName t...
bool defineDouble(const char *name, const char *argName, int doubleNum, double defValue=0.0)
Define double property name 'name' mapped to double in slot 'doubleNum' in RooCmdArg with name argNam...
RooArgSet * getSet(const char *name, RooArgSet *set=nullptr) const
Return RooArgSet property registered with name 'name'.
bool defineSet(const char *name, const char *argName, int setNum, const RooArgSet *set=nullptr)
Define TObject property name 'name' mapped to object in slot 'setNum' in RooCmdArg with name argName ...
bool ok(bool verbose) const
Return true of parsing was successful.
bool defineObject(const char *name, const char *argName, int setNum, const TObject *obj=nullptr, bool isArray=false)
Define TObject property name 'name' mapped to object in slot 'setNum' in RooCmdArg with name argName ...
const char * getString(const char *name, const char *defaultValue="", bool convEmptyToNull=false) const
Return string property registered with name 'name'.
bool defineString(const char *name, const char *argName, int stringNum, const char *defValue="", bool appendMode=false)
Define double property name 'name' mapped to double in slot 'stringNum' in RooCmdArg with name argNam...
const RooLinkedList & getObjectList(const char *name) const
Return list of objects registered with name 'name'.
bool defineInt(const char *name, const char *argName, int intNum, int defValue=0)
Define integer property name 'name' mapped to integer in slot 'intNum' in RooCmdArg with name argName...
int getInt(const char *name, int defaultValue=0) const
Return integer property registered with name 'name'.
TObject * getObject(const char *name, TObject *obj=nullptr) const
Return TObject property registered with name 'name'.
Container class to hold N-dimensional binned data.
std::span< const double > getWeightBatch(std::size_t first, std::size_t len, bool sumW2=false) const override
Return event weights of all events in range [first, first+len).
void interpolateQuadratic(double *output, std::span< const double > xVals, bool correctForBinSize, bool cdfBoundaries)
A vectorized version of interpolateDim for boundary safe quadratic interpolation of one dimensional h...
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...
Int_t _cache_sum_valid
! Is cache sum valid? Needs to be Int_t instead of CacheSumState_t for subclasses.
void printContents(std::ostream &os=std::cout) const override
Print the contents of the dataset to the specified output stream.
double interpolateDim(int iDim, double xval, size_t centralIdx, int intOrder, bool correctForBinSize, bool cdfBoundaries)
Perform boundary safe 'intOrder'-th interpolation of weights in dimension 'dim' at current value 'xva...
double weightSquared() const override
Return squared weight of last bin that was requested with get().
friend class RooDataHistSliceIter
void importTH1(const RooArgList &vars, const TH1 &histo, double initWgt, bool doDensityCorrection)
Import data from given TH1/2/3 into this RooDataHist.
TClass * IsA() const override
void SetNameTitle(const char *name, const char *title) override
Change the title of this RooDataHist.
double _cache_sum
! Cache for sum of entries ;
void initialize(const char *binningName=nullptr, bool fillTree=true)
Initialization procedure: allocate weights array, calculate multipliers needed for N-space to 1-dim a...
std::string declWeightArrayForCodeSquash(RooFit::Experimental::CodegenContext &ctx, bool correctForBinSize) const
Int_t getIndex(const RooAbsCollection &coord, bool fast=false) const
Calculate bin number of the given coordinates.
void add(const RooArgSet &row, double wgt=1.0) override
Add wgt to the bin content enclosed by the coordinates passed in row.
const std::vector< double > & calculatePartialBinVolume(const RooArgSet &dimSet) const
Fill the transient cache with partial bin volumes with up-to-date values for the partial volume speci...
static std::unique_ptr< RooAbsDataStore > makeDefaultDataStore(RooStringView name, RooStringView title, RooArgSet const &vars)
double weightInterpolated(const RooArgSet &bin, int intOrder, bool correctForBinSize, bool cdfBoundaries)
Return the weight at given coordinates with interpolation.
std::unordered_map< int, std::vector< double > > _pbinvCache
! Cache for arrays of partial bin volumes
void checkBinBounds() const
void initializeAsymErrArrays() const
double weight(std::size_t i) const
Return weight of i-th bin.
void set(std::size_t binNumber, double weight, double wgtErr)
Set bin content of bin that was last loaded with get(std::size_t).
void weightError(double &lo, double &hi, ErrorType etype=Poisson) const override
Return the asymmetric errors on the current weight.
double * _errHi
[_arrSize] High-side error on weight array
void importTH1Set(const RooArgList &vars, RooCategory &indexCat, std::map< std::string, TH1 * > hmap, double initWgt, bool doDensityCorrection)
Import data from given set of TH1/2/3 into this RooDataHist.
void adjustBinning(const RooArgList &vars, const TH1 &href, Int_t *offset=nullptr)
Adjust binning specification on first and optionally second and third observable to binning in given ...
double * _binv
[_arrSize] Bin volume array
RooDataHist()
Default constructor.
ULong64_t _curIndex
Current index.
std::string calculateTreeIndexForCodeSquash(RooFit::Experimental::CodegenContext &ctx, const RooAbsCollection &coords, bool reverse=false) const
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...
double weight() const override
Return weight of last bin that was requested with get().
std::vector< std::vector< double > > _binbounds
! list of bin bounds per dimension
void printArgs(std::ostream &os) const override
Print argument of dataset, i.e. the observable names.
void importDHistSet(const RooArgList &vars, RooCategory &indexCat, std::map< std::string, RooDataHist * > dmap, double initWgt)
Import data from given set of TH1/2/3 into this RooDataHist.
void _adjustBinning(RooRealVar &theirVar, const TAxis &axis, RooRealVar *ourVar, Int_t *offset)
Helper doing the actual work of adjustBinning().
void printMultiline(std::ostream &os, Int_t content, bool verbose=false, TString indent="") const override
Print the details on the dataset contents.
double * _sumw2
[_arrSize] Sum of weights^2
TIterator * sliceIterator(RooAbsArg &sliceArg, const RooArgSet &otherArgs)
Create an iterator over all bins in a slice defined by the subset of observables listed in sliceArg.
Int_t calcTreeIndex() const
Legacy overload to calculate the tree index from the current value of _vars.
~RooDataHist() override
Destructor.
bool isNonPoissonWeighted() const override
Returns true if dataset contains entries with a non-integer weight.
std::vector< RooAbsLValue * > _lvvars
! List of observables casted as RooAbsLValue
void SetName(const char *name) override
Change the name of the RooDataHist.
std::vector< std::unique_ptr< const RooAbsBinning > > _lvbins
! List of used binnings associated with lvalues
void Streamer(TBuffer &) override
Stream an object of class RooDataHist.
std::vector< double > _interpolationBuffer
! Buffer to contain values used for weight interpolation
std::vector< Int_t > _idxMult
void registerWeightArraysToDataStore() const
Hand over pointers to our weight arrays to the data store implementation.
void reset() override
Reset all bin weights to zero.
double * _errLo
[_arrSize] Low-side error on weight array
double * _wgt
[_arrSize] Weight array
RooPlot * plotOnImpl(RooPlot *frame, PlotOpt o) const override
Back end function to plotting functionality.
void printValue(std::ostream &os) const override
Print value of the dataset, i.e. the sum of weights contained in the dataset.
VarInfo const & getVarInfo()
Return reference to VarInfo struct with cached histogram variable information that is frequently used...
std::unique_ptr< RooAbsData > reduceEng(const RooArgSet &varSubset, const RooFormulaVar *cutVar, const char *cutRange=nullptr, std::size_t nStart=0, std::size_t nStop=std::numeric_limits< std::size_t >::max()) const override
Implementation of RooAbsData virtual method that drives the RooAbsData::reduce() methods.
const RooArgSet * get() const override
Get bin centre of current bin.
void interpolateLinear(double *output, std::span< const double > xVals, bool correctForBinSize, bool cdfBoundaries)
A vectorized version of interpolateDim for boundary safe linear interpolation of one dimensional hist...
double binVolume() const
Return volume of current bin.
double sumEntries() const override
Sum the weights of all bins.
Utility base class for RooFit objects that are to be attached to ROOT directories.
virtual void Streamer(TBuffer &)
void removeFromDir(TObject *obj)
Remove object from directory it was added to.
TDirectory * _dir
! Associated directory
A class to maintain the context for squashing of RooFit models into code.
std::string buildArg(RooAbsCollection const &x, std::string const &arrayType="double")
Function to save a RooListProxy as an array in the squashed code.
static const RooHistError & instance()
Return a reference to a singleton object that is created the first time this method is called.
bool getPoissonInterval(Int_t n, double &mu1, double &mu2, double nSigma=1) const
Calculate a confidence interval for the expected number of events given n observed (unweighted) event...
Collection class for internal use, storing a collection of RooAbsArg pointers in a doubly linked list...
RooLinkedListIterImpl begin() const
static double interpolate(double yArr[], Int_t nOrder, double x)
Plot frame and a container for graphics objects within that frame.
RooAbsRealLValue * getPlotVar() const
virtual void printStream(std::ostream &os, Int_t contents, StyleOption style, TString indent="") const
Print description of object on ostream, printing contents set by contents integer,...
Variable that can be changed from the outside.
void setRange(const char *name, double min, double max, bool shared=true)
Set a fit or plotting range.
void setBinning(const RooAbsBinning &binning, const char *name=nullptr, bool shared=true)
Add given binning under name 'name' with this variable.
const RooAbsBinning & getBinning(const char *name=nullptr, bool verbose=true, bool createOnTheFly=false, bool shared=true) const override
Return binning definition with name.
The RooStringView is a wrapper around a C-style string that can also be constructed from a std::strin...
const Double_t * GetArray() const
Class to manage histogram axis.
const TArrayD * GetXbins() const
virtual Int_t FindFixBin(Double_t x) const
Find bin number corresponding to abscissa x
Buffer base class used for serializing objects.
virtual Version_t ReadVersion(UInt_t *start=nullptr, UInt_t *bcnt=nullptr, const TClass *cl=nullptr)=0
virtual Int_t CheckByteCount(UInt_t startpos, UInt_t bcnt, const TClass *clss)=0
virtual void ReadFastArray(Bool_t *b, Int_t n)=0
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
static TClass * GetClass(const char *name, Bool_t load=kTRUE, Bool_t silent=kFALSE)
Static method returning pointer to TClass of the specified class name.
virtual TList * GetList() const
TH1 is the base class of all histogram classes in ROOT.
virtual Int_t GetNbinsY() const
virtual Double_t GetBinError(Int_t bin) const
Return value of error associated to bin number bin.
virtual Int_t GetNbinsZ() const
virtual Int_t GetDimension() const
virtual Int_t GetNbinsX() const
virtual Double_t GetBinContent(Int_t bin) const
Return content of bin number bin.
Iterator abstract base class.
void Add(TObject *obj) override
TObject * Remove(TObject *obj) override
Remove object from the list.
virtual void SetTitle(const char *title="")
Set the title of the TNamed.
const char * GetName() const override
Returns name of object.
const char * GetTitle() const override
Returns title of object.
Mother of all ROOT objects.
virtual const char * ClassName() const
Returns name of class to which the object belongs.
virtual void Streamer(TBuffer &)
Stream a string object.
A TTree represents a columnar dataset.
std::vector< std::string > Split(std::string_view str, std::string_view delims, bool skipEmpty=false)
Splits a string at each character in delims.
Structure to cache information on the histogram variable that is frequently used for histogram weight...