Loading [MathJax]/extensions/tex2jax.js
ROOT  6.06/09
Reference Guide
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
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 //
19 // BEGIN_HTML
20 // RooCompositeDataStore is the abstract base class for data collection that
21 // use a TTree as internal storage mechanism
22 // END_HTML
23 //
24 
25 #include "RooFit.h"
26 #include "RooMsgService.h"
27 #include "RooCompositeDataStore.h"
28 
29 #include "Riostream.h"
30 #include "TTree.h"
31 #include "TChain.h"
32 #include "TDirectory.h"
33 #include "TROOT.h"
34 #include "RooFormulaVar.h"
35 #include "RooRealVar.h"
36 #include "RooTrace.h"
37 #include "RooCategory.h"
38 #include <iomanip>
39 using namespace std ;
40 
42 ;
43 
44 
45 ////////////////////////////////////////////////////////////////////////////////
46 
47 RooCompositeDataStore::RooCompositeDataStore() : _indexCat(0), _curStore(0), _curIndex(0), _ownComps(kFALSE)
48 {
50 }
51 
52 
53 
54 ////////////////////////////////////////////////////////////////////////////////
55 /// Convert map by label to map by index for more efficient internal use
56 
57 RooCompositeDataStore::RooCompositeDataStore(const char* name, const char* title, const RooArgSet& vars, RooCategory& indexCat,map<std::string,RooAbsDataStore*> inputData) :
58  RooAbsDataStore(name,title,RooArgSet(vars,indexCat)), _indexCat(&indexCat), _curStore(0), _curIndex(0), _ownComps(kFALSE)
59 {
60  for (map<string,RooAbsDataStore*>::iterator iter=inputData.begin() ; iter!=inputData.end() ; ++iter) {
61  _dataMap[indexCat.lookupType(iter->first.c_str())->getVal()] = iter->second ;
62  }
64 }
65 
66 
67 
68 
69 ////////////////////////////////////////////////////////////////////////////////
70 /// Convert map by label to map by index for more efficient internal use
71 
73  RooAbsDataStore(other,newname), _indexCat(other._indexCat), _curStore(other._curStore), _curIndex(other._curIndex), _ownComps(kTRUE)
74 {
75  for (map<Int_t,RooAbsDataStore*>::const_iterator iter=other._dataMap.begin() ; iter!=other._dataMap.end() ; ++iter) {
76  RooAbsDataStore* clonedata = iter->second->clone() ;
77  _dataMap[iter->first] = clonedata ;
78  }
80 }
81 
82 
83 ////////////////////////////////////////////////////////////////////////////////
84 /// Update index category pointer, if it is contained in input argument vars
85 
86 RooCompositeDataStore::RooCompositeDataStore(const RooCompositeDataStore& other, const RooArgSet& vars, const char* newname) :
87  RooAbsDataStore(other,vars,newname), _indexCat(other._indexCat), _curStore(other._curStore), _curIndex(other._curIndex), _ownComps(kTRUE)
88 {
89  RooCategory* newIdx = (RooCategory*) vars.find(other._indexCat->GetName()) ;
90  if (newIdx) {
91  _indexCat = newIdx ;
92  }
93 
94  // Convert map by label to map by index for more efficient internal use
95  for (map<Int_t,RooAbsDataStore*>::const_iterator iter=other._dataMap.begin() ; iter!=other._dataMap.end() ; ++iter) {
96  RooAbsDataStore* clonedata = iter->second->clone(vars) ;
97  _dataMap[iter->first] = clonedata ;
98  }
100 }
101 
102 
103 
104 
105 ////////////////////////////////////////////////////////////////////////////////
106 /// Destructor
107 
109 {
110  if (_ownComps) {
111  map<int,RooAbsDataStore*>::const_iterator iter ;
112  for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
113  delete iter->second ;
114  }
115  }
117 }
118 
119 
120 ////////////////////////////////////////////////////////////////////////////////
121 /// Return true if currently loaded coordinate is considered valid within
122 /// the current range definitions of all observables
123 
125 {
126  return kTRUE ;
127 }
128 
129 
130 
131 
132 ////////////////////////////////////////////////////////////////////////////////
133 /// Forward recalculate request to all subsets
134 
135 void RooCompositeDataStore::recalculateCache(const RooArgSet* proj, Int_t firstEvent, Int_t lastEvent, Int_t stepSize, Bool_t skipZeroWeights)
136 {
137  map<int,RooAbsDataStore*>::const_iterator iter ;
138  for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
139  iter->second->recalculateCache(proj,firstEvent,lastEvent,stepSize,skipZeroWeights) ;
140  }
141 }
142 
143 
144 ////////////////////////////////////////////////////////////////////////////////
145 
147 {
148  Bool_t ret(kFALSE) ;
149  map<int,RooAbsDataStore*>::const_iterator iter ;
150  for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
151  ret |= iter->second->hasFilledCache() ;
152  }
153  return ret ;
154 }
155 
156 
157 ////////////////////////////////////////////////////////////////////////////////
158 
160 {
161  map<int,RooAbsDataStore*>::const_iterator iter ;
162  for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
163  iter->second->forceCacheUpdate() ;
164  }
165 }
166 
167 
168 
169 ////////////////////////////////////////////////////////////////////////////////
170 /// Forward fill request to appropriate subset
171 
173 {
175  const_cast<RooArgSet*>((subset->get()))->assignValueOnly(_vars) ;
176  return subset->fill() ;
177 }
178 
179 
180 
181 ////////////////////////////////////////////////////////////////////////////////
182 /// Forward fill request to appropriate subset
183 
185 {
186  Double_t sum(0) ;
187 
188  map<int,RooAbsDataStore*>::const_iterator iter ;
189  for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
190  sum+= iter->second->sumEntries() ;
191  }
192  return sum ;
193 }
194 
195 
196 
197 ////////////////////////////////////////////////////////////////////////////////
198 /// Load the n-th data point (n='idx') in memory
199 /// and return a pointer to the internal RooArgSet
200 /// holding its coordinates.
201 
203 {
204  Int_t offset(0) ;
205  map<int,RooAbsDataStore*>::const_iterator iter ;
206  for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
207  if (idx>=(offset+iter->second->numEntries())) {
208  offset += iter->second->numEntries() ;
209  continue ;
210  }
211  const_cast<RooCompositeDataStore*>(this)->_vars = (*iter->second->get(idx-offset)) ;
212 
213  _indexCat->setIndex(iter->first) ;
214  _curStore = iter->second ;
215  _curIndex = idx-offset ;
216 
217  return &_vars ;
218  }
219  return 0 ;
220 }
221 
222 
223 
224 ////////////////////////////////////////////////////////////////////////////////
225 
227 {
228  if (!_curStore) get(0) ;
229  // coverity[FORWARD_NULL]
230  return _curStore->weight(_curIndex) ;
231 }
232 
233 
234 
235 
236 
237 ////////////////////////////////////////////////////////////////////////////////
238 
240 {
241  get(idx) ;
242  return weight() ;
243 }
244 
245 
246 
247 
248 ////////////////////////////////////////////////////////////////////////////////
249 
251 {
252  if (!_curStore) get(0) ;
253  // coverity[FORWARD_NULL]
254  return _curStore->weightError(etype) ;
255 }
256 
257 
258 
259 
260 ////////////////////////////////////////////////////////////////////////////////
261 
263 {
264  if (!_curStore) get(0) ;
265  // coverity[FORWARD_NULL]
266  return _curStore->weightError(lo,hi,etype) ;
267 }
268 
269 
270 
271 
272 ////////////////////////////////////////////////////////////////////////////////
273 
275 {
276  map<int,RooAbsDataStore*>::const_iterator iter ;
277  for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
278  if (iter->second->isWeighted()) return kTRUE ;
279  }
280  return kFALSE ; ;
281 }
282 
283 
284 ////////////////////////////////////////////////////////////////////////////////
285 
287 {
288  throw(std::string("RooCompositeDataSore::loadValues() NOT IMPLEMENTED")) ;
289 }
290 
291 
292 
293 ////////////////////////////////////////////////////////////////////////////////
294 /// Change name of internal observable named 'from' into 'to'
295 
296 Bool_t RooCompositeDataStore::changeObservableName(const char* from, const char* to)
297 {
298 
299  // Find observable to be changed
300  RooAbsArg* var = _vars.find(from) ;
301 
302  // Check that we found it
303  if (!var) {
304  coutE(InputArguments) << "RooCompositeDataStore::changeObservableName(" << GetName() << " no observable " << from << " in this dataset" << endl ;
305  return kTRUE ;
306  }
307 
308  // Process name change
309  var->SetName(to) ;
310 
311  // Forward name change request to component datasets
312  Bool_t ret(kFALSE) ;
313  map<int,RooAbsDataStore*>::const_iterator iter ;
314  for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
315  ret |= iter->second->changeObservableName(from,to) ;
316  }
317 
318  return ret ;
319 }
320 
321 
322 
323 ////////////////////////////////////////////////////////////////////////////////
324 /// WVE ownership issue here!! Caller (a RooAbsData) should take ownership of all
325 /// arguments, but only does for the first one here...
326 
328 {
329  RooAbsArg* ret(0) ;
330  map<int,RooAbsDataStore*>::const_iterator iter ;
331  for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
332  ret = iter->second->addColumn(newVar,adjustRange) ;
333  }
334  if (ret) {
335  _vars.add(*ret) ;
336  }
337  return ret ;
338 }
339 
340 
341 
342 ////////////////////////////////////////////////////////////////////////////////
343 /// WVE ownership issue here!! Caller (a RooAbsData) should take ownership of all
344 /// arguments, but only does for the first one here...
345 
347 {
348  RooArgSet* ret(0) ;
349  map<int,RooAbsDataStore*>::const_iterator iter ;
350  for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
351  ret = iter->second->addColumns(varList) ;
352  }
353  if (ret) {
354  _vars.add(*ret) ;
355  }
356  return ret ;
357 }
358 
359 
360 
361 
362 ////////////////////////////////////////////////////////////////////////////////
363 
364 RooAbsDataStore* RooCompositeDataStore::merge(const RooArgSet& /*allVars*/, list<RooAbsDataStore*> /*dstoreList*/)
365 {
366  throw string("RooCompositeDataStore::merge() is not implemented yet") ;
367 }
368 
369 
370 
371 
372 
373 ////////////////////////////////////////////////////////////////////////////////
374 
376 {
377  Int_t nevt = other.numEntries() ;
378  for (int i=0 ; i<nevt ; i++) {
379  _vars = *other.get(i) ;
380  fill() ;
381  }
382 }
383 
384 
385 
386 ////////////////////////////////////////////////////////////////////////////////
387 
389 {
390  Int_t n(0) ;
391  map<int,RooAbsDataStore*>::const_iterator iter ;
392  for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
393  n += iter->second->numEntries() ;
394  }
395  return n ;
396 }
397 
398 
399 
400 
401 ////////////////////////////////////////////////////////////////////////////////
402 
404 {
405  map<int,RooAbsDataStore*>::const_iterator iter ;
406  for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
407  iter->second->reset() ;
408  }
409 }
410 
411 
412 
413 ////////////////////////////////////////////////////////////////////////////////
414 
415 void RooCompositeDataStore::cacheArgs(const RooAbsArg* owner, RooArgSet& newVarSet, const RooArgSet* nset, Bool_t skipZeroWeights)
416 {
417  map<int,RooAbsDataStore*>::const_iterator iter ;
418  for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
419  iter->second->cacheArgs(owner,newVarSet,nset,skipZeroWeights) ;
420  }
421 }
422 
423 
424 
425 ////////////////////////////////////////////////////////////////////////////////
426 
428 {
429  map<int,RooAbsDataStore*>::const_iterator iter ;
430  for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
431  RooArgSet* subset = (RooArgSet*) set.selectCommon(*iter->second->get()) ;
432  iter->second->setArgStatus(*subset,active) ;
433  delete subset ;
434  }
435  return ;
436 }
437 
438 
439 
440 ////////////////////////////////////////////////////////////////////////////////
441 /// Initialize cache of dataset: attach variables of cache ArgSet
442 /// to the corresponding TTree branches
443 
444 void RooCompositeDataStore::attachCache(const RooAbsArg* newOwner, const RooArgSet& inCachedVars)
445 {
446  map<int,RooAbsDataStore*>::const_iterator iter ;
447  for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
448  iter->second->attachCache(newOwner,inCachedVars) ;
449  }
450  return ;
451 }
452 
453 
454 
455 ////////////////////////////////////////////////////////////////////////////////
456 
458 {
459  map<int,RooAbsDataStore*>::const_iterator iter ;
460  for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
461  iter->second->resetCache() ;
462  }
463  return ;
464 }
465 
466 
467 
468 ////////////////////////////////////////////////////////////////////////////////
469 
471 {
472  map<int,RooAbsDataStore*>::const_iterator iter ;
473  for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
474  iter->second->attachBuffers(extObs);
475  }
476  return ;
477 }
478 
479 
480 
481 ////////////////////////////////////////////////////////////////////////////////
482 
484 {
485  map<int,RooAbsDataStore*>::const_iterator iter ;
486  for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
487  iter->second->resetBuffers();
488  }
489  return ;
490 }
491 
492 
493 ////////////////////////////////////////////////////////////////////////////////
494 
496 {
497  cout << "RooCompositeDataStore::dump()" << endl ;
498  map<int,RooAbsDataStore*>::const_iterator iter ;
499  for (iter = _dataMap.begin() ; iter!=_dataMap.end() ; ++iter) {
500  cout << "state number " << iter->first << " has store " << iter->second->IsA()->GetName() << " with variables " << *iter->second->get() ;
501  if (iter->second->isWeighted()) cout << " and is weighted " ;
502  cout << endl ;
503  }
504 }
505 
506 
#define coutE(a)
Definition: RooMsgService.h:35
virtual Int_t getIndex() const
Return index number of current state.
Definition: RooCategory.h:35
virtual Double_t weight() const =0
virtual Bool_t isWeighted() const
RooAbsCollection * selectCommon(const RooAbsCollection &refColl) const
Create a subset of the current collection, consisting only of those elements that are contained as we...
virtual Int_t numEntries() const
virtual Bool_t setIndex(Int_t index, Bool_t printError=kTRUE)
Set value by specifying the index code of the desired state.
virtual ~RooCompositeDataStore()
Destructor.
virtual const RooArgSet * get() const
virtual const RooArgSet * get(Int_t index) const =0
virtual void setArgStatus(const RooArgSet &set, Bool_t active)
int Int_t
Definition: RtypesCore.h:41
bool Bool_t
Definition: RtypesCore.h:59
const Bool_t kFALSE
Definition: Rtypes.h:92
STL namespace.
ClassImp(RooCompositeDataStore)
virtual Int_t numEntries() const =0
#define TRACE_CREATE
Definition: RooTrace.h:23
virtual void attachBuffers(const RooArgSet &extObs)
std::map< Int_t, RooAbsDataStore * > _dataMap
std::map< std::string, std::string >::const_iterator iter
Definition: TAlienJob.cxx:54
virtual Int_t fill()
Forward fill request to appropriate subset.
Bool_t _ownComps
Index associated with current event.
if on multiple lines(like in C++).**The" * configuration fragment. * * The "import myobject continue
Parses the configuration file.
Definition: HLFactory.cxx:368
virtual Bool_t valid() const
Return true if currently loaded coordinate is considered valid within the current range definitions o...
virtual Double_t weightError(RooAbsData::ErrorType etype=RooAbsData::Poisson) const
RooAbsArg * find(const char *name) const
Find object with given name in list.
return
Definition: TBase64.cxx:62
virtual Bool_t hasFilledCache() const
virtual Bool_t changeObservableName(const char *from, const char *to)
Change name of internal observable named 'from' into 'to'.
void SetName(const char *name)
Change (i.e.
Definition: RooAbsArg.cxx:2389
virtual const char * GetName() const
Returns name of object.
Definition: TNamed.h:51
void loadValues(const RooAbsDataStore *tds, const RooFormulaVar *select=0, const char *rangeName=0, Int_t nStart=0, Int_t nStop=2000000000)
virtual RooAbsArg * addColumn(RooAbsArg &var, Bool_t adjustRange=kTRUE)
WVE ownership issue here!! Caller (a RooAbsData) should take ownership of all arguments, but only does for the first one here...
virtual void cacheArgs(const RooAbsArg *owner, RooArgSet &varSet, const RooArgSet *nset=0, Bool_t skipZeroWeights=kFALSE)
void attachCache(const RooAbsArg *newOwner, const RooArgSet &cachedVars)
Initialize cache of dataset: attach variables of cache ArgSet to the corresponding TTree branches...
virtual RooArgSet * addColumns(const RooArgList &varList)
WVE ownership issue here!! Caller (a RooAbsData) should take ownership of all arguments, but only does for the first one here...
RooAbsCollection & assignValueOnly(const RooAbsCollection &other, Bool_t oneSafe=kFALSE)
The assignment operator sets the value of any argument in our set that also appears in the other set...
double Double_t
Definition: RtypesCore.h:55
#define TRACE_DESTROY
Definition: RooTrace.h:24
Int_t _curIndex
Datastore associated with current event.
#define name(a, b)
Definition: linkTestLib0.cpp:5
RooAbsDataStore * merge(const RooArgSet &allvars, std::list< RooAbsDataStore * > dstoreList)
virtual Double_t weightError(RooAbsData::ErrorType etype=RooAbsData::Poisson) const =0
float type_of_call hi(const int &, const int &)
RooAbsArg is the common abstract base class for objects that represent a value (of arbitrary type) an...
Definition: RooAbsArg.h:66
const Bool_t kTRUE
Definition: Rtypes.h:91
const Int_t n
Definition: legend1.C:16
virtual Double_t sumEntries() const
Forward fill request to appropriate subset.
virtual Double_t weight() const
virtual Int_t fill()=0
virtual void append(RooAbsDataStore &other)
virtual Bool_t add(const RooAbsArg &var, Bool_t silent=kFALSE)
Add element to non-owning set.
Definition: RooArgSet.cxx:448
virtual void recalculateCache(const RooArgSet *, Int_t, Int_t, Int_t, Bool_t)
Forward recalculate request to all subsets.
const RooCatType * lookupType(Int_t index, Bool_t printError=kFALSE) const
Find our type corresponding to the specified index, or return 0 for no match.