120using std::endl, std::string, std::map, std::list, std::ifstream, std::ofstream, std::ostream;
124#ifndef USEMEMPOOLFORDATASET
130RooDataSet::MemPool* RooDataSet::memPool() {
131 RooSentinel::activate();
132 static auto * memPool =
new RooDataSet::MemPool();
137 auto pool = memPool();
153void* RooDataSet::operator
new (
size_t bytes)
158 return memPool()->allocate(
bytes);
166void RooDataSet::operator
delete (
void* ptr)
169 if (memPool()->deallocate(ptr))
172 std::cerr << __func__ <<
" " << ptr <<
" is not in any of the pools." << std::endl;
175 ::operator
delete(ptr);
191struct FinalizeVarsOutput {
193 std::unique_ptr<RooRealVar> weight;
194 std::string weightVarName;
198FinalizeVarsOutput finalizeVars(
RooArgSet const &vars,
200 const char* wgtVarName,
205 FinalizeVarsOutput
out;
206 out.finalVars.add(vars);
210 std::vector<RooAbsData*> weightedImpDatasets;
211 if(impData && impData->
isWeighted()) weightedImpDatasets.push_back(impData);
213 if(
data->isWeighted()) {
214 weightedImpDatasets.push_back(
data);
218 bool needsWeightErrors =
false;
223 needsWeightErrors =
true;
228 out.finalVars.add(*indexCat,
true);
231 out.weightVarName = wgtVarName ? wgtVarName :
"";
233 if(
out.weightVarName.empty()) {
239 out.weightVarName = ds->weightVar()->GetName();
253 if (!
out.weightVarName.empty() && !wgtVar) {
254 const char*
name =
out.weightVarName.c_str();
255 out.weight = std::make_unique<RooRealVar>(
name,
name, 1.0);
256 wgtVar =
out.weight.get();
257 out.finalVars.add(*
out.weight);
260 if(needsWeightErrors) {
261 out.errorSet.add(*wgtVar);
265 if(errorSet)
out.errorSet.add(*errorSet,
true);
271std::unique_ptr<RooDataSet> makeDataSetFromDataHist(
RooDataHist const &hist)
276 const char* wgtName = wgtVarCmdArg.
getString(0);
339 RooCmdConfig pc(
"RooDataSet::ctor(" + std::string(GetName()) +
")");
340 pc.defineInt(
"ownLinked",
"OwnLinked",0) ;
341 pc.defineObject(
"impTree",
"ImportTree",0) ;
342 pc.defineObject(
"impData",
"ImportData",0) ;
343 pc.defineObject(
"indexCat",
"IndexCat",0) ;
344 pc.defineObject(
"impSliceData",
"ImportDataSlice",0,
nullptr,
true) ;
345 pc.defineString(
"impSliceState",
"ImportDataSlice",0,
"",
true) ;
346 pc.defineObject(
"lnkSliceData",
"LinkDataSlice",0,
nullptr,
true) ;
347 pc.defineString(
"lnkSliceState",
"LinkDataSlice",0,
"",
true) ;
348 pc.defineString(
"cutSpec",
"CutSpec",0,
"") ;
349 pc.defineObject(
"cutVar",
"CutVar",0) ;
350 pc.defineString(
"cutRange",
"CutRange",0,
"") ;
351 pc.defineString(
"wgtVarName",
"WeightVarName",0,
"") ;
352 pc.defineInt(
"newWeight1",
"WeightVarName",0,0) ;
353 pc.defineString(
"fname",
"ImportFromFile",0,
"") ;
354 pc.defineString(
"tname",
"ImportFromFile",1,
"") ;
355 pc.defineObject(
"wgtVar",
"WeightVar",0) ;
356 pc.defineInt(
"newWeight2",
"WeightVar",0,0) ;
357 pc.defineObject(
"dummy1",
"ImportDataSliceMany",0) ;
358 pc.defineObject(
"dummy2",
"LinkDataSliceMany",0) ;
359 pc.defineSet(
"errorSet",
"StoreError",0) ;
360 pc.defineSet(
"asymErrSet",
"StoreAsymError",0) ;
361 pc.defineSet(
"glObs",
"GlobalObservables",0,
nullptr) ;
362 pc.defineMutex(
"ImportTree",
"ImportData",
"ImportDataSlice",
"LinkDataSlice",
"ImportFromFile") ;
363 pc.defineMutex(
"CutSpec",
"CutVar") ;
364 pc.defineMutex(
"WeightVarName",
"WeightVar") ;
365 pc.defineDependency(
"ImportDataSlice",
"IndexCat") ;
366 pc.defineDependency(
"LinkDataSlice",
"IndexCat") ;
367 pc.defineDependency(
"OwnLinked",
"LinkDataSlice") ;
379 const std::string errMsg =
"Error in RooDataSet constructor: command argument list could not be processed";
380 coutE(InputArguments) << errMsg << std::endl;
381 throw std::invalid_argument(errMsg);
384 if(pc.getSet(
"glObs")) setGlobalObservables(*pc.getSet(
"glObs"));
387 TTree* impTree =
static_cast<TTree*
>(pc.getObject(
"impTree")) ;
388 auto impData =
static_cast<RooAbsData*
>(pc.getObject(
"impData")) ;
390 const char* cutSpec = pc.getString(
"cutSpec",
"",
true) ;
391 const char* cutRange = pc.getString(
"cutRange",
"",
true) ;
392 const char* wgtVarName = pc.getString(
"wgtVarName",
"",
true) ;
394 const char* impSliceNames = pc.getString(
"impSliceState",
"",
true) ;
395 const RooLinkedList& impSliceData = pc.getObjectList(
"impSliceData") ;
396 const char* lnkSliceNames = pc.getString(
"lnkSliceState",
"",
true) ;
397 const RooLinkedList& lnkSliceData = pc.getObjectList(
"lnkSliceData") ;
399 RooArgSet* asymErrorSet = pc.getSet(
"asymErrSet") ;
400 const char* fname = pc.getString(
"fname") ;
401 const char* tname = pc.getString(
"tname") ;
402 Int_t ownLinked = pc.getInt(
"ownLinked") ;
403 Int_t newWeight = pc.getInt(
"newWeight1") + pc.getInt(
"newWeight2") ;
407 wgtVarName = wgtVar->
GetName();
410 auto finalVarsInfo = finalizeVars(vars,indexCat,wgtVarName,impData,impSliceData, pc.getSet(
"errorSet"));
411 initializeVars(finalVarsInfo.finalVars);
412 if(!finalVarsInfo.weightVarName.empty()) {
413 wgtVarName = finalVarsInfo.weightVarName.c_str();
416 RooArgSet* errorSet = finalVarsInfo.errorSet.
empty() ? nullptr : &finalVarsInfo.errorSet;
422 map<string,RooAbsData*> hmap ;
425 strlcpy(tmp, lnkSliceNames, 64000);
426 char *token = strtok(tmp,
",");
427 auto hiter = lnkSliceData.
begin();
429 hmap[token] =
static_cast<RooAbsData *
>(*hiter);
430 token = strtok(
nullptr,
",");
435 appendToDir(
this,
true) ;
440 map<string,RooAbsDataStore*> storeMap ;
443 throw std::string(
"RooDataSet::RooDataSet() ERROR in constructor, cannot find index category") ;
445 for (map<string,RooAbsData*>::iterator hiter = hmap.begin() ; hiter!=hmap.end() ; ++hiter) {
447 if (indexCat && !indexCat->
hasLabel(hiter->first)) {
449 coutI(InputArguments) <<
"RooDataSet::ctor(" << GetName() <<
") defining state \"" << hiter->first <<
"\" in index category " << indexCat->
GetName() << endl ;
451 if (icat && !icat->
hasLabel(hiter->first)) {
454 icat->
setLabel(hiter->first.c_str()) ;
459 addOwnedComponent(hiter->first.c_str(),*hiter->second) ;
464 _dstore = std::make_unique<RooCompositeDataStore>(
name,title,_vars,*icat,storeMap) ;
471 if (defaultStorageType==Tree) {
472 _dstore = std::make_unique<RooTreeDataStore>(
name,title,_vars,wgtVarName) ;
474 }
else if (defaultStorageType==Vector) {
475 if (wgtVarName && newWeight) {
476 RooAbsArg* wgttmp = _vars.find(wgtVarName) ;
481 _dstore = std::make_unique<RooVectorDataStore>(
name,title,_vars,wgtVarName) ;
486 std::map<string,RooAbsData*> hmap ;
488 auto hiter = impSliceData.
begin() ;
489 for (
const auto& token :
ROOT::
Split(impSliceNames,
",")) {
490 hmap[token] =
static_cast<RooDataSet*
>(*hiter);
497 std::unique_ptr<RooArgSet> intErrorSet{_vars.selectCommon(*errorSet)};
498 intErrorSet->setAttribAll(
"StoreError") ;
500 arg->attachToStore(*_dstore) ;
504 std::unique_ptr<RooArgSet> intAsymErrorSet{_vars.selectCommon(*asymErrorSet)};
505 intAsymErrorSet->setAttribAll(
"StoreAsymError") ;
507 arg->attachToStore(*_dstore) ;
511 appendToDir(
this,
true) ;
517 std::unique_ptr<RooFormulaVar> cutVarTmp;
521 loadValuesFromSlices(*indexCat, hmap, cutRange, cutVar, cutSpec);
522 }
else if (impData) {
524 std::unique_ptr<RooDataSet> impDataSet;
528 impDataSet = makeDataSetFromDataHist(
static_cast<RooDataHist const &
>(*impData));
529 impData = impDataSet.
get();
532 cutVarTmp = std::make_unique<RooFormulaVar>(cutSpec, cutSpec, *impData->
get(),
false);
533 cutVar = cutVarTmp.get();
535 _dstore->loadValues(impData->
store(), cutVar, cutRange);
537 }
else if (impTree || (fname && strlen(fname))) {
539 std::unique_ptr<TFile> file;
541 if (impTree ==
nullptr) {
544 std::stringstream ss;
545 ss <<
"RooDataSet::ctor(" << GetName() <<
") ERROR file '" << fname
546 <<
"' cannot be opened or does not exist";
547 const std::string errMsg = ss.str();
548 coutE(InputArguments) << errMsg << std::endl;
549 throw std::invalid_argument(errMsg);
552 file->GetObject(tname, impTree);
554 std::stringstream ss;
555 ss <<
"RooDataSet::ctor(" << GetName() <<
") ERROR file '" << fname
556 <<
"' does not contain a TTree named '" << tname <<
"'";;
557 const std::string errMsg = ss.str();
558 coutE(InputArguments) << errMsg << std::endl;
559 throw std::invalid_argument(errMsg);
564 cutVarTmp = std::make_unique<RooFormulaVar>(cutSpec, cutSpec, _vars,
false);
565 cutVar = cutVarTmp.get();
569 tstore->
loadValues(impTree, cutVar, cutRange);
572 tmpstore.loadValues(impTree, cutVar, cutRange);
573 _dstore->append(tmpstore);
608 const RooArgSet& vars,
const char *cuts,
const char* wgtVarName) :
615 std::unique_ptr<RooFormulaVar> cutVar;
616 if (cuts && strlen(cuts) != 0) {
618 cutVar = std::make_unique<RooFormulaVar>(cuts, cuts,
_vars,
false);
620 _dstore = std::make_unique<RooVectorDataStore>(
name,title,
664 :
RooDataSet{
name, title, dset, vars, cutVar.expression(), wgtVarName} {}
684 :
RooDataSet{
name, title, theTree, vars, cutVar.expression(), wgtVarName} {}
711 const RooArgSet& vars,
const char* cuts,
const char* wgtVarName) :
715 auto tstore = std::make_unique<RooTreeDataStore>(
name,title,
_vars,*theTree,cuts,wgtVarName);
721 _dstore = std::make_unique<RooVectorDataStore>(
name,title,
_vars,wgtVarName);
751 bool useOldWeight =
_wgtVar && (wgtVarName ==
nullptr || strcmp(wgtVarName,
_wgtVar->
GetName()) == 0);
753 if(newName ==
nullptr) newName =
GetName();
754 if(newTitle ==
nullptr) newTitle =
GetTitle();
758 if(vars ==
nullptr) {
766 vars2.
add(varInData ? *varInData : *var);
777 if(var->getAttribute(
"StoreError")) errorSet.
add(*var);;
778 if(var->getAttribute(
"StoreAsymError")) asymErrorSet.
add(*var);;
782 return RooFit::makeOwningPtr<RooAbsData>(std::make_unique<RooDataSet>(
783 newName, newTitle, vars2, WeightVar(wgtVarName), StoreError(errorSet), StoreAsymError(asymErrorSet)));
800 coutE(DataHandling) <<
"RooDataSet::RooDataSet(" <<
GetName() <<
"): designated weight variable "
801 << wgtVarName <<
" not found in set of variables, no weighting will be assigned" << endl ;
802 throw std::invalid_argument(
"RooDataSet::initialize() weight variable could not be initialised.");
804 coutE(DataHandling) <<
"RooDataSet::RooDataSet(" <<
GetName() <<
"): designated weight variable "
805 << wgtVarName <<
" is not of type RooRealVar, no weighting will be assigned" << endl ;
806 throw std::invalid_argument(
"RooDataSet::initialize() weight variable could not be initialised.");
820 const char *cutRange, std::size_t nStart, std::size_t nStop)
830 std::unique_ptr<RooAbsData> out{createEmptyClone()};
832 if (!cutRange || strchr(cutRange,
',') ==
nullptr) {
834 ds.
_dstore =
_dstore->reduce(ds.GetName(), ds.GetTitle(), ds._vars, cutVar, cutRange, nStart, nStop);
835 ds._cachedVars.add(
_dstore->cachedVars());
840 std::stringstream errMsg;
841 errMsg <<
"Error in RooAbsData::reduce! The ranges " << cutRange <<
" are overlapping!";
842 throw std::runtime_error(errMsg.str());
844 for (
const auto &token : tokens) {
845 std::unique_ptr<RooAbsData> appendedData{createEmptyClone()};
846 auto &ds =
static_cast<RooDataSet &
>(*appendedData);
847 ds.
_dstore =
_dstore->reduce(ds.GetName(), ds.GetTitle(), ds._vars, cutVar, token.c_str(), nStart, nStop);
848 ds._cachedVars.add(
_dstore->cachedVars());
883 title = std::string(
GetTitle()) +
"_binned" ;
912 return e > 0.0 ?
e *
e :
w *
w;
922 if(first +
len > nEntries) {
923 throw std::runtime_error(
"RooDataSet::getWeightBatch(): requested range not valid for dataset.");
927 if(allWeights.empty())
return {};
929 if(!sumW2)
return {&*(std::cbegin(allWeights) + first),
len};
939 for (std::size_t i = 0; i < nEntries; ++i) {
945 return std::span<const double>(&*(
_sumW2Buffer->begin() + first),
len);
992 std::unique_ptr<RooFormula> select = nullptr ;
993 if (cutSpec && strlen(cutSpec) > 0) {
994 select = std::make_unique<RooFormula>(
"select",cutSpec,*
get()) ;
1006 if (select && select->eval()==0.) continue ;
1083 }
else if ((wgt != 1. || wgtError != 0.) &&
_errorMsgCount < 5) {
1084 ccoutE(DataHandling) <<
"An event weight/error was passed but no weight variable was defined"
1085 <<
" in the dataset '" <<
GetName() <<
"'. The weight will be ignored." << std::endl;
1091 && std::abs(wgt*wgt - wgtError)/wgtError > 1.E-15
1092 && _errorMsgCount < 5 && !_wgtVar->getAttribute(
"StoreError")) {
1093 coutE(DataHandling) <<
"An event weight error was passed to the RooDataSet '" <<
GetName()
1095 <<
"' does not store errors. Check `StoreError` in the RooDataSet constructor." << std::endl;
1133 ccoutE(DataHandling) <<
"An event weight was given but no weight variable was defined"
1134 <<
" in the dataset '" <<
GetName() <<
"'. The weight will be ignored." << std::endl;
1139 && _errorMsgCount < 5 && !_wgtVar->getAttribute(
"StoreAsymError")) {
1140 coutE(DataHandling) <<
"An event weight error was passed to the RooDataSet '" <<
GetName()
1142 <<
"' does not store errors. Check `StoreAsymError` in the RooDataSet constructor." << std::endl;
1185 ccoutE(DataHandling) <<
"An event weight was given but no weight variable was defined"
1186 <<
" in the dataset '" <<
GetName() <<
"'. The weight will be ignored." << std::endl;
1193 && wgtError != 0. && wgtError != wgt*wgt
1194 && _errorMsgCount < 5 && !_wgtVar->getAttribute(
"StoreError")) {
1195 coutE(DataHandling) <<
"An event weight error was passed to the RooDataSet '" <<
GetName()
1197 <<
"' does not store errors. Check `StoreError` in the RooDataSet constructor." << std::endl;
1218 list<RooDataSet*> dsetList ;
1219 if (data1) dsetList.push_back(data1) ;
1220 if (data2) dsetList.push_back(data2) ;
1221 if (data3) dsetList.push_back(data3) ;
1222 if (data4) dsetList.push_back(data4) ;
1223 if (data5) dsetList.push_back(data5) ;
1224 if (data6) dsetList.push_back(data6) ;
1225 return merge(dsetList) ;
1241 for (list<RooDataSet*>::iterator iter = dsetList.begin() ; iter != dsetList.end() ; ++iter) {
1243 coutE(InputArguments) <<
"RooDataSet::merge(" <<
GetName() <<
") ERROR: datasets have different size" << endl ;
1249 list<RooAbsDataStore*> dstoreList ;
1250 for (list<RooDataSet*>::iterator iter = dsetList.begin() ; iter != dsetList.end() ; ++iter) {
1252 dstoreList.push_back((*iter)->store()) ;
1291 std::unique_ptr<RooAbsArg> ret{
_dstore->addColumn(var,adjustRange)};
1360 pc.
defineInt(
"lineColor",
"LineColor",0,-999) ;
1361 pc.
defineInt(
"lineStyle",
"LineStyle",0,-999) ;
1362 pc.
defineInt(
"lineWidth",
"LineWidth",0,-999) ;
1363 pc.
defineInt(
"markerColor",
"MarkerColor",0,-999) ;
1364 pc.
defineInt(
"markerStyle",
"MarkerStyle",0,8) ;
1366 pc.
defineInt(
"fillColor",
"FillColor",0,-999) ;
1367 pc.
defineInt(
"fillStyle",
"FillStyle",0,-999) ;
1368 pc.
defineInt(
"histInvisible",
"Invisible",0,0) ;
1381 const char* drawOptions = pc.
getString(
"drawOption") ;
1382 Int_t histInvisible = pc.
getInt(
"histInvisible") ;
1383 const char* histName = pc.
getString(
"histName",
nullptr,
true) ;
1384 double scaleFactor = pc.
getDouble(
"scaleFactor") ;
1393 coutE(InputArguments) <<
"RooDataSet::plotOnXY(" <<
GetName() <<
") ERROR: no YVar() argument specified and dataset is not weighted" << endl ;
1398 if (yvar && !dataY) {
1399 coutE(InputArguments) <<
"RooDataSet::plotOnXY(" <<
GetName() <<
") ERROR on YVar() argument, dataset does not contain a variable named " << yvar->
GetName() << endl ;
1407 graph->SetName(histName) ;
1409 graph->SetName((
"hxy_" + std::string(
GetName())).c_str());
1428 graph->addBinWithXYError(
x,
y,-1*exlo,exhi,-1*eylo,eyhi,scaleFactor) ;
1441 if (lineColor!=-999)
graph->SetLineColor(lineColor) ;
1442 if (lineStyle!=-999)
graph->SetLineStyle(lineStyle) ;
1443 if (lineWidth!=-999)
graph->SetLineWidth(lineWidth) ;
1444 if (markerColor!=-999)
graph->SetMarkerColor(markerColor) ;
1445 if (markerStyle!=-999)
graph->SetMarkerStyle(markerStyle) ;
1446 if (markerSize!=-999)
graph->SetMarkerSize(markerSize) ;
1447 if (fillColor!=-999)
graph->SetFillColor(fillColor) ;
1448 if (fillStyle!=-999)
graph->SetFillStyle(fillStyle) ;
1508 const char *verbOpt,
const char* commonPath,
1509 const char* indexCatName) {
1514 bool ownIsBlind(
true) ;
1515 RooAbsArg* blindState = variables.find(
"blindState") ;
1517 blindState =
new RooCategory(
"blindState",
"Blinding State") ;
1518 variables.add(*blindState) ;
1520 ownIsBlind = false ;
1522 oocoutE(
nullptr,DataHandling) <<
"RooDataSet::read: ERROR: variable list already contains"
1523 <<
"a non-RooCategory blindState member" << endl ;
1526 oocoutW(
nullptr,DataHandling) <<
"RooDataSet::read: WARNING: recycling existing "
1527 <<
"blindState category in variable list" << endl ;
1542 auto data = std::make_unique<RooDataSet>(
"dataset", fileList, variables);
1543 if (ownIsBlind) { variables.remove(*blindState) ;
delete blindState ; }
1545 oocoutE(
nullptr,DataHandling) <<
"RooDataSet::read: unable to create a new dataset"
1551 blindCat =
static_cast<RooCategory*
>(
data->_vars.find(
"blindState")) ;
1558 tmp =
data->_vars.find(indexCatName) ;
1560 oocoutE(
data.get(),DataHandling) <<
"RooDataSet::read: no index category named "
1561 << indexCatName <<
" in supplied variable list" << endl ;
1565 oocoutE(
data.get(),DataHandling) <<
"RooDataSet::read: variable " << indexCatName
1566 <<
" is not a RooCategory" << endl ;
1576 Int_t outOfRange(0) ;
1579 Int_t fileSeqNum(0);
1585 const char *catname = strchr(
filename.c_str(),
':');
1601 char newLabel[128] ;
1602 snprintf(newLabel,128,
"file%03d",fileSeqNum) ;
1603 if (indexCat->
defineType(newLabel,fileSeqNum)) {
1604 oocoutE(
data.get(), DataHandling) <<
"RooDataSet::read: Error, cannot register automatic type name " << newLabel
1605 <<
" in index category " << indexCat->
GetName() << endl ;
1613 oocoutI(
data.get(), DataHandling) <<
"RooDataSet::read: reading file " <<
filename << endl ;
1616 TString fullName(commonPath) ;
1618 ifstream file(fullName) ;
1621 oocoutE(
data.get(), DataHandling) <<
"RooDataSet::read: unable to open '"
1622 <<
filename <<
"'. Returning nullptr now." << endl;
1628 bool haveBlindString(
false) ;
1630 while(file.good() && !file.eof()) {
1632 if(debug)
oocxcoutD(
data.get(),DataHandling) <<
"reading line " <<
line << endl;
1635 if (file.peek() ==
'#') {
1636 if(debug)
oocxcoutD(
data.get(),DataHandling) <<
"skipping comment on line " <<
line << endl;
1639 bool readError = variables.readFromStream(file,
true,verbose) ;
1640 data->_vars.assign(variables) ;
1644 oocoutE(
data.get(), DataHandling) <<
"RooDataSet::read(static): read error at line " <<
line << endl ;
1651 blindCat->
setIndex(haveBlindString) ;
1657 while (isspace(file.peek())) {
1659 file >> std::noskipws >> dummy >> std::skipws;
1671 assert(
dynamic_cast<RooCategory*
>(variables.find(indexCatName)));
1672 const auto origIndexCat =
static_cast<RooCategory*
>(variables.find(indexCatName));
1673 for (
const auto& nameIdx : *indexCat) {
1674 origIndexCat->
defineType(nameIdx.first, nameIdx.second);
1677 oocoutI(
data.get(),DataHandling) <<
"RooDataSet::read: read " <<
data->numEntries()
1678 <<
" events (ignored " << outOfRange <<
" out of range events)" << endl;
1680 return data.release();
1697 coutE(DataHandling) <<
"RooDataSet::write(" <<
GetName() <<
") cannot create file " <<
filename << endl ;
1702 coutI(DataHandling) <<
"RooDataSet::write(" <<
GetName() <<
") writing ASCII file " <<
filename << endl ;
1720 coutW(DataHandling) <<
"RooDataSet::write(" <<
GetName() <<
"): WARNING error(s) have occurred in writing" << endl ;
1738 os <<
indent <<
" Dataset variable \"" <<
_wgtVar->
GetName() <<
"\" is interpreted as the event weight" << endl ;
1769 os << arg->GetName() ;
1832 TTree *X_tree(
nullptr);
1842 _dstore = std::make_unique<RooTreeDataStore>(X_tree,
_vars);
1877 const char * cstr =
"cstr";
1888 const char *rangeName,
RooFormulaVar const *cutVar,
const char *cutSpec)
1891 if (cutVar && cutSpec) {
1892 throw std::invalid_argument(
"Only one of cutVar or cutSpec should be not a nullptr!");
1897 for (
auto const &item : slices) {
1898 std::unique_ptr<RooDataSet> sliceDataSet;
1903 sliceDataSet = makeDataSetFromDataHist(
static_cast<RooDataHist const &
>(*sliceData));
1904 sliceData = sliceDataSet.
get();
1908 if (!indexCat.
hasLabel(item.first)) {
1910 coutI(InputArguments) <<
"RooDataSet::ctor(" <<
GetName() <<
") defining state \"" << item.first
1911 <<
"\" in index category " << indexCat.
GetName() << std::endl;
1913 if (!indexCatInData.hasLabel(item.first)) {
1914 indexCatInData.defineType(item.first);
1916 indexCatInData.setLabel(item.first.c_str());
1917 std::unique_ptr<RooFormulaVar> cutVarTmp;
1919 cutVarTmp = std::make_unique<RooFormulaVar>(cutSpec, cutSpec, *sliceData->
get(),
false);
1920 cutVar = cutVarTmp.get();
1922 _dstore->loadValues(sliceData->
store(), cutVar, rangeName);
ROOT::RRangeCast< T, false, Range_t > static_range_cast(Range_t &&coll)
static void indent(ostringstream &buf, int indent_level)
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 filename
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 index
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 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 bytes
The Kahan summation is a compensated summation algorithm, which significantly reduces numerical error...
Common abstract base class for objects that represent a value and a "shape" in RooFit.
void setAttribute(const Text_t *name, bool value=true)
Set (default) or clear a named boolean attribute of this object.
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.
virtual void removeAll()
Remove all arguments from our set, deleting them if we own them.
virtual bool remove(const RooAbsArg &var, bool silent=false, bool matchByNameOnly=false)
Remove the specified argument from our list.
Storage_t const & get() const
Const access to the underlying stl container.
bool allInRange(const char *rangeSpec) const
Return true if all contained object report to have their value inside the specified range.
void assignFast(const RooAbsCollection &other, bool setValDirty=true) const
Functional equivalent of assign() but assumes this and other collection have same layout.
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...
virtual bool addOwned(RooAbsArg &var, bool silent=false)
Add an argument and transfer the ownership to the collection.
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 a data collection.
virtual bool isWeighted() const =0
virtual double sumEntries() const
virtual RooAbsDataStore * merge(const RooArgSet &allvars, std::list< RooAbsDataStore * > dstoreList)=0
virtual double weightError(RooAbsData::ErrorType etype=RooAbsData::Poisson) const =0
virtual double weight() const =0
Abstract base class for binned and unbinned datasets.
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.
RooAbsDataStore * store()
static StorageType defaultStorageType
std::unique_ptr< RooAbsDataStore > _dstore
Data storage implementation.
RooArgSet _vars
Dimensions of this data set.
virtual Int_t numEntries() const
Return number of entries in dataset, i.e., count unweighted entries.
virtual bool isWeighted() const
void Streamer(TBuffer &) override
Stream an object of class RooAbsData.
double getVal(const RooArgSet *normalisationSet=nullptr) const
Evaluate object.
RooArgList is a container object that can hold multiple RooAbsArg objects.
RooArgSet is a container object that can hold multiple RooAbsArg objects.
void Streamer(TBuffer &) override
Stream an object of class TObject.
virtual void writeToStream(std::ostream &os, bool compact, const char *section=nullptr) const
Write the contents of the argset in ASCII form to given stream.
Object to represent discrete states.
bool setIndex(Int_t index, bool printError=true) override
Set value by specifying the index code of the desired state.
bool defineType(const std::string &label)
Define a state with given name.
bool setLabel(const char *label, bool printError=true) override
Set value by specifying the name of the desired state.
Named container for two doubles, two integers two object points and three string pointers that can be...
const char * getString(Int_t idx) const
Return string stored in slot idx.
Configurable parser for RooCmdArg named arguments.
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'.
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...
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...
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.
double weight(std::size_t i) const
Return weight of i-th bin.
double weightSquared(std::size_t i) const
Return squared weight sum of i-th bin.
const RooArgSet * get() const override
Get bin centre of current bin.
Container class to hold unbinned data.
RooFit::OwningPtr< RooAbsData > emptyClone(const char *newName=nullptr, const char *newTitle=nullptr, const RooArgSet *vars=nullptr, const char *wgtVarName=nullptr) const override
Return an empty clone of this dataset.
RooRealVar * _wgtVar
Pointer to weight variable (if set)
bool _doWeightErrorCheck
! When adding events with weights, check that weights can actually be stored.
RooArgSet _varsNoWgt
Vars without weight variable.
void loadValuesFromSlices(RooCategory &indexCat, std::map< std::string, RooAbsData * > const &slices, const char *rangeName, RooFormulaVar const *cutVar, const char *cutSpec)
RooFit::OwningPtr< RooDataHist > binnedClone(const char *newName=nullptr, const char *newTitle=nullptr) const
Return binned clone of this dataset.
void weightError(double &lo, double &hi, ErrorType etype=SumW2) const override
Return the asymmetric errors on the current weight.
const RooArgSet * get() const override
Return a RooArgSet with the coordinates of the current event.
void initialize(const char *wgtVarName)
Initialize the dataset.
void printArgs(std::ostream &os) const override
Print argument of dataset, i.e. the observable names.
void SetName(const char *name) override
Change the name of this dataset into the given name.
virtual void addFast(const RooArgSet &row, double weight=1.0, double weightError=0.0)
Add a data point, with its coordinates specified in the 'data' argset, to the data set.
bool merge(RooDataSet *data1, RooDataSet *data2=nullptr, RooDataSet *data3=nullptr, RooDataSet *data4=nullptr, RooDataSet *data5=nullptr, RooDataSet *data6=nullptr)
TClass * IsA() const override
virtual RooAbsArg * addColumn(RooAbsArg &var, bool adjustRange=true)
Add a column with the values of the given (function) argument to this dataset.
bool write(const char *filename) const
Write the contents of this dataset to an ASCII file with the specified name.
double sumEntries() const override
Return effective number of entries in dataset, i.e., sum all weights.
std::span< const double > getWeightBatch(std::size_t first, std::size_t len, bool sumW2) const override
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.
virtual RooArgSet * addColumns(const RooArgList &varList)
Add a column with the values of the given list of (function) argument to this dataset.
~RooDataSet() override
Destructor.
bool isNonPoissonWeighted() const override
Returns true if histogram contains bins with entries with a non-integer weight.
void SetNameTitle(const char *name, const char *title) override
Change the title of this dataset into the given name.
void printValue(std::ostream &os) const override
Print value of the dataset, i.e. the sum of weights contained in the dataset.
void append(RooDataSet &data)
Add all data points of given data set to this data set.
RooDataSet()
Default constructor for persistence.
std::unique_ptr< std::vector< double > > _sumW2Buffer
! Buffer for sumW2 in case a batch of values is requested.
void Streamer(TBuffer &) override
Stream an object of class RooDataSet.
void add(const RooArgSet &row, double weight, double weightError)
Add one ore more rows of data.
unsigned short _errorMsgCount
! Counter to silence error messages when filling dataset.
void convertToTreeStore() override
Convert vector-based storage to tree-based storage.
virtual RooPlot * plotOnXY(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
Special plot method for 'X-Y' datasets used in fitting.
void printMultiline(std::ostream &os, Int_t contents, bool verbose=false, TString indent="") const override
Print info about this dataset to the specified output stream.
double weightSquared() const override
Return squared event weight of the current event.
double weight() const override
Return event weight of current event.
static RooDataSet * read(const char *filename, const RooArgList &variables, const char *opts="", const char *commonPath="", const char *indexCatName=nullptr)
Read data from a text file and create a dataset from it.
bool isWeighted() const override
Return true if dataset contains weighted events.
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.
Graphical representation of binned data based on the TGraphAsymmErrors class.
Collection class for internal use, storing a collection of RooAbsArg pointers in a doubly linked list...
virtual void Add(TObject *arg)
RooLinkedListIterImpl begin() const
Plot frame and a container for graphics objects within that frame.
RooAbsRealLValue * getPlotVar() const
void addPlotable(RooPlotable *plotable, Option_t *drawOptions="", bool invisible=false, bool refreshNorm=false)
Add the specified plotable object to our plot.
Variable that can be changed from the outside.
void setVal(double value) override
Set value of variable to 'value'.
void setError(double value)
double getErrorLo() const
void setAsymError(double lo, double hi)
double getErrorHi() const
The RooStringView is a wrapper around a C-style string that can also be constructed from a std::strin...
TTree-backed data storage.
void loadValues(const TTree *t, const RooFormulaVar *select=nullptr, const char *rangeName=nullptr, Int_t nStart=0, Int_t nStop=2000000000)
Load values from tree 't' into this data collection, optionally selecting events using the RooFormula...
Uses std::vector to store data columns.
void append(RooAbsDataStore &other) override
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 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
static TFile * Open(const char *name, Option_t *option="", const char *ftitle="", Int_t compress=ROOT::RCompressionSetting::EDefaults::kUseCompiledDefault, Int_t netopt=0)
Create / open a file.
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.
virtual void SetName(const char *name)
Set the name of the TNamed.
TClass * IsA() const override
Mother of all ROOT objects.
virtual Bool_t InheritsFrom(const char *classname) const
Returns kTRUE if object inherits from class "classname".
void ToLower()
Change string to lower-case.
virtual void Streamer(TBuffer &)
Stream a string object.
TString & Append(const char *cs)
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
A TTree represents a columnar dataset.
RooCmdArg StoreError(const RooArgSet &aset)
RooCmdArg WeightVar(const char *name="weight", bool reinterpretAsWeight=false)
tbb::task_arena is an alias of tbb::interface7::task_arena, which doesn't allow to forward declare tb...
std::vector< std::string > Split(std::string_view str, std::string_view delims, bool skipEmpty=false)
Splits a string at each character in delims.
The namespace RooFit contains mostly switches that change the behaviour of functions of PDFs (or othe...
OwningPtr< T > makeOwningPtr(std::unique_ptr< T > &&ptr)
Internal helper to turn a std::unique_ptr<T> into an OwningPtr.
T * OwningPtr
An alias for raw pointers for indicating that the return type of a RooFit function is an owning point...
bool checkIfRangesOverlap(RooArgSet const &observables, std::vector< std::string > const &rangeNames)