Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
RooDataSet.cxx
Go to the documentation of this file.
1/*****************************************************************************
2 * Project: RooFit *
3 * Package: RooFitCore *
4 * @(#)root/roofitcore:$Id$
5 * Authors: *
6 * WV, Wouter Verkerke, UC Santa Barbara, verkerke@slac.stanford.edu *
7 * DK, David Kirkby, UC Irvine, dkirkby@uci.edu *
8 * *
9 * Copyright (c) 2000-2005, Regents of the University of California *
10 * and Stanford University. All rights reserved. *
11 * *
12 * Redistribution and use in source and binary forms, *
13 * with or without modification, are permitted according to the terms *
14 * listed in LICENSE (http://roofit.sourceforge.net/license.txt) *
15 *****************************************************************************/
16
17/**
18\file RooDataSet.cxx
19\class RooDataSet
20\ingroup Roofitcore
21
22Container class to hold unbinned data. The binned equivalent is
23RooDataHist. In RooDataSet, each data point in N-dimensional space is represented
24by a RooArgSet of RooRealVar, RooCategory or RooStringVar objects, which can be
25retrieved using get().
26
27Since RooDataSet saves every event, it allows for fits with highest precision. With a large
28amount of data, however, it could be beneficial to represent them in binned form,
29i.e., RooDataHist. Binning the data will incur a loss of information, though.
30RooDataHist on the other hand may suffer from the curse of dimensionality if a high-dimensional
31problem with a lot of bins on each axis is tackled.
32
33### Inspecting a dataset
34Inspect a dataset using Print() with the "verbose" option:
35```
36dataset->Print("V");
37dataset->get(0)->Print("V");
38dataset->get(1)->Print("V");
39...
40```
41
42### Plotting data.
43See RooAbsData::plotOn().
44
45
46### Storage strategy
47There are two storage backends:
48- RooVectorDataStore (default): std::vectors in memory. They are fast, but they
49cannot be serialised if the dataset exceeds a size of 1 Gb
50- RooTreeDataStore: Uses a TTree under the hood. Note that the TTree is not
51attached to any currently-opened TFile in order to avoid double-ownership.
52 - Enable tree-backed storage similar to this:
53 ```
54 TFile outputFile("filename.root", "RECREATE");
55 RooAbsData::setDefaultStorageType(RooAbsData::Tree);
56 RooDataSet mydata(...);
57 ```
58 - Or convert an existing memory-backed data storage:
59 ```
60 RooDataSet mydata(...);
61
62 TFile outputFile("filename.root", "RECREATE");
63 mydata.convertToTreeStore();
64 ```
65
66For the inverse conversion, see `RooAbsData::convertToVectorStore()`.
67
68
69### Creating a dataset using RDataFrame
70See RooAbsDataHelper, rf408_RDataFrameToRooFit.C
71
72### Uniquely identifying RooDataSet objects
73
74\warning Before v6.28, it was ensured that no RooDataSet objects on the heap
75were located at an address that had already been used for a RooDataSet before.
76With v6.28, this is not guaranteed anymore. Hence, if your code uses pointer
77comparisons to uniquely identify RooDataSet instances, please consider using
78the new `RooAbsData::uniqueId()`.
79
80
81**/
82
83#include "RooDataSet.h"
84
85#include "RooPlot.h"
86#include "RooAbsReal.h"
87#include "Roo1DTable.h"
88#include "RooCategory.h"
89#include "RooFormula.h"
90#include "RooFormulaVar.h"
91#include "RooArgList.h"
92#include "RooRealVar.h"
93#include "RooDataHist.h"
94#include "RooMsgService.h"
95#include "RooCmdConfig.h"
96#include "RooHist.h"
97#include "RooTreeDataStore.h"
98#include "RooVectorDataStore.h"
100#include "RooSentinel.h"
101#include "RooTrace.h"
102#include "RooFitImplHelpers.h"
103
104#include "ROOT/StringUtils.hxx"
105
106#include "Math/Util.h"
107#include "TTree.h"
108#include "TFile.h"
109#include "TBuffer.h"
110#include "strlcpy.h"
111#include "snprintf.h"
112
113#include <iostream>
114#include <memory>
115#include <fstream>
116
117
118using std::endl, std::string, std::map, std::list, std::ifstream, std::ofstream, std::ostream;
119
120
122
123////////////////////////////////////////////////////////////////////////////////
124/// Default constructor for persistence
125
130
131namespace {
132
133struct FinalizeVarsOutput {
134 RooArgSet finalVars;
135 std::unique_ptr<RooRealVar> weight;
136 std::string weightVarName;
137 RooArgSet errorSet;
138};
139
140FinalizeVarsOutput finalizeVars(RooArgSet const &vars,
141 RooAbsArg * indexCat,
142 const char* wgtVarName,
145 RooArgSet * errorSet)
146{
147 FinalizeVarsOutput out;
148 out.finalVars.add(vars);
149
150 // Gather all imported weighted datasets to infer the weight variable name
151 // and whether we need weight errors
152 std::vector<RooAbsData*> weightedImpDatasets;
153 if(impData && impData->isWeighted()) weightedImpDatasets.push_back(impData);
155 if(data->isWeighted()) {
156 weightedImpDatasets.push_back(data);
157 }
158 }
159
160 bool needsWeightErrors = false;
161
162 // Figure out if the weight needs to store errors
164 if(dynamic_cast<RooDataHist const*>(data)) {
165 needsWeightErrors = true;
166 }
167 }
168
169 if (indexCat) {
170 out.finalVars.add(*indexCat, true);
171 }
172
173 out.weightVarName = wgtVarName ? wgtVarName : "";
174
175 if(out.weightVarName.empty()) {
176 // Even if no weight variable is specified, we want to have one if we are
177 // importing weighted datasets
179 if(auto ds = dynamic_cast<RooDataSet const*>(data)) {
180 // If the imported data is a RooDataSet, we take over its weight variable name
181 out.weightVarName = ds->weightVar()->GetName();
182 break;
183 } else {
185 // Don't break here! The next imported data might be a RooDataSet,
186 // and in that case we want to take over its weight name instead of
187 // using the default one.
188 }
189 }
190 }
191
192 // If the weight variable is required but is not in the set, create and add
193 // it on the fly
194 RooAbsArg * wgtVar = out.finalVars.find(out.weightVarName.c_str());
195 if (!out.weightVarName.empty() && !wgtVar) {
196 const char* name = out.weightVarName.c_str();
197 out.weight = std::make_unique<RooRealVar>(name, name, 1.0);
198 wgtVar = out.weight.get();
199 out.finalVars.add(*out.weight);
200 }
201
203 out.errorSet.add(*wgtVar);
204 }
205
206 // Combine the error set figured out by finalizeVars and the ones passed by the user
207 if(errorSet) out.errorSet.add(*errorSet, /*silent=*/true);
208
209 return out;
210}
211
212// generating an unbinned dataset from a binned one
213std::unique_ptr<RooDataSet> makeDataSetFromDataHist(RooDataHist const &hist)
214{
215 using namespace RooFit;
216
218 const char* wgtName = wgtVarCmdArg.getString(0);
219 // Instantiate weight variable here such that we can pass it to StoreError()
221
222 RooArgSet vars{*hist.get(), wgtVar};
223
224 // We have to explicitly store the errors that are implied by the sum of weights squared.
225 auto data = std::make_unique<RooDataSet>(hist.GetName(), hist.GetTitle(), vars, wgtVarCmdArg, StoreError(wgtVar));
226 for (int i = 0; i < hist.numEntries(); ++i) {
227 data->add(*hist.get(i), hist.weight(i), std::sqrt(hist.weightSquared(i)));
228 }
229
230 return data;
231}
232
233} // namespace
234
235////////////////////////////////////////////////////////////////////////////////
236/// Construct an unbinned dataset from a RooArgSet defining the dimensions of the data space. Optionally, data
237/// can be imported at the time of construction.
238///
239/// <table>
240/// <tr><th> %RooCmdArg <th> Effect
241/// <tr><td> Import(TTree&) <td> Import contents of given TTree. Only branches of the TTree that have names
242/// corresponding to those of the RooAbsArgs that define the RooDataSet are
243/// imported.
244/// <tr><td> ImportFromFile(const char* fileName, const char* treeName) <td> Import tree with given name from file with given name.
245/// <tr><td> Import(RooAbsData&)
246/// <td> Import contents of given RooDataSet or RooDataHist. Only observables that are common with the definition of this dataset will be imported
247/// <tr><td> Index(RooCategory&) <td> Prepare import of datasets into a N+1 dimensional RooDataSet
248/// where the extra discrete dimension labels the source of the imported histogram.
249/// <tr><td> Import(const char*, RooAbsData&)
250/// <td> Import a RooDataSet or RooDataHist to be associated with the given state name of the index category
251/// specified in Index(). If the given state name is not yet defined in the index
252/// category it will be added on the fly. The import command can be specified multiple times.
253/// <tr><td> Link(const char*, RooDataSet&) <td> Link contents of supplied RooDataSet to this dataset for given index category state name.
254/// In this mode, no data is copied and the linked dataset must be remain live for the duration
255/// of this dataset. Note that link is active for both reading and writing, so modifications
256/// to the aggregate dataset will also modify its components. Link() and Import() are mutually exclusive.
257/// <tr><td> OwnLinked() <td> Take ownership of all linked datasets
258/// <tr><td> Import(std::map<string,RooAbsData*>&) <td> As above, but allows specification of many imports in a single operation
259/// <tr><td> Link(std::map<string,RooDataSet*>&) <td> As above, but allows specification of many links in a single operation
260/// <tr><td> Cut(const char*) <br>
261/// Cut(RooFormulaVar&)
262/// <td> Apply the given cut specification when importing data
263/// <tr><td> CutRange(const char*) <td> Only accept events in the observable range with the given name
264/// <tr><td> WeightVar(const char*) <br>
265/// WeightVar(const RooAbsArg&)
266/// <td> Interpret the given variable as event weight rather than as observable
267/// <tr><td> StoreError(const RooArgSet&) <td> Store symmetric error along with value for given subset of observables
268/// <tr><td> StoreAsymError(const RooArgSet&) <td> Store asymmetric error along with value for given subset of observables
269/// <tr><td> `GlobalObservables(const RooArgSet&)` <td> Define the set of global observables to be stored in this RooDataSet.
270/// A snapshot of the passed RooArgSet is stored, meaning the values wont't change unexpectedly.
271/// </table>
272///
273
275 const RooCmdArg& arg4,const RooCmdArg& arg5,const RooCmdArg& arg6,const RooCmdArg& arg7,const RooCmdArg& arg8) :
276 RooAbsData(name,title,{})
277{
279
280 // Define configuration for this method
281 RooCmdConfig pc("RooDataSet::ctor(" + std::string(GetName()) + ")");
282 pc.defineInt("ownLinked","OwnLinked",0) ;
283 pc.defineObject("impTree","ImportTree",0) ;
284 pc.defineObject("impData","ImportData",0) ;
285 pc.defineObject("indexCat","IndexCat",0) ;
286 pc.defineObject("impSliceData","ImportDataSlice",0,nullptr,true) ; // array
287 pc.defineString("impSliceState","ImportDataSlice",0,"",true) ; // array
288 pc.defineObject("lnkSliceData","LinkDataSlice",0,nullptr,true) ; // array
289 pc.defineString("lnkSliceState","LinkDataSlice",0,"",true) ; // array
290 pc.defineString("cutSpec","CutSpec",0,"") ;
291 pc.defineObject("cutVar","CutVar",0) ;
292 pc.defineString("cutRange","CutRange",0,"") ;
293 pc.defineString("wgtVarName","WeightVarName",0,"") ;
294 pc.defineInt("newWeight1","WeightVarName",0,0) ;
295 pc.defineString("fname","ImportFromFile",0,"") ;
296 pc.defineString("tname","ImportFromFile",1,"") ;
297 pc.defineObject("wgtVar","WeightVar",0) ;
298 pc.defineInt("newWeight2","WeightVar",0,0) ;
299 pc.defineObject("dummy1","ImportDataSliceMany",0) ;
300 pc.defineObject("dummy2","LinkDataSliceMany",0) ;
301 pc.defineSet("errorSet","StoreError",0) ;
302 pc.defineSet("asymErrSet","StoreAsymError",0) ;
303 pc.defineSet("glObs","GlobalObservables",0,nullptr) ;
304 pc.defineMutex("ImportTree","ImportData","ImportDataSlice","LinkDataSlice","ImportFromFile") ;
305 pc.defineMutex("CutSpec","CutVar") ;
306 pc.defineMutex("WeightVarName","WeightVar") ;
307 pc.defineDependency("ImportDataSlice","IndexCat") ;
308 pc.defineDependency("LinkDataSlice","IndexCat") ;
309 pc.defineDependency("OwnLinked","LinkDataSlice") ;
310
311
313 l.Add((TObject*)&arg1) ; l.Add((TObject*)&arg2) ;
314 l.Add((TObject*)&arg3) ; l.Add((TObject*)&arg4) ;
315 l.Add((TObject*)&arg5) ; l.Add((TObject*)&arg6) ;
316 l.Add((TObject*)&arg7) ; l.Add((TObject*)&arg8) ;
317
318 // Process & check varargs
319 pc.process(l) ;
320 if (!pc.ok(true)) {
321 const std::string errMsg = "Error in RooDataSet constructor: command argument list could not be processed";
322 coutE(InputArguments) << errMsg << std::endl;
323 throw std::invalid_argument(errMsg);
324 }
325
326 if(pc.getSet("glObs")) setGlobalObservables(*pc.getSet("glObs"));
327
328 // Extract relevant objects
329 TTree* impTree = static_cast<TTree*>(pc.getObject("impTree")) ;
330 auto impData = static_cast<RooAbsData*>(pc.getObject("impData")) ;
331 RooFormulaVar* cutVar = static_cast<RooFormulaVar*>(pc.getObject("cutVar")) ;
332 const char* cutSpec = pc.getString("cutSpec","",true) ;
333 const char* cutRange = pc.getString("cutRange","",true) ;
334 const char* wgtVarName = pc.getString("wgtVarName","",true) ;
335 RooRealVar* wgtVar = static_cast<RooRealVar*>(pc.getObject("wgtVar")) ;
336 const char* impSliceNames = pc.getString("impSliceState","",true) ;
337 const RooLinkedList& impSliceData = pc.getObjectList("impSliceData") ;
338 const char* lnkSliceNames = pc.getString("lnkSliceState","",true) ;
339 const RooLinkedList& lnkSliceData = pc.getObjectList("lnkSliceData") ;
340 RooCategory* indexCat = static_cast<RooCategory*>(pc.getObject("indexCat")) ;
341 RooArgSet* asymErrorSet = pc.getSet("asymErrSet") ;
342 const char* fname = pc.getString("fname") ;
343 const char* tname = pc.getString("tname") ;
344 Int_t ownLinked = pc.getInt("ownLinked") ;
345 Int_t newWeight = pc.getInt("newWeight1") + pc.getInt("newWeight2") ;
346
347 // Lookup name of weight variable if it was specified by object reference
348 if(wgtVar) {
349 wgtVarName = wgtVar->GetName();
350 }
351
352 auto finalVarsInfo = finalizeVars(vars,indexCat,wgtVarName,impData,impSliceData, pc.getSet("errorSet"));
353 initializeVars(finalVarsInfo.finalVars);
354 if(!finalVarsInfo.weightVarName.empty()) {
355 wgtVarName = finalVarsInfo.weightVarName.c_str();
356 }
357
358 RooArgSet* errorSet = finalVarsInfo.errorSet.empty() ? nullptr : &finalVarsInfo.errorSet;
359
360 // Case 1 --- Link multiple dataset as slices
361 if (lnkSliceNames) {
362
363 // Make import mapping if index category is specified
365 if (indexCat) {
366 char tmp[64000];
367 strlcpy(tmp, lnkSliceNames, 64000);
368 char *token = strtok(tmp, ",");
369 auto hiter = lnkSliceData.begin();
370 while (token) {
371 hmap[token] = static_cast<RooAbsData *>(*hiter);
372 token = strtok(nullptr, ",");
373 ++hiter;
374 }
375 }
376
377 // Initialize RooDataSet with optional weight variable
378 initialize(nullptr) ;
379
381 RooCategory* icat = static_cast<RooCategory*> (indexCat ? _vars.find(indexCat->GetName()) : nullptr ) ;
382 if (!icat) {
383 throw std::string("RooDataSet::RooDataSet() ERROR in constructor, cannot find index category") ;
384 }
385 for (map<string,RooAbsData*>::iterator hiter = hmap.begin() ; hiter!=hmap.end() ; ++hiter) {
386 // Define state labels in index category (both in provided indexCat and in internal copy in dataset)
387 if (indexCat && !indexCat->hasLabel(hiter->first)) {
388 indexCat->defineType(hiter->first) ;
389 coutI(InputArguments) << "RooDataSet::ctor(" << GetName() << ") defining state \"" << hiter->first << "\" in index category " << indexCat->GetName() << std::endl ;
390 }
391 if (icat && !icat->hasLabel(hiter->first)) {
392 icat->defineType(hiter->first) ;
393 }
394 icat->setLabel(hiter->first.c_str()) ;
395 storeMap[icat->getCurrentLabel()]=hiter->second->store() ;
396
397 // Take ownership of slice if requested
398 if (ownLinked) {
399 addOwnedComponent(hiter->first.c_str(),*hiter->second) ;
400 }
401 }
402
403 // Create composite datastore
404 _dstore = std::make_unique<RooCompositeDataStore>(name,title,_vars,*icat,storeMap) ;
405
406 return;
407 }
408
409 // Create empty datastore
410 RooTreeDataStore* tstore = nullptr;
411 if (defaultStorageType==Tree) {
412 _dstore = std::make_unique<RooTreeDataStore>(name,title,_vars,wgtVarName) ;
413 tstore = static_cast<RooTreeDataStore*>(_dstore.get());
414 } else if (defaultStorageType==Vector) {
415 if (wgtVarName && newWeight) {
416 RooAbsArg* wgttmp = _vars.find(wgtVarName) ;
417 if (wgttmp) {
418 wgttmp->setAttribute("NewWeight") ;
419 }
420 }
421 _dstore = std::make_unique<RooVectorDataStore>(name,title,_vars,wgtVarName) ;
422 }
423
424
425 // Make import mapping if index category is specified
426 std::map<string,RooAbsData*> hmap ;
427 if (indexCat) {
428 auto hiter = impSliceData.begin() ;
429 for (const auto& token : ROOT::Split(impSliceNames, ",")) {
430 hmap[token] = static_cast<RooDataSet*>(*hiter);
431 ++hiter;
432 }
433 }
434
435 // process StoreError requests
436 if (errorSet) {
437 std::unique_ptr<RooArgSet> intErrorSet{_vars.selectCommon(*errorSet)};
438 intErrorSet->setAttribAll("StoreError") ;
439 for(RooAbsArg* arg : *intErrorSet) {
440 arg->attachToStore(*_dstore) ;
441 }
442 }
443 if (asymErrorSet) {
444 std::unique_ptr<RooArgSet> intAsymErrorSet{_vars.selectCommon(*asymErrorSet)};
445 intAsymErrorSet->setAttribAll("StoreAsymError") ;
446 for(RooAbsArg* arg : *intAsymErrorSet) {
447 arg->attachToStore(*_dstore) ;
448 }
449 }
450
451 // Initialize RooDataSet with optional weight variable
453
454 // Import one or more datasets
455 std::unique_ptr<RooFormulaVar> cutVarTmp;
456
457 if (indexCat) {
458 // Case 2 --- Import multiple RooDataSets as slices
459 loadValuesFromSlices(*indexCat, hmap, cutRange, cutVar, cutSpec);
460 } else if (impData) {
461 // Case 3 --- Import RooDataSet
462 std::unique_ptr<RooDataSet> impDataSet;
463
464 // If we are importing a RooDataHist, first convert it to a RooDataSet
465 if(impData->InheritsFrom(RooDataHist::Class())) {
466 impDataSet = makeDataSetFromDataHist(static_cast<RooDataHist const &>(*impData));
467 impData = impDataSet.get();
468 }
469 if (cutSpec) {
470 cutVarTmp = std::make_unique<RooFormulaVar>(cutSpec, cutSpec, *impData->get(), /*checkVariables=*/false);
471 cutVar = cutVarTmp.get();
472 }
473 _dstore->loadValues(impData->store(), cutVar, cutRange);
474
475 } else if (impTree || (fname && strlen(fname))) {
476 // Case 4 --- Import TTree from memory / file
477 std::unique_ptr<TFile> file;
478
479 if (impTree == nullptr) {
480 file.reset(TFile::Open(fname));
481 if (!file) {
482 std::stringstream ss;
483 ss << "RooDataSet::ctor(" << GetName() << ") ERROR file '" << fname
484 << "' cannot be opened or does not exist";
485 const std::string errMsg = ss.str();
486 coutE(InputArguments) << errMsg << std::endl;
487 throw std::invalid_argument(errMsg);
488 }
489
490 file->GetObject(tname, impTree);
491 if (!impTree) {
492 std::stringstream ss;
493 ss << "RooDataSet::ctor(" << GetName() << ") ERROR file '" << fname
494 << "' does not contain a TTree named '" << tname << "'";
495 const std::string errMsg = ss.str();
496 coutE(InputArguments) << errMsg << std::endl;
497 throw std::invalid_argument(errMsg);
498 }
499 }
500
501 if (cutSpec) {
502 cutVarTmp = std::make_unique<RooFormulaVar>(cutSpec, cutSpec, _vars, /*checkVariables=*/false);
503 cutVar = cutVarTmp.get();
504 }
505
506 if (tstore) {
507 tstore->loadValues(impTree, cutVar, cutRange);
508 } else {
510 tmpstore.loadValues(impTree, cutVar, cutRange);
511 _dstore->append(tmpstore);
512 }
513 }
514}
515
516////////////////////////////////////////////////////////////////////////////////
517/// Copy constructor
518
521{
522 initialize(other._wgtVar ? other._wgtVar->GetName() : nullptr);
524}
525
526////////////////////////////////////////////////////////////////////////////////
527/// Return an empty clone of this dataset. If vars is not null, only the variables in vars
528/// are added to the definition of the empty clone
529
530RooFit::OwningPtr<RooAbsData> RooDataSet::emptyClone(const char* newName, const char* newTitle, const RooArgSet* vars, const char* wgtVarName) const
531{
532 bool useOldWeight = _wgtVar && (wgtVarName == nullptr || strcmp(wgtVarName, _wgtVar->GetName()) == 0);
533
534 if(newName == nullptr) newName = GetName();
535 if(newTitle == nullptr) newTitle = GetTitle();
537
539 if(vars == nullptr) {
540 vars2.add(_vars);
541 } else {
542 for(RooAbsArg *var : *vars) {
543 // We should take the variables from the original dataset if
544 // available, such that we can query the "StoreError" and
545 // "StoreAsymError" attributes.
546 auto varInData = _vars.find(*var);
547 vars2.add(varInData ? *varInData : *var);
548 }
549 // We also need to add the weight variable of the original dataset if
550 // it's not added yet, again to query the error attributes correctly.
551 if(useOldWeight && !vars2.find(wgtVarName)) vars2.add(*_wgtVar);
552 }
553
554 RooArgSet errorSet;
556
557 for(RooAbsArg *var : vars2) {
558 if(var->getAttribute("StoreError")) errorSet.add(*var);
559 if(var->getAttribute("StoreAsymError")) asymErrorSet.add(*var);
560 }
561
562 using namespace RooFit;
563 return RooFit::makeOwningPtr<RooAbsData>(std::make_unique<RooDataSet>(
564 newName, newTitle, vars2, WeightVar(wgtVarName), StoreError(errorSet), StoreAsymError(asymErrorSet)));
565}
566
567
568
569////////////////////////////////////////////////////////////////////////////////
570/// Initialize the dataset. If wgtVarName is not null, interpret the observable
571/// with that name as event weight
572
574{
577 _wgtVar = nullptr ;
578 if (wgtVarName) {
580 if (!wgt) {
581 coutE(DataHandling) << "RooDataSet::RooDataSet(" << GetName() << "): designated weight variable "
582 << wgtVarName << " not found in set of variables, no weighting will be assigned" << std::endl ;
583 throw std::invalid_argument("RooDataSet::initialize() weight variable could not be initialised.");
584 } else if (!dynamic_cast<RooRealVar*>(wgt)) {
585 coutE(DataHandling) << "RooDataSet::RooDataSet(" << GetName() << "): designated weight variable "
586 << wgtVarName << " is not of type RooRealVar, no weighting will be assigned" << std::endl ;
587 throw std::invalid_argument("RooDataSet::initialize() weight variable could not be initialised.");
588 } else {
590 _wgtVar = static_cast<RooRealVar*>(wgt) ;
591 }
592 }
593}
594
595
596
597////////////////////////////////////////////////////////////////////////////////
598/// Implementation of RooAbsData virtual method that drives the RooAbsData::reduce() methods
599
600std::unique_ptr<RooAbsData> RooDataSet::reduceEng(const RooArgSet &varSubset, const RooFormulaVar *cutVar,
601 const char *cutRange, std::size_t nStart, std::size_t nStop) const
602{
603 checkInit();
604 RooArgSet tmp(varSubset);
605 if (_wgtVar) {
606 tmp.add(*_wgtVar);
607 }
608
609 auto createEmptyClone = [&]() { return emptyClone(GetName(), GetTitle(), &tmp); };
610
611 std::unique_ptr<RooAbsData> out{createEmptyClone()};
612
613 if (!cutRange || strchr(cutRange, ',') == nullptr) {
614 auto &ds = static_cast<RooDataSet &>(*out);
615 ds._dstore = _dstore->reduce(ds.GetName(), ds.GetTitle(), ds._vars, cutVar, cutRange, nStart, nStop);
616 ds._cachedVars.add(_dstore->cachedVars());
617 } else {
618 // Composite case: multiple ranges
619 auto tokens = ROOT::Split(cutRange, ",");
621 std::stringstream errMsg;
622 errMsg << "Error in RooAbsData::reduce! The ranges " << cutRange << " are overlapping!";
623 throw std::runtime_error(errMsg.str());
624 }
625 for (const auto &token : tokens) {
626 std::unique_ptr<RooAbsData> appendedData{createEmptyClone()};
627 auto &ds = static_cast<RooDataSet &>(*appendedData);
628 ds._dstore = _dstore->reduce(ds.GetName(), ds.GetTitle(), ds._vars, cutVar, token.c_str(), nStart, nStop);
629 ds._cachedVars.add(_dstore->cachedVars());
630 static_cast<RooDataSet &>(*out).append(ds);
631 }
632 }
633 return out;
634}
635
636
637
638////////////////////////////////////////////////////////////////////////////////
639/// Destructor
640
646
647
648
649////////////////////////////////////////////////////////////////////////////////
650/// Return binned clone of this dataset
651
653{
654 std::string title;
655 std::string name;
656 if (newName) {
657 name = newName ;
658 } else {
659 name = std::string(GetName()) + "_binned" ;
660 }
661 if (newTitle) {
662 title = newTitle ;
663 } else {
664 title = std::string(GetTitle()) + "_binned" ;
665 }
666
667 return RooFit::makeOwningPtr(std::make_unique<RooDataHist>(name,title,*get(),*this));
668}
669
670
671
672////////////////////////////////////////////////////////////////////////////////
673/// Return event weight of current event
674
675double RooDataSet::weight() const
676{
677 return store()->weight() ;
678}
679
680
681
682////////////////////////////////////////////////////////////////////////////////
683/// Return squared event weight of the current event. If this RooDataSet has no
684/// weight errors set, this will be the same as `weight() * weight()`, like
685/// expected for an unbinned dataset. When weight errors are set, it is assumed
686/// that the RooDataSet represents a weighted binned dataset and
687/// weightSquared() is the corresponding sum of weight squares for the bin.
688
690{
691 const double w = store()->weight();
692 const double e = weightError();
693 return e > 0.0 ? e * e : w * w;
694}
695
696
697////////////////////////////////////////////////////////////////////////////////
698/// \see RooAbsData::getWeightBatch().
699std::span<const double> RooDataSet::getWeightBatch(std::size_t first, std::size_t len, bool sumW2 /*=false*/) const {
700
701 std::size_t nEntries = this->numEntries(); // for the casting to std::size_t
702
703 if(first + len > nEntries) {
704 throw std::runtime_error("RooDataSet::getWeightBatch(): requested range not valid for dataset.");
705 }
706
707 std::span<const double> allWeights = _dstore->getWeightBatch(0, numEntries());
708 if(allWeights.empty()) return {};
709
710 if(!sumW2) return {&*(std::cbegin(allWeights) + first), len};
711
712 // Treat the sumW2 case with a result buffer, first reset buffer if the
713 // number of entries doesn't match with the dataset anymore
714 if(_sumW2Buffer && _sumW2Buffer->size() != nEntries) _sumW2Buffer.reset();
715
716 if (!_sumW2Buffer) {
717 _sumW2Buffer = std::make_unique<std::vector<double>>();
718 _sumW2Buffer->reserve(nEntries);
719
720 for (std::size_t i = 0; i < nEntries; ++i) {
721 get(i);
722 _sumW2Buffer->push_back(weightSquared());
723 }
724 }
725
726 return std::span<const double>(&*(_sumW2Buffer->begin() + first), len);
727}
728
729
730////////////////////////////////////////////////////////////////////////////////
731/// \copydoc RooAbsData::weightError(double&,double&,RooAbsData::ErrorType) const
732/// \param etype error type
733void RooDataSet::weightError(double& lo, double& hi, ErrorType etype) const
734{
735 store()->weightError(lo,hi,etype) ;
736}
737
738
739////////////////////////////////////////////////////////////////////////////////
740/// \copydoc RooAbsData::weightError(ErrorType)
741/// \param etype error type
743{
744 return store()->weightError(etype) ;
745}
746
747
748////////////////////////////////////////////////////////////////////////////////
749/// Return RooArgSet with coordinates of event 'index'
750
752{
754 return ret ? &_varsNoWgt : nullptr ;
755}
756
757
758////////////////////////////////////////////////////////////////////////////////
759
761{
762 return store()->sumEntries() ;
763}
764
765
766////////////////////////////////////////////////////////////////////////////////
767/// Return the sum of weights in all entries matching cutSpec (if specified)
768/// and in named range cutRange (if specified)
769
770double RooDataSet::sumEntries(const char* cutSpec, const char* cutRange) const
771{
772 // Setup RooFormulaVar for cutSpec if it is present
773 std::unique_ptr<RooFormula> select = nullptr ;
774 if (cutSpec && strlen(cutSpec) > 0) {
775 select = std::make_unique<RooFormula>("select",cutSpec,*get()) ;
776 }
777
778 // Shortcut for unweighted unselected datasets
779 if (!select && !cutRange && !isWeighted()) {
780 return numEntries() ;
781 }
782
783 // Otherwise sum the weights in the event
785 for (int i = 0 ; i<numEntries() ; i++) {
786 get(i) ;
787 if (select && select->eval()==0.) continue ;
788 if (cutRange && !_vars.allInRange(cutRange)) continue ;
789 sumw += weight();
790 }
791
792 return sumw.Sum() ;
793}
794
795
796
797
798////////////////////////////////////////////////////////////////////////////////
799/// Return true if dataset contains weighted events
800
802{
803 return store() ? store()->isWeighted() : false;
804}
805
806
807
808////////////////////////////////////////////////////////////////////////////////
809/// Returns true if histogram contains bins with entries with a non-integer weight
810
812{
813 // Return false if we have no weights
814 if (!_wgtVar) return false ;
815
816 // Now examine individual weights
817 for (int i=0 ; i<numEntries() ; i++) {
818 get(i) ;
819 if (std::abs(weight()-Int_t(weight()))>1e-10) return true ;
820 }
821 // If sum of weights is less than number of events there are negative (integer) weights
822 if (sumEntries()<numEntries()) return true ;
823
824 return false ;
825}
826
827
828
829
830////////////////////////////////////////////////////////////////////////////////
831/// Return a RooArgSet with the coordinates of the current event
832
834{
835 return &_varsNoWgt ;
836}
837
838
839
840////////////////////////////////////////////////////////////////////////////////
841/// Add a data point, with its coordinates specified in the 'data' argset, to the data set.
842/// Any variables present in 'data' but not in the dataset will be silently ignored.
843/// \param[in] data Data point.
844/// \param[in] wgt Event weight. Defaults to 1. The current value of the weight variable is
845/// ignored.
846/// \note To obtain weighted events, a variable must be designated `WeightVar` in the constructor.
847/// \param[in] wgtError Optional weight error.
848/// \note This requires including the weight variable in the set of `StoreError` variables when constructing
849/// the dataset.
850
851void RooDataSet::add(const RooArgSet& data, double wgt, double wgtError)
852{
853 checkInit() ;
854
855 const double oldW = _wgtVar ? _wgtVar->getVal() : 0.;
856
858
859 if (_wgtVar) {
860 _wgtVar->setVal(wgt) ;
861 if (wgtError!=0.) {
863 }
864 } else if ((wgt != 1. || wgtError != 0.) && _errorMsgCount < 5) {
865 ccoutE(DataHandling) << "An event weight/error was passed but no weight variable was defined"
866 << " in the dataset '" << GetName() << "'. The weight will be ignored." << std::endl;
868 }
869
871 && wgtError != 0.
872 && std::abs(wgt*wgt - wgtError)/wgtError > 1.E-15 //Exception for standard wgt^2 errors, which need not be stored.
873 && _errorMsgCount < 5 && !_wgtVar->getAttribute("StoreError")) {
874 coutE(DataHandling) << "An event weight error was passed to the RooDataSet '" << GetName()
875 << "', but the weight variable '" << _wgtVar->GetName()
876 << "' does not store errors. Check `StoreError` in the RooDataSet constructor." << std::endl;
878 }
879
880 fill();
881
882 // Restore weight state
883 if (_wgtVar) {
886 }
887}
888
889
890
891
892////////////////////////////////////////////////////////////////////////////////
893/// Add a data point, with its coordinates specified in the 'data' argset, to the data set.
894/// Any variables present in 'data' but not in the dataset will be silently ignored.
895/// \param[in] indata Data point.
896/// \param[in] inweight Event weight. The current value of the weight variable is ignored.
897/// \note To obtain weighted events, a variable must be designated `WeightVar` in the constructor.
898/// \param[in] weightErrorLo Asymmetric weight error.
899/// \param[in] weightErrorHi Asymmetric weight error.
900/// \note This requires including the weight variable in the set of `StoreAsymError` variables when constructing
901/// the dataset.
902
904{
905 checkInit() ;
906
907 const double oldW = _wgtVar ? _wgtVar->getVal() : 0.;
908
910 if (_wgtVar) {
913 } else if (inweight != 1. && _errorMsgCount < 5) {
914 ccoutE(DataHandling) << "An event weight was given but no weight variable was defined"
915 << " in the dataset '" << GetName() << "'. The weight will be ignored." << std::endl;
917 }
918
920 && _errorMsgCount < 5 && !_wgtVar->getAttribute("StoreAsymError")) {
921 coutE(DataHandling) << "An event weight error was passed to the RooDataSet '" << GetName()
922 << "', but the weight variable '" << _wgtVar->GetName()
923 << "' does not store errors. Check `StoreAsymError` in the RooDataSet constructor." << std::endl;
925 }
926
927 fill();
928
929 // Restore weight state
930 if (_wgtVar) {
933 }
934}
935
936
937
938
939
940////////////////////////////////////////////////////////////////////////////////
941/// Add a data point, with its coordinates specified in the 'data' argset, to the data set.
942/// \attention The order and type of the input variables are **assumed** to be the same as
943/// for the RooArgSet returned by RooDataSet::get(). Input values will just be written
944/// into the internal data columns by ordinal position.
945/// \param[in] data Data point.
946/// \param[in] wgt Event weight. Defaults to 1. The current value of the weight variable is
947/// ignored.
948/// \note To obtain weighted events, a variable must be designated `WeightVar` in the constructor.
949/// \param[in] wgtError Optional weight error.
950/// \note This requires including the weight variable in the set of `StoreError` variables when constructing
951/// the dataset.
952
953void RooDataSet::addFast(const RooArgSet& data, double wgt, double wgtError)
954{
955 checkInit() ;
956
957 const double oldW = _wgtVar ? _wgtVar->getVal() : 0.;
958
959 _varsNoWgt.assignFast(data,_dstore->dirtyProp());
960 if (_wgtVar) {
961 _wgtVar->setVal(wgt) ;
962 if (wgtError!=0.) {
964 }
965 } else if (wgt != 1. && _errorMsgCount < 5) {
966 ccoutE(DataHandling) << "An event weight was given but no weight variable was defined"
967 << " in the dataset '" << GetName() << "'. The weight will be ignored." << std::endl;
969 }
970
971 fill();
972
974 && wgtError != 0. && wgtError != wgt*wgt //Exception for standard weight error, which need not be stored
975 && _errorMsgCount < 5 && !_wgtVar->getAttribute("StoreError")) {
976 coutE(DataHandling) << "An event weight error was passed to the RooDataSet '" << GetName()
977 << "', but the weight variable '" << _wgtVar->GetName()
978 << "' does not store errors. Check `StoreError` in the RooDataSet constructor." << std::endl;
980 }
982 _doWeightErrorCheck = false;
983 }
984
985 if (_wgtVar) {
988 }
989}
990
991
992
993////////////////////////////////////////////////////////////////////////////////
994
997{
998 checkInit() ;
1000 if (data1) dsetList.push_back(data1) ;
1001 if (data2) dsetList.push_back(data2) ;
1002 if (data3) dsetList.push_back(data3) ;
1003 if (data4) dsetList.push_back(data4) ;
1004 if (data5) dsetList.push_back(data5) ;
1005 if (data6) dsetList.push_back(data6) ;
1006 return merge(dsetList) ;
1007}
1008
1009
1010
1011////////////////////////////////////////////////////////////////////////////////
1012/// Merge columns of supplied data set(s) with this data set. All
1013/// data sets must have equal number of entries. In case of
1014/// duplicate columns the column of the last dataset in the list
1015/// prevails
1016
1018{
1019
1020 checkInit() ;
1021 // Sanity checks: data sets must have the same size
1022 for (list<RooDataSet*>::iterator iter = dsetList.begin() ; iter != dsetList.end() ; ++iter) {
1023 if (numEntries()!=(*iter)->numEntries()) {
1024 coutE(InputArguments) << "RooDataSet::merge(" << GetName() << ") ERROR: datasets have different size" << std::endl ;
1025 return true ;
1026 }
1027 }
1028
1029 // Extend vars with elements of other dataset
1031 for (list<RooDataSet*>::iterator iter = dsetList.begin() ; iter != dsetList.end() ; ++iter) {
1032 _vars.addClone((*iter)->_vars,true) ;
1033 dstoreList.push_back((*iter)->store()) ;
1034 }
1035
1036 // Merge data stores
1038 mergedStore->SetName(_dstore->GetName()) ;
1039 mergedStore->SetTitle(_dstore->GetTitle()) ;
1040
1041 // Replace current data store with merged store
1042 _dstore.reset(mergedStore);
1043
1044 initialize(_wgtVar?_wgtVar->GetName():nullptr) ;
1045 return false ;
1046}
1047
1048
1049////////////////////////////////////////////////////////////////////////////////
1050/// Add all data points of given data set to this data set.
1051/// Observable in 'data' that are not in this dataset
1052/// with not be transferred
1053
1055{
1056 checkInit() ;
1057 _dstore->append(*data._dstore) ;
1058}
1059
1060
1061
1062////////////////////////////////////////////////////////////////////////////////
1063/// Add a column with the values of the given (function) argument
1064/// to this dataset. The function value is calculated for each
1065/// event using the observable values of each event in case the
1066/// function depends on variables with names that are identical
1067/// to the observable names in the dataset
1068
1070{
1071 checkInit() ;
1072 std::unique_ptr<RooAbsArg> ret{_dstore->addColumn(var,adjustRange)};
1073 RooAbsArg* retPtr = ret.get();
1074 _vars.addOwned(std::move(ret));
1075 initialize(_wgtVar?_wgtVar->GetName():nullptr) ;
1076 return retPtr;
1077}
1078
1079
1080////////////////////////////////////////////////////////////////////////////////
1081/// Special plot method for 'X-Y' datasets used in \f$ \chi^2 \f$ fitting.
1082/// For general plotting, see RooAbsData::plotOn().
1083///
1084/// These datasets
1085/// have one observable (X) and have weights (Y) and associated errors.
1086/// <table>
1087/// <tr><th> Contents options <th> Effect
1088/// <tr><td> YVar(RooRealVar& var) <td> Designate specified observable as 'y' variable
1089/// If not specified, the event weight will be the y variable
1090/// <tr><th> Histogram drawing options <th> Effect
1091/// <tr><td> DrawOption(const char* opt) <td> Select ROOT draw option for resulting TGraph object
1092/// <tr><td> LineStyle(Int_t style) <td> Select line style by ROOT line style code, default is solid
1093/// <tr><td> LineColor(Int_t color) <td> Select line color by ROOT color code, default is black
1094/// <tr><td> LineWidth(Int_t width) <td> Select line with in pixels, default is 3
1095/// <tr><td> MarkerStyle(Int_t style) <td> Select the ROOT marker style, default is 21
1096/// <tr><td> MarkerColor(Int_t color) <td> Select the ROOT marker color, default is black
1097/// <tr><td> MarkerSize(double size) <td> Select the ROOT marker size
1098/// <tr><td> Rescale(double factor) <td> Apply global rescaling factor to histogram
1099/// <tr><th> Misc. other options <th> Effect
1100/// <tr><td> Name(const chat* name) <td> Give curve specified name in frame. Useful if curve is to be referenced later
1101/// <tr><td> Invisible(bool flag) <td> Add curve to frame, but do not display. Useful in combination AddTo()
1102/// </table>
1103
1105 const RooCmdArg& arg3, const RooCmdArg& arg4,
1106 const RooCmdArg& arg5, const RooCmdArg& arg6,
1107 const RooCmdArg& arg7, const RooCmdArg& arg8) const
1108{
1109 checkInit() ;
1110
1111 RooLinkedList argList ;
1112 argList.Add((TObject*)&arg1) ; argList.Add((TObject*)&arg2) ;
1113 argList.Add((TObject*)&arg3) ; argList.Add((TObject*)&arg4) ;
1114 argList.Add((TObject*)&arg5) ; argList.Add((TObject*)&arg6) ;
1115 argList.Add((TObject*)&arg7) ; argList.Add((TObject*)&arg8) ;
1116
1117 // Process named arguments
1118 RooCmdConfig pc("RooDataSet::plotOnXY(" + std::string(GetName()) + ")");
1119 pc.defineString("drawOption","DrawOption",0,"P") ;
1120 pc.defineString("histName","Name",0,"") ;
1121 pc.defineInt("lineColor","LineColor",0,-999) ;
1122 pc.defineInt("lineStyle","LineStyle",0,-999) ;
1123 pc.defineInt("lineWidth","LineWidth",0,-999) ;
1124 pc.defineInt("markerColor","MarkerColor",0,-999) ;
1125 pc.defineInt("markerStyle","MarkerStyle",0,8) ;
1126 pc.defineDouble("markerSize","MarkerSize",0,-999) ;
1127 pc.defineInt("fillColor","FillColor",0,-999) ;
1128 pc.defineInt("fillStyle","FillStyle",0,-999) ;
1129 pc.defineInt("histInvisible","Invisible",0,0) ;
1130 pc.defineDouble("scaleFactor","Rescale",0,1.) ;
1131 pc.defineObject("xvar","XVar",0,nullptr) ;
1132 pc.defineObject("yvar","YVar",0,nullptr) ;
1133
1134
1135 // Process & check varargs
1136 pc.process(argList) ;
1137 if (!pc.ok(true)) {
1138 return frame ;
1139 }
1140
1141 // Extract values from named arguments
1142 const char* drawOptions = pc.getString("drawOption") ;
1143 Int_t histInvisible = pc.getInt("histInvisible") ;
1144 const char* histName = pc.getString("histName",nullptr,true) ;
1145 double scaleFactor = pc.getDouble("scaleFactor") ;
1146
1147 RooRealVar* xvar = static_cast<RooRealVar*>(_vars.find(frame->getPlotVar()->GetName())) ;
1148
1149 // Determine Y variable (default is weight, if present)
1150 RooRealVar* yvar = static_cast<RooRealVar*>(pc.getObject("yvar")) ;
1151
1152 // Sanity check. XY plotting only applies to weighted datasets if no YVar is specified
1153 if (!_wgtVar && !yvar) {
1154 coutE(InputArguments) << "RooDataSet::plotOnXY(" << GetName() << ") ERROR: no YVar() argument specified and dataset is not weighted" << std::endl ;
1155 return nullptr ;
1156 }
1157
1158 RooRealVar* dataY = yvar ? static_cast<RooRealVar*>(_vars.find(yvar->GetName())) : nullptr ;
1159 if (yvar && !dataY) {
1160 coutE(InputArguments) << "RooDataSet::plotOnXY(" << GetName() << ") ERROR on YVar() argument, dataset does not contain a variable named " << yvar->GetName() << std::endl ;
1161 return nullptr ;
1162 }
1163
1164
1165 // Make RooHist representing XY contents of data
1166 RooHist* graph = new RooHist ;
1167 if (histName) {
1168 graph->SetName(histName) ;
1169 } else {
1170 graph->SetName(("hxy_" + std::string(GetName())).c_str());
1171 }
1172
1173 for (int i=0 ; i<numEntries() ; i++) {
1174 get(i) ;
1175 double x = xvar->getVal() ;
1176 double exlo = xvar->getErrorLo() ;
1177 double exhi = xvar->getErrorHi() ;
1178 double y;
1179 double eylo;
1180 double eyhi;
1181 if (!dataY) {
1182 y = weight() ;
1184 } else {
1185 y = dataY->getVal() ;
1186 eylo = dataY->getErrorLo() ;
1187 eyhi = dataY->getErrorHi() ;
1188 }
1189 graph->addBinWithXYError(x,y,-1*exlo,exhi,-1*eylo,eyhi,scaleFactor) ;
1190 }
1191
1192 // Adjust style options according to named arguments
1193 Int_t lineColor = pc.getInt("lineColor") ;
1194 Int_t lineStyle = pc.getInt("lineStyle") ;
1195 Int_t lineWidth = pc.getInt("lineWidth") ;
1196 Int_t markerColor = pc.getInt("markerColor") ;
1197 Int_t markerStyle = pc.getInt("markerStyle") ;
1198 Size_t markerSize = pc.getDouble("markerSize") ;
1199 Int_t fillColor = pc.getInt("fillColor") ;
1200 Int_t fillStyle = pc.getInt("fillStyle") ;
1201
1202 if (lineColor!=-999) graph->SetLineColor(lineColor) ;
1203 if (lineStyle!=-999) graph->SetLineStyle(lineStyle) ;
1204 if (lineWidth!=-999) graph->SetLineWidth(lineWidth) ;
1205 if (markerColor!=-999) graph->SetMarkerColor(markerColor) ;
1206 if (markerStyle!=-999) graph->SetMarkerStyle(markerStyle) ;
1207 if (markerSize!=-999) graph->SetMarkerSize(markerSize) ;
1208 if (fillColor!=-999) graph->SetFillColor(fillColor) ;
1209 if (fillStyle!=-999) graph->SetFillStyle(fillStyle) ;
1210
1211 // Add graph to frame
1212 frame->addPlotable(graph,drawOptions,histInvisible) ;
1213
1214 return frame ;
1215}
1216
1217
1218
1219
1220////////////////////////////////////////////////////////////////////////////////
1221/// Read given list of ascii files, and construct a data set, using the given
1222/// ArgList as structure definition.
1223/// \param fileList Multiple file names, comma separated. Each
1224/// file is optionally prefixed with 'commonPath' if such a path is
1225/// provided
1226///
1227/// \param varList Specify the dimensions of the dataset to be built.
1228/// This list describes the order in which these dimensions appear in the
1229/// ascii files to be read.
1230/// Each line in the ascii file should contain N white-space separated
1231/// tokens, with N the number of args in `varList`. Any text beyond
1232/// N tokens will be ignored with a warning message.
1233/// (NB: This is the default output of RooArgList::writeToStream())
1234///
1235/// \param verbOpt `Q` be quiet, `D` debug mode (verbose)
1236///
1237/// \param commonPath All filenames in `fileList` will be prefixed with this optional path.
1238///
1239/// \param indexCatName Interpret the data as belonging to category `indexCatName`.
1240/// When multiple files are read, a RooCategory arg in `varList` can
1241/// optionally be designated to hold information about the source file
1242/// of each data point. This feature is enabled by giving the name
1243/// of the (already existing) category variable in `indexCatName`.
1244///
1245/// \attention If the value of any of the variables on a given line exceeds the
1246/// fit range associated with that dimension, the entire line will be
1247/// ignored. A warning message is printed in each case, unless the
1248/// `Q` verbose option is given. The number of events read and skipped
1249/// is always summarized at the end.
1250///
1251/// If no further information is given a label name 'fileNNN' will
1252/// be assigned to each event, where NNN is the sequential number of
1253/// the source file in `fileList`.
1254///
1255/// Alternatively, it is possible to override the default label names
1256/// of the index category by specifying them in the fileList string:
1257/// When instead of `file1.txt,file2.txt` the string
1258/// `file1.txt:FOO,file2.txt:BAR` is specified, a state named "FOO"
1259/// is assigned to the index category for each event originating from
1260/// file1.txt. The labels FOO,BAR may be predefined in the index
1261/// category via defineType(), but don't have to be.
1262///
1263/// Finally, one can also assign the same label to multiple files,
1264/// either by specifying `file1.txt:FOO,file2,txt:FOO,file3.txt:BAR`
1265/// or `file1.txt,file2.txt:FOO,file3.txt:BAR`.
1266///
1267
1269 const char *verbOpt, const char* commonPath,
1270 const char* indexCatName) {
1271 // Make working copy of variables list
1272 RooArgList variables(varList) ;
1273
1274 // Append blinding state category to variable list if not already there
1275 bool ownIsBlind(true) ;
1276 RooAbsArg* blindState = variables.find("blindState") ;
1277 if (!blindState) {
1278 blindState = new RooCategory("blindState","Blinding State") ;
1279 variables.add(*blindState) ;
1280 } else {
1281 ownIsBlind = false ;
1282 if (blindState->IsA()!=RooCategory::Class()) {
1283 oocoutE(nullptr,DataHandling) << "RooDataSet::read: ERROR: variable list already contains"
1284 << "a non-RooCategory blindState member" << std::endl ;
1285 return nullptr ;
1286 }
1287 oocoutW(nullptr,DataHandling) << "RooDataSet::read: WARNING: recycling existing "
1288 << "blindState category in variable list" << std::endl ;
1289 }
1290 RooCategory* blindCat = static_cast<RooCategory*>(blindState) ;
1291
1292 // Configure blinding state category
1293 blindCat->setAttribute("Dynamic") ;
1294 blindCat->defineType("Normal",0) ;
1295 blindCat->defineType("Blind",1) ;
1296
1297 // parse the option string
1299 opts.ToLower();
1300 bool verbose= !opts.Contains("q");
1301 bool debug= opts.Contains("d");
1302
1303 auto data = std::make_unique<RooDataSet>("dataset", fileList, variables);
1304 if (ownIsBlind) { variables.remove(*blindState) ; delete blindState ; }
1305 if(!data) {
1306 oocoutE(nullptr,DataHandling) << "RooDataSet::read: unable to create a new dataset"
1307 << std::endl;
1308 return nullptr;
1309 }
1310
1311 // Redirect blindCat to point to the copy stored in the data set
1312 blindCat = static_cast<RooCategory*>(data->_vars.find("blindState")) ;
1313
1314 // Find index category, if requested
1315 RooCategory *indexCat = nullptr;
1316 //RooCategory *indexCatOrig = 0;
1317 if (indexCatName) {
1318 RooAbsArg* tmp = nullptr;
1319 tmp = data->_vars.find(indexCatName) ;
1320 if (!tmp) {
1321 oocoutE(data.get(),DataHandling) << "RooDataSet::read: no index category named "
1322 << indexCatName << " in supplied variable list" << std::endl ;
1323 return nullptr;
1324 }
1325 if (tmp->IsA()!=RooCategory::Class()) {
1326 oocoutE(data.get(),DataHandling) << "RooDataSet::read: variable " << indexCatName
1327 << " is not a RooCategory" << std::endl ;
1328 return nullptr;
1329 }
1330 indexCat = static_cast<RooCategory*>(tmp);
1331
1332 // Prevent RooArgSet from attempting to read in indexCat
1333 indexCat->setAttribute("Dynamic") ;
1334 }
1335
1336
1337 Int_t outOfRange(0) ;
1338
1339 // Loop over all names in comma separated list
1340 Int_t fileSeqNum(0);
1341 for (const auto& filename : ROOT::Split(std::string(fileList), ", ")) {
1342 // Determine index category number, if this option is active
1343 if (indexCat) {
1344
1345 // Find and detach optional file category name
1346 const char *catname = strchr(filename.c_str(),':');
1347
1348 if (catname) {
1349 // Use user category name if provided
1350 catname++ ;
1351
1352 if (indexCat->hasLabel(catname)) {
1353 // Use existing category index
1354 indexCat->setLabel(catname);
1355 } else {
1356 // Register cat name
1357 indexCat->defineType(catname,fileSeqNum) ;
1358 indexCat->setIndex(fileSeqNum) ;
1359 }
1360 } else {
1361 // Assign autogenerated name
1362 char newLabel[128] ;
1363 snprintf(newLabel,128,"file%03d",fileSeqNum) ;
1364 if (indexCat->defineType(newLabel,fileSeqNum)) {
1365 oocoutE(data.get(), DataHandling) << "RooDataSet::read: Error, cannot register automatic type name " << newLabel
1366 << " in index category " << indexCat->GetName() << std::endl ;
1367 return nullptr ;
1368 }
1369 // Assign new category number
1370 indexCat->setIndex(fileSeqNum) ;
1371 }
1372 }
1373
1374 oocoutI(data.get(), DataHandling) << "RooDataSet::read: reading file " << filename << std::endl ;
1375
1376 // Prefix common path
1378 fullName.Append(filename) ;
1379 ifstream file(fullName) ;
1380
1381 if (!file.good()) {
1382 oocoutE(data.get(), DataHandling) << "RooDataSet::read: unable to open '"
1383 << filename << "'. Returning nullptr now." << std::endl;
1384 return nullptr;
1385 }
1386
1387 // double value;
1388 Int_t line(0) ;
1389 bool haveBlindString(false) ;
1390
1391 while(file.good() && !file.eof()) {
1392 line++;
1393 if(debug) oocxcoutD(data.get(),DataHandling) << "reading line " << line << std::endl;
1394
1395 // process comment lines
1396 if (file.peek() == '#') {
1397 if(debug) oocxcoutD(data.get(),DataHandling) << "skipping comment on line " << line << std::endl;
1398 } else {
1399 // Read single line
1400 bool readError = variables.readFromStream(file,true,verbose) ;
1401 data->_vars.assign(variables) ;
1402
1403 // Stop on read error
1404 if(!file.good()) {
1405 oocoutE(data.get(), DataHandling) << "RooDataSet::read(static): read error at line " << line << std::endl ;
1406 break;
1407 }
1408
1409 if (readError) {
1410 outOfRange++ ;
1411 } else {
1412 blindCat->setIndex(haveBlindString) ;
1413 data->fill(); // store this event
1414 }
1415 }
1416
1417 // Skip all white space (including empty lines).
1418 while (isspace(file.peek())) {
1419 char dummy;
1420 file >> std::noskipws >> dummy >> std::skipws;
1421 }
1422 }
1423
1424 file.close();
1425
1426 // get next file name
1427 fileSeqNum++ ;
1428 }
1429
1430 if (indexCat) {
1431 // Copy dynamically defined types from new data set to indexCat in original list
1432 assert(dynamic_cast<RooCategory*>(variables.find(indexCatName)));
1433 const auto origIndexCat = static_cast<RooCategory*>(variables.find(indexCatName));
1434 for (const auto& nameIdx : *indexCat) {
1435 origIndexCat->defineType(nameIdx.first, nameIdx.second);
1436 }
1437 }
1438 oocoutI(data.get(),DataHandling) << "RooDataSet::read: read " << data->numEntries()
1439 << " events (ignored " << outOfRange << " out of range events)" << std::endl;
1440
1441 return data.release();
1442}
1443
1444
1445
1446
1447////////////////////////////////////////////////////////////////////////////////
1448/// Write the contents of this dataset to an ASCII file with the specified name.
1449/// Each event will be written as a single line containing the written values
1450/// of each observable in the order they were declared in the dataset and
1451/// separated by whitespaces
1452
1453bool RooDataSet::write(const char* filename) const
1454{
1455 // Open file for writing
1456 ofstream ofs(filename) ;
1457 if (ofs.fail()) {
1458 coutE(DataHandling) << "RooDataSet::write(" << GetName() << ") cannot create file " << filename << std::endl ;
1459 return true ;
1460 }
1461
1462 // Write all lines as arglist in compact mode
1463 coutI(DataHandling) << "RooDataSet::write(" << GetName() << ") writing ASCII file " << filename << std::endl ;
1464 return write(ofs);
1465}
1466
1467////////////////////////////////////////////////////////////////////////////////
1468/// Write the contents of this dataset to the stream.
1469/// Each event will be written as a single line containing the written values
1470/// of each observable in the order they were declared in the dataset and
1471/// separated by whitespaces
1472
1473bool RooDataSet::write(ostream & ofs) const {
1474 checkInit();
1475
1476 for (Int_t i=0; i<numEntries(); ++i) {
1477 get(i)->writeToStream(ofs,true);
1478 }
1479
1480 if (ofs.fail()) {
1481 coutW(DataHandling) << "RooDataSet::write(" << GetName() << "): WARNING error(s) have occurred in writing" << std::endl ;
1482 }
1483
1484 return ofs.fail() ;
1485}
1486
1487
1488////////////////////////////////////////////////////////////////////////////////
1489/// Print info about this dataset to the specified output stream.
1490///
1491/// Standard: number of entries
1492/// Shape: list of variables we define & were generated with
1493
1494void RooDataSet::printMultiline(ostream& os, Int_t contents, bool verbose, TString indent) const
1495{
1496 checkInit() ;
1497 RooAbsData::printMultiline(os,contents,verbose,indent) ;
1498 if (_wgtVar) {
1499 os << indent << " Dataset variable \"" << _wgtVar->GetName() << "\" is interpreted as the event weight" << std::endl ;
1500 }
1501}
1502
1503
1504////////////////////////////////////////////////////////////////////////////////
1505/// Print value of the dataset, i.e. the sum of weights contained in the dataset
1506
1507void RooDataSet::printValue(ostream& os) const
1508{
1509 os << numEntries() << " entries" ;
1510 if (isWeighted()) {
1511 os << " (" << sumEntries() << " weighted)" ;
1512 }
1513}
1514
1515
1516
1517////////////////////////////////////////////////////////////////////////////////
1518/// Print argument of dataset, i.e. the observable names
1519
1520void RooDataSet::printArgs(ostream& os) const
1521{
1522 os << "[" ;
1523 bool first(true) ;
1524 for(RooAbsArg* arg : _varsNoWgt) {
1525 if (first) {
1526 first=false ;
1527 } else {
1528 os << "," ;
1529 }
1530 os << arg->GetName() ;
1531 }
1532 if (_wgtVar) {
1533 os << ",weight:" << _wgtVar->GetName() ;
1534 }
1535 os << "]" ;
1536}
1537
1538
1539
1540////////////////////////////////////////////////////////////////////////////////
1541/// Change the name of this dataset into the given name
1542
1543void RooDataSet::SetName(const char *name)
1544{
1545 if (_dir) _dir->GetList()->Remove(this);
1546 // We need to use the function from RooAbsData, because it already overrides TNamed::SetName
1548 if (_dir) _dir->GetList()->Add(this);
1549}
1550
1551
1552////////////////////////////////////////////////////////////////////////////////
1553/// Change the title of this dataset into the given name
1554
1555void RooDataSet::SetNameTitle(const char *name, const char* title)
1556{
1557 SetName(name);
1558 SetTitle(title);
1559}
1560
1561
1562////////////////////////////////////////////////////////////////////////////////
1563/// Stream an object of class RooDataSet.
1564
1566{
1567 if (R__b.IsReading()) {
1568
1569 UInt_t R__s;
1570 UInt_t R__c;
1571 Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
1572
1573 if (R__v > 1) {
1574
1575 // Use new-style streaming for version >1
1576 R__b.ReadClassBuffer(RooDataSet::Class(), this, R__v, R__s, R__c);
1577
1578 } else {
1579
1580 // Legacy dataset conversion happens here. Legacy RooDataSet inherits from RooTreeData
1581 // which in turn inherits from RooAbsData. Manually stream RooTreeData contents on
1582 // file here and convert it into a RooTreeDataStore which is installed in the
1583 // new-style RooAbsData base class
1584
1585 // --- This is the contents of the streamer code of RooTreeData version 1 ---
1586 UInt_t R__s1;
1587 UInt_t R__c1;
1588 Version_t R__v1 = R__b.ReadVersion(&R__s1, &R__c1);
1589 if (R__v1) {
1590 }
1591
1593 TTree *X_tree(nullptr);
1594 R__b >> X_tree;
1596 X_truth.Streamer(R__b);
1598 X_blindString.Streamer(R__b);
1599 R__b.CheckByteCount(R__s1, R__c1, TClass::GetClass("RooTreeData"));
1600 // --- End of RooTreeData-v1 streamer
1601
1602 // Construct RooTreeDataStore from X_tree and complete initialization of new-style RooAbsData
1603 _dstore = std::make_unique<RooTreeDataStore>(X_tree, _vars);
1604 _dstore->SetName(GetName());
1605 _dstore->SetTitle(GetTitle());
1606 _dstore->checkInit();
1607
1608 // This is the contents of the streamer code of RooDataSet version 1
1611 R__b >> _wgtVar;
1612 R__b.CheckByteCount(R__s, R__c, RooDataSet::IsA());
1613 }
1614 } else {
1615 R__b.WriteClassBuffer(RooDataSet::Class(), this);
1616 }
1617}
1618
1619
1620
1621////////////////////////////////////////////////////////////////////////////////
1622/// Convert vector-based storage to tree-based storage. This implementation overrides the base class
1623/// implementation because the latter doesn't transfer weights.
1625{
1627 _dstore = std::make_unique<RooTreeDataStore>(GetName(), GetTitle(), _vars, *_dstore, nullptr, _wgtVar ? _wgtVar->GetName() : nullptr);
1629 }
1630}
1631
1632
1633namespace {
1634
1635 // Compile-time test if we can still use TStrings for the constructors of
1636 // RooDataClasses, either for both name and title or for only one of them.
1637 TString tstr = "tstr";
1638 const char * cstr = "cstr";
1639 RooRealVar x{"x", "x", 1.0};
1640 RooArgSet vars{x};
1641 RooDataSet d1(tstr, tstr, vars);
1642 RooDataSet d2(tstr, cstr, vars);
1643 RooDataSet d3(cstr, tstr, vars);
1644
1645} // namespace
1646
1647
1648void RooDataSet::loadValuesFromSlices(RooCategory &indexCat, std::map<std::string, RooAbsData *> const &slices,
1649 const char *rangeName, RooFormulaVar const *cutVar, const char *cutSpec)
1650{
1651
1652 if (cutVar && cutSpec) {
1653 throw std::invalid_argument("Only one of cutVar or cutSpec should be not a nullptr!");
1654 }
1655
1656 auto &indexCatInData = *static_cast<RooCategory *>(_vars.find(indexCat.GetName()));
1657
1658 for (auto const &item : slices) {
1659 std::unique_ptr<RooDataSet> sliceDataSet;
1660 RooAbsData* sliceData = item.second;
1661
1662 // If we are importing a RooDataHist, first convert it to a RooDataSet
1663 if(sliceData->InheritsFrom(RooDataHist::Class())) {
1665 sliceData = sliceDataSet.get();
1666 }
1667
1668 // Define state labels in index category (both in provided indexCat and in internal copy in dataset)
1669 if (!indexCat.hasLabel(item.first)) {
1670 indexCat.defineType(item.first);
1671 coutI(InputArguments) << "RooDataSet::ctor(" << GetName() << ") defining state \"" << item.first
1672 << "\" in index category " << indexCat.GetName() << std::endl;
1673 }
1674 if (!indexCatInData.hasLabel(item.first)) {
1675 indexCatInData.defineType(item.first);
1676 }
1677 indexCatInData.setLabel(item.first.c_str());
1678 std::unique_ptr<RooFormulaVar> cutVarTmp;
1679 if (cutSpec) {
1680 cutVarTmp = std::make_unique<RooFormulaVar>(cutSpec, cutSpec, *sliceData->get(), /*checkVariables=*/false);
1681 cutVar = cutVarTmp.get();
1682 }
1683 _dstore->loadValues(sliceData->store(), cutVar, rangeName);
1684 }
1685}
1686
1687/**
1688 * \brief Prints the contents of the RooDataSet to the specified output stream.
1689 *
1690 * This function iterates through all events (rows) of the dataset and prints
1691 * the value of each observable, along with the event's weight.
1692 * It is designed to be robust, handling empty or invalid datasets gracefully,
1693 * and works for datasets of any dimension.
1694 *
1695 * \param os The output stream (e.g., std::cout) to write the contents to.
1696 */
1697void RooDataSet::printContents(std::ostream& os) const
1698{
1699 os << "Contents of RooDataSet \"" << GetName() << "\"" << std::endl;
1700
1701 if (numEntries() == 0) {
1702 os << "(dataset is empty)" << std::endl;
1703 return;
1704 }
1705
1706 if (get() == nullptr || get()->empty()) {
1707 os << "(dataset has no observables)" << std::endl;
1708 return;
1709 }
1710
1711 for (int i = 0; i < numEntries(); ++i) {
1712 const RooArgSet* row = get(i); // reuses internal buffers
1713 os << " Entry " << i << ": ";
1714
1715 bool first = true;
1716 for (const auto* var : *row) {
1717 if (!first) os << ", ";
1718 first = false;
1719
1720 os << var->GetName() << "=";
1721 if (auto realVar = dynamic_cast<const RooRealVar*>(var)) {
1722 os << realVar->getVal();
1723 } else if (auto catVar = dynamic_cast<const RooCategory*>(var)) {
1724 os << catVar->getLabel();
1725 } else {
1726 os << "(unsupported type)"; //added as a precaution
1727 }
1728 }
1729
1730 os << ", weight=" << weight();
1731
1732 double lo, hi;
1733 weightError(lo, hi);
1734 if (lo != 0.0 || hi != 0.0) {
1735 os << " ±[" << lo << "," << hi << "]";
1736 }
1737
1738 os << std::endl;
1739 }
1740}
#define e(i)
Definition RSha256.hxx:103
ROOT::RRangeCast< T, false, Range_t > static_range_cast(Range_t &&coll)
#define coutI(a)
#define ccoutE(a)
#define oocoutW(o, a)
#define oocxcoutD(o, a)
#define coutW(a)
#define oocoutE(o, a)
#define oocoutI(o, a)
#define coutE(a)
#define TRACE_DESTROY
Definition RooTrace.h:24
#define TRACE_CREATE
Definition RooTrace.h:23
int Int_t
Signed integer 4 bytes (int)
Definition RtypesCore.h:59
float Size_t
Attribute size (float)
Definition RtypesCore.h:103
short Version_t
Class version identifier (short)
Definition RtypesCore.h:79
static void indent(ostringstream &buf, int indent_level)
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
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 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 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
char name[80]
Definition TGX11.cxx:110
#define hi
#define snprintf
Definition civetweb.c:1579
The Kahan summation is a compensated summation algorithm, which significantly reduces numerical error...
Definition Util.h:141
const_iterator begin() const
const_iterator end() const
Common abstract base class for objects that represent a value and a "shape" in RooFit.
Definition RooAbsArg.h:76
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 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.
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 double weightError(RooAbsData::ErrorType etype=RooAbsData::Poisson) const =0
virtual double weight() const =0
Abstract base class for binned and unbinned datasets.
Definition RooAbsData.h:56
virtual const RooArgSet * get() const
Definition RooAbsData.h:100
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()
Definition RooAbsData.h:76
void checkInit() const
std::unique_ptr< RooAbsDataStore > _dstore
Data storage implementation.
Definition RooAbsData.h:358
virtual void fill()
RooArgSet _vars
Dimensions of this data set.
Definition RooAbsData.h:355
virtual Int_t numEntries() const
Return number of entries in dataset, i.e., count unweighted entries.
StorageType storageType
Definition RooAbsData.h:300
void Streamer(TBuffer &) override
Stream an object of class RooAbsData.
double getVal(const RooArgSet *normalisationSet=nullptr) const
Evaluate object.
Definition RooAbsReal.h:107
RooArgList is a container object that can hold multiple RooAbsArg objects.
Definition RooArgList.h:22
RooArgSet is a container object that can hold multiple RooAbsArg objects.
Definition RooArgSet.h:24
void Streamer(TBuffer &) override
Stream an object of class TObject.
Object to represent discrete states.
Definition RooCategory.h:28
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.
static TClass * Class()
Named container for two doubles, two integers two object points and three string pointers that can be...
Definition RooCmdArg.h:26
const char * getString(Int_t idx) const
Return string stored in slot idx.
Definition RooCmdArg.h:96
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.
Definition RooDataHist.h:40
static TClass * Class()
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.
Definition RooDataHist.h:82
Container class to hold unbinned data.
Definition RooDataSet.h:32
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)
Definition RooDataSet.h:126
bool _doWeightErrorCheck
! When adding events with weights, check that weights can actually be stored.
Definition RooDataSet.h:134
static void cleanup()
RooArgSet _varsNoWgt
Vars without weight variable.
Definition RooDataSet.h:125
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 printContents(std::ostream &os=std::cout) const override
Print the contents of the dataset to the specified output stream.
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 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
Definition RooDataSet.h:138
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
~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.
Definition RooDataSet.h:136
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.
Definition RooDataSet.h:133
static TClass * Class()
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.
void convertToTreeStore() override
Convert vector-based storage to tree-based storage.
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.
Definition RooDirItem.h:22
virtual void Streamer(TBuffer &)
void removeFromDir(TObject *obj)
Remove object from directory it was added to.
TDirectory * _dir
! Associated directory
Definition RooDirItem.h:33
A RooFormulaVar is a generic implementation of a real-valued object, which takes a RooArgList of serv...
Graphical representation of binned data based on the TGraphAsymmErrors class.
Definition RooHist.h:29
void addBinWithXYError(Axis_t binCenter, double n, double exlow, double exhigh, double eylow, double eyhigh, double scaleFactor=1.0)
Add a bin to this histogram with the specified bin contents and error.
Definition RooHist.cxx:497
Collection class for internal use, storing a collection of RooAbsArg pointers in a doubly linked list...
virtual void Add(TObject *arg)
Plot frame and a container for graphics objects within that frame.
Definition RooPlot.h:43
RooAbsRealLValue * getPlotVar() const
Definition RooPlot.h:137
void addPlotable(RooPlotable *plotable, Option_t *drawOptions="", bool invisible=false, bool refreshNorm=false)
Add the specified plotable object to our plot.
Definition RooPlot.cxx:475
Variable that can be changed from the outside.
Definition RooRealVar.h:37
void setVal(double value) override
Set value of variable to 'value'.
void setError(double value)
Definition RooRealVar.h:61
void removeAsymError()
Definition RooRealVar.h:66
void setAsymError(double lo, double hi)
Definition RooRealVar.h:67
void removeError()
Definition RooRealVar.h:62
The RooStringView is a wrapper around a C-style string that can also be constructed from a std::strin...
TTree-backed data storage.
virtual void SetFillColor(Color_t fcolor)
Set the fill area color.
Definition TAttFill.h:38
virtual void SetFillStyle(Style_t fstyle)
Set the fill area style.
Definition TAttFill.h:40
virtual void SetLineStyle(Style_t lstyle)
Set the line style.
Definition TAttLine.h:44
virtual void SetLineWidth(Width_t lwidth)
Set the line width.
Definition TAttLine.h:45
virtual void SetLineColor(Color_t lcolor)
Set the line color.
Definition TAttLine.h:42
virtual void SetMarkerColor(Color_t mcolor=1)
Set the marker color.
Definition TAttMarker.h:39
virtual void SetMarkerStyle(Style_t mstyle=1)
Set the marker style.
Definition TAttMarker.h:41
virtual void SetMarkerSize(Size_t msize=1)
Set the marker size.
Definition TAttMarker.h:46
Buffer base class used for serializing objects.
Definition TBuffer.h:43
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.
Definition TClass.cxx:2973
virtual TList * GetList() const
Definition TDirectory.h:223
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.
Definition TFile.cxx:3765
void SetName(const char *name="") override
Set graph name.
Definition TGraph.cxx:2426
virtual void SetTitle(const char *title="")
Set the title of the TNamed.
Definition TNamed.cxx:173
const char * GetName() const override
Returns name of object.
Definition TNamed.h:49
const char * GetTitle() const override
Returns title of object.
Definition TNamed.h:50
Mother of all ROOT objects.
Definition TObject.h:42
Basic string class.
Definition TString.h:138
A TTree represents a columnar dataset.
Definition TTree.h:89
TLine * line
RooCmdArg StoreError(const RooArgSet &aset)
RooCmdArg WeightVar(const char *name="weight", bool reinterpretAsWeight=false)
Double_t y[n]
Definition legend1.C:17
Double_t x[n]
Definition legend1.C:17
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...
Definition CodegenImpl.h:67
T * OwningPtr
An alias for raw pointers for indicating that the return type of a RooFit function is an owning point...
Definition Config.h:35
OwningPtr< T > makeOwningPtr(std::unique_ptr< T > &&ptr)
Internal helper to turn a std::unique_ptr<T> into an OwningPtr.
Definition Config.h:40
bool checkIfRangesOverlap(RooArgSet const &observables, std::vector< std::string > const &rangeNames)
void initialize(typename Architecture_t::Matrix_t &A, EInitialization m)
Definition Functions.h:282
TLine l
Definition textangle.C:4