Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
RooAbsCategory.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 RooAbsCategory.cxx
19\class RooAbsCategory
20\ingroup Roofitcore
21
22RooAbsCategory is the base class for objects that represent a discrete value with a finite number of states.
23
24Each state is denoted by an integer and a name. Both can be used to retrieve and
25set states, but referring to states by index is more efficient. Conversion between
26index and name can be done using lookupName() or lookupIndex().
27It is possible to iterate through all defined states using begin() and end().
28
29For category classes deriving from RooAbsCategory, states can only be evaluated, *i.e.*, queried.
30Refer to RooAbsCategoryLValue and its derived classes for categories where states can also be set. The
31simplest category class whose states can be set, queried and saved in a dataset, refer to RooCategory.
32
33### Interface change in ROOT-6.22
34Category data were based in the class RooCatType, holding an index state and a category name truncated to 256
35characters. This wastes 64 bytes of storage space per entry, and prevents fast retrieval of category data.
36Since ROOT-6.22, categories are only represented by an integer. RooAbsCategory::lookupName() can be used to
37retrieve the corresponding state name. There is no limit for the length of the state name.
38
39To not break old code, the old RooCatType interfaces are still available. Whenever possible,
40the following replacements should be used:
41- lookupType() \f$ \rightarrow \f$ lookupName() / lookupIndex()
42- typeIterator() \f$ \rightarrow \f$ range-based for loop / begin() / end()
43- isValidIndex(Int_t index) \f$ \rightarrow \f$ hasIndex()
44- isValid(const RooCatType&) \f$ \rightarrow \f$ hasIndex() / hasLabel()
45**/
46
47#include "RooAbsCategory.h"
48
49#include "RooArgSet.h"
50#include "Roo1DTable.h"
51#include "RooCategory.h"
52#include "RooMsgService.h"
53#include "RooVectorDataStore.h"
55#include "TreeReadBuffer.h"
56
57#include "Compression.h"
58#include "TString.h"
59#include "TTree.h"
60#include "TLeaf.h"
61#include "TBranch.h"
62
63#include <functional>
64#include <memory>
65
67
68/// A category state to signify an invalid category. The category name is empty,
69/// the index is the minimal int.
71 static const decltype(RooAbsCategory::_stateNames)::value_type invalid{"", std::numeric_limits<value_type>::min()};
72 return invalid;
73}
74
75
77
78
79////////////////////////////////////////////////////////////////////////////////
80/// Constructor
81
82RooAbsCategory::RooAbsCategory(const char *name, const char *title) :
83 RooAbsArg(name,title), _currentIndex(0)
84{
87}
88
89
90
91////////////////////////////////////////////////////////////////////////////////
92/// Copy constructor, copies the registered category states from the original.
93
95 RooAbsArg(other,name), _currentIndex(other._currentIndex),
96 _stateNames(other._stateNames),
97 _insertionOrder(other._insertionOrder)
98{
100 setShapeDirty() ;
101}
102
103
104
105////////////////////////////////////////////////////////////////////////////////
106/// Destructor
107
109{
110 if (_treeReadBuffer) {
111 delete _treeReadBuffer;
112 }
113 _treeReadBuffer = nullptr;
114}
115
116
117
118////////////////////////////////////////////////////////////////////////////////
119/// Return index number of current state
120
122{
123 if (isValueDirty() || isShapeDirty()) {
125
127 }
128
129 return _currentIndex;
130}
131
132
133
134////////////////////////////////////////////////////////////////////////////////
135/// Return label string of current state.
136
138{
139 const auto index = getCurrentIndex();
140 for (const auto& item : stateNames()) {
141 if (item.second == index)
142 return item.first.c_str();
143 }
144
145 return "";
146}
147
148
149////////////////////////////////////////////////////////////////////////////////
150/// Equality operator with a integer (compares with state index number)
151
153{
154 return (index==getCurrentIndex()) ;
155}
156
157
158
159////////////////////////////////////////////////////////////////////////////////
160/// Equality operator with a string (compares with state label string)
161
162bool RooAbsCategory::operator==(const char* label) const
163{
164 return strcmp(label, getCurrentLabel()) == 0;
165}
166
167
168
169////////////////////////////////////////////////////////////////////////////////
170/// Equality operator with another RooAbsArg. Only functional
171/// is also a RooAbsCategory, will return true if index is the same
172
173bool RooAbsCategory::operator==(const RooAbsArg& other) const
174{
175 const RooAbsCategory* otherCat = dynamic_cast<const RooAbsCategory*>(&other) ;
176 return otherCat ? operator==(otherCat->getCurrentIndex()) : false ;
177}
178
179
180////////////////////////////////////////////////////////////////////////////////
181
182bool RooAbsCategory::isIdentical(const RooAbsArg& other, bool assumeSameType) const
183{
184 if (!assumeSameType) {
185 const RooAbsCategory* otherCat = dynamic_cast<const RooAbsCategory*>(&other) ;
186 return otherCat ? operator==(otherCat->getCurrentIndex()) : false ;
187 } else {
188 return getCurrentIndex() == static_cast<const RooAbsCategory&>(other).getCurrentIndex();
189 }
190}
191
192
193////////////////////////////////////////////////////////////////////////////////
194/// Check if a state with index `index` exists.
196{
197 for (const auto& item : stateNames()) {
198 if (item.second == index)
199 return true;
200 }
201
202 return false;
203}
204
205
206////////////////////////////////////////////////////////////////////////////////
207/// Look up the name corresponding to the given index.
208const std::string& RooAbsCategory::lookupName(value_type index) const {
209 for (const auto& item : stateNames()) {
210 if (item.second == index)
211 return item.first;
212 }
213
214 return invalidCategory().first;
215}
216
217////////////////////////////////////////////////////////////////////////////////
218/// Define a new state with given label. The next available
219/// integer is assigned as index value.
220const std::map<std::string, RooAbsCategory::value_type>::value_type& RooAbsCategory::defineState(const std::string& label)
221{
222 return defineState(label, nextAvailableStateIndex());
223}
224
225
226////////////////////////////////////////////////////////////////////////////////
227/// Internal version of defineState() that does not check if type
228/// already exists
230{
231 _stateNames.emplace(label, index);
232 _insertionOrder.push_back(label);
233
234 if (_stateNames.size() == 1)
236
238}
239
240
241
242////////////////////////////////////////////////////////////////////////////////
243/// Define new state with given name and index number.
244
245const std::map<std::string, RooAbsCategory::value_type>::value_type& RooAbsCategory::defineState(const std::string& label, RooAbsCategory::value_type index)
246{
247 auto& theStateNames = stateNames();
248
249 if (hasIndex(index)) {
250 coutE(InputArguments) << "RooAbsCategory::" << __func__ << "(" << GetName() << "): index "
251 << index << " already assigned" << std::endl;
252 return invalidCategory();
253 }
254
255 if (hasLabel(label)) {
256 coutE(InputArguments) << "RooAbsCategory::" << __func__ << "(" << GetName() << "): label "
257 << label << " already assigned or not allowed" << std::endl;
258 return invalidCategory();
259 }
260
261 const auto result = theStateNames.emplace(label, index);
262 _insertionOrder.push_back(label);
263
264 if (theStateNames.size() == 1)
266
268
269 return *(result.first);
270}
271
272
273
274////////////////////////////////////////////////////////////////////////////////
275/// Delete all currently defined states
276
278{
279 _stateNames.clear();
280 _insertionOrder.clear();
282 setShapeDirty() ;
283}
284
285
286////////////////////////////////////////////////////////////////////////////////
287/// Find the index number corresponding to the state name.
288/// \see hasLabel() for checking if a given label has been defined.
289/// \return Index of the category or std::numeric_limits<int>::min() on failure.
290RooAbsCategory::value_type RooAbsCategory::lookupIndex(const std::string& stateName) const {
291 const auto item = stateNames().find(stateName);
292 if (item != stateNames().end()) {
293 return item->second;
294 }
295
296 return invalidCategory().second;
297}
298
299////////////////////////////////////////////////////////////////////////////////
300/// Find our type that matches the specified type, or return 0 for no match.
301/// \deprecated RooCatType is not used, any more. This function will create one and let it leak.
302/// Use lookupIndex() (preferred) or lookupName() instead.
303const RooCatType* RooAbsCategory::lookupType(const RooCatType &other, bool printError) const
304{
305 return lookupType(other.getVal(), printError);
306}
307
308
309
310////////////////////////////////////////////////////////////////////////////////
311/// Find our type corresponding to the specified index, or return nullptr for no match.
312/// \deprecated RooCatType is not used, any more. This function will create one and let it leak.
313/// Use lookupIndex() (preferred) or lookupName() instead.
315{
316 for (const auto &item : stateNames()) {
317 if (item.second == index) {
319 }
320 }
321
322 if (printError) {
323 coutE(InputArguments) << ClassName() << "::" << GetName() << ":lookupType: no match for index "
324 << index << std::endl;
325 }
326
327 return nullptr;
328}
329
330
331
332////////////////////////////////////////////////////////////////////////////////
333/// Find our type corresponding to the specified label, or return 0 for no match.
334/// \deprecated RooCatType is not used, any more. This function will create one and let it leak.
335/// Use lookupIndex() (preferred) or lookupName() instead.
336const RooCatType* RooAbsCategory::lookupType(const char* label, bool printError) const
337{
338 for (const auto& type : stateNames()) {
339 if(type.first == label)
340 return retrieveLegacyState(type.second);
341 }
342
343 // Try if label represents integer number
344 char* endptr ;
345 RooAbsCategory::value_type idx=strtol(label,&endptr,10) ;
346 if (endptr==label+strlen(label)) {
347 return lookupType(idx);
348 }
349
350 if (printError) {
351 coutE(InputArguments) << ClassName() << "::" << GetName() << ":lookupType: no match for label "
352 << label << std::endl;
353 }
354 return nullptr;
355}
356
357
358////////////////////////////////////////////////////////////////////////////////
359/// Check if given state is defined for this object
360
362{
363 return hasIndex(value.getVal()) ;
364}
365
366
367
368////////////////////////////////////////////////////////////////////////////////
369/// Create a table matching the shape of this category
370
372{
373 return new Roo1DTable(GetName(),label,*this) ;
374}
375
376
377
378////////////////////////////////////////////////////////////////////////////////
379/// Read object contents from stream (dummy for now)
380
381bool RooAbsCategory::readFromStream(std::istream&, bool, bool)
382{
383 return false ;
384}
385
386
387
388////////////////////////////////////////////////////////////////////////////////
389/// Write object contents to ostream
390
391void RooAbsCategory::writeToStream(std::ostream& os, bool /* compact */) const
392{
393 os << getCurrentLabel() ;
394}
395
396
397
398////////////////////////////////////////////////////////////////////////////////
399/// Print value (label name)
400
401void RooAbsCategory::printValue(std::ostream& os) const
402{
403 os << getCurrentLabel() << "(idx = " << getCurrentIndex() << ")" << std::endl;
404}
405
406
407
408////////////////////////////////////////////////////////////////////////////////
409/// Print info about this object to the specified stream. In addition to the info
410/// from RooAbsArg::printStream() we add:
411///
412/// Shape : label, index, defined types
413
414void RooAbsCategory::printMultiline(std::ostream& os, Int_t contents, bool verbose, TString indent) const
415{
416 RooAbsArg::printMultiline(os,contents,verbose,indent);
417
418 os << indent << "--- RooAbsCategory ---" << std::endl;
419 if (stateNames().empty()) {
420 os << indent << " ** No values defined **" << std::endl;
421 return;
422 }
423 os << indent << " Value = " << getCurrentIndex() << " \"" << getCurrentLabel() << ')' << std::endl;
424 os << indent << " Possible states:" << std::endl;
425 indent.Append(" ");
426 for (const auto& type : stateNames()) {
427 os << indent << type.first << '\t' << type.second << "\n";
428 }
429}
430
431
432
433////////////////////////////////////////////////////////////////////////////////
434/// Attach the category index and label to as branches to the given vector store
435
437{
438 RooVectorDataStore::CatVector* cv = vstore.addCategory(this) ;
440}
441
442
443
444
445////////////////////////////////////////////////////////////////////////////////
446/// Attach the category index and label as branches to the given
447/// TTree. The index field will be attached as integer with name
448/// `<name>_idx`. If a branch `<name>` exists, it attaches to this branch.
450{
451 // First check if there is an integer branch matching the category name
452 std::string cleanName = cleanBranchName().Data();
453 TBranch* branch = tree.GetBranch(cleanName.c_str());
454 if (!branch) {
455 cleanName += "_idx";
456 branch = tree.GetBranch(cleanName.c_str());
457 }
458
459 if (branch) {
460 TLeaf* leaf = static_cast<TLeaf*>(branch->GetListOfLeaves()->At(0));
461
462 // Check that leaf is _not_ an array
463 Int_t dummy ;
464 TLeaf* counterLeaf = leaf->GetLeafCounter(dummy) ;
465 if (counterLeaf) {
466 coutE(Eval) << "RooAbsCategory::attachToTree(" << GetName() << ") ERROR: TTree branch " << GetName()
467 << " is an array and cannot be attached to a RooAbsCategory" << std::endl;
468 return ;
469 }
470
471 const std::string typeName = leaf->GetTypeName();
472
473
474 // For different type names, store a function to attach
475 std::map<std::string, std::function<std::unique_ptr<TreeReadBuffer>()>> typeMap {
476 {"Float_t", [&](){ return createTreeReadBuffer<Float_t >(cleanName, tree); }},
477 {"Double_t", [&](){ return createTreeReadBuffer<Double_t >(cleanName, tree); }},
478 {"UChar_t", [&](){ return createTreeReadBuffer<UChar_t >(cleanName, tree); }},
479 {"Boolt_", [&](){ return createTreeReadBuffer<Bool_t >(cleanName, tree); }},
480 {"Char_t", [&](){ return createTreeReadBuffer<Char_t >(cleanName, tree); }},
481 {"UInt_t", [&](){ return createTreeReadBuffer<UInt_t >(cleanName, tree); }},
482 {"Long64_t", [&](){ return createTreeReadBuffer<Long64_t >(cleanName, tree); }},
483 {"ULong64_t", [&](){ return createTreeReadBuffer<ULong64_t>(cleanName, tree); }},
484 {"Short_t", [&](){ return createTreeReadBuffer<Short_t >(cleanName, tree); }},
485 {"UShort_t", [&](){ return createTreeReadBuffer<UShort_t >(cleanName, tree); }},
486 };
487
488 auto typeDetails = typeMap.find(typeName);
489 if (typeDetails != typeMap.end()) {
490 coutI(DataHandling) << "RooAbsCategory::attachToTree(" << GetName() << ") TTree " << typeName << " branch \"" << cleanName
491 << "\" will be converted to int." << std::endl;
492 _treeReadBuffer = typeDetails->second().release();
493 } else {
494 if (_treeReadBuffer) {
495 delete _treeReadBuffer;
496 }
497 _treeReadBuffer = nullptr;
498
499 if (typeName == "Int_t") {
500 tree.SetBranchAddress(cleanName.c_str(), &_currentIndex);
501 }
502 else {
503 coutE(InputArguments) << "RooAbsCategory::attachToTree(" << GetName() << ") data type " << typeName << " is not supported." << std::endl;
504 }
505 }
506 } else {
507 void* ptr = &_currentIndex;
508 tree.Branch(cleanName.c_str(), ptr, (cleanName + "/I").c_str(), bufSize);
509 }
510}
511
512
513
514////////////////////////////////////////////////////////////////////////////////
515/// Fill tree branches associated with current object with current value
516
518{
519 // First determine if branch is taken
520 TBranch* idxBranch = t.GetBranch((std::string(GetName()) + "_idx").c_str()) ;
521 if (!idxBranch) {
522 coutF(DataHandling) << "RooAbsCategory::fillTreeBranch(" << GetName() << ") ERROR: not attached to tree" << std::endl;
523 throw std::runtime_error("RooAbsCategory::fillTreeBranch(): Category is not attached to a tree.");
524 }
525
526 idxBranch->Fill() ;
527}
528
529
530
531////////////////////////////////////////////////////////////////////////////////
532/// (De)activate associate tree branch
533
535{
536 TBranch* branch = t.GetBranch(Form("%s_idx",GetName())) ;
537 if (branch) {
538 t.SetBranchStatus(Form("%s_idx",GetName()),active?true:false) ;
539 }
540}
541
542
543
544////////////////////////////////////////////////////////////////////////////////
545/// Explicitly synchronize RooAbsCategory internal cache
546
548{
550}
551
552
553
554////////////////////////////////////////////////////////////////////////////////
555/// Copy the cached value from given source and raise dirty flag.
556/// It is the callers responsibility to ensure that the sources
557/// cache is clean(valid) before this function is called, e.g. by
558/// calling syncCache() on the source.
559
560void RooAbsCategory::copyCache(const RooAbsArg *source, bool /*valueOnly*/, bool setValDirty)
561{
562 auto other = static_cast<const RooAbsCategory*>(source);
563 assert(dynamic_cast<const RooAbsCategory*>(source));
564
565 _currentIndex = other->_treeReadBuffer ? *other->_treeReadBuffer : other->_currentIndex;
566
567 if (setValDirty) {
569 }
570}
571
572
573////////////////////////////////////////////////////////////////////////////////
574/// Overwrite the value stored in this object's cache.
575/// This can be used to fake a computation that resulted in `value`.
576/// \param[in] value Value to write. The argument is reinterpreted as a category state.
577/// If such a state does not exist, this will create undefined behaviour.
578/// \param[in] notifyClients If true, notify users of this object that its value changed.
579/// This is the default.
580void RooAbsCategory::setCachedValue(double value, bool notifyClients) {
581 _currentIndex = static_cast<value_type>(value);
582
583 if (notifyClients) {
585 _valueDirty = false;
586 }
587}
588
589
590////////////////////////////////////////////////////////////////////////////////
591/// Return name and index of the `n`th defined state. When states are defined using
592/// defineType() or operator[], the order of insertion is tracked, to mimic the behaviour
593/// before modernising the category classes.
594/// When directly manipulating the map with state names using states(), the order of insertion
595/// is not known, so alphabetical ordering as usual for std::map is used. The latter is faster.
596/// \param[in] n Number of state to be retrieved.
597/// \return A pair with name and index.
598const std::map<std::string, RooAbsCategory::value_type>::value_type& RooAbsCategory::getOrdinal(unsigned int n) const {
599 // Retrieve state names, trigger possible recomputation
600 auto& theStateNames = stateNames();
601
602 if (n >= theStateNames.size())
603 return invalidCategory();
604
605 if (theStateNames.size() != _insertionOrder.size())
606 return *std::next(theStateNames.begin(), n);
607
608 const auto item = theStateNames.find(_insertionOrder[n]);
609 if (item != theStateNames.end())
610 return *item;
611
612 return invalidCategory();
613}
614
615
616////////////////////////////////////////////////////////////////////////////////
617/// Return ordinal number of the current state.
619 // Retrieve state names, trigger possible recomputation
620 auto& theStateNames = stateNames();
621
622 // If we don't have the full history of inserted state names, have to go by map ordering:
623 if (theStateNames.size() != _insertionOrder.size()) {
624 const auto currentIndex = getCurrentIndex();
625 for (auto it = theStateNames.begin(); it != theStateNames.end(); ++it) {
626 if (it->second == currentIndex)
627 return std::distance(theStateNames.begin(), it);
628 }
629 }
630
631 // With full insertion history, find index of current label:
632 auto item = std::find(_insertionOrder.begin(), _insertionOrder.end(), getCurrentLabel());
633 assert(item != _insertionOrder.end());
634
635 return item - _insertionOrder.begin();
636}
637
638
639////////////////////////////////////////////////////////////////////////////////
640/// Create a RooCategory fundamental object with our properties.
641
643{
644 // Add and precalculate new category column
645 auto fund = std::make_unique<RooCategory>(newname?newname:GetName(),GetTitle()) ;
646
647 // Copy states
648 for (const auto& type : stateNames()) {
649 fund->defineStateUnchecked(type.first, type.second);
650 }
651
652 return RooFit::makeOwningPtr<RooAbsArg>(std::move(fund));
653}
654
655
656
657////////////////////////////////////////////////////////////////////////////////
658/// Determine if category has 2 or 3 states with index values -1,0,1
659
660bool RooAbsCategory::isSignType(bool mustHaveZero) const
661{
662 const auto& theStateNames = stateNames();
663
664 if (theStateNames.size() > 3 || theStateNames.size() < 2) return false;
665 if (mustHaveZero && theStateNames.size() != 3) return false;
666
667 for (const auto& type : theStateNames) {
668 if (std::abs(type.second)>1)
669 return false;
670 }
671
672 return true;
673}
674
675/// \deprecated Use begin() and end() instead.
676/// \note Using this iterator creates useless RooCatType instances, which will leak
677/// unless deleted by the user.
680}
681
682const RooCatType* RooAbsCategory::defineType(const char* label) {
683 defineState(label);
684 return retrieveLegacyState(stateNames()[label]);
685}
686
687const RooCatType* RooAbsCategory::defineType(const char* label, int index) {
688 defineState(label, index);
690}
691
695}
696
697/// Return the legacy RooCatType corresponding to `index`. If it doesn't exist, create one.
699 auto result = _legacyStates.find(index);
700 if (result == _legacyStates.end()) {
701 result = _legacyStates.emplace(index,
702 std::make_unique<RooCatType>(lookupName(index).c_str(), index)).first;
703 }
704
705 return result->second.get();
706}
707
708
710 const auto& theStateNames = stateNames();
711
712 if (theStateNames.empty())
713 return 0;
714
715 return 1 + std::max_element(theStateNames.begin(), theStateNames.end(),
716 [](auto const& left, auto const& right) { return left.second < right.second; })->second;
717}
#define coutI(a)
#define coutF(a)
#define coutE(a)
#define ClassImp(name)
Definition Rtypes.h:382
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 result
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 value
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 type
char name[80]
Definition TGX11.cxx:110
char * Form(const char *fmt,...)
Formats a string in a circular formatting buffer.
Definition TString.cxx:2489
One-dimensional table.
Definition Roo1DTable.h:23
Common abstract base class for objects that represent a value and a "shape" in RooFit.
Definition RooAbsArg.h:79
void setShapeDirty()
Notify that a shape-like property (e.g. binning) has changed.
Definition RooAbsArg.h:467
bool isShapeDirty() const
Definition RooAbsArg.h:388
void clearValueDirty() const
Definition RooAbsArg.h:576
bool _valueDirty
Definition RooAbsArg.h:685
void setValueDirty()
Mark the element dirty. This forces a re-evaluation when a value is requested.
Definition RooAbsArg.h:462
void printMultiline(std::ostream &os, Int_t contents, bool verbose=false, TString indent="") const override
Implement multi-line detailed printing.
TString cleanBranchName() const
Construct a mangled name from the actual name that is free of any math symbols that might be interpre...
bool isValueDirty() const
Definition RooAbsArg.h:393
A space to attach TBranches.
virtual value_type getCurrentIndex() const
Return index number of current state.
void setCachedValue(double value, bool notifyClients=true) final
Overwrite the value stored in this object's cache.
unsigned int getCurrentOrdinalNumber() const
Return ordinal number of the current state.
bool hasLabel(const std::string &label) const
Check if a state with name label exists.
virtual const char * getCurrentLabel() const
Return label string of current state.
const std::string & lookupName(value_type index) const
Get the name corresponding to the given index.
TIterator * typeIterator() const
bool operator==(value_type index) const
Equality operator with a integer (compares with state index number)
RooCatType * retrieveLegacyState(value_type index) const
Return the legacy RooCatType corresponding to index. If it doesn't exist, create one.
void copyCache(const RooAbsArg *source, bool valueOnly=false, bool setValueDirty=true) override
Copy the cached value from given source and raise dirty flag.
value_type _currentIndex
Current category state.
Roo1DTable * createTable(const char *label) const
Create a table matching the shape of this category.
void defineStateUnchecked(const std::string &label, value_type index)
Internal version of defineState() that does not check if type already exists.
const RooCatType * defineTypeUnchecked(const char *label, value_type index)
void setTreeBranchStatus(TTree &t, bool active) override
(De)activate associate tree branch
const RooCatType * lookupType(value_type index, bool printError=false) const
Find our type corresponding to the specified index, or return nullptr for no match.
void writeToStream(std::ostream &os, bool compact) const override
Write object contents to ostream.
value_type nextAvailableStateIndex() const
bool readFromStream(std::istream &is, bool compact, bool verbose=false) override
Read object contents from stream (dummy for now)
bool isSignType(bool mustHaveZero=false) const
Determine if category has 2 or 3 states with index values -1,0,1.
std::map< std::string, value_type >::const_iterator end() const
Iterator for category state names. Points to pairs of index and name.
virtual const std::map< std::string, RooAbsCategory::value_type >::value_type & defineState(const std::string &label)
Define a new state with given label.
virtual value_type evaluate() const =0
Evaluate the category state and return.
void syncCache(const RooArgSet *set=nullptr) override
Explicitly synchronize RooAbsCategory internal cache.
const std::map< std::string, value_type >::value_type & getOrdinal(unsigned int n) const
Return name and index of the nth defined state.
RooFit::OwningPtr< RooAbsArg > createFundamental(const char *newname=nullptr) const override
Create a RooCategory fundamental object with our properties.
void printMultiline(std::ostream &os, Int_t contents, bool verbose=false, TString indent="") const override
Print info about this object to the specified stream.
TreeReadBuffer * _treeReadBuffer
std::map< value_type, std::unique_ptr< RooCatType, std::function< void(RooCatType *)> > > _legacyStates
! Map holding pointers to RooCatType instances. Only for legacy interface. Don't use if possible.
bool isIdentical(const RooAbsArg &other, bool assumeSameType=false) const override
~RooAbsCategory() override
Destructor.
std::vector< std::string > _insertionOrder
Keeps track in which order state numbers have been inserted. Make sure this is updated in recomputeSh...
std::map< std::string, value_type > _stateNames
Map state names to index numbers. Make sure state names are updated in recomputeShape().
bool isValid() const override
WVE (08/21/01) Probably obsolete now.
const RooCatType * defineType(const char *label)
const std::map< std::string, value_type > & stateNames() const
Access the map of state names to index numbers.
bool hasIndex(value_type index) const
Check if a state with index index exists.
void attachToVStore(RooVectorDataStore &vstore) override
Attach the category index and label to as branches to the given vector store.
static const decltype(_stateNames) ::value_type & invalidCategory()
A category state to signify an invalid category.
value_type lookupIndex(const std::string &stateName) const
Find the index number corresponding to the state name.
void attachToTree(TTree &t, Int_t bufSize=32000) override
Attach the category index and label as branches to the given TTree.
void fillTreeBranch(TTree &t) override
Fill tree branches associated with current object with current value.
bool empty() const
If there are no states defined.
void clearTypes()
Delete all currently defined states.
void printValue(std::ostream &os) const override
Print value (label name)
RooArgSet is a container object that can hold multiple RooAbsArg objects.
Definition RooArgSet.h:24
RooCatType is an auxiliary class for RooAbsCategory and defines a a single category state.
Int_t getVal() const
void setBuffer(RooAbsCategory::value_type *newBuf)
Uses std::vector to store data columns.
CatVector * addCategory(RooAbsCategory *cat)
A TTree is a list of TBranches.
Definition TBranch.h:93
TObjArray * GetListOfLeaves()
Definition TBranch.h:247
Int_t Fill()
Definition TBranch.h:205
Iterator abstract base class.
Definition TIterator.h:30
A TLeaf describes individual elements of a TBranch See TBranch structure in TTree.
Definition TLeaf.h:57
virtual const char * GetTypeName() const
Definition TLeaf.h:139
virtual TLeaf * GetLeafCounter(Int_t &countval) const
Return a pointer to the counter of this leaf (if any) or store the number of elements that the leaf c...
Definition TLeaf.cxx:249
const char * GetName() const override
Returns name of object.
Definition TNamed.h:47
const char * GetTitle() const override
Returns title of object.
Definition TNamed.h:48
TObject * At(Int_t idx) const override
Definition TObjArray.h:164
virtual const char * ClassName() const
Returns name of class to which the object belongs.
Definition TObject.cxx:213
Basic string class.
Definition TString.h:139
const char * Data() const
Definition TString.h:376
A TTree represents a columnar dataset.
Definition TTree.h:79
virtual void SetBranchStatus(const char *bname, bool status=true, UInt_t *found=nullptr)
Set branch status to Process or DoNotProcess.
Definition TTree.cxx:8534
virtual TBranch * GetBranch(const char *name)
Return pointer to the branch with the given name in this tree or its friends.
Definition TTree.cxx:5294
const Int_t n
Definition legend1.C:16
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