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
17Class RooProfileLL implements 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 namespace std ;
34
36
37
38////////////////////////////////////////////////////////////////////////////////
39/// Default constructor
40/// Should only be used by proof.
41
43 RooAbsReal("RooProfileLL","RooProfileLL"),
44 _nll(),
45 _obs("paramOfInterest","Parameters of interest",this),
46 _par("nuisanceParam","Nuisance parameters",this,false,false)
47{
48}
49
50
51////////////////////////////////////////////////////////////////////////////////
52/// Constructor of profile likelihood given input likelihood nll w.r.t
53/// the given set of variables. The input log likelihood is minimized w.r.t
54/// to all other variables of the likelihood at each evaluation and the
55/// value of the global log likelihood minimum is always subtracted.
56
57RooProfileLL::RooProfileLL(const char *name, const char *title,
58 RooAbsReal& nllIn, const RooArgSet& observables) :
59 RooAbsReal(name,title),
60 _nll("input","-log(L) function",this,nllIn),
61 _obs("paramOfInterest","Parameters of interest",this),
62 _par("nuisanceParam","Nuisance parameters",this,false,false)
63{
64 // Determine actual parameters and observables
65 nllIn.getObservables(&observables, _obs) ;
66 nllIn.getParameters(&observables, _par) ;
67}
68
69
70
71////////////////////////////////////////////////////////////////////////////////
72/// Copy constructor
73
74RooProfileLL::RooProfileLL(const RooProfileLL& other, const char* name) :
75 RooAbsReal(other,name),
76 _nll("nll",this,other._nll),
77 _obs("obs",this,other._obs),
78 _par("par",this,other._par),
79 _startFromMin(other._startFromMin),
80 _absMinValid(false),
81 _absMin(0),
82 _paramFixed(other._paramFixed),
83 _neval(0)
84{
87
88}
89
90
91////////////////////////////////////////////////////////////////////////////////
92
94{
96 return _paramAbsMin ;
97}
98
99
100////////////////////////////////////////////////////////////////////////////////
101
103{
105 return _obsAbsMin ;
106}
107
108
109
110
111////////////////////////////////////////////////////////////////////////////////
112/// Optimized implementation of createProfile for profile likelihoods.
113/// Return profile of original function in terms of stated parameters
114/// of interest rather than profiling recursively.
115
117{
118 return nll().createProfile(paramsOfInterest) ;
119}
120
121
122
123
124////////////////////////////////////////////////////////////////////////////////
125
127{
128 coutI(Minimization) << "RooProfileLL::evaluate(" << GetName() << ") Creating instance of MINUIT" << endl ;
129
130 bool smode = RooMsgService::instance().silentMode() ;
132 _minimizer = std::make_unique<RooMinimizer>(const_cast<RooAbsReal&>(_nll.arg())) ;
133 if (!smode) RooMsgService::instance().setSilentMode(false) ;
134
135}
136
137
138
139////////////////////////////////////////////////////////////////////////////////
140/// Evaluate profile likelihood by minimizing likelihood w.r.t. all
141/// parameters that are not considered observables of this profile
142/// likelihood object.
143
145{
146 // Instantiate minimizer if we haven't done that already
147 if (!_minimizer) {
149 }
150
151 // Save current value of observables
152 RooArgSet obsSetOrig;
153 _obs.snapshot(obsSetOrig) ;
154
156
157
158 // Set all observables constant in the minimization
159 const_cast<RooSetProxy&>(_obs).setAttribAll("Constant",true) ;
160 ccoutP(Eval) << "." ; ccoutP(Eval).flush() ;
161
162 // If requested set initial parameters to those corresponding to absolute minimum
163 if (_startFromMin) {
165 }
166
167 _minimizer->zeroEvalCount() ;
168
169 _minimizer->migrad() ;
170 _neval = _minimizer->evalCounter() ;
171
172 // Restore original values and constant status of observables
173 for(auto const& arg : obsSetOrig) {
174 assert(dynamic_cast<RooRealVar*>(arg));
175 auto var = static_cast<RooRealVar*>(arg);
176 auto target = static_cast<RooRealVar*>(_obs.find(var->GetName())) ;
177 target->setVal(var->getVal()) ;
178 target->setConstant(var->isConstant()) ;
179 }
180
181 return _nll - _absMin ;
182}
183
184
185
186////////////////////////////////////////////////////////////////////////////////
187/// Check that parameters and likelihood value for 'best fit' are still valid. If not,
188/// because the best fit has never been calculated, or because constant parameters have
189/// changed value or parameters have changed const/float status, the minimum is recalculated
190
192{
193 // Check if constant status of any of the parameters have changed
194 if (_absMinValid) {
195 for(auto const& par : _par) {
196 if (_paramFixed[par->GetName()] != par->isConstant()) {
197 cxcoutI(Minimization) << "RooProfileLL::evaluate(" << GetName() << ") constant status of parameter " << par->GetName() << " has changed from "
198 << (_paramFixed[par->GetName()]?"fixed":"floating") << " to " << (par->isConstant()?"fixed":"floating")
199 << ", recalculating absolute minimum" << endl ;
200 _absMinValid = false ;
201 break ;
202 }
203 }
204 }
205
206
207 // If we don't have the absolute minimum w.r.t all observables, calculate that first
208 if (!_absMinValid) {
209
210 cxcoutI(Minimization) << "RooProfileLL::evaluate(" << GetName() << ") determining minimum likelihood for current configurations w.r.t all observable" << endl ;
211
212
213 if (!_minimizer) {
215 }
216
217 // Save current values of non-marginalized parameters
218 RooArgSet obsStart;
219 _obs.snapshot(obsStart, false) ;
220
221 // Start from previous global minimum
222 if (_paramAbsMin.getSize()>0) {
223 const_cast<RooSetProxy&>(_par).assignValueOnly(_paramAbsMin) ;
224 }
225 if (_obsAbsMin.getSize()>0) {
226 const_cast<RooSetProxy&>(_obs).assignValueOnly(_obsAbsMin) ;
227 }
228
229 // Find minimum with all observables floating
230 const_cast<RooSetProxy&>(_obs).setAttribAll("Constant",false) ;
231
232 _minimizer->migrad() ;
233
234 // Save value and remember
235 _absMin = _nll ;
236 _absMinValid = true ;
237
238 // Save parameter values at abs minimum as well
240
241 // Only store non-constant parameters here!
242 _paramAbsMin.addClone(*std::unique_ptr<RooArgSet>{static_cast<RooArgSet*>(_par.selectByAttrib("Constant",false))});
243
245
246 // Save constant status of all parameters
247 for(auto const& par : _par) {
248 _paramFixed[par->GetName()] = par->isConstant() ;
249 }
250
251 if (dologI(Minimization)) {
252 cxcoutI(Minimization) << "RooProfileLL::evaluate(" << GetName() << ") minimum found at (" ;
253
254 bool first=true ;
255 for(auto const& arg : _obs) {
256 ccxcoutI(Minimization) << (first?"":", ") << arg->GetName() << "="
257 << static_cast<RooAbsReal const*>(arg)->getVal() ;
258 first=false ;
259 }
260 ccxcoutI(Minimization) << ")" << endl ;
261 }
262
263 // Restore original parameter values
264 _obs.assign(obsStart) ;
265
266 }
267}
268
269
270
271////////////////////////////////////////////////////////////////////////////////
272
273bool RooProfileLL::redirectServersHook(const RooAbsCollection& newServerList, bool mustReplaceAll,
274 bool nameChange, bool isRecursive)
275{
276 _minimizer.reset();
277 return RooAbsReal::redirectServersHook(newServerList, mustReplaceAll, nameChange, isRecursive);
278}
279
280
#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:363
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.
Int_t getSize() const
Return the number of elements in the collection.
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
Class RooProfileLL implements the profile likelihood estimator for a given likelihood and set of para...
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
RooRealVar represents a 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:43
Definition first.py:1