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));
170 std::map<string,TH1*> histMap,
double wgt) :
194 std::map<string,RooDataHist*> dhistMap,
double wgt) :
222 std::stringstream errorMsgStream;
223 errorMsgStream <<
"RooDataHist::ctor(" <<
GetName() <<
") ERROR: dimension of input histogram must match "
224 <<
"number of dimension variables";
225 const std::string errorMsg = errorMsgStream.str();
226 coutE(InputArguments) << errorMsg << std::endl;
227 throw std::invalid_argument(errorMsg);
277 RooAbsData(
name,title,
RooArgSet(vars,(
RooAbsArg*)
RooCmdConfig::decodeObjOnTheFly(
"RooDataHist::RooDataHist",
"IndexCat",0,nullptr,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8)))
285 pc.
defineInt(
"impDens",
"ImportHisto",0) ;
287 pc.
defineObject(
"impSliceData",
"ImportDataSlice",0,
nullptr,
true) ;
288 pc.
defineString(
"impSliceState",
"ImportDataSlice",0,
"",
true) ;
291 pc.
defineSet(
"glObs",
"GlobalObservables",0,
nullptr) ;
304 throw std::invalid_argument(
"Invalid command arguments passed to RooDataHist constructor!");
310 bool impDens = pc.
getInt(
"impDens") ;
311 double initWgt = pc.
getDouble(
"weight") ;
313 const char* impSliceNames = pc.
getString(
"impSliceState",
"",
true) ;
320 importTH1(vars,*impHist,initWgt, impDens) ;
322 }
else if (indexCat) {
326 std::map<std::string,RooDataHist*> dmap ;
327 std::map<std::string,TH1*> hmap ;
328 auto hiter = impSliceHistos.
begin() ;
329 for (
const auto& token :
ROOT::Split(impSliceNames,
",",
true)) {
330 if(
auto dHist =
dynamic_cast<RooDataHist*
>(*hiter)) {
333 if(
auto hHist =
dynamic_cast<TH1*
>(*hiter)) {
338 if(!dmap.empty() && !hmap.empty()) {
339 std::stringstream errorMsgStream;
340 errorMsgStream <<
"RooDataHist::ctor(" <<
GetName() <<
") ERROR: you can't import mix of TH1 and RooDataHist";
341 const std::string errorMsg = errorMsgStream.str();
342 coutE(InputArguments) << errorMsg << std::endl;
343 throw std::invalid_argument(errorMsg);
400 Int_t ix(0),iy(0),iz(0) ;
401 for (ix=0 ; ix < xvar->
getBins() ; ix++) {
404 for (iy=0 ; iy < yvar->
getBins() ; iy++) {
407 for (iz=0 ; iz < zvar->
getBins() ; iz++) {
409 double bv = doDensityCorrection ?
binVolume(vset) : 1;
413 double bv = doDensityCorrection ?
binVolume(vset) : 1;
418 double bv = doDensityCorrection ?
binVolume(vset) : 1 ;
426bool checkConsistentAxes(
const TH1*
first,
const TH1* second) {
442 constexpr double tolerance = 1
e-6;
444 auto const& vars1 = *
h1.get();
445 auto const& vars2 = *h2.
get();
448 if(!vars1.hasSameLayout(vars2)) {
452 for(std::size_t iVar = 0; iVar < vars1.size(); ++iVar) {
453 auto * var1 =
dynamic_cast<RooRealVar*
>(vars1[iVar]);
454 auto * var2 =
dynamic_cast<RooRealVar*
>(vars2[iVar]);
457 if((!var1 && var2) || (var1 && !var2))
return false;
464 auto const& bng2 = var2->getBinning();
467 if(bng1.numBins() != bng2.numBins())
return false;
469 std::size_t nBins = bng1.
numBins();
472 for(std::size_t iBin = 0; iBin < nBins; ++iBin) {
473 double v1 = bng1.binLow(iBin);
474 double v2 = bng2.binLow(iBin);
475 if(std::abs((
v1 -
v2) /
v1) > tolerance)
return false;
477 double v1 = bng1.binHigh(nBins - 1);
478 double v2 = bng2.binHigh(nBins - 1);
479 if(std::abs((
v1 -
v2) /
v1) > tolerance)
return false;
495 TH1* histo(
nullptr) ;
497 for (
const auto& hiter : hmap) {
500 histo = hiter.second;
502 if (!checkConsistentAxes(histo, hiter.second)) {
503 coutE(InputArguments) <<
"Axes of histogram " << hiter.second->
GetName() <<
" are not consistent with first processed "
504 <<
"histogram " << histo->
GetName() << std::endl;
505 throw std::invalid_argument(
"Axes of inputs for RooDataHist are inconsistent");
509 if (!indexCat.
hasLabel(hiter.first)) {
511 coutI(InputArguments) <<
"RooDataHist::importTH1Set(" <<
GetName() <<
") defining state \"" << hiter.first <<
"\" in index category " << indexCat.
GetName() << endl ;
520 coutE(InputArguments) <<
"RooDataHist::importTH1Set(" <<
GetName() <<
"): dimension of input histogram must match "
521 <<
"number of continuous variables" << endl ;
522 throw std::invalid_argument(
"Inputs histograms for RooDataHist are not compatible with dimensions of variables.");
558 Int_t ic(0),ix(0),iy(0),iz(0) ;
559 for (ic=0 ; ic < icat->
numBins(
nullptr) ; ic++) {
562 for (ix=0 ; ix < xvar->
getBins() ; ix++) {
565 for (iy=0 ; iy < yvar->
getBins() ; iy++) {
568 for (iz=0 ; iz < zvar->
getBins() ; iz++) {
570 double bv = doDensityCorrection ?
binVolume(vset)/avgBV : 1;
574 double bv = doDensityCorrection ?
binVolume(vset)/avgBV : 1;
579 double bv = doDensityCorrection ?
binVolume(vset)/avgBV : 1;
600 for (
const auto& diter : dmap) {
602 std::string
const& label = diter.first;
605 if(!dhistForBinning) {
606 dhistForBinning = dhist;
609 if(!hasConsistentLayoutAndBinning(*dhistForBinning, *dhist)) {
610 coutE(InputArguments) <<
"Layout or binning of histogram " << dhist->
GetName() <<
" is not consistent with first processed "
611 <<
"histogram " << dhistForBinning->
GetName() << std::endl;
612 throw std::invalid_argument(
"Layout or binning of inputs for RooDataHist is inconsistent");
619 coutI(InputArguments) <<
"RooDataHist::importDHistSet(" <<
GetName() <<
") defining state \"" << label <<
"\" in index category " << indexCat.
GetName() << endl ;
621 if (!icat->hasLabel(label)) {
622 icat->defineType(label) ;
627 for(
auto * theirVar : dynamic_range_cast<RooRealVar*>(dhistForBinning->
_vars)) {
629 if(!theirVar || !ourVar)
continue;
637 for (
const auto& diter : dmap) {
638 std::string
const& label = diter.first;
641 icat->setLabel(label.c_str()) ;
664 coutE(InputArguments) <<
"RooDataHist::adjustBinning(" << ownName <<
") ERROR: dimension " << ourVarName
665 <<
" must be real\n";
666 throw std::logic_error(
"Incorrect type object (" + ourVarName +
667 ") passed as argument to RooDataHist::_adjustBinning. Please report this issue.");
670 const double xlo = theirVar.
getMin();
671 const double xhi = theirVar.
getMax();
676 const double tolerance = 1
e-6 * xbins.averageBinWidth();
679 const double xloAdj = xbins.binLow(xbins.binNumber(xlo + tolerance));
680 const double xhiAdj = xbins.binHigh(xbins.binNumber(xhi - tolerance));
681 xbins.setRange(xloAdj, xhiAdj);
685 if (
true || std::abs(xloAdj - xlo) > tolerance || std::abs(xhiAdj - xhi) > tolerance) {
686 coutI(DataHandling) <<
"RooDataHist::adjustBinning(" << ownName <<
"): fit range of variable " << ourVarName
687 <<
" expanded to nearest bin boundaries: [" << xlo <<
"," << xhi <<
"] --> [" << xloAdj
688 <<
"," << xhiAdj <<
"]"
695 *
offset = xbins.rawBinNumber(xloAdj + tolerance);
701 const double tolerance = 1
e-6 * xbins.averageBinWidth();
704 const double xloAdj = xbins.binLow(xbins.binNumber(xlo + tolerance));
705 const double xhiAdj = xbins.binHigh(xbins.binNumber(xhi - tolerance));
706 xbins.setRange(xloAdj, xhiAdj);
709 if (std::abs(xloAdj - xlo) > tolerance || std::abs(xhiAdj - xhi) > tolerance) {
710 coutI(DataHandling) <<
"RooDataHist::adjustBinning(" << ownName <<
"): fit range of variable " << ourVarName
711 <<
" expanded to nearest bin boundaries: [" << xlo <<
"," << xhi <<
"] --> [" << xloAdj
712 <<
"," << xhiAdj <<
"]"
720 *
offset = xbins.rawBinNumber(xloAdj + tolerance);
756void cloneArray(
double*& ours,
const double* theirs, std::size_t
n) {
757 if (ours)
delete[] ours;
760 ours =
new double[
n];
761 std::copy(theirs, theirs+
n, ours);
765void initArray(
double*& arr, std::size_t
n,
double val) {
766 if (arr)
delete[] arr;
770 std::fill(arr, arr+
n, val);
786 for (
unsigned int i = 0; i <
_vars.
size(); ++i) {
798 const RooAbsBinning* binning = lvarg->getBinningPtr(
nullptr);
799 _lvbins.emplace_back(binning ? binning->
clone() :
nullptr);
808 for (
const auto var :
_vars) {
813 for (
unsigned int i = 0u; i<
n; i++) {
837 if (!fillTree) return ;
843 Int_t j(0), idx(0), tmp(ibin) ;
844 double theBinVolume(1) ;
849 theBinVolume *= arg2->getBinWidth(idx) ;
851 _binv[ibin] = theBinVolume ;
868 std::vector<double>& bounds =
_binbounds.back();
869 bounds.reserve(2 * it->numBins());
870 for (
Int_t i = 0; i < it->numBins(); ++i) {
871 bounds.push_back(it->binLow(i));
872 bounds.push_back(it->binHigh(i));
883 RooAbsData(other,newname),
RooDirItem(), _arrSize(other._arrSize), _idxMult(other._idxMult), _pbinvCache(other._pbinvCache)
894 for (
const auto rvarg :
_vars) {
898 const RooAbsBinning* binning = lvarg->getBinningPtr(
nullptr);
899 _lvbins.emplace_back(binning ? binning->
clone() :
nullptr) ;
912 std::size_t nStart, std::size_t nStop)
917 auto rdh = std::make_unique<RooDataHist>(
GetName(),
GetTitle(), myVarSubset);
920 std::unique_ptr<RooArgSet> tmp;
922 tmp = std::make_unique<RooArgSet>();
925 coutE(DataHandling) <<
"RooDataHist::reduceEng(" <<
GetName() <<
") Couldn't deep-clone cut variable, abort," << endl ;
933 const std::size_t nevt = nStop < static_cast<std::size_t>(
numEntries()) ? nStop :
static_cast<std::size_t
>(
numEntries());
934 for (
auto i=nStart; i<nevt ; i++) {
937 bool doSelect(
true) ;
939 for (
const auto arg : *row) {
940 if (!arg->inRange(cutRange)) {
946 if (!doSelect) continue ;
948 if (!cloneVar || cloneVar->
getVal()) {
950 rdh->add(*row,
weight(),lo*lo) ;
990 bool correctForBinSize)
const
994 std::string arrayDecl =
"double " + weightName +
"[" + std::to_string(
_arrSize) +
"] = {";
996 arrayDecl +=
" " + std::to_string(
_wgt[i]) + (correctForBinSize ?
" / " + std::to_string(
_binv[i]) :
"") +
",";
998 arrayDecl.back() =
' ';
1012 ctx.
addToCodeBody(klass,
"unsigned int " + idxName +
" = 0;\n");
1015 for (std::size_t i = 0; i <
_vars.
size(); ++i) {
1017 std::size_t iVar = reverse ?
_vars.
size() - 1 - i : i;
1023 coutE(InputArguments) <<
"RooHistPdf::weight(" <<
GetName()
1024 <<
") ERROR: Code Squashing currently does not support category values." << std::endl;
1027 coutE(InputArguments) <<
"RooHistPdf::weight(" <<
GetName()
1028 <<
") ERROR: Code Squashing currently only supports uniformly binned cases."
1033 std::string
const &bin = ctx.
buildCall(
"RooFit::Detail::EvaluateFuncs::getUniformBinning", binning->
lowBound(),
1035 ctx.
addToCodeBody(klass, idxName +
" += " + std::to_string(idxMult) +
" * " + bin +
";\n");
1039 idxMult *=
dynamic_cast<RooAbsLValue const *
>(internalVar)->numBins();
1063 if (&
_vars == &coords)
1066 std::size_t masterIdx = 0;
1068 for (
unsigned int i=0; i <
_vars.
size(); ++i) {
1075 const RooAbsArg* theVar = fast ? coords[i] : coords.
find(*internalVar);
1078 theVar = internalVar;
1088 assert(
dynamic_cast<const RooAbsReal*
>(theVar));
1089 const double val =
static_cast<const RooAbsReal*
>(theVar)->getVal();
1095 masterIdx +=
_idxMult[i] * cat->
getBin(
static_cast<const char*
>(
nullptr));
1121 <<
":plotOn: frame does not specify a plot variable" << endl;
1128 <<
":plotOn: dataset doesn't contain plot frame variable" << endl;
1132 o.
bins = &dataVar->getBinning() ;
1153 bool correctForBinSize,
bool cdfBoundaries)
1156 const std::size_t nEvents = xVals.size();
1160 auto binIndices =
reinterpret_cast<int*
>(
output + nEvents) - nEvents;
1161 std::fill(binIndices, binIndices + nEvents, 0);
1162 binning.
binNumbers(xVals.data(), binIndices, nEvents);
1167 std::vector<double> coordsExt(nBins+3);
1168 double* binCoords = coordsExt.data() + 2;
1170 for (std::size_t binIdx = 1; binIdx < nBins ; ++binIdx) {
1172 double binWidth =
_binv[0];
1173 binCoords[binIdx] = binIdx*binWidth + binCoords[0];
1176 double binCentDiff = 0.5*
_binv[binIdx-1] + 0.5*
_binv[binIdx];
1177 binCoords[binIdx] = binCoords[binIdx-1] + binCentDiff;
1181 std::vector<double> weightsExt(nBins+3);
1183 for (std::size_t binIdx = 0; binIdx < nBins; ++binIdx) {
1184 weightsExt[binIdx+2] = correctForBinSize ?
_wgt[binIdx] /
_binv[binIdx] :
_wgt[binIdx];
1187 if (cdfBoundaries) {
1188 coordsExt[0] = - 1
e-10 + binning.
lowBound();
1194 coordsExt[nBins+2] = binning.
highBound();
1195 weightsExt[nBins+2] = 1.;
1199 coordsExt[0] = binCoords[1] - 2*
_binv[0] -
_binv[1];
1200 weightsExt[0] = weightsExt[3];
1202 coordsExt[1] = binCoords[0] -
_binv[0];
1203 weightsExt[1] = weightsExt[2];
1205 coordsExt[nBins+2] = binCoords[nBins-1] +
_binv[nBins-1];
1206 weightsExt[nBins+2] = weightsExt[nBins+1];
1211 for (std::size_t i = 0; i < nEvents ; ++i) {
1212 double xVal = xVals[i];
1213 std::size_t binIdx = binIndices[i] + 2;
1217 if (xVal > coordsExt[binIdx]) {
1221 double x1 = coordsExt[binIdx-2];
1222 double y1 = weightsExt[binIdx-2];
1224 double x2 = coordsExt[binIdx-1];
1225 double y2 = weightsExt[binIdx-1];
1227 double x3 = coordsExt[binIdx];
1228 double y3 = weightsExt[binIdx];
1231 double quotient = (x3-
x1) / (
x2-
x1);
1232 double x1Sqrd =
x1*
x1;
1233 double x3Sqrd = x3*x3;
1235 double secondCoeff = (y3 -
y1 - (
y2-
y1) * quotient) / (x3Sqrd - x1Sqrd - (
x2*
x2 - x1Sqrd) * quotient);
1236 double firstCoeff = (y3 -
y1 - secondCoeff*(x3Sqrd - x1Sqrd)) / (x3-
x1);
1237 double zerothCoeff =
y1 - secondCoeff*x1Sqrd - firstCoeff*
x1;
1239 output[i] = secondCoeff * xVal * xVal + firstCoeff * xVal + zerothCoeff;
1260 bool correctForBinSize,
bool cdfBoundaries)
1263 const std::size_t nEvents = xVals.size();
1267 auto binIndices =
reinterpret_cast<int*
>(
output + nEvents) - nEvents;
1268 std::fill(binIndices, binIndices + nEvents, 0);
1269 binning.
binNumbers(xVals.data(), binIndices, nEvents);
1274 std::vector<double> coordsExt(nBins+2);
1275 double* binCoords = coordsExt.data() + 1;
1277 for (std::size_t binIdx = 1; binIdx < nBins ; ++binIdx) {
1279 double binWidth =
_binv[0];
1280 binCoords[binIdx] = binIdx*binWidth + binCoords[0];
1283 double binCentDiff = 0.5*
_binv[binIdx-1] + 0.5*
_binv[binIdx];
1284 binCoords[binIdx] = binCoords[binIdx-1] + binCentDiff;
1288 std::vector<double> weightsExt(nBins+2);
1290 for (std::size_t binIdx = 0; binIdx < nBins; ++binIdx) {
1291 weightsExt[binIdx+1] = correctForBinSize ?
_wgt[binIdx] /
_binv[binIdx] :
_wgt[binIdx];
1295 if (cdfBoundaries) {
1298 coordsExt[nBins+1] = binning.
highBound();
1299 weightsExt[nBins+1] = 1.;
1303 coordsExt[0] = binCoords[0] -
_binv[0];
1304 weightsExt[0] = weightsExt[1];
1305 coordsExt[nBins+1] = binCoords[nBins-1] +
_binv[nBins-1];
1306 weightsExt[nBins+1] = weightsExt[nBins];
1311 for (std::size_t i = 0; i < nEvents ; ++i) {
1312 double xVal = xVals[i];
1313 std::size_t binIdx = binIndices[i] + 1;
1317 if (xVal > coordsExt[binIdx]) { binIdx += 1; }
1319 double x1 = coordsExt[binIdx-1];
1320 double y1 = weightsExt[binIdx-1];
1321 double x2 = coordsExt[binIdx];
1322 double y2 = weightsExt[binIdx];
1325 double firstCoeff = (
y2-
y1) / (
x2-
x1);
1326 double zerothCoeff =
y1 - firstCoeff *
x1;
1328 output[i] = firstCoeff * xVal + zerothCoeff;
1349 auto const nEvents = xVals.size();
1351 if (intOrder == 0) {
1355 auto binIndices =
reinterpret_cast<int*
>(
output + nEvents) - nEvents;
1356 std::fill(binIndices, binIndices + nEvents, 0);
1357 binning.
binNumbers(xVals.data(), binIndices, nEvents);
1359 for (std::size_t i=0; i < nEvents; ++i) {
1360 auto binIdx = binIndices[i];
1364 else if (intOrder == 1) {
1367 else if (intOrder == 2) {
1372 coutE(InputArguments) <<
"RooDataHist::weights(" <<
GetName() <<
") interpolation in "
1373 << intOrder <<
" dimensions not yet implemented" << std::endl ;
1375 weights(
output, xVals, 1, correctForBinSize, cdfBoundaries);
1401 coutE(InputArguments) <<
"RooDataHist::weight(" <<
GetName() <<
") ERROR: interpolation order must be positive" << endl ;
1408 return correctForBinSize ?
_wgt[idx] /
_binv[idx] :
_wgt[idx];
1436 coutE(InputArguments) <<
"RooDataHist::weight(" <<
GetName() <<
") ERROR: interpolation order must be positive" << endl ;
1443 return correctForBinSize ?
_wgt[idx] /
_binv[idx] :
_wgt[idx];
1490 double xval = realX.
getVal() ;
1491 double yval = realY.getVal() ;
1496 int ybinLo = ybinC-intOrder/2 - ((yval<binningY.
binCenter(ybinC))?1:0) ;
1497 int ybinM = binningY.
numBins() ;
1500 auto offsetIdx = centralIdx - idxMultY * ybinC;
1504 double * xarr = yarr + intOrder + 1;
1505 for (
int i=ybinLo ; i<=intOrder+ybinLo ; i++) {
1507 if (i>=0 && i<ybinM) {
1510 xarr[i-ybinLo] = binningY.
binCenter(ibin) ;
1511 }
else if (i>=ybinM) {
1513 ibin = 2*ybinM-i-1 ;
1520 auto centralIdxX = offsetIdx + idxMultY * ibin;
1525 cout <<
"RooDataHist interpolating data is" << endl ;
1527 for (
int q=0;
q<=intOrder ;
q++) cout << xarr[
q] <<
" " ;
1528 cout <<
" yarr = " ;
1529 for (
int q=0;
q<=intOrder ;
q++) cout << yarr[
q] <<
" " ;
1537 coutE(InputArguments) <<
"RooDataHist::weight(" <<
GetName() <<
") interpolation in "
1538 << varInfo.
nRealVars <<
" dimensions not yet implemented" << endl ;
1539 return weightFast(bin,0,correctForBinSize,cdfBoundaries) ;
1573 throw std::invalid_argument(
"RooDataHist::weightError(" + std::string(
GetName()) +
") error type Auto not allowed here");
1577 throw std::invalid_argument(
"RooDataHist::weightError(" + std::string(
GetName()) +
") error type Expected not allowed here");
1635 auto const& binning =
static_cast<RooRealVar&
>(*
_vars[iDim]).getBinning();
1638 int fbinC = binning.binNumber(xval) ;
1639 int fbinLo = fbinC-intOrder/2 - ((xval<binning.binCenter(fbinC))?1:0) ;
1640 int fbinM = binning.numBins() ;
1643 auto offsetIdx = centralIdx - idxMult * fbinC;
1647 double * xarr = yarr + intOrder + 1;
1649 for (
int i=fbinLo ; i<=intOrder+fbinLo ; i++) {
1651 if (i>=0 && i<fbinM) {
1654 xarr[i-fbinLo] = binning.binCenter(ibin) ;
1655 auto idx = offsetIdx + idxMult * ibin;
1656 yarr[i - fbinLo] =
_wgt[idx];
1657 if (correctForBinSize) yarr[i-fbinLo] /=
_binv[idx] ;
1658 }
else if (i>=fbinM) {
1660 ibin = 2*fbinM-i-1 ;
1661 if (cdfBoundaries) {
1662 xarr[i-fbinLo] = binning.highBound()+1
e-10*(i-fbinM+1) ;
1663 yarr[i-fbinLo] = 1.0 ;
1665 auto idx = offsetIdx + idxMult * ibin;
1666 xarr[i-fbinLo] = 2*binning.highBound()-binning.binCenter(ibin) ;
1667 yarr[i - fbinLo] =
_wgt[idx];
1668 if (correctForBinSize)
1669 yarr[i - fbinLo] /=
_binv[idx];
1674 if (cdfBoundaries) {
1675 xarr[i-fbinLo] = binning.lowBound()-ibin*(1
e-10) ;
1676 yarr[i-fbinLo] = 0.0 ;
1678 auto idx = offsetIdx + idxMult * ibin;
1679 xarr[i-fbinLo] = 2*binning.lowBound()-binning.binCenter(ibin) ;
1680 yarr[i - fbinLo] =
_wgt[idx];
1681 if (correctForBinSize)
1682 yarr[i - fbinLo] /=
_binv[idx];
1703 if ((sumw2 > 0. || wgt != 1.) && !
_sumw2) {
1714 if (
_sumw2)
_sumw2[idx] += (sumw2 > 0 ? sumw2 : wgt*wgt);
1752 if (wgtErr > 0. && !
_sumw2) {
1759 _wgt[binNumber] = wgt ;
1773 if (
_curIndex == std::numeric_limits<std::size_t>::max()) {
1800 add(dset,&cutVar,wgt) ;
1814 std::unique_ptr<RooArgSet> tmp;
1817 tmp = std::make_unique<RooArgSet>();
1819 coutE(DataHandling) <<
"RooDataHist::add(" <<
GetName() <<
") Couldn't deep-clone cut variable, abort," << endl ;
1831 if (!cloneVar || cloneVar->
getVal()) {
1860 const double theBinVolume = correctForBinSize ? (inverseBinCor ? 1/
_binv[i] :
_binv[i]) : 1.0 ;
1861 kahanSum +=
_wgt[i] * theBinVolume;
1868 return kahanSum.Sum();
1892 sliceOnlySet.
remove(sumSet,
true,
true) ;
1895 std::vector<double>
const * pbinv =
nullptr;
1897 if(correctForBinSize && inverseBinCor) {
1899 }
else if(correctForBinSize && !inverseBinCor) {
1907 for (
unsigned int i = 0; i <
_vars.
size(); ++i) {
1911 if (sumSet.
find(*arg)) {
1915 refBin[i] = argLv->
getBin();
1923 std::size_t tmpibin = ibin;
1927 for (
unsigned int ivar = 0; !skip && ivar <
_vars.
size(); ++ivar) {
1930 if (
mask[ivar] && idx!=refBin[ivar])
1935 const double theBinVolume = correctForBinSize ? (inverseBinCor ? 1/(*pbinv)[ibin] : (*pbinv)[ibin] ) : 1.0 ;
1962 bool correctForBinSize,
bool inverseBinCor,
1963 const std::map<
const RooAbsArg*, std::pair<double, double> >& ranges,
1964 std::function<
double(
int)> getBinScale)
1972 sliceOnlySet.
remove(sumSet,
true,
true);
1980 std::vector<double> rangeLo(
_vars.
size(), -std::numeric_limits<double>::infinity());
1981 std::vector<double> rangeHi(
_vars.
size(), +std::numeric_limits<double>::infinity());
1983 for (std::size_t i = 0; i <
_vars.
size(); ++i) {
1992 refBin[i] = argLV->
getBin();
1995 auto it = ranges.find(sumsetv ? sumsetv : slicesetv);
1996 if (ranges.end() != it) {
1997 rangeLo[i] = it->second.first;
1998 rangeHi[i] = it->second.second;
2007 for (
int ivar = 0, tmp = ibin; !skip && ivar <
int(
_vars.
size()); ++ivar) {
2010 if (
mask[ivar] && idx!=refBin[ivar]) skip =
true;
2019 double binVolumeSumSetFull = 1.;
2020 double binVolumeSumSetInRange = 1.;
2026 const auto arg =
_vars[ivar];
2027 if (!sumSet.
find(*arg)) {
2032 const double binLo =
_binbounds[ivar][2 * idx];
2033 const double binHi =
_binbounds[ivar][2 * idx + 1];
2034 if (binHi < rangeLo[ivar] || binLo > rangeHi[ivar]) {
2036 binVolumeSumSetInRange = 0.;
2040 binVolumeSumSetFull *= binHi - binLo;
2041 binVolumeSumSetInRange *= std::min(rangeHi[ivar], binHi) - std::max(rangeLo[ivar], binLo);
2043 const double corrPartial = binVolumeSumSetInRange / binVolumeSumSetFull;
2044 if (0. == corrPartial)
continue;
2045 const double corr = correctForBinSize ? (inverseBinCor ? binVolumeSumSetFull /
_binv[ibin] : binVolumeSumSetFull ) : 1.0;
2046 total += getBinScale(ibin)*(
_wgt[ibin] * corr * corrPartial);
2067 for (
auto const&
v :
_vars) {
2068 code += ((dimSet.
find(*
v) ? 1 : 0) << i) ;
2074 if(!pbinv.empty()) {
2081 for (std::size_t i = 0; i < selDim.size(); ++i) {
2082 selDim[i] = (code >> i) & 1 ;
2087 Int_t idx(0), tmp(ibin) ;
2088 double theBinVolume(1) ;
2089 for (
unsigned int j=0; j <
_lvvars.size(); ++j) {
2099 pbinv[ibin] = theBinVolume ;
2123 if (cutSpec==
nullptr && cutRange==
nullptr) {
2128 std::unique_ptr<RooFormula> select;
2130 select = std::make_unique<RooFormula>(
"select",cutSpec,*
get());
2137 if ((select && select->eval() == 0.) || (cutRange && !
_vars.
allInRange(cutRange)))
2143 return kahanSum.Sum();
2214 coutE(InputArguments) <<
"RooDataHist::sliceIterator() variable " << sliceArg.
GetName() <<
" is not part of this RooDataHist" << endl ;
2261 for (
const auto arg :
_vars) {
2267 os << arg->GetName() ;
2280 const double wgt =
_wgt[i];
2282 if (std::abs(std::modf(wgt, &intpart)) > 1.E-10)
2301 os <<
indent <<
" Observables " <<
_vars << endl ;
2303 os <<
indent <<
" Observables: " ;
2348 TTree* X_tree(
nullptr) ; R__b >> X_tree;
2355 _dstore = std::make_unique<RooTreeDataStore>(X_tree,
_vars);
2426 for (
const auto real :
_vars) {
2428 if(info.nRealVars == 0) info.realVarIdx1 = iVar;
2429 if(info.nRealVars == 1) info.realVarIdx2 = iVar;
2438 for (
unsigned int i=0; i <
_vars.
size(); ++i) {
2447 info.initialized =
true;
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
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.
RooAbsArg is the common abstract base class for objects that represent a value and a "shape" in RooFi...
void attachDataSet(const RooAbsData &set)
Replace server nodes with names matching the dataset variable names with those data set variables,...
RooAbsBinning is the 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 RooAbsBinning * clone(const char *name=nullptr) const =0
RooAbsCategoryLValue is the common abstract base class for objects that represent a discrete value th...
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.
Int_t getBin(const char *=nullptr) const override
Get the index of the plot bin for the current value of this category.
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.
RooAbsCollection is an 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.
Int_t getSize() const
Return the number of elements in the collection.
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.
bool selectCommon(const RooAbsCollection &refColl, RooAbsCollection &outColl) const
Create a subset of the current collection, consisting only of those elements that are contained as we...
RooAbsArg * find(const char *name) const
Find object with given name in list.
RooAbsData is the common 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.
virtual RooPlot * plotOn(RooPlot *frame, 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
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.
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
RooAbsRealLValue is the common abstract base class for objects that represent a real value that may a...
virtual Int_t getBins(const char *name=nullptr) const
Get number of bins of currently defined range.
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.
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.
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.
Class RooBinning is an implements RooAbsBinning in terms of an array of boundary values,...
RooCategory is an object to represent discrete states.
bool defineType(const std::string &label)
Define a state with given name.
RooCmdArg is a named container for two doubles, two integers two object points and three string point...
Class RooCmdConfig is a 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'.
The RooDataHist is a 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.
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.
void printDataHistogram(std::ostream &os, RooRealVar *obs) const
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 calculateTreeIndexForCodeSquash(RooAbsArg const *klass, RooFit::Detail::CodeSquashContext &ctx, const RooAbsCollection &coords, bool reverse=false) 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.
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...
RooPlot * plotOn(RooPlot *frame, PlotOpt o) const override
Back end function to plotting functionality.
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::string declWeightArrayForCodeSquash(RooAbsArg const *klass, RooFit::Detail::CodeSquashContext &ctx, bool correctForBinSize) const
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
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()) 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.
RooDirItem is a 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
void appendToDir(TObject *obj, bool forceMemoryResident=false)
Append object to directory.
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.
std::string makeValidVarName(TString in) const
Transform a string into a valid C++ variable name by replacing forbidden.
void addToCodeBody(RooAbsArg const *klass, std::string const &in)
Adds the input string to the squashed code body.
std::string getTmpVarName()
Get a unique variable name to be used in the generated 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
Return a confidence interval for the expected number of events given n observed (unweighted) events.
RooLinkedList is an collection class for internal use, storing a collection of RooAbsArg pointers in ...
RooLinkedListIterImpl begin() const
static double interpolate(double yArr[], Int_t nOrder, double x)
A RooPlot is a 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,...
RooRealVar represents a variable that can be changed from the outside.
const RooAbsBinning & getBinning(const char *name=nullptr, bool verbose=true, bool createOnTheFly=false) const override
Return binning definition with name.
void setBinning(const RooAbsBinning &binning, const char *name=nullptr)
Add given binning under name 'name' with this variable.
void setRange(const char *name, double min, double max)
Set a fit or plotting range.
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
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.
LongDouble_t Power(LongDouble_t x, LongDouble_t y)
Returns x raised to the power y.
Structure to cache information on the histogram variable that is frequently used for histogram weight...