ROOT  6.06/09
Reference Guide
RooProduct.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  * GR, Gerhard Raven, VU Amsterdan, graven@nikhef.nl *
8  * *
9  * Copyright (c) 2000-2007, 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 //
21 // RooProduct a RooAbsReal implementation that represent the product
22 // of a given set of other RooAbsReal objects
23 //
24 // END_HTML
25 //
26 
27 
28 #include <cmath>
29 #include <vector>
30 #include <utility>
31 #include <memory>
32 #include <algorithm>
33 
34 #include "RooProduct.h"
35 #include "RooNameReg.h"
36 #include "RooAbsReal.h"
37 #include "RooAbsCategory.h"
38 #include "RooErrorHandler.h"
39 #include "RooMsgService.h"
40 #include "RooTrace.h"
41 
42 using namespace std ;
43 
45 ;
46 
47 class RooProduct::ProdMap : public std::vector<std::pair<RooArgSet*,RooArgList*> > {} ;
48 
49 // Namespace with helper functions that have STL stuff that we don't want to expose to CINT
50 namespace {
51  typedef RooProduct::ProdMap::iterator RPPMIter ;
52  std::pair<RPPMIter,RPPMIter> findOverlap2nd(RPPMIter i, RPPMIter end) ;
53  void dump_map(ostream& os, RPPMIter i, RPPMIter end) ;
54 }
55 
56 
57 
58 ////////////////////////////////////////////////////////////////////////////////
59 /// Default constructor
60 
62 {
64 }
65 
66 
67 
68 ////////////////////////////////////////////////////////////////////////////////
69 /// Destructor
70 
72 {
74 }
75 
76 
77 
78 ////////////////////////////////////////////////////////////////////////////////
79 /// Construct function representing the product of functions in prodSet
80 
81 RooProduct::RooProduct(const char* name, const char* title, const RooArgList& prodSet) :
82  RooAbsReal(name, title),
83  _compRSet("!compRSet","Set of real product components",this),
84  _compCSet("!compCSet","Set of category product components",this),
85  _cacheMgr(this,10)
86 {
87  RooAbsArg* comp ;
88  RooFIter compIter = prodSet.fwdIterator();
89  while((comp = (RooAbsArg*)compIter.next())) {
90  if (dynamic_cast<RooAbsReal*>(comp)) {
91  _compRSet.add(*comp) ;
92  } else if (dynamic_cast<RooAbsCategory*>(comp)) {
93  _compCSet.add(*comp) ;
94  } else {
95  coutE(InputArguments) << "RooProduct::ctor(" << GetName() << ") ERROR: component " << comp->GetName()
96  << " is not of type RooAbsReal or RooAbsCategory" << endl ;
98  }
99  }
101 }
102 
103 
104 
105 ////////////////////////////////////////////////////////////////////////////////
106 /// Copy constructor
107 
108 RooProduct::RooProduct(const RooProduct& other, const char* name) :
109  RooAbsReal(other, name),
110  _compRSet("!compRSet",this,other._compRSet),
111  _compCSet("!compCSet",this,other._compCSet),
112  _cacheMgr(other._cacheMgr,this)
113 {
115 }
116 
117 
118 
119 ////////////////////////////////////////////////////////////////////////////////
120 /// Force internal handling of integration of given observable if any
121 /// of the product terms depend on it.
122 
124 {
125  // Force internal handling of integration of given observable if any
126  // of the product terms depend on it.
127 
128  RooFIter compRIter = _compRSet.fwdIterator() ;
129  RooAbsReal* rcomp ;
130  Bool_t depends(kFALSE);
131  while((rcomp=(RooAbsReal*)compRIter.next())&&!depends) {
132  depends = rcomp->dependsOn(dep);
133  }
134  return depends ;
135 }
136 
137 
138 
139 ////////////////////////////////////////////////////////////////////////////////
140 /// Group observables into subsets in which the product factorizes
141 /// and that can thus be integrated separately
142 
143 RooProduct::ProdMap* RooProduct::groupProductTerms(const RooArgSet& allVars) const
144 {
145  ProdMap* map = new ProdMap ;
146 
147  // Do we have any terms which do not depend on the
148  // on the variables we integrate over?
149  RooAbsReal* rcomp ;
150  RooFIter compRIter = _compRSet.fwdIterator() ;
151  RooArgList *indep = new RooArgList();
152  while((rcomp=(RooAbsReal*) compRIter.next())) {
153  if( !rcomp->dependsOn(allVars) ) indep->add(*rcomp);
154  }
155  if (indep->getSize()!=0) {
156  map->push_back( std::make_pair(new RooArgSet(),indep) );
157  }
158 
159  // Map observables -> functions ; start with individual observables
160  RooFIter allVarsIter = allVars.fwdIterator() ;
161  RooAbsReal* var ;
162  while((var=(RooAbsReal*)allVarsIter.next())) {
163  RooArgSet *vars = new RooArgSet(); vars->add(*var);
164  RooArgList *comps = new RooArgList();
165  RooAbsReal* rcomp2 ;
166 
167  compRIter = _compRSet.fwdIterator() ;
168  while((rcomp2=(RooAbsReal*) compRIter.next())) {
169  if( rcomp2->dependsOn(*var) ) comps->add(*rcomp2);
170  }
171  map->push_back( std::make_pair(vars,comps) );
172  }
173 
174  // Merge groups with overlapping dependents
175  Bool_t overlap;
176  do {
177  std::pair<ProdMap::iterator,ProdMap::iterator> i = findOverlap2nd(map->begin(),map->end());
178  overlap = (i.first!=i.second);
179  if (overlap) {
180  i.first->first->add(*i.second->first);
181 
182  // In the merging step, make sure not to duplicate
183  RooFIter it = i.second->second->fwdIterator() ;
184  RooAbsArg* targ ;
185  while ((targ = it.next())) {
186  if (!i.first->second->find(*targ)) {
187  i.first->second->add(*targ) ;
188  }
189  }
190  //i.first->second->add(*i.second->second);
191 
192  delete i.second->first;
193  delete i.second->second;
194  map->erase(i.second);
195  }
196  } while (overlap);
197 
198  // check that we have all variables to be integrated over on the LHS
199  // of the map, and all terms in the product do appear on the RHS
200  int nVar=0; int nFunc=0;
201  for (ProdMap::iterator i = map->begin();i!=map->end();++i) {
202  nVar+=i->first->getSize();
203  nFunc+=i->second->getSize();
204  }
205  assert(nVar==allVars.getSize());
206  assert(nFunc==_compRSet.getSize());
207  return map;
208 }
209 
210 
211 
212 ////////////////////////////////////////////////////////////////////////////////
213 /// Return list of (partial) integrals whose product defines the integral of this
214 /// RooProduct over the observables in iset in range isetRange. If no such list
215 /// exists, create it now and store it in the cache for future use.
216 
217 Int_t RooProduct::getPartIntList(const RooArgSet* iset, const char *isetRange) const
218 {
219 
220  // check if we already have integrals for this combination of factors
221  Int_t sterileIndex(-1);
222  CacheElem* cache = (CacheElem*) _cacheMgr.getObj(iset,iset,&sterileIndex,RooNameReg::ptr(isetRange));
223  if (cache!=0) {
224  Int_t code = _cacheMgr.lastIndex();
225  return code;
226  }
227 
228  ProdMap* map = groupProductTerms(*iset);
229 
230  cxcoutD(Integration) << "RooProduct::getPartIntList(" << GetName() << ") groupProductTerms returned map" ;
231  if (dologD(Integration)) {
232  dump_map(ccoutD(Integration),map->begin(),map->end());
233  ccoutD(Integration) << endl;
234  }
235 
236  // did we find any factorizable terms?
237  if (map->size()<2) {
238 
239  for (ProdMap::iterator iter = map->begin() ; iter != map->end() ; ++iter) {
240  delete iter->first ;
241  delete iter->second ;
242  }
243 
244  delete map ;
245  return -1; // RRI caller will zero analVars if return code = 0....
246  }
247  cache = new CacheElem();
248 
249  for (ProdMap::const_iterator i = map->begin();i!=map->end();++i) {
250  RooAbsReal *term(0);
251  if (i->second->getSize()>1) { // create a RooProd for this subexpression
252  const char *name = makeFPName("SUBPROD_",*i->second);
253  term = new RooProduct(name,name,*i->second);
254  cache->_ownedList.addOwned(*term);
255  cxcoutD(Integration) << "RooProduct::getPartIntList(" << GetName() << ") created subexpression " << term->GetName() << endl;
256  } else {
257  assert(i->second->getSize()==1);
258  RooFIter j = i->second->fwdIterator();
259  term = (RooAbsReal*)j.next();
260  }
261  assert(term!=0);
262  if (i->first->getSize()==0) { // check whether we need to integrate over this term or not...
263  cache->_prodList.add(*term);
264  cxcoutD(Integration) << "RooProduct::getPartIntList(" << GetName() << ") adding simple factor " << term->GetName() << endl;
265  } else {
266  RooAbsReal *integral = term->createIntegral(*i->first,isetRange);
267  cache->_prodList.add(*integral);
268  cache->_ownedList.addOwned(*integral);
269  cxcoutD(Integration) << "RooProduct::getPartIntList(" << GetName() << ") adding integral for " << term->GetName() << " : " << integral->GetName() << endl;
270  }
271  }
272  // add current set-up to cache, and return index..
273  Int_t code = _cacheMgr.setObj(iset,iset,(RooAbsCacheElement*)cache,RooNameReg::ptr(isetRange));
274 
275  cxcoutD(Integration) << "RooProduct::getPartIntList(" << GetName() << ") created list " << cache->_prodList << " with code " << code+1 << endl
276  << " for iset=" << *iset << " @" << iset << " range: " << (isetRange?isetRange:"<none>") << endl ;
277 
278  for (ProdMap::iterator iter = map->begin() ; iter != map->end() ; ++iter) {
279  delete iter->first ;
280  delete iter->second ;
281  }
282  delete map ;
283  return code;
284 }
285 
286 
287 ////////////////////////////////////////////////////////////////////////////////
288 /// Declare that we handle all integrations internally
289 
291  const RooArgSet* /*normSet*/,
292  const char* rangeName) const
293 {
294  if (_forceNumInt) return 0 ;
295 
296  // Declare that we can analytically integrate all requested observables
297  // (basically, we will take care of the problem, and delegate where required)
298  //assert(normSet==0);
299  assert(analVars.getSize()==0);
300  analVars.add(allVars) ;
301  Int_t code = getPartIntList(&analVars,rangeName)+1;
302  return code ;
303 }
304 
305 
306 ////////////////////////////////////////////////////////////////////////////////
307 /// Calculate integral internally from appropriate partial integral cache
308 
309 Double_t RooProduct::analyticalIntegral(Int_t code, const char* rangeName) const
310 {
311  // note: rangeName implicit encoded in code: see _cacheMgr.setObj in getPartIntList...
312  CacheElem *cache = (CacheElem*) _cacheMgr.getObjByIndex(code-1);
313  if (cache==0) {
314  // cache got sterilized, trigger repopulation of this slot, then try again...
315  std::auto_ptr<RooArgSet> vars( getParameters(RooArgSet()) );
316  std::auto_ptr<RooArgSet> iset( _cacheMgr.nameSet2ByIndex(code-1)->select(*vars) );
317  Int_t code2 = getPartIntList(iset.get(),rangeName)+1;
318  assert(code==code2); // must have revived the right (sterilized) slot...
319  return analyticalIntegral(code2,rangeName);
320  }
321  assert(cache!=0);
322 
323  return calculate(cache->_prodList);
324 }
325 
326 
327 ////////////////////////////////////////////////////////////////////////////////
328 /// Calculate and return product of partial terms in partIntList
329 
330 Double_t RooProduct::calculate(const RooArgList& partIntList) const
331 {
332  RooAbsReal *term(0);
333  Double_t val=1;
334  RooFIter i = partIntList.fwdIterator() ;
335  while((term=(RooAbsReal*)i.next())) {
336  double x = term->getVal();
337  val*= x;
338  }
339  return val;
340 }
341 
342 
343 ////////////////////////////////////////////////////////////////////////////////
344 /// Construct automatic name for internal product terms
345 
346 const char* RooProduct::makeFPName(const char *pfx,const RooArgSet& terms) const
347 {
348  static TString pname;
349  pname = pfx;
350  RooFIter i = terms.fwdIterator();
351  RooAbsArg *arg;
352  Bool_t first(kTRUE);
353  while((arg=(RooAbsArg*)i.next())) {
354  if (first) { first=kFALSE;}
355  else pname.Append("_X_");
356  pname.Append(arg->GetName());
357  }
358  return pname.Data();
359 }
360 
361 
362 
363 ////////////////////////////////////////////////////////////////////////////////
364 /// Evaluate product of input functions
365 
367 {
368  Double_t prod(1) ;
369 
370  RooFIter compRIter = _compRSet.fwdIterator() ;
371  RooAbsReal* rcomp ;
372  const RooArgSet* nset = _compRSet.nset() ;
373  while((rcomp=(RooAbsReal*)compRIter.next())) {
374  prod *= rcomp->getVal(nset) ;
375  }
376 
377  RooFIter compCIter = _compCSet.fwdIterator() ;
378  RooAbsCategory* ccomp ;
379  while((ccomp=(RooAbsCategory*)compCIter.next())) {
380  prod *= ccomp->getIndex() ;
381  }
382 
383  return prod ;
384 }
385 
386 
387 
388 ////////////////////////////////////////////////////////////////////////////////
389 /// Forward the plot sampling hint from the p.d.f. that defines the observable obs
390 
391 std::list<Double_t>* RooProduct::binBoundaries(RooAbsRealLValue& obs, Double_t xlo, Double_t xhi) const
392 {
394  RooAbsReal* func ;
395  while((func=(RooAbsReal*)iter.next())) {
396  list<Double_t>* binb = func->binBoundaries(obs,xlo,xhi) ;
397  if (binb) {
398  return binb ;
399  }
400  }
401 
402  return 0 ;
403 }
404 
405 
406 //_____________________________________________________________________________B
408 {
409  // If all components that depend on obs are binned that so is the product
410 
412  RooAbsReal* func ;
413  while((func=(RooAbsReal*)iter.next())) {
414  if (func->dependsOn(obs) && !func->isBinnedDistribution(obs)) {
415  return kFALSE ;
416  }
417  }
418 
419  return kTRUE ;
420 }
421 
422 
423 
424 ////////////////////////////////////////////////////////////////////////////////
425 /// Forward the plot sampling hint from the p.d.f. that defines the observable obs
426 
427 std::list<Double_t>* RooProduct::plotSamplingHint(RooAbsRealLValue& obs, Double_t xlo, Double_t xhi) const
428 {
430  RooAbsReal* func ;
431  while((func=(RooAbsReal*)iter.next())) {
432  list<Double_t>* hint = func->plotSamplingHint(obs,xlo,xhi) ;
433  if (hint) {
434  return hint ;
435  }
436  }
437 
438  return 0 ;
439 }
440 
441 
442 
443 ////////////////////////////////////////////////////////////////////////////////
444 /// Destructor
445 
447 {
448 }
449 
450 
451 ////////////////////////////////////////////////////////////////////////////////
452 /// Return list of all RooAbsArgs in cache element
453 
455 {
456  RooArgList ret(_ownedList) ;
457  return ret ;
458 }
459 
460 
461 
462 
463 ////////////////////////////////////////////////////////////////////////////////
464 /// Label OK'ed components of a RooProduct with cache-and-track
465 
467 {
468  RooArgSet comp(components()) ;
469  RooFIter piter = comp.fwdIterator() ;
470  RooAbsArg* parg ;
471  while ((parg=piter.next())) {
472  if (parg->isDerived()) {
473  if (parg->canNodeBeCached()==Always) {
474  trackNodes.add(*parg) ;
475  //cout << "tracking node RooProduct component " << parg->IsA()->GetName() << "::" << parg->GetName() << endl ;
476  }
477  }
478  }
479 }
480 
481 
482 
483 
484 
485 ////////////////////////////////////////////////////////////////////////////////
486 /// Customized printing of arguments of a RooProduct to more intuitively reflect the contents of the
487 /// product operator construction
488 
489 void RooProduct::printMetaArgs(ostream& os) const
490 {
491  Bool_t first(kTRUE) ;
492 
493  RooFIter compRIter = _compRSet.fwdIterator();
494  RooAbsReal* rcomp ;
495  while((rcomp=(RooAbsReal*) compRIter.next())) {
496  if (!first) { os << " * " ; } else { first = kFALSE ; }
497  os << rcomp->GetName() ;
498  }
499 
500  RooFIter compCIter = _compCSet.fwdIterator() ;
501  RooAbsCategory* ccomp ;
502  while((ccomp=(RooAbsCategory*) compCIter.next())) {
503  if (!first) { os << " * " ; } else { first = kFALSE ; }
504  os << ccomp->GetName() ;
505  }
506 
507  os << " " ;
508 }
509 
510 
511 
512 
513 
514 namespace {
515 
516 std::pair<RPPMIter,RPPMIter> findOverlap2nd(RPPMIter i, RPPMIter end)
517 {
518  // Utility function finding pairs of overlapping input functions
519  for (; i!=end; ++i) for ( RPPMIter j(i+1); j!=end; ++j) {
520  if (i->second->overlaps(*j->second)) {
521  return std::make_pair(i,j);
522  }
523  }
524  return std::make_pair(end,end);
525 }
526 
527 
528 void dump_map(ostream& os, RPPMIter i, RPPMIter end)
529 {
530  // Utility dump function for debugging
531  Bool_t first(kTRUE);
532  os << " [ " ;
533  for(; i!=end;++i) {
534  if (first) { first=kFALSE; }
535  else { os << " , " ; }
536  os << *(i->first) << " -> " << *(i->second) ;
537  }
538  os << " ] " ;
539 }
540 
541 }
542 
543 
544 
545 
RooListProxy _compRSet
Definition: RooProduct.h:64
Double_t evaluate() const
Evaluate product of input functions.
Definition: RooProduct.cxx:366
const RooArgSet * nset() const
Definition: RooAbsProxy.h:47
virtual ~CacheElem()
Destructor.
Definition: RooProduct.cxx:446
#define coutE(a)
Definition: RooMsgService.h:35
virtual Bool_t add(const RooAbsArg &var, Bool_t silent=kFALSE)
Add the specified argument to list.
virtual std::list< Double_t > * binBoundaries(RooAbsRealLValue &, Double_t, Double_t) const
Definition: RooAbsReal.h:278
Double_t calculate(const RooArgList &partIntList) const
Calculate and return product of partial terms in partIntList.
Definition: RooProduct.cxx:330
Int_t getPartIntList(const RooArgSet *iset, const char *rangeName=0) const
Return list of (partial) integrals whose product defines the integral of this RooProduct over the obs...
Definition: RooProduct.cxx:217
ProdMap * groupProductTerms(const RooArgSet &) const
Group observables into subsets in which the product factorizes and that can thus be integrated separa...
Definition: RooProduct.cxx:143
virtual Bool_t isDerived() const
Definition: RooAbsArg.h:81
static void softAbort()
virtual Int_t getAnalyticalIntegralWN(RooArgSet &allVars, RooArgSet &analVars, const RooArgSet *normSet, const char *rangeName=0) const
Declare that we handle all integrations internally.
Definition: RooProduct.cxx:290
const char * makeFPName(const char *pfx, const RooArgSet &terms) const
Construct automatic name for internal product terms.
Definition: RooProduct.cxx:346
virtual Bool_t isBinnedDistribution(const RooArgSet &) const
Definition: RooAbsReal.h:277
const RooNameSet * nameSet2ByIndex(Int_t index) const
virtual Bool_t addOwned(RooAbsArg &var, Bool_t silent=kFALSE)
Add the specified argument to list.
RooFIter fwdIterator() const
#define cxcoutD(a)
Definition: RooMsgService.h:80
#define assert(cond)
Definition: unittest.h:542
virtual Int_t getIndex() const
Return index number of current state.
virtual RooArgList containedArgs(Action)
Return list of all RooAbsArgs in cache element.
Definition: RooProduct.cxx:454
Int_t lastIndex() const
Basic string class.
Definition: TString.h:137
int Int_t
Definition: RtypesCore.h:41
bool Bool_t
Definition: RtypesCore.h:59
const Bool_t kFALSE
Definition: Rtypes.h:92
STL namespace.
virtual Bool_t forceAnalyticalInt(const RooAbsArg &dep) const
Force internal handling of integration of given observable if any of the product terms depend on it...
Definition: RooProduct.cxx:123
const char * Data() const
Definition: TString.h:349
#define TRACE_CREATE
Definition: RooTrace.h:23
Double_t x[n]
Definition: legend1.C:17
T * getObj(const RooArgSet *nset, Int_t *sterileIndex=0, const TNamed *isetRangeName=0)
std::map< std::string, std::string >::const_iterator iter
Definition: TAlienJob.cxx:54
TString & Append(const char *cs)
Definition: TString.h:492
friend class RooArgSet
Definition: RooAbsArg.h:469
Double_t getVal(const RooArgSet *set=0) const
Definition: RooAbsReal.h:64
RooListProxy _compCSet
Definition: RooProduct.h:65
virtual Bool_t add(const RooAbsArg &var, Bool_t silent=kFALSE)
Reimplementation of standard RooArgList::add()
RooArgSet * getParameters(const RooAbsData *data, Bool_t stripDisconnected=kTRUE) const
Create a list of leaf nodes in the arg tree starting with ourself as top node that don't match any of...
Definition: RooAbsArg.cxx:559
void printMetaArgs(std::ostream &os) const
Customized printing of arguments of a RooProduct to more intuitively reflect the contents of the prod...
Definition: RooProduct.cxx:489
Bool_t _forceNumInt
Definition: RooAbsReal.h:392
virtual Bool_t isBinnedDistribution(const RooArgSet &obs) const
Definition: RooProduct.cxx:407
ClassImp(RooProduct)
static const TNamed * ptr(const char *stringPtr)
Return a unique TNamed pointer for given C++ string.
Definition: RooNameReg.cxx:124
virtual std::list< Double_t > * binBoundaries(RooAbsRealLValue &, Double_t, Double_t) const
Forward the plot sampling hint from the p.d.f. that defines the observable obs.
Definition: RooProduct.cxx:391
RooProduct()
Default constructor.
Definition: RooProduct.cxx:61
virtual const char * GetName() const
Returns name of object.
Definition: TNamed.h:51
virtual std::list< Double_t > * plotSamplingHint(RooAbsRealLValue &, Double_t, Double_t) const
Definition: RooAbsReal.h:279
virtual ~RooProduct()
Destructor.
Definition: RooProduct.cxx:71
RooAbsArg * next()
double Double_t
Definition: RtypesCore.h:55
RooAbsReal is the common abstract base class for objects that represent a real value and implements f...
Definition: RooAbsReal.h:53
double func(double *x, double *p)
Definition: stressTF1.cxx:213
#define TRACE_DESTROY
Definition: RooTrace.h:24
virtual CacheMode canNodeBeCached() const
Definition: RooAbsArg.h:317
#define name(a, b)
Definition: linkTestLib0.cpp:5
#define dologD(a)
Definition: RooMsgService.h:64
T * getObjByIndex(Int_t index) const
RooArgList _prodList
Definition: RooProduct.h:71
Bool_t dependsOn(const RooAbsCollection &serverList, const RooAbsArg *ignoreArg=0, Bool_t valueOnly=kFALSE) const
Test whether we depend on (ie, are served by) any object in the specified collection.
Definition: RooAbsArg.cxx:743
RooObjCacheManager _cacheMgr
Definition: RooProduct.h:75
RooArgList _ownedList
Definition: RooProduct.h:72
virtual Double_t analyticalIntegral(Int_t code, const char *rangeName=0) const
Calculate integral internally from appropriate partial integral cache.
Definition: RooProduct.cxx:309
Int_t setObj(const RooArgSet *nset, T *obj, const TNamed *isetRangeName=0)
Int_t getSize() const
RooAbsArg is the common abstract base class for objects that represent a value (of arbitrary type) an...
Definition: RooAbsArg.h:66
virtual std::list< Double_t > * plotSamplingHint(RooAbsRealLValue &, Double_t, Double_t) const
Forward the plot sampling hint from the p.d.f. that defines the observable obs.
Definition: RooProduct.cxx:427
const Bool_t kTRUE
Definition: Rtypes.h:91
#define ccoutD(a)
Definition: RooMsgService.h:38
RooArgSet * select(const RooArgSet &list) const
Construct a RooArgSet of objects in input 'list' whose names match to those in the internal name list...
Definition: RooNameSet.cxx:188
RooArgList components()
Definition: RooProduct.h:47
virtual void setCacheAndTrackHints(RooArgSet &)
Label OK'ed components of a RooProduct with cache-and-track.
Definition: RooProduct.cxx:466
virtual Bool_t add(const RooAbsArg &var, Bool_t silent=kFALSE)
Add element to non-owning set.
Definition: RooArgSet.cxx:448
RooAbsReal * createIntegral(const RooArgSet &iset, const RooCmdArg &arg1, const RooCmdArg &arg2=RooCmdArg::none(), const RooCmdArg &arg3=RooCmdArg::none(), const RooCmdArg &arg4=RooCmdArg::none(), const RooCmdArg &arg5=RooCmdArg::none(), const RooCmdArg &arg6=RooCmdArg::none(), const RooCmdArg &arg7=RooCmdArg::none(), const RooCmdArg &arg8=RooCmdArg::none()) const
Create an object that represents the integral of the function over one or more observables listed in ...
Definition: RooAbsReal.cxx:503