47 ClassImp(RooCompositeDataStore);
53 RooCompositeDataStore::RooCompositeDataStore() : _indexCat(0), _curStore(0), _curIndex(0), _ownComps(kFALSE)
63 RooCompositeDataStore::RooCompositeDataStore(
const char* name,
const char* title,
const RooArgSet& vars, RooCategory& indexCat,map<std::string,RooAbsDataStore*> inputData) :
64 RooAbsDataStore(name,title,RooArgSet(vars,indexCat)), _indexCat(&indexCat), _curStore(0), _curIndex(0), _ownComps(kFALSE)
66 for (map<string,RooAbsDataStore*>::iterator iter=inputData.begin() ; iter!=inputData.end() ; ++iter) {
67 _dataMap[indexCat.lookupType(iter->first.c_str())->getVal()] = iter->second ;
78 RooCompositeDataStore::RooCompositeDataStore(
const RooCompositeDataStore& other,
const char* newname) :
79 RooAbsDataStore(other,newname), _indexCat(other._indexCat), _curStore(other._curStore), _curIndex(other._curIndex), _ownComps(kTRUE)
81 for (map<Int_t,RooAbsDataStore*>::const_iterator iter=other._dataMap.begin() ; iter!=other._dataMap.end() ; ++iter) {
82 RooAbsDataStore* clonedata = iter->second->clone() ;
83 _dataMap[iter->first] = clonedata ;
92 RooCompositeDataStore::RooCompositeDataStore(
const RooCompositeDataStore& other,
const RooArgSet& vars,
const char* newname) :
93 RooAbsDataStore(other,vars,newname), _indexCat(other._indexCat), _curStore(other._curStore), _curIndex(other._curIndex), _ownComps(kTRUE)
95 RooCategory* newIdx = (RooCategory*) vars.find(other._indexCat->GetName()) ;
101 for (map<Int_t,RooAbsDataStore*>::const_iterator iter=other._dataMap.begin() ; iter!=other._dataMap.end() ; ++iter) {
102 RooAbsDataStore* clonedata = iter->second->clone(vars) ;
103 _dataMap[iter->first] = clonedata ;
114 RooCompositeDataStore::~RooCompositeDataStore()
117 map<int,RooAbsDataStore*>::const_iterator iter ;
118 for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
119 delete iter->second ;
130 Bool_t RooCompositeDataStore::valid()
const
141 void RooCompositeDataStore::recalculateCache(
const RooArgSet* proj, Int_t firstEvent, Int_t lastEvent, Int_t stepSize, Bool_t skipZeroWeights)
143 map<int,RooAbsDataStore*>::const_iterator iter ;
144 for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
145 iter->second->recalculateCache(proj,firstEvent,lastEvent,stepSize,skipZeroWeights) ;
152 Bool_t RooCompositeDataStore::hasFilledCache()
const
155 map<int,RooAbsDataStore*>::const_iterator iter ;
156 for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
157 ret |= iter->second->hasFilledCache() ;
165 void RooCompositeDataStore::forceCacheUpdate()
167 map<int,RooAbsDataStore*>::const_iterator iter ;
168 for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
169 iter->second->forceCacheUpdate() ;
178 Int_t RooCompositeDataStore::fill()
180 RooAbsDataStore* subset = _dataMap[_indexCat->getIndex()] ;
181 const_cast<RooArgSet*
>((subset->get()))->assignValueOnly(_vars) ;
182 return subset->fill() ;
190 Double_t RooCompositeDataStore::sumEntries()
const
194 map<int,RooAbsDataStore*>::const_iterator iter ;
195 for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
196 sum+= iter->second->sumEntries() ;
208 const RooArgSet* RooCompositeDataStore::get(Int_t idx)
const
211 map<int,RooAbsDataStore*>::const_iterator iter ;
212 for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
213 if (idx>=(offset+iter->second->numEntries())) {
214 offset += iter->second->numEntries() ;
217 const_cast<RooCompositeDataStore*
>(
this)->_vars = (*iter->second->get(idx-offset)) ;
219 _indexCat->setIndex(iter->first) ;
220 _curStore = iter->second ;
221 _curIndex = idx-offset ;
232 Double_t RooCompositeDataStore::weight()
const
234 if (!_curStore)
get(0) ;
236 return _curStore->weight(_curIndex) ;
245 Double_t RooCompositeDataStore::weight(Int_t idx)
const
256 Double_t RooCompositeDataStore::weightError(RooAbsData::ErrorType etype)
const
258 if (!_curStore)
get(0) ;
260 return _curStore->weightError(etype) ;
268 void RooCompositeDataStore::weightError(Double_t& lo, Double_t& hi, RooAbsData::ErrorType etype)
const
270 if (!_curStore)
get(0) ;
272 return _curStore->weightError(lo,hi,etype) ;
280 Bool_t RooCompositeDataStore::isWeighted()
const
282 map<int,RooAbsDataStore*>::const_iterator iter ;
283 for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
284 if (iter->second->isWeighted())
return kTRUE ;
292 void RooCompositeDataStore::loadValues(
const RooAbsDataStore*,
const RooFormulaVar*,
const char*, Int_t, Int_t)
294 throw(std::string(
"RooCompositeDataSore::loadValues() NOT IMPLEMENTED")) ;
302 Bool_t RooCompositeDataStore::changeObservableName(
const char* from,
const char* to)
306 RooAbsArg* var = _vars.find(from) ;
310 coutE(InputArguments) <<
"RooCompositeDataStore::changeObservableName(" << GetName() <<
" no observable " << from <<
" in this dataset" << endl ;
319 map<int,RooAbsDataStore*>::const_iterator iter ;
320 for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
321 ret |= iter->second->changeObservableName(from,to) ;
333 RooAbsArg* RooCompositeDataStore::addColumn(RooAbsArg& newVar, Bool_t adjustRange)
336 map<int,RooAbsDataStore*>::const_iterator iter ;
337 for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
338 ret = iter->second->addColumn(newVar,adjustRange) ;
352 RooArgSet* RooCompositeDataStore::addColumns(
const RooArgList& varList)
355 map<int,RooAbsDataStore*>::const_iterator iter ;
356 for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
357 ret = iter->second->addColumns(varList) ;
370 RooAbsDataStore* RooCompositeDataStore::merge(
const RooArgSet& , list<RooAbsDataStore*> )
372 throw string(
"RooCompositeDataStore::merge() is not implemented yet") ;
381 void RooCompositeDataStore::append(RooAbsDataStore& other)
383 Int_t nevt = other.numEntries() ;
384 for (
int i=0 ; i<nevt ; i++) {
385 _vars = *other.get(i) ;
394 Int_t RooCompositeDataStore::numEntries()
const
397 map<int,RooAbsDataStore*>::const_iterator iter ;
398 for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
399 n += iter->second->numEntries() ;
409 void RooCompositeDataStore::reset()
411 map<int,RooAbsDataStore*>::const_iterator iter ;
412 for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
413 iter->second->reset() ;
421 void RooCompositeDataStore::cacheArgs(
const RooAbsArg* owner, RooArgSet& newVarSet,
const RooArgSet* nset, Bool_t skipZeroWeights)
423 map<int,RooAbsDataStore*>::const_iterator iter ;
424 for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
425 iter->second->cacheArgs(owner,newVarSet,nset,skipZeroWeights) ;
433 void RooCompositeDataStore::setArgStatus(
const RooArgSet& set, Bool_t active)
435 map<int,RooAbsDataStore*>::const_iterator iter ;
436 for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
437 RooArgSet* subset = (RooArgSet*) set.selectCommon(*iter->second->get()) ;
438 iter->second->setArgStatus(*subset,active) ;
450 void RooCompositeDataStore::attachCache(
const RooAbsArg* newOwner,
const RooArgSet& inCachedVars)
452 map<int,RooAbsDataStore*>::const_iterator iter ;
453 for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
454 iter->second->attachCache(newOwner,inCachedVars) ;
463 void RooCompositeDataStore::resetCache()
465 map<int,RooAbsDataStore*>::const_iterator iter ;
466 for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
467 iter->second->resetCache() ;
476 void RooCompositeDataStore::attachBuffers(
const RooArgSet& extObs)
478 map<int,RooAbsDataStore*>::const_iterator iter ;
479 for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
480 iter->second->attachBuffers(extObs);
489 void RooCompositeDataStore::resetBuffers()
491 map<int,RooAbsDataStore*>::const_iterator iter ;
492 for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
493 iter->second->resetBuffers();
501 void RooCompositeDataStore::dump()
503 cout <<
"RooCompositeDataStore::dump()" << endl ;
504 map<int,RooAbsDataStore*>::const_iterator iter ;
505 for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
506 cout <<
"state number " << iter->first <<
" has store " << iter->second->IsA()->GetName() <<
" with variables " << *iter->second->get() ;
507 if (iter->second->isWeighted()) cout <<
" and is weighted " ;