39 ClassImp(RooNormSetCache);
48 RooNormSetCache::RooNormSetCache(ULong_t max) :
49 _max(max), _next(0), _set2RangeName(0)
56 RooNormSetCache::~RooNormSetCache()
63 void RooNormSetCache::clear()
66 PairIdxMapType tmpmap;
67 tmpmap.swap(_pairToIdx);
70 PairVectType tmppairvect;
71 tmppairvect.swap(_pairs);
79 void RooNormSetCache::add(
const RooArgSet* set1,
const RooArgSet* set2)
81 const Pair pair(set1, set2);
82 PairIdxMapType::iterator it = _pairToIdx.lower_bound(pair);
83 if (_pairToIdx.end() != it && !PairCmp()(it->first, pair) &&
84 !PairCmp()(pair, it->first)) {
89 _pairToIdx.insert(it, std::make_pair(pair, ULong_t(_pairs.size())));
91 _pairs.push_back(pair);
93 while (_pairs.size() > _max) {
97 _pairToIdx.erase(_pairs[_next]);
99 _pairs[_next] = _pairs.back();
101 _pairs.erase(_pairs.end() - 1);
113 Bool_t RooNormSetCache::autoCache(
const RooAbsArg*
self,
const RooArgSet* set1,
114 const RooArgSet* set2,
const TNamed* set2RangeName, Bool_t doRefill)
120 if (set2RangeName == _set2RangeName && contains(set1,set2)) {
125 RooNameSet nset1d, nset2d;
132 RooArgSet *set1d, *set2d ;
134 set1d = set1 ?
self->getObservables(*set1,kFALSE) :
new RooArgSet;
135 set2d = set2 ?
self->getObservables(*set2,kFALSE) :
new RooArgSet;
137 set1d = set1 ? (RooArgSet*)set1->snapshot() :
new RooArgSet;
138 set2d = set2 ? (RooArgSet*)set2->snapshot() :
new RooArgSet;
143 nset1d.refill(*set1d);
144 nset2d.refill(*set2d);
146 if (nset1d == _name1 && nset2d == _name2 && _set2RangeName == set2RangeName) {
159 _name1.refill(*set1d);
160 _name2.refill(*set2d);
163 _set2RangeName = (TNamed*) set2RangeName;