Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
RooCategory.h
Go to the documentation of this file.
1/*****************************************************************************
2 * Project: RooFit *
3 * Package: RooFitCore *
4 * File: $Id: RooCategory.h,v 1.27 2007/05/11 09:11:30 verkerke Exp $
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#ifndef ROO_CATEGORY
17#define ROO_CATEGORY
18
20
21#include <vector>
22#include <map>
23#include <string>
24
26
27class RooCategory final : public RooAbsCategoryLValue {
28public:
29 // Constructor, assignment etc.
30 RooCategory() ;
31 RooCategory(const char *name, const char *title);
32 RooCategory(const char* name, const char* title, const std::map<std::string, int>& allowedStates);
33 RooCategory(const RooCategory& other, const char* name=0) ;
35 virtual ~RooCategory();
36 virtual TObject* clone(const char* newname) const override { return new RooCategory(*this,newname); }
37
38 /// Return current index.
39 virtual value_type getCurrentIndex() const override final {
40 return RooCategory::evaluate();
41 }
42
43 virtual Bool_t setIndex(Int_t index, bool printError = true) override;
45 virtual Bool_t setLabel(const char* label, bool printError = true) override;
47
48 // I/O streaming interface (machine readable)
49 virtual Bool_t readFromStream(std::istream& is, Bool_t compact, Bool_t verbose=kFALSE) override;
50 virtual void writeToStream(std::ostream& os, Bool_t compact) const override ;
51
52 bool defineType(const std::string& label);
53 bool defineType(const std::string& label, Int_t index);
54 void defineTypes(const std::map<std::string, int>& allowedStates);
55 value_type& operator[](const std::string& stateName);
56 std::map<std::string, RooAbsCategory::value_type>& states();
57
58 /// \cond LEGACY
59 bool defineType(const char* label) {
60 return defineType(std::string(label));
61 }
62 bool defineType(const char* label, Int_t index) {
63 return defineType(std::string(label), index);
64 }
65 /// \endcond
66
67 /// Clear all defined category states.
68 void clear() {
69 clearTypes();
70 }
71
72 void clearRange(const char* name, Bool_t silent) ;
73 void setRange(const char* rangeName, const char* stateNameList) ;
74 void addToRange(const char* rangeName, RooAbsCategory::value_type stateIndex);
75 void addToRange(const char* rangeName, const char* stateNameList) ;
76
77
78 /// \name RooFit interface
79 /// @{
80
81 /// Tell whether we can be stored in a dataset. Always true for RooCategory.
82 inline virtual Bool_t isFundamental() const override {
83 return true;
84 }
85
86 /// Does our value or shape depend on any other arg? Always false for RooCategory.
87 virtual Bool_t isDerived() const override {
88 return false;
89 }
90
91 Bool_t isStateInRange(const char* rangeName, RooAbsCategory::value_type stateIndex) const ;
92 Bool_t isStateInRange(const char* rangeName, const char* stateName) const ;
93 /// Check if the currently defined category state is in the range with the given name.
94 /// If no ranges are defined, the state counts as being in range.
95 virtual Bool_t inRange(const char* rangeName) const override {
96 return isStateInRange(rangeName, RooCategory::evaluate());
97 }
98 /// Returns true if category has a range with given name defined.
99 virtual bool hasRange(const char* rangeName) const override {
100 return _ranges->find(rangeName) != _ranges->end();
101 }
102
103 ///@}
104
105protected:
106 /// \copydoc RooAbsCategory::evaluate() const
107 /// Returns the currently set state index. If this is invalid,
108 /// returns the first-set index.
109 virtual value_type evaluate() const override {
111 return _currentIndex;
112
113 if (_insertionOrder.empty()) {
114 return invalidCategory().second;
115 } else {
116 auto item = stateNames().find(_insertionOrder.front());
117 assert(item != stateNames().end());
118 return item->second;
119 }
120 }
121
122 /// This category's shape does not depend on others, and does not need recomputing.
123 void recomputeShape() override { };
124
125private:
126
127 using RangeMap_t = std::map<std::string, std::vector<value_type>>;
128 /// Map range names to allowed category states. Note that this must be shared between copies,
129 /// so categories in datasets have the same ranges as their counterparts outside of the dataset.
130 std::shared_ptr<RangeMap_t> _ranges{new RangeMap_t()}; //!
131 RangeMap_t* _rangesPointerForIO{nullptr}; // Pointer to the same object as _ranges, but not shared for I/O.
132
134 void installSharedRange(std::unique_ptr<RangeMap_t>&& rangeMap);
135 // Helper for restoring shared ranges from old versions of this class read from files. Maps TUUID names to shared ranges.
136 static std::map<std::string, std::weak_ptr<RangeMap_t>> _uuidToSharedRangeIOHelper;
137 // Helper for restoring shared ranges from current versions of this class read from files. Maps category names to shared ranges.
138 static std::map<std::string, std::weak_ptr<RangeMap_t>> _sharedRangeIOHelper;
139
140 ClassDefOverride(RooCategory, 3) // Discrete valued variable type
141};
142
143#endif
const Bool_t kFALSE
Definition RtypesCore.h:101
#define ClassDefOverride(name, id)
Definition Rtypes.h:329
char name[80]
Definition TGX11.cxx:110
RooAbsCategoryLValue is the common abstract base class for objects that represent a discrete value th...
virtual bool setIndex(value_type index, bool printError=true)=0
Change category state by specifying the index code of the desired state.
virtual bool setLabel(const char *label, Bool_t printError=kTRUE)=0
Change category state by specifying a state name.
value_type _currentIndex
std::map< std::string, value_type >::const_iterator end() const
Iterator for category state names. Points to pairs of index and name.
int value_type
The type used to denote a specific category state.
bool hasIndex(value_type index) const
Check if a state with index index exists.
std::vector< std::string > _insertionOrder
Map state names to index numbers. Make sure state names are updated in recomputeShape().
const std::map< std::string, value_type > & stateNames() const
Access the map of state names to index numbers.
static const decltype(_stateNames) ::value_type & invalidCategory()
Is this category attached to a tree?
void clearTypes()
Delete all currently defined states.
RooCategorySharedProperties is the container for all properties that are shared between instance of R...
RooCategory is an object to represent discrete states.
Definition RooCategory.h:27
virtual Bool_t isFundamental() const override
Tell whether we can be stored in a dataset. Always true for RooCategory.
Definition RooCategory.h:82
RangeMap_t * _rangesPointerForIO
void addToRange(const char *rangeName, RooAbsCategory::value_type stateIndex)
Add the given state to the given range.
virtual void writeToStream(std::ostream &os, Bool_t compact) const override
compact only at the moment
void setRange(const char *rangeName, const char *stateNameList)
void defineTypes(const std::map< std::string, int > &allowedStates)
Define multiple states in a single call.
void recomputeShape() override
This category's shape does not depend on others, and does not need recomputing.
static std::map< std::string, std::weak_ptr< RangeMap_t > > _sharedRangeIOHelper
void installSharedRange(std::unique_ptr< RangeMap_t > &&rangeMap)
In current versions of the class, a map with ranges can be shared between instances.
virtual value_type evaluate() const override
Evaluate the category state and return.
bool defineType(const std::string &label)
Define a state with given name.
virtual ~RooCategory()
Destructor.
std::shared_ptr< RangeMap_t > _ranges
Map range names to allowed category states.
std::map< std::string, std::vector< value_type > > RangeMap_t
virtual Bool_t readFromStream(std::istream &is, Bool_t compact, Bool_t verbose=kFALSE) override
Read object contents from given stream.
virtual Bool_t setLabel(const char *label, bool printError=true) override
Set value by specifying the name of the desired state.
virtual Bool_t inRange(const char *rangeName) const override
Check if the currently defined category state is in the range with the given name.
Definition RooCategory.h:95
virtual value_type getCurrentIndex() const override final
Return current index.
Definition RooCategory.h:39
value_type & operator[](const std::string &stateName)
Access a named state.
void clear()
Clear all defined category states.
Definition RooCategory.h:68
static std::map< std::string, std::weak_ptr< RangeMap_t > > _uuidToSharedRangeIOHelper
virtual Bool_t setIndex(Int_t index, bool printError=true) override
Set value by specifying the index code of the desired state.
virtual bool hasRange(const char *rangeName) const override
Returns true if category has a range with given name defined.
Definition RooCategory.h:99
virtual Bool_t isDerived() const override
Does our value or shape depend on any other arg? Always false for RooCategory.
Definition RooCategory.h:87
void clearRange(const char *name, Bool_t silent)
Clear the named range.
virtual TObject * clone(const char *newname) const override
Definition RooCategory.h:36
std::map< std::string, RooAbsCategory::value_type > & states()
Return a reference to the map of state names to index states.
RooCategory & operator=(const RooCategory &)=delete
Bool_t isStateInRange(const char *rangeName, RooAbsCategory::value_type stateIndex) const
Check if the state is in the given range.
void installLegacySharedProp(const RooCategorySharedProperties *sp)
When reading old versions of the class, we get instances of shared properties.
Mother of all ROOT objects.
Definition TObject.h:41