38 ClassImp(RooProfileLL);
45 RooProfileLL::RooProfileLL() :
46 RooAbsReal(
"RooProfileLL",
"RooProfileLL"),
48 _obs(
"paramOfInterest",
"Parameters of interest",this),
49 _par(
"nuisanceParam",
"Nuisance parameters",this,kFALSE,kFALSE),
56 _piter = _par.createIterator() ;
57 _oiter = _obs.createIterator() ;
67 RooProfileLL::RooProfileLL(
const char *name,
const char *title,
68 RooAbsReal& nllIn,
const RooArgSet& observables) :
69 RooAbsReal(name,title),
70 _nll(
"input",
"-log(L) function",this,nllIn),
71 _obs(
"paramOfInterest",
"Parameters of interest",this),
72 _par(
"nuisanceParam",
"Nuisance parameters",this,kFALSE,kFALSE),
80 RooArgSet* actualObs = nllIn.getObservables(observables) ;
81 RooArgSet* actualPars = nllIn.getParameters(observables) ;
83 _obs.add(*actualObs) ;
84 _par.add(*actualPars) ;
89 _piter = _par.createIterator() ;
90 _oiter = _obs.createIterator() ;
98 RooProfileLL::RooProfileLL(
const RooProfileLL& other,
const char* name) :
99 RooAbsReal(other,name),
100 _nll(
"nll",this,other._nll),
101 _obs(
"obs",this,other._obs),
102 _par(
"par",this,other._par),
103 _startFromMin(other._startFromMin),
105 _absMinValid(kFALSE),
107 _paramFixed(other._paramFixed),
110 _piter = _par.createIterator() ;
111 _oiter = _obs.createIterator() ;
113 _paramAbsMin.addClone(other._paramAbsMin) ;
114 _obsAbsMin.addClone(other._obsAbsMin) ;
123 RooProfileLL::~RooProfileLL()
139 const RooArgSet& RooProfileLL::bestFitParams()
const
142 return _paramAbsMin ;
148 const RooArgSet& RooProfileLL::bestFitObs()
const
162 RooAbsReal* RooProfileLL::createProfile(
const RooArgSet& paramsOfInterest)
164 return nll().createProfile(paramsOfInterest) ;
172 void RooProfileLL::initializeMinimizer()
const
174 coutI(Minimization) <<
"RooProfileLL::evaluate(" << GetName() <<
") Creating instance of MINUIT" << endl ;
176 Bool_t smode = RooMsgService::instance().silentMode() ;
177 RooMsgService::instance().setSilentMode(kTRUE) ;
178 _minimizer =
new MINIMIZER(const_cast<RooAbsReal&>(_nll.arg())) ;
179 if (!smode) RooMsgService::instance().setSilentMode(kFALSE) ;
193 Double_t RooProfileLL::evaluate()
const
197 initializeMinimizer() ;
201 RooArgSet* obsSetOrig = (RooArgSet*) _obs.snapshot() ;
207 const_cast<RooSetProxy&
>(_obs).setAttribAll(
"Constant",kTRUE) ;
208 ccoutP(Eval) <<
"." ; ccoutP(Eval).flush() ;
212 const_cast<RooProfileLL&
>(*this)._par = _paramAbsMin ;
215 _minimizer->zeroEvalCount() ;
222 _minimizer->migrad() ;
223 _neval = _minimizer->evalCounter() ;
226 TIterator* iter = obsSetOrig->createIterator() ;
228 while((var=dynamic_cast<RooRealVar*>(iter->Next()) ) ) {
229 RooRealVar* target = (RooRealVar*) _obs.find(var->GetName()) ;
230 target->setVal(var->getVal()) ;
231 target->setConstant(var->isConstant()) ;
236 return _nll - _absMin ;
246 void RooProfileLL::validateAbsMin()
const
252 while((par=(RooAbsArg*)_piter->Next())) {
253 if (_paramFixed[par->GetName()] != par->isConstant()) {
254 cxcoutI(Minimization) <<
"RooProfileLL::evaluate(" << GetName() <<
") constant status of parameter " << par->GetName() <<
" has changed from "
255 << (_paramFixed[par->GetName()]?
"fixed":
"floating") <<
" to " << (par->isConstant()?
"fixed":
"floating")
256 <<
", recalculating absolute minimum" << endl ;
257 _absMinValid = kFALSE ;
267 cxcoutI(Minimization) <<
"RooProfileLL::evaluate(" << GetName() <<
") determining minimum likelihood for current configurations w.r.t all observable" << endl ;
271 initializeMinimizer() ;
275 RooArgSet* obsStart = (RooArgSet*) _obs.snapshot(kFALSE) ;
278 if (_paramAbsMin.getSize()>0) {
279 const_cast<RooSetProxy&
>(_par).assignValueOnly(_paramAbsMin) ;
281 if (_obsAbsMin.getSize()>0) {
282 const_cast<RooSetProxy&
>(_obs).assignValueOnly(_obsAbsMin) ;
286 const_cast<RooSetProxy&
>(_obs).setAttribAll(
"Constant",kFALSE) ;
292 _minimizer->migrad() ;
296 _absMinValid = kTRUE ;
299 _paramAbsMin.removeAll() ;
302 RooArgSet* tmp = (RooArgSet*) _par.selectByAttrib(
"Constant",kFALSE) ;
303 _paramAbsMin.addClone(*tmp) ;
306 _obsAbsMin.addClone(_obs) ;
311 while((par=(RooAbsArg*)_piter->Next())) {
312 _paramFixed[par->GetName()] = par->isConstant() ;
315 if (dologI(Minimization)) {
316 cxcoutI(Minimization) <<
"RooProfileLL::evaluate(" << GetName() <<
") minimum found at (" ;
321 while ((arg=(RooAbsReal*)_oiter->Next())) {
322 ccxcoutI(Minimization) << (first?
"":
", ") << arg->GetName() <<
"=" << arg->getVal() ;
325 ccxcoutI(Minimization) <<
")" << endl ;
329 const_cast<RooSetProxy&
>(_obs) = *obsStart ;
339 Bool_t RooProfileLL::redirectServersHook(
const RooAbsCollection& , Bool_t ,