/////////////////////////////////////////////////////////////////////////
//
// 'LIKELIHOOD AND MINIMIZATION' RooFit tutorial macro #601
//
// Interactive minimization with MINUIT
//
//
// 07/2008 - Wouter Verkerke
//
/////////////////////////////////////////////////////////////////////////
#ifndef __CINT__
#include "RooGlobalFunc.h"
#endif
#include "RooRealVar.h"
#include "RooDataSet.h"
#include "RooGaussian.h"
#include "RooConstVar.h"
#include "RooProdPdf.h"
#include "RooAddPdf.h"
#include "RooMinuit.h"
#include "RooFitResult.h"
#include "RooPlot.h"
#include "TCanvas.h"
#include "TAxis.h"
#include "TH1.h"
using namespace RooFit ;
void rf601_intminuit()
{
// S e t u p p d f a n d l i k e l i h o o d
// -----------------------------------------------
// Observable
RooRealVar x("x","x",-20,20) ;
// Model (intentional strong correlations)
RooRealVar mean("mean","mean of g1 and g2",0) ;
RooRealVar sigma_g1("sigma_g1","width of g1",3) ;
RooGaussian g1("g1","g1",x,mean,sigma_g1) ;
RooRealVar sigma_g2("sigma_g2","width of g2",4,3.0,6.0) ;
RooGaussian g2("g2","g2",x,mean,sigma_g2) ;
RooRealVar frac("frac","frac",0.5,0.0,1.0) ;
RooAddPdf model("model","model",RooArgList(g1,g2),frac) ;
// Generate 1000 events
RooDataSet* data = model.generate(x,1000) ;
// Construct unbinned likelihood of model w.r.t. data
RooAbsReal* nll = model.createNLL(*data) ;
// I n t e r a c t i v e m i n i m i z a t i o n , e r r o r a n a l y s i s
// -------------------------------------------------------------------------------
// Create MINUIT interface object
RooMinuit m(*nll) ;
// Activate verbose logging of MINUIT parameter space stepping
m.setVerbose(kTRUE) ;
// Call MIGRAD to minimize the likelihood
m.migrad() ;
// Print values of all parameters, that reflect values (and error estimates)
// that are back propagated from MINUIT
model.getParameters(x)->Print("s") ;
// Disable verbose logging
m.setVerbose(kFALSE) ;
// Run HESSE to calculate errors from d2L/dp2
m.hesse() ;
// Print value (and error) of sigma_g2 parameter, that reflects
// value and error back propagated from MINUIT
sigma_g2.Print() ;
// Run MINOS on sigma_g2 parameter only
m.minos(sigma_g2) ;
// Print value (and error) of sigma_g2 parameter, that reflects
// value and error back propagated from MINUIT
sigma_g2.Print() ;
// S a v i n g r e s u l t s , c o n t o u r p l o t s
// ---------------------------------------------------------
// Save a snapshot of the fit result. This object contains the initial
// fit parameters, the final fit parameters, the complete correlation
// matrix, the EDM, the minimized FCN , the last MINUIT status code and
// the number of times the RooFit function object has indicated evaluation
// problems (e.g. zero probabilities during likelihood evaluation)
RooFitResult* r = m.save() ;
// Make contour plot of mx vs sx at 1,2,3 sigma
RooPlot* frame = m.contour(frac,sigma_g2,1,2,3) ;
frame->SetTitle("RooMinuit contour plot") ;
// Print the fit result snapshot
r->Print("v") ;
// C h a n g e p a r a m e t e r v a l u e s , f l o a t i n g
// -----------------------------------------------------------------
// At any moment you can manually change the value of a (constant)
// parameter
mean = 0.3 ;
// Rerun MIGRAD,HESSE
m.migrad() ;
m.hesse() ;
frac.Print() ;
// Now fix sigma_g2
sigma_g2.setConstant(kTRUE) ;
// Rerun MIGRAD,HESSE
m.migrad() ;
m.hesse() ;
frac.Print() ;
new TCanvas("rf601_intminuit","rf601_intminuit",600,600) ;
gPad->SetLeftMargin(0.15) ; frame->GetYaxis()->SetTitleOffset(1.4) ; frame->Draw() ;
}