Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
RooAddition.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 RooAddition.cxx
19\class RooAddition
20\ingroup Roofitcore
21
22Calculates the sum of a set of RooAbsReal terms, or
23when constructed with two sets, it sums the product of the terms
24in the two sets.
25**/
26
27#include "RooAddition.h"
28#include "RooRealSumPdf.h"
29#include "RooProduct.h"
30#include "RooErrorHandler.h"
31#include "RooArgSet.h"
32#include "RooNameReg.h"
34#include "RooMsgService.h"
35#include "RooBatchCompute.h"
36
37#ifdef ROOFIT_LEGACY_EVAL_BACKEND
38#include "RooNLLVar.h"
39#include "RooChi2Var.h"
40#endif
41
42#include <ostream>
43
44////////////////////////////////////////////////////////////////////////////////
45/// Constructor with a single set consisting of RooAbsReal.
46/// \param[in] name Name of the PDF
47/// \param[in] title Title
48/// \param[in] sumSet The value of the function will be the sum of the values in this set
49
50RooAddition::RooAddition(const char *name, const char *title, const RooArgList &sumSet)
51 : RooAbsReal(name, title), _set("!set", "set of components", this), _cacheMgr(this, 10)
52{
54}
55
56
57
58////////////////////////////////////////////////////////////////////////////////
59/// Constructor with two sets of RooAbsReals.
60///
61/// The sum of pair-wise products of elements in the sets will be computed:
62/// \f[
63/// A = \sum_i \mathrm{Set1}[i] * \mathrm{Set2}[i]
64/// \f]
65///
66/// \param[in] name Name of the PDF
67/// \param[in] title Title
68/// \param[in] sumSet1 Left-hand element of the pair-wise products
69/// \param[in] sumSet2 Right-hand element of the pair-wise products
70///
71RooAddition::RooAddition(const char *name, const char *title, const RooArgList &sumSet1, const RooArgList &sumSet2)
72 : RooAbsReal(name, title), _set("!set", "set of components", this), _cacheMgr(this, 10)
73{
74 if (sumSet1.size() != sumSet2.size()) {
75 coutE(InputArguments) << "RooAddition::ctor(" << GetName() << ") ERROR: input lists should be of equal length" << std::endl;
77 }
78
79 for (unsigned int i = 0; i < sumSet1.size(); ++i) {
80 const auto comp1 = &sumSet1[i];
81 const auto comp2 = &sumSet2[i];
82
83 if (!dynamic_cast<RooAbsReal*>(comp1)) {
84 coutE(InputArguments) << "RooAddition::ctor(" << GetName() << ") ERROR: component " << comp1->GetName()
85 << " in first list is not of type RooAbsReal" << std::endl;
87 }
88
89 if (!dynamic_cast<RooAbsReal*>(comp2)) {
90 coutE(InputArguments) << "RooAddition::ctor(" << GetName() << ") ERROR: component " << comp2->GetName()
91 << " in first list is not of type RooAbsReal" << std::endl;
93 }
94 TString _name(name);
95 _name.Append( "_[");
96 _name.Append(comp1->GetName());
97 _name.Append( "_x_");
98 _name.Append(comp2->GetName());
99 _name.Append( "]");
100 auto prod = std::make_unique<RooProduct>( _name, _name , RooArgSet(*comp1, *comp2));
101 _set.add(*prod);
102 _ownedList.addOwned(std::move(prod));
103 }
104}
105
106
107
108////////////////////////////////////////////////////////////////////////////////
109/// Copy constructor
110
113 , _set("!set",this,other._set)
114 , _cacheMgr(other._cacheMgr,this)
115{
116 // Member _ownedList is intentionally not copy-constructed -- ownership is not transferred
117}
118
119////////////////////////////////////////////////////////////////////////////////
120/// Calculate and return current value of self
121
123{
124 double sum(0);
125 const RooArgSet* nset = _set.nset() ;
126
128 const double tmp = comp->getVal(nset);
129 sum += tmp ;
130 }
131 return sum ;
132}
133
134
135////////////////////////////////////////////////////////////////////////////////
136/// Compute addition of PDFs in batches.
138{
139 std::vector<std::span<const double>> pdfs;
140 std::vector<double> coefs;
141 pdfs.reserve(_set.size());
142 coefs.reserve(_set.size());
143 for (const auto arg : _set) {
144 pdfs.push_back(ctx.at(arg));
145 coefs.push_back(1.0);
146 }
147 RooBatchCompute::compute(ctx.config(this), RooBatchCompute::AddPdf, ctx.output(), pdfs, coefs);
148}
149
150////////////////////////////////////////////////////////////////////////////////
151/// Return the default error level for MINUIT error analysis
152/// If the addition contains one or more RooNLLVars and
153/// no RooChi2Vars, return the defaultErrorLevel() of
154/// RooNLLVar. If the addition contains one ore more RooChi2Vars
155/// and no RooNLLVars, return the defaultErrorLevel() of
156/// RooChi2Var. If the addition contains neither or both
157/// issue a warning message and return a value of 1
158
160{
161 RooAbsReal* nllArg(nullptr) ;
162 RooAbsReal* chi2Arg(nullptr) ;
163
164 std::unique_ptr<RooArgSet> comps{getComponents()};
165 for(RooAbsArg * arg : *comps) {
166 if (dynamic_cast<RooFit::Detail::RooNLLVarNew*>(arg)) {
167 nllArg = static_cast<RooAbsReal*>(arg) ;
168 }
169#ifdef ROOFIT_LEGACY_EVAL_BACKEND
170 if (dynamic_cast<RooNLLVar*>(arg)) {
171 nllArg = static_cast<RooAbsReal*>(arg) ;
172 }
173 if (dynamic_cast<RooChi2Var*>(arg)) {
174 chi2Arg = static_cast<RooAbsReal*>(arg) ;
175 }
176#endif
177 }
178
179 if (nllArg && !chi2Arg) {
180 coutI(Fitting) << "RooAddition::defaultErrorLevel(" << GetName()
181 << ") Summation contains a RooNLLVar, using its error level" << std::endl;
182 return nllArg->defaultErrorLevel() ;
183 } else if (chi2Arg && !nllArg) {
184 coutI(Fitting) << "RooAddition::defaultErrorLevel(" << GetName()
185 << ") Summation contains a RooChi2Var, using its error level" << std::endl;
186 return chi2Arg->defaultErrorLevel() ;
187 } else if (!nllArg && !chi2Arg) {
188 coutI(Fitting) << "RooAddition::defaultErrorLevel(" << GetName() << ") WARNING: "
189 << "Summation contains neither RooNLLVar nor RooChi2Var server, using default level of 1.0" << std::endl;
190 } else {
191 coutI(Fitting) << "RooAddition::defaultErrorLevel(" << GetName() << ") WARNING: "
192 << "Summation contains BOTH RooNLLVar and RooChi2Var server, using default level of 1.0" << std::endl;
193 }
194
195 return 1.0 ;
196}
197
198
199
200////////////////////////////////////////////////////////////////////////////////
201
203{
204 for (const auto arg : _set) {
205 static_cast<RooAbsReal*>(arg)->setData(data,cloneData) ;
206 }
207 return true ;
208}
209
210
211
212////////////////////////////////////////////////////////////////////////////////
213
214void RooAddition::printMetaArgs(std::ostream& os) const
215{
216 // We can use the implementation of RooRealSumPdf with an empty coefficient list.
217 static const RooArgList coefs{};
219}
220
221////////////////////////////////////////////////////////////////////////////////
222
224{
225 // we always do things ourselves -- actually, always delegate further down the line ;-)
226 analVars.add(allVars);
227
228 // check if we already have integrals for this combination of factors
231 if (cache!=nullptr) {
232 Int_t code = _cacheMgr.lastIndex();
233 return code+1;
234 }
235
236 // we don't, so we make it right here....
237 cache = new CacheElem;
238 for (auto *arg : static_range_cast<RooAbsReal const*>(_set)) {// checked in c'tor that this will work...
239 cache->_I.addOwned(std::unique_ptr<RooAbsReal>{arg->createIntegral(analVars,rangeName)});
240 }
241
243 return 1+code;
244}
245
246////////////////////////////////////////////////////////////////////////////////
247/// Calculate integral internally from appropriate integral cache
248
249double RooAddition::analyticalIntegral(Int_t code, const char* rangeName) const
250{
251 // note: rangeName implicit encoded in code: see _cacheMgr.setObj in getPartIntList...
252 CacheElem *cache = static_cast<CacheElem*>(_cacheMgr.getObjByIndex(code-1));
253 if (cache==nullptr) {
254 // cache got sterilized, trigger repopulation of this slot, then try again...
255 std::unique_ptr<RooArgSet> vars( getParameters(RooArgSet()) );
256 RooArgSet iset = _cacheMgr.selectFromSet2(*vars, code-1);
257 RooArgSet dummy;
259 assert(code==code2); // must have revived the right (sterilized) slot...
261 }
262 assert(cache!=nullptr);
263
264 // loop over cache, and sum...
265 double result(0);
266 for (auto I : cache->_I) {
267 result += static_cast<const RooAbsReal*>(I)->getVal();
268 }
269 return result;
270
271}
272
273
274////////////////////////////////////////////////////////////////////////////////
275
276std::list<double>* RooAddition::binBoundaries(RooAbsRealLValue& obs, double xlo, double xhi) const
277{
278 return RooRealSumPdf::binBoundaries(_set, obs, xlo, xhi);
279}
280
281
286
287
288////////////////////////////////////////////////////////////////////////////////
289
290std::list<double>* RooAddition::plotSamplingHint(RooAbsRealLValue& obs, double xlo, double xhi) const
291{
292 return RooRealSumPdf::plotSamplingHint(_set, obs, xlo, xhi);
293}
#define coutI(a)
#define coutE(a)
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void data
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t result
char name[80]
Definition TGX11.cxx:142
Common abstract base class for objects that represent a value and a "shape" in RooFit.
Definition RooAbsArg.h:76
RooFit::OwningPtr< RooArgSet > getParameters(const RooAbsData *data, bool stripDisconnected=true) const
Create a list of leaf nodes in the arg tree starting with ourself as top node that don't match any of...
RooFit::OwningPtr< RooArgSet > getComponents() const
Create a RooArgSet with all components (branch nodes) of the expression tree headed by this object.
Abstract base class for objects to be stored in RooAbsCache cache manager objects.
Storage_t::size_type size() const
bool addTyped(const RooAbsCollection &list, bool silent=false)
Adds elements of a given RooAbsCollection to the container if they match the specified type.
virtual bool addOwned(RooAbsArg &var, bool silent=false)
Add an argument and transfer the ownership to the collection.
Abstract base class for binned and unbinned datasets.
Definition RooAbsData.h:55
const RooArgSet * nset() const
Definition RooAbsProxy.h:52
Abstract base class for objects that represent a real value that may appear on the left hand side of ...
Abstract base class for objects that represent a real value and implements functionality common to al...
Definition RooAbsReal.h:63
double getVal(const RooArgSet *normalisationSet=nullptr) const
Evaluate object.
Definition RooAbsReal.h:107
Calculates the sum of a set of RooAbsReal terms, or when constructed with two sets,...
Definition RooAddition.h:27
RooArgList _ownedList
List of owned components.
Definition RooAddition.h:61
void doEval(RooFit::EvalContext &) const override
Compute addition of PDFs in batches.
Int_t getAnalyticalIntegral(RooArgSet &allVars, RooArgSet &numVars, const char *rangeName=nullptr) const override
Interface function getAnalyticalIntergral advertises the analytical integrals that are supported.
std::list< double > * binBoundaries(RooAbsRealLValue &, double, double) const override
Retrieve bin boundaries if this distribution is binned in obs.
RooListProxy _set
set of terms to be summed
Definition RooAddition.h:62
void printMetaArgs(std::ostream &os) const override
bool setData(RooAbsData &data, bool cloneData=true) override
double analyticalIntegral(Int_t code, const char *rangeName=nullptr) const override
Calculate integral internally from appropriate integral cache.
RooObjCacheManager _cacheMgr
! The cache manager
Definition RooAddition.h:70
double defaultErrorLevel() const override
Return the default error level for MINUIT error analysis If the addition contains one or more RooNLLV...
double evaluate() const override
Calculate and return current value of self.
std::list< double > * plotSamplingHint(RooAbsRealLValue &, double, double) const override
Interface for returning an optional hint for initial sampling points when constructing a curve projec...
bool isBinnedDistribution(const RooArgSet &obs) const override
Tests if the distribution is binned. Unless overridden by derived classes, this always returns false.
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:24
Int_t setObj(const RooArgSet *nset, T *obj, const TNamed *isetRangeName=nullptr)
Setter function without integration set.
T * getObjByIndex(Int_t index) const
Retrieve payload object by slot index.
RooArgSet selectFromSet2(RooArgSet const &argSet, int index) const
Create RooArgSet containing the objects that are both in the cached set 2 with a given index and an i...
Int_t lastIndex() const
Return index of slot used in last get or set operation.
T * getObj(const RooArgSet *nset, Int_t *sterileIndex=nullptr, const TNamed *isetRangeName=nullptr)
Getter function without integration set.
bool add(const RooAbsArg &var, bool valueServer, bool shapeServer, bool silent)
Overloaded RooCollection_t::add() method insert object into set and registers object as server to own...
static void softAbort()
Soft abort function that interrupts macro execution but doesn't kill ROOT.
static const TNamed * ptr(const char *stringPtr)
Return a unique TNamed pointer for given C++ string.
std::list< double > * plotSamplingHint(RooAbsRealLValue &, double, double) const override
Interface for returning an optional hint for initial sampling points when constructing a curve projec...
std::list< double > * binBoundaries(RooAbsRealLValue &, double, double) const override
Retrieve bin boundaries if this distribution is binned in obs.
void printMetaArgs(std::ostream &os) const override
Customized printing of arguments of a RooRealSumPdf to more intuitively reflect the contents of the p...
bool isBinnedDistribution(const RooArgSet &obs) const override
Check if all components that depend on obs are binned.
const char * GetName() const override
Returns name of object.
Definition TNamed.h:49
Basic string class.
Definition TString.h:138
TString & Append(const char *cs)
Definition TString.h:583
void compute(Config cfg, Computer comp, std::span< double > output, VarSpan vars, ArgSpan extraArgs={})
static uint64_t sum(uint64_t i)
Definition Factory.cxx:2335