Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
RooProfileLL.cxx
Go to the documentation of this file.
1 /*****************************************************************************
2 * Project: RooFit *
3 * *
4 * Copyright (c) 2000-2005, Regents of the University of California *
5 * and Stanford University. All rights reserved. *
6 * *
7 * Redistribution and use in source and binary forms, *
8 * with or without modification, are permitted according to the terms *
9 * listed in LICENSE (http://roofit.sourceforge.net/license.txt) *
10 *****************************************************************************/
11
12/**
13\file RooProfileLL.cxx
14\class RooProfileLL
15\ingroup Roofitcore
16
17Implements the profile likelihood estimator for
18a given likelihood and set of parameters of interest. The value return by
19RooProfileLL is the input likelihood nll minimized w.r.t all nuisance parameters
20(which are all parameters except for those listed in the constructor) minus
21the -log(L) of the best fit. Note that this function is slow to evaluate
22as a MIGRAD minimization step is executed for each function evaluation
23**/
24
25#include "Riostream.h"
26
27#include "RooProfileLL.h"
28#include "RooAbsReal.h"
29#include "RooMinimizer.h"
30#include "RooMsgService.h"
31#include "RooRealVar.h"
32
33using std::endl;
34
36
37
38////////////////////////////////////////////////////////////////////////////////
39/// Default constructor
40/// Should only be used by proof.
41
43 : RooAbsReal("RooProfileLL", "RooProfileLL"),
44 _obs("paramOfInterest", "Parameters of interest", this),
45 _par("nuisanceParam", "Nuisance parameters", this, false, false)
46{
47}
48
49
50////////////////////////////////////////////////////////////////////////////////
51/// Constructor of profile likelihood given input likelihood nll w.r.t
52/// the given set of variables. The input log likelihood is minimized w.r.t
53/// to all other variables of the likelihood at each evaluation and the
54/// value of the global log likelihood minimum is always subtracted.
55
56RooProfileLL::RooProfileLL(const char *name, const char *title,
57 RooAbsReal& nllIn, const RooArgSet& observables) :
58 RooAbsReal(name,title),
59 _nll("input","-log(L) function",this,nllIn),
60 _obs("paramOfInterest","Parameters of interest",this),
61 _par("nuisanceParam","Nuisance parameters",this,false,false)
62{
63 // Determine actual parameters and observables
64 nllIn.getObservables(&observables, _obs) ;
65 nllIn.getParameters(&observables, _par) ;
66}
67
68
69
70////////////////////////////////////////////////////////////////////////////////
71/// Copy constructor
72
74 : RooAbsReal(other, name),
75 _nll("nll", this, other._nll),
76 _obs("obs", this, other._obs),
77 _par("par", this, other._par),
78 _startFromMin(other._startFromMin),
79 _paramFixed(other._paramFixed)
80{
83
84}
85
86
87////////////////////////////////////////////////////////////////////////////////
88
90{
92 return _paramAbsMin ;
93}
94
95
96////////////////////////////////////////////////////////////////////////////////
97
99{
101 return _obsAbsMin ;
102}
103
104
105
106
107////////////////////////////////////////////////////////////////////////////////
108/// Optimized implementation of createProfile for profile likelihoods.
109/// Return profile of original function in terms of stated parameters
110/// of interest rather than profiling recursively.
111
113{
114 return nll().createProfile(paramsOfInterest) ;
115}
116
117
118
119
120////////////////////////////////////////////////////////////////////////////////
121
123{
124 coutI(Minimization) << "RooProfileLL::evaluate(" << GetName() << ") Creating instance of MINUIT" << endl ;
125
126 bool smode = RooMsgService::instance().silentMode() ;
128 _minimizer = std::make_unique<RooMinimizer>(const_cast<RooAbsReal&>(_nll.arg())) ;
129 if (!smode) RooMsgService::instance().setSilentMode(false) ;
130
131}
132
133
134
135////////////////////////////////////////////////////////////////////////////////
136/// Evaluate profile likelihood by minimizing likelihood w.r.t. all
137/// parameters that are not considered observables of this profile
138/// likelihood object.
139
141{
142 // Instantiate minimizer if we haven't done that already
143 if (!_minimizer) {
145 }
146
147 // Save current value of observables
148 RooArgSet obsSetOrig;
149 _obs.snapshot(obsSetOrig) ;
150
152
153
154 // Set all observables constant in the minimization
155 const_cast<RooSetProxy&>(_obs).setAttribAll("Constant",true) ;
156 ccoutP(Eval) << "." ; ccoutP(Eval).flush() ;
157
158 // If requested set initial parameters to those corresponding to absolute minimum
159 if (_startFromMin) {
161 }
162
163 _minimizer->zeroEvalCount() ;
164
165 _minimizer->migrad() ;
166 _neval = _minimizer->evalCounter() ;
167
168 // Restore original values and constant status of observables
169 for(auto const& arg : obsSetOrig) {
170 assert(dynamic_cast<RooRealVar*>(arg));
171 auto var = static_cast<RooRealVar*>(arg);
172 auto target = static_cast<RooRealVar*>(_obs.find(var->GetName())) ;
173 target->setVal(var->getVal()) ;
174 target->setConstant(var->isConstant()) ;
175 }
176
177 return _nll - _absMin ;
178}
179
180
181
182////////////////////////////////////////////////////////////////////////////////
183/// Check that parameters and likelihood value for 'best fit' are still valid. If not,
184/// because the best fit has never been calculated, or because constant parameters have
185/// changed value or parameters have changed const/float status, the minimum is recalculated
186
188{
189 // Check if constant status of any of the parameters have changed
190 if (_absMinValid) {
191 for(auto const& par : _par) {
192 if (_paramFixed[par->GetName()] != par->isConstant()) {
193 cxcoutI(Minimization) << "RooProfileLL::evaluate(" << GetName() << ") constant status of parameter " << par->GetName() << " has changed from "
194 << (_paramFixed[par->GetName()]?"fixed":"floating") << " to " << (par->isConstant()?"fixed":"floating")
195 << ", recalculating absolute minimum" << endl ;
196 _absMinValid = false ;
197 break ;
198 }
199 }
200 }
201
202
203 // If we don't have the absolute minimum w.r.t all observables, calculate that first
204 if (!_absMinValid) {
205
206 cxcoutI(Minimization) << "RooProfileLL::evaluate(" << GetName() << ") determining minimum likelihood for current configurations w.r.t all observable" << endl ;
207
208
209 if (!_minimizer) {
211 }
212
213 // Save current values of non-marginalized parameters
214 RooArgSet obsStart;
215 _obs.snapshot(obsStart, false) ;
216
217 // Start from previous global minimum
218 if (!_paramAbsMin.empty()) {
219 const_cast<RooSetProxy&>(_par).assignValueOnly(_paramAbsMin) ;
220 }
221 if (!_obsAbsMin.empty()) {
222 const_cast<RooSetProxy&>(_obs).assignValueOnly(_obsAbsMin) ;
223 }
224
225 // Find minimum with all observables floating
226 const_cast<RooSetProxy&>(_obs).setAttribAll("Constant",false) ;
227
228 _minimizer->migrad() ;
229
230 // Save value and remember
231 _absMin = _nll ;
232 _absMinValid = true ;
233
234 // Save parameter values at abs minimum as well
236
237 // Only store non-constant parameters here!
238 _paramAbsMin.addClone(*std::unique_ptr<RooArgSet>{static_cast<RooArgSet*>(_par.selectByAttrib("Constant",false))});
239
241
242 // Save constant status of all parameters
243 for(auto const& par : _par) {
244 _paramFixed[par->GetName()] = par->isConstant() ;
245 }
246
247 if (dologI(Minimization)) {
248 cxcoutI(Minimization) << "RooProfileLL::evaluate(" << GetName() << ") minimum found at (" ;
249
250 bool first=true ;
251 for(auto const& arg : _obs) {
252 ccxcoutI(Minimization) << (first?"":", ") << arg->GetName() << "="
253 << static_cast<RooAbsReal const*>(arg)->getVal() ;
254 first=false ;
255 }
256 ccxcoutI(Minimization) << ")" << endl ;
257 }
258
259 // Restore original parameter values
260 _obs.assign(obsStart) ;
261
262 }
263}
264
265
266
267////////////////////////////////////////////////////////////////////////////////
268
269bool RooProfileLL::redirectServersHook(const RooAbsCollection& newServerList, bool mustReplaceAll,
270 bool nameChange, bool isRecursive)
271{
272 _minimizer.reset();
273 return RooAbsReal::redirectServersHook(newServerList, mustReplaceAll, nameChange, isRecursive);
274}
#define coutI(a)
#define cxcoutI(a)
#define ccoutP(a)
#define dologI(a)
#define ccxcoutI(a)
#define ClassImp(name)
Definition Rtypes.h:377
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 Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t target
char name[80]
Definition TGX11.cxx:110
bool isConstant() const
Check if the "Constant" attribute is set.
Definition RooAbsArg.h:361
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 > getObservables(const RooArgSet &set, bool valueOnly=true) const
Given a set of possible observables, return the observables that this PDF depends on.
Abstract container object that can hold multiple RooAbsArg objects.
RooAbsCollection * selectByAttrib(const char *name, bool value) const
Create a subset of the current collection, consisting only of those elements with the specified attri...
virtual void removeAll()
Remove all arguments from our set, deleting them if we own them.
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...
virtual RooAbsArg * addClone(const RooAbsArg &var, bool silent=false)
Add a clone of the specified argument to list.
RooAbsArg * find(const char *name) const
Find object with given name in list.
Abstract base class for objects that represent a real value and implements functionality common to al...
Definition RooAbsReal.h:59
double getVal(const RooArgSet *normalisationSet=nullptr) const
Evaluate object.
Definition RooAbsReal.h:103
bool redirectServersHook(const RooAbsCollection &newServerList, bool mustReplaceAll, bool nameChange, bool isRecursiveStep) override
Function that is called at the end of redirectServers().
virtual RooFit::OwningPtr< RooAbsReal > createProfile(const RooArgSet &paramsOfInterest)
Create a RooProfileLL object that eliminates all nuisance parameters in the present function.
RooArgSet is a container object that can hold multiple RooAbsArg objects.
Definition RooArgSet.h:55
RooArgSet * snapshot(bool deepCopy=true) const
Use RooAbsCollection::snapshot(), but return as RooArgSet.
Definition RooArgSet.h:178
static RooMsgService & instance()
Return reference to singleton instance.
void setSilentMode(bool flag)
bool silentMode() const
Implements the profile likelihood estimator for a given likelihood and set of parameters of interest.
const RooArgSet & bestFitObs() const
RooArgSet _paramAbsMin
Parameter values at absolute minimum.
RooSetProxy _obs
Parameters of profile likelihood.
Int_t _neval
Number evaluations used in last minimization.
RooProfileLL()
Default constructor Should only be used by proof.
void initializeMinimizer() const
RooAbsReal & nll()
bool _absMinValid
flag if absmin is up-to-date
std::map< std::string, bool > _paramFixed
Parameter constant status at last time of use.
bool _startFromMin
Always start minimization for global minimum?
std::unique_ptr< RooMinimizer > _minimizer
! Internal minimizer instance
RooArgSet _obsAbsMin
Observable values at absolute minimum.
void validateAbsMin() const
Check that parameters and likelihood value for 'best fit' are still valid.
RooSetProxy _par
Marginalised parameters of likelihood.
double _absMin
absolute minimum of -log(L)
double evaluate() const override
Evaluate profile likelihood by minimizing likelihood w.r.t.
RooFit::OwningPtr< RooAbsReal > createProfile(const RooArgSet &paramsOfInterest) override
Optimized implementation of createProfile for profile likelihoods.
RooRealProxy _nll
Input -log(L) function.
bool redirectServersHook(const RooAbsCollection &, bool, bool, bool) override
Function that is called at the end of redirectServers().
const RooArgSet & bestFitParams() const
Variable that can be changed from the outside.
Definition RooRealVar.h:37
const T & arg() const
Return reference to object held in proxy.
const char * GetName() const override
Returns name of object.
Definition TNamed.h:47
T * OwningPtr
An alias for raw pointers for indicating that the return type of a RooFit function is an owning point...
Definition Config.h:35