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