Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
RooCompositeDataStore.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 RooCompositeDataStore.cxx
19\class RooCompositeDataStore
20\ingroup Roofitcore
21
22RooCompositeDataStore combines several disjunct datasets into one. This is useful for simultaneous PDFs
23that do not depend on the same observable such as a PDF depending on `x` combined with another one depending
24on `y`.
25The composite storage will store two different datasets, `{x}` and `{y}`, but they can be passed as a single
26dataset to RooFit operations. A category tag will define which dataset has to be passed to which likelihood.
27
28When iterated from start to finish, datasets will be traversed in the order of the category index.
29**/
30
32
33#include "RooFit.h"
34#include "RooMsgService.h"
35#include "RooFormulaVar.h"
36#include "RooRealVar.h"
37#include "RooTrace.h"
38#include "RooCategory.h"
39
40#include "TTree.h"
41#include "TChain.h"
42
43#include <iomanip>
44#include <iostream>
45
46using namespace std;
47
49
50
51////////////////////////////////////////////////////////////////////////////////
52
53RooCompositeDataStore::RooCompositeDataStore() : _indexCat(0), _curStore(0), _curIndex(0), _ownComps(kFALSE)
54{
56}
57
58
59
60////////////////////////////////////////////////////////////////////////////////
61/// Convert map by label to map by index for more efficient internal use
62
64 std::string_view name, std::string_view title,
65 const RooArgSet& vars, RooCategory& indexCat,map<std::string,RooAbsDataStore*> inputData) :
66 RooAbsDataStore(name,title,RooArgSet(vars,indexCat)), _indexCat(&indexCat), _curStore(0), _curIndex(0), _ownComps(kFALSE)
67{
68 for (const auto& iter : inputData) {
69 const RooAbsCategory::value_type idx = indexCat.lookupIndex(iter.first);
70 _dataMap[idx] = iter.second;
71 }
73}
74
75
76
77
78////////////////////////////////////////////////////////////////////////////////
79/// Convert map by label to map by index for more efficient internal use
80
82 RooAbsDataStore(other,newname), _indexCat(other._indexCat), _curStore(other._curStore), _curIndex(other._curIndex), _ownComps(kTRUE)
83{
84 for (map<Int_t,RooAbsDataStore*>::const_iterator iter=other._dataMap.begin() ; iter!=other._dataMap.end() ; ++iter) {
85 RooAbsDataStore* clonedata = iter->second->clone() ;
86 _dataMap[iter->first] = clonedata ;
87 }
89}
90
91
92////////////////////////////////////////////////////////////////////////////////
93/// Update index category pointer, if it is contained in input argument vars
94
95RooCompositeDataStore::RooCompositeDataStore(const RooCompositeDataStore& other, const RooArgSet& vars, const char* newname) :
96 RooAbsDataStore(other,vars,newname), _indexCat(other._indexCat), _curStore(other._curStore), _curIndex(other._curIndex), _ownComps(kTRUE)
97{
98 RooCategory* newIdx = (RooCategory*) vars.find(other._indexCat->GetName()) ;
99 if (newIdx) {
100 _indexCat = newIdx ;
101 }
102
103 // Convert map by label to map by index for more efficient internal use
104 for (map<Int_t,RooAbsDataStore*>::const_iterator iter=other._dataMap.begin() ; iter!=other._dataMap.end() ; ++iter) {
105 RooAbsDataStore* clonedata = iter->second->clone(vars) ;
106 _dataMap[iter->first] = clonedata ;
107 }
109}
110
111
112
113
114////////////////////////////////////////////////////////////////////////////////
115/// Destructor
116
118{
119 if (_ownComps) {
120 map<int,RooAbsDataStore*>::const_iterator iter ;
121 for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
122 delete iter->second ;
123 }
124 }
126}
127
128
129////////////////////////////////////////////////////////////////////////////////
130/// Forward recalculate request to all subsets
131
132void RooCompositeDataStore::recalculateCache(const RooArgSet* proj, Int_t firstEvent, Int_t lastEvent, Int_t stepSize, Bool_t skipZeroWeights)
133{
134 map<int,RooAbsDataStore*>::const_iterator iter ;
135 for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
136 iter->second->recalculateCache(proj,firstEvent,lastEvent,stepSize,skipZeroWeights) ;
137 }
138}
139
140
141////////////////////////////////////////////////////////////////////////////////
142
144{
145 Bool_t ret(kFALSE) ;
146 map<int,RooAbsDataStore*>::const_iterator iter ;
147 for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
148 ret |= iter->second->hasFilledCache() ;
149 }
150 return ret ;
151}
152
153
154////////////////////////////////////////////////////////////////////////////////
155
157{
158 map<int,RooAbsDataStore*>::const_iterator iter ;
159 for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
160 iter->second->forceCacheUpdate() ;
161 }
162}
163
164
165
166////////////////////////////////////////////////////////////////////////////////
167/// Forward fill request to appropriate subset
168
170{
172 const_cast<RooArgSet*>((subset->get()))->assignValueOnly(_vars) ;
173 return subset->fill() ;
174}
175
176
177
178////////////////////////////////////////////////////////////////////////////////
179/// Forward fill request to appropriate subset
180
182{
183 Double_t sum(0) ;
184
185 map<int,RooAbsDataStore*>::const_iterator iter ;
186 for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
187 sum+= iter->second->sumEntries() ;
188 }
189 return sum ;
190}
191
192
193
194////////////////////////////////////////////////////////////////////////////////
195/// Load the n-th data point (n='idx') in memory
196/// and return a pointer to the internal RooArgSet
197/// holding its coordinates.
198
200{
201 Int_t offset(0) ;
202 map<int,RooAbsDataStore*>::const_iterator iter ;
203 for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
204 if (idx>=(offset+iter->second->numEntries())) {
205 offset += iter->second->numEntries() ;
206 continue ;
207 }
208 _vars.assign(*iter->second->get(idx-offset)) ;
209
210 _indexCat->setIndex(iter->first) ;
211 _curStore = iter->second ;
212 _curIndex = idx-offset ;
213
214 return &_vars ;
215 }
216 return 0 ;
217}
218
219
220
221////////////////////////////////////////////////////////////////////////////////
222
224{
225 if (!_curStore) get(0) ;
226 // coverity[FORWARD_NULL]
227 return _curStore->weight(_curIndex) ;
228}
229
230
231////////////////////////////////////////////////////////////////////////////////
232
234{
235 if (!_curStore) get(0) ;
236 // coverity[FORWARD_NULL]
237 return _curStore->weightError(etype) ;
238}
239
240
241
242
243////////////////////////////////////////////////////////////////////////////////
244
246{
247 if (!_curStore) get(0) ;
248 // coverity[FORWARD_NULL]
249 return _curStore->weightError(lo,hi,etype) ;
250}
251
252
253
254
255////////////////////////////////////////////////////////////////////////////////
256
258{
259 map<int,RooAbsDataStore*>::const_iterator iter ;
260 for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
261 if (iter->second->isWeighted()) return kTRUE ;
262 }
263 return kFALSE ; ;
264}
265
266
267////////////////////////////////////////////////////////////////////////////////
268
269void RooCompositeDataStore::loadValues(const RooAbsDataStore*, const RooFormulaVar*, const char*, std::size_t, std::size_t)
270{
271 throw(std::runtime_error("RooCompositeDataSore::loadValues() NOT IMPLEMENTED")) ;
272}
273
274
275
276////////////////////////////////////////////////////////////////////////////////
277/// Change name of internal observable named 'from' into 'to'
278
279Bool_t RooCompositeDataStore::changeObservableName(const char* from, const char* to)
280{
281
282 // Find observable to be changed
283 RooAbsArg* var = _vars.find(from) ;
284
285 // Check that we found it
286 if (!var) {
287 coutE(InputArguments) << "RooCompositeDataStore::changeObservableName(" << GetName() << " no observable " << from << " in this dataset" << endl ;
288 return kTRUE ;
289 }
290
291 // Process name change
292 var->SetName(to) ;
293
294 // Forward name change request to component datasets
295 Bool_t ret(kFALSE) ;
296 map<int,RooAbsDataStore*>::const_iterator iter ;
297 for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
298 ret |= iter->second->changeObservableName(from,to) ;
299 }
300
301 return ret ;
302}
303
304
305
306////////////////////////////////////////////////////////////////////////////////
307/// WVE ownership issue here!! Caller (a RooAbsData) should take ownership of all
308/// arguments, but only does for the first one here...
309
311{
312 RooAbsArg* ret(0) ;
313 map<int,RooAbsDataStore*>::const_iterator iter ;
314 for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
315 ret = iter->second->addColumn(newVar,adjustRange) ;
316 }
317 if (ret) {
318 _vars.add(*ret) ;
319 }
320 return ret ;
321}
322
323
324
325////////////////////////////////////////////////////////////////////////////////
326/// WVE ownership issue here!! Caller (a RooAbsData) should take ownership of all
327/// arguments, but only does for the first one here...
328
330{
331 RooArgSet* ret(0) ;
332 map<int,RooAbsDataStore*>::const_iterator iter ;
333 for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
334 ret = iter->second->addColumns(varList) ;
335 }
336 if (ret) {
337 _vars.add(*ret) ;
338 }
339 return ret ;
340}
341
342
343
344
345////////////////////////////////////////////////////////////////////////////////
346
347RooAbsDataStore* RooCompositeDataStore::merge(const RooArgSet& /*allVars*/, list<RooAbsDataStore*> /*dstoreList*/)
348{
349 throw string("RooCompositeDataStore::merge() is not implemented yet") ;
350}
351
352
353
354
355
356////////////////////////////////////////////////////////////////////////////////
357
359{
360 Int_t nevt = other.numEntries() ;
361 for (int i=0 ; i<nevt ; i++) {
362 _vars.assign(*other.get(i)) ;
363 fill() ;
364 }
365}
366
367
368
369////////////////////////////////////////////////////////////////////////////////
370
372{
373 Int_t n(0) ;
374 map<int,RooAbsDataStore*>::const_iterator iter ;
375 for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
376 n += iter->second->numEntries() ;
377 }
378 return n ;
379}
380
381
382
383
384////////////////////////////////////////////////////////////////////////////////
385
387{
388 map<int,RooAbsDataStore*>::const_iterator iter ;
389 for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
390 iter->second->reset() ;
391 }
392}
393
394
395
396////////////////////////////////////////////////////////////////////////////////
397
398void RooCompositeDataStore::cacheArgs(const RooAbsArg* owner, RooArgSet& newVarSet, const RooArgSet* nset, Bool_t skipZeroWeights)
399{
400 map<int,RooAbsDataStore*>::const_iterator iter ;
401 for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
402 iter->second->cacheArgs(owner,newVarSet,nset,skipZeroWeights) ;
403 }
404}
405
406
407
408////////////////////////////////////////////////////////////////////////////////
409
411{
412 map<int,RooAbsDataStore*>::const_iterator iter ;
413 for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
414 RooArgSet* subset = (RooArgSet*) set.selectCommon(*iter->second->get()) ;
415 iter->second->setArgStatus(*subset,active) ;
416 delete subset ;
417 }
418 return ;
419}
420
421
422
423////////////////////////////////////////////////////////////////////////////////
424/// Initialize cache of dataset: attach variables of cache ArgSet
425/// to the corresponding TTree branches
426
427void RooCompositeDataStore::attachCache(const RooAbsArg* newOwner, const RooArgSet& inCachedVars)
428{
429 map<int,RooAbsDataStore*>::const_iterator iter ;
430 for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
431 iter->second->attachCache(newOwner,inCachedVars) ;
432 }
433 return ;
434}
435
436
437
438////////////////////////////////////////////////////////////////////////////////
439
441{
442 map<int,RooAbsDataStore*>::const_iterator iter ;
443 for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
444 iter->second->resetCache() ;
445 }
446 return ;
447}
448
449
450
451////////////////////////////////////////////////////////////////////////////////
452
454{
455 map<int,RooAbsDataStore*>::const_iterator iter ;
456 for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
457 iter->second->attachBuffers(extObs);
458 }
459 return ;
460}
461
462
463
464////////////////////////////////////////////////////////////////////////////////
465
467{
468 map<int,RooAbsDataStore*>::const_iterator iter ;
469 for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
470 iter->second->resetBuffers();
471 }
472 return ;
473}
474
475
476////////////////////////////////////////////////////////////////////////////////
477
479{
480 cout << "RooCompositeDataStore::dump()" << endl ;
481 map<int,RooAbsDataStore*>::const_iterator iter ;
482 for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
483 cout << "state number " << iter->first << " has store " << iter->second->IsA()->GetName() << " with variables " << *iter->second->get() ;
484 if (iter->second->isWeighted()) cout << " and is weighted " ;
485 cout << endl ;
486 }
487}
488
489
490////////////////////////////////////////////////////////////////////////////////
491/// Get the weights of the events in the range [first, first+len).
492/// This implementation will fill a vector with every event retrieved one by one
493/// (even if the weight is constant). Then, it returns a span.
495 if (!_weightBuffer) {
496 _weightBuffer.reset(new std::vector<double>());
497 _weightBuffer->reserve(len);
498
499 for (std::size_t i = 0; i < static_cast<std::size_t>(numEntries()); ++i) {
500 _weightBuffer->push_back(weight(i));
501 }
502 }
503
504 return {_weightBuffer->data() + first, len};
505}
#define coutE(a)
#define TRACE_DESTROY
Definition RooTrace.h:24
#define TRACE_CREATE
Definition RooTrace.h:23
const Bool_t kFALSE
Definition RtypesCore.h:101
const Bool_t kTRUE
Definition RtypesCore.h:100
#define ClassImp(name)
Definition Rtypes.h:364
char name[80]
Definition TGX11.cxx:110
#define hi
RooAbsArg is the common abstract base class for objects that represent a value and a "shape" in RooFi...
Definition RooAbsArg.h:69
void SetName(const char *name)
Set the name of the TNamed.
value_type lookupIndex(const std::string &stateName) const
Find the index number corresponding to the state name.
RooAbsCollection & assignValueOnly(const RooAbsCollection &other, bool forceIfSizeOne=false)
Sets the value of any argument in our set that also appears in the other set.
virtual Bool_t add(const RooAbsArg &var, Bool_t silent=kFALSE)
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...
RooAbsArg * first() const
bool selectCommon(const RooAbsCollection &refColl, RooAbsCollection &outColl) const
Create a subset of the current collection, consisting only of those elements that are contained as we...
RooAbsArg * find(const char *name) const
Find object with given name in list.
RooAbsDataStore is the abstract base class for data collection that use a TTree as internal storage m...
virtual const RooArgSet * get(Int_t index) const =0
virtual Int_t fill()=0
virtual Double_t weight() const =0
virtual Double_t weightError(RooAbsData::ErrorType etype=RooAbsData::Poisson) const =0
virtual RooAbsDataStore * clone(const char *newname=0) const =0
virtual void recalculateCache(const RooArgSet *, Int_t, Int_t, Int_t, Bool_t)
virtual Int_t numEntries() const =0
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:35
RooCategory is an object to represent discrete states.
Definition RooCategory.h:27
virtual value_type getCurrentIndex() const override final
Return current index.
Definition RooCategory.h:39
virtual Bool_t setIndex(Int_t index, bool printError=true) override
Set value by specifying the index code of the desired state.
RooCompositeDataStore combines several disjunct datasets into one.
virtual RooAbsArg * addColumn(RooAbsArg &var, Bool_t adjustRange=kTRUE)
WVE ownership issue here!! Caller (a RooAbsData) should take ownership of all arguments,...
std::unique_ptr< std::vector< double > > _weightBuffer
Index associated with current event.
Int_t _curIndex
Datastore associated with current event.
void loadValues(const RooAbsDataStore *tds, const RooFormulaVar *select=0, const char *rangeName=0, std::size_t nStart=0, std::size_t nStop=std::numeric_limits< std::size_t >::max())
virtual Bool_t changeObservableName(const char *from, const char *to)
Change name of internal observable named 'from' into 'to'.
std::map< Int_t, RooAbsDataStore * > _dataMap
virtual void attachBuffers(const RooArgSet &extObs)
void attachCache(const RooAbsArg *newOwner, const RooArgSet &cachedVars)
Initialize cache of dataset: attach variables of cache ArgSet to the corresponding TTree branches.
virtual Double_t weightError(RooAbsData::ErrorType etype=RooAbsData::Poisson) const
Bool_t _ownComps
Buffer for weights in case a batch of values is requested.
virtual Double_t sumEntries() const
Forward fill request to appropriate subset.
virtual void setArgStatus(const RooArgSet &set, Bool_t active)
virtual RooArgSet * addColumns(const RooArgList &varList)
WVE ownership issue here!! Caller (a RooAbsData) should take ownership of all arguments,...
virtual RooSpan< const double > getWeightBatch(std::size_t first, std::size_t len) const
Get the weights of the events in the range [first, first+len).
virtual Int_t numEntries() const
virtual void append(RooAbsDataStore &other)
virtual Bool_t isWeighted() const
virtual Double_t weight() const
virtual void cacheArgs(const RooAbsArg *owner, RooArgSet &varSet, const RooArgSet *nset=0, Bool_t skipZeroWeights=kFALSE)
virtual ~RooCompositeDataStore()
Destructor.
RooAbsDataStore * merge(const RooArgSet &allvars, std::list< RooAbsDataStore * > dstoreList)
virtual Bool_t hasFilledCache() const
virtual void recalculateCache(const RooArgSet *, Int_t, Int_t, Int_t, Bool_t)
Forward recalculate request to all subsets.
virtual const RooArgSet * get() const
virtual Int_t fill()
Forward fill request to appropriate subset.
A RooFormulaVar is a generic implementation of a real-valued object, which takes a RooArgList of serv...
A simple container to hold a batch of data values.
Definition RooSpan.h:34
constexpr std::span< T >::pointer data() const
Definition RooSpan.h:106
virtual const char * GetName() const
Returns name of object.
Definition TNamed.h:47
const Int_t n
Definition legend1.C:16
Definition first.py:1
static uint64_t sum(uint64_t i)
Definition Factory.cxx:2345