From $ROOTSYS/tutorials/roostats/JeffreysPriorDemo.C

// tutorial demonstrating and validates the RooJeffreysPrior class

/*
JeffreysPriorDemo.C

author Kyle Cranmer
date   Dec. 2010

This tutorial demonstraites and validates the RooJeffreysPrior class

Jeffreys's prior is an 'objective prior' based on formal rules.
It is calculated from the Fisher information matrix.

Read more:
http://en.wikipedia.org/wiki/Jeffreys_prior

The analytic form is not known for most PDFs, but it is for
simple cases like the Poisson mean, Gaussian mean, Gaussian sigma.

This class uses numerical tricks to calculate the Fisher Information Matrix
efficiently.  In particular, it takes advantage of a property of the
'Asimov data' as described in
Asymptotic formulae for likelihood-based tests of new physics
Glen Cowan, Kyle Cranmer, Eilam Gross, Ofer Vitells
http://arxiv.org/abs/arXiv:1007.1727

This Demo has four parts:
TestJeffreysPriorDemo -- validates Poisson mean case 1/sqrt(mu)
TestJeffreysGaussMean -- validates Gaussian mean case
TestJeffreysGaussSigma -- validates Gaussian sigma case 1/sigma
TestJeffreysGaussMeanAndSigma -- demonstraites 2-d example

*/

#include "RooJeffreysPrior.h"

#include "RooWorkspace.h"
#include "RooDataHist.h"
#include "RooGenericPdf.h"
#include "TCanvas.h"
#include "RooPlot.h"
#include "RooFitResult.h"
#include "TMatrixDSym.h"
#include "RooRealVar.h"
#include "RooAbsPdf.h"
#include "RooNumIntConfig.h"
#include "TH1F.h"

using namespace RooFit;

void JeffreysPriorDemo(){
  RooWorkspace w("w");
  w.factory("Uniform::u(x[0,1])");
  w.factory("mu[100,1,200]");
  w.factory("ExtendPdf::p(u,mu)");

  //  w.factory("Poisson::pois(n[0,inf],mu)");

  RooDataHist* asimov = w.pdf("p")->generateBinned(*w.var("x"),ExpectedData());
  //  RooDataHist* asimov2 = w.pdf("pois")->generateBinned(*w.var("n"),ExpectedData());

  RooFitResult* res = w.pdf("p")->fitTo(*asimov,Save(),SumW2Error(kTRUE));

  asimov->Print();
  res->Print();
  TMatrixDSym cov = res->covarianceMatrix();
  cout << "variance = " << (cov.Determinant()) << endl;
  cout << "stdev = " << sqrt(cov.Determinant()) << endl;
  cov.Invert();
  cout << "jeffreys = " << sqrt(cov.Determinant()) << endl;

  w.defineSet("poi","mu");
  w.defineSet("obs","x");
  //  w.defineSet("obs2","n");

  RooJeffreysPrior pi("jeffreys","jeffreys",*w.pdf("p"),*w.set("poi"),*w.set("obs"));
  //  pi.specialIntegratorConfig(kTRUE)->method1D().setLabel("RooAdaptiveGaussKronrodIntegrator1D")  ;
  //  pi.specialIntegratorConfig(kTRUE)->getConfigSection("RooIntegrator1D").setRealValue("maxSteps",10);

  //  JeffreysPrior pi2("jeffreys2","jeffreys",*w.pdf("pois"),*w.set("poi"),*w.set("obs2"));

  //  return;
  RooGenericPdf* test = new RooGenericPdf("test","test","1./sqrt(mu)",*w.set("poi"));

  TCanvas* c1 = new TCanvas;
  RooPlot* plot = w.var("mu")->frame();
  //  pi.plotOn(plot, Normalization(1,RooAbsReal::Raw),Precision(.1));
  pi.plotOn(plot);
  //  pi2.plotOn(plot,LineColor(kGreen),LineStyle(kDotted));
  test->plotOn(plot,LineColor(kRed));
  plot->Draw();

}


//_________________________________________________
void TestJeffreysGaussMean(){
  RooWorkspace w("w");
  w.factory("Gaussian::g(x[0,-20,20],mu[0,-5,5],sigma[1,0,10])");
  w.factory("n[10,.1,200]");
  w.factory("ExtendPdf::p(g,n)");
  w.var("sigma")->setConstant();
  w.var("n")->setConstant();

  RooDataHist* asimov = w.pdf("p")->generateBinned(*w.var("x"),ExpectedData());

  RooFitResult* res = w.pdf("p")->fitTo(*asimov,Save(),SumW2Error(kTRUE));

  asimov->Print();
  res->Print();
  TMatrixDSym cov = res->covarianceMatrix();
  cout << "variance = " << (cov.Determinant()) << endl;
  cout << "stdev = " << sqrt(cov.Determinant()) << endl;
  cov.Invert();
  cout << "jeffreys = " << sqrt(cov.Determinant()) << endl;

  //  w.defineSet("poi","mu,sigma");
  w.defineSet("poi","mu");
  w.defineSet("obs","x");

  RooJeffreysPrior pi("jeffreys","jeffreys",*w.pdf("p"),*w.set("poi"),*w.set("obs"));
  //  pi.specialIntegratorConfig(kTRUE)->method1D().setLabel("RooAdaptiveGaussKronrodIntegrator1D")  ;
  //  pi.specialIntegratorConfig(kTRUE)->getConfigSection("RooIntegrator1D").setRealValue("maxSteps",3);

  const RooArgSet* temp = w.set("poi");
  pi.getParameters(*temp)->Print();

  //  return;
  RooGenericPdf* test = new RooGenericPdf("test","test","1",*w.set("poi"));

  TCanvas* c1 = new TCanvas;
  RooPlot* plot = w.var("mu")->frame();
  pi.plotOn(plot);
  test->plotOn(plot,LineColor(kRed),LineStyle(kDotted));
  plot->Draw();


}

//_________________________________________________
void TestJeffreysGaussSigma(){
  // this one is VERY sensitive
  // if the Gaussian is narrow ~ range(x)/nbins(x) then the peak isn't resolved
  //   and you get really bizzare shapes
  // if the Gaussian is too wide range(x) ~ sigma then PDF gets renormalized
  //   and the PDF falls off too fast at high sigma
  RooWorkspace w("w");
  w.factory("Gaussian::g(x[0,-20,20],mu[0,-5,5],sigma[1,1,5])");
  w.factory("n[100,.1,2000]");
  w.factory("ExtendPdf::p(g,n)");
  //  w.var("sigma")->setConstant();
  w.var("mu")->setConstant();
  w.var("n")->setConstant();
  w.var("x")->setBins(301);

  RooDataHist* asimov = w.pdf("p")->generateBinned(*w.var("x"),ExpectedData());

  RooFitResult* res = w.pdf("p")->fitTo(*asimov,Save(),SumW2Error(kTRUE));

  asimov->Print();
  res->Print();
  TMatrixDSym cov = res->covarianceMatrix();
  cout << "variance = " << (cov.Determinant()) << endl;
  cout << "stdev = " << sqrt(cov.Determinant()) << endl;
  cov.Invert();
  cout << "jeffreys = " << sqrt(cov.Determinant()) << endl;


  //  w.defineSet("poi","mu,sigma");
  //w.defineSet("poi","mu,sigma,n");
  w.defineSet("poi","sigma");
  w.defineSet("obs","x");

  RooJeffreysPrior pi("jeffreys","jeffreys",*w.pdf("p"),*w.set("poi"),*w.set("obs"));
  //  pi.specialIntegratorConfig(kTRUE)->method1D().setLabel("RooAdaptiveGaussKronrodIntegrator1D")  ;
  pi.specialIntegratorConfig(kTRUE)->getConfigSection("RooIntegrator1D").setRealValue("maxSteps",3);

  const RooArgSet* temp = w.set("poi");
  pi.getParameters(*temp)->Print();
  //  return;

  //  return;
  RooGenericPdf* test = new RooGenericPdf("test","test","sqrt(2.)/sigma",*w.set("poi"));

  TCanvas* c1 = new TCanvas;
  RooPlot* plot = w.var("sigma")->frame();
  pi.plotOn(plot);
  test->plotOn(plot,LineColor(kRed),LineStyle(kDotted));
  plot->Draw();


}


//_________________________________________________
void TestJeffreysGaussMeanAndSigma(){
  // this one is VERY sensitive
  // if the Gaussian is narrow ~ range(x)/nbins(x) then the peak isn't resolved
  //   and you get really bizzare shapes
  // if the Gaussian is too wide range(x) ~ sigma then PDF gets renormalized
  //   and the PDF falls off too fast at high sigma
  RooWorkspace w("w");
  w.factory("Gaussian::g(x[0,-20,20],mu[0,-5,5],sigma[1,1,5])");
  w.factory("n[100,.1,2000]");
  w.factory("ExtendPdf::p(g,n)");
  //  w.var("sigma")->setConstant();
  //  w.var("mu")->setConstant();
  w.var("n")->setConstant();
  w.var("x")->setBins(301);

  RooDataHist* asimov = w.pdf("p")->generateBinned(*w.var("x"),ExpectedData());

  RooFitResult* res = w.pdf("p")->fitTo(*asimov,Save(),SumW2Error(kTRUE));

  asimov->Print();
  res->Print();
  TMatrixDSym cov = res->covarianceMatrix();
  cout << "variance = " << (cov.Determinant()) << endl;
  cout << "stdev = " << sqrt(cov.Determinant()) << endl;
  cov.Invert();
  cout << "jeffreys = " << sqrt(cov.Determinant()) << endl;


  w.defineSet("poi","mu,sigma");
  //w.defineSet("poi","mu,sigma,n");
  //  w.defineSet("poi","sigma");
  w.defineSet("obs","x");

  RooJeffreysPrior pi("jeffreys","jeffreys",*w.pdf("p"),*w.set("poi"),*w.set("obs"));
  //  pi.specialIntegratorConfig(kTRUE)->method1D().setLabel("RooAdaptiveGaussKronrodIntegrator1D")  ;
  pi.specialIntegratorConfig(kTRUE)->getConfigSection("RooIntegrator1D").setRealValue("maxSteps",3);

  const RooArgSet* temp = w.set("poi");
  pi.getParameters(*temp)->Print();
  //  return;

  TCanvas* c1 = new TCanvas;
  TH1* Jeff2d = pi.createHistogram("2dJeffreys",*w.var("mu"),Binning(10),YVar(*w.var("sigma"),Binning(10)));
  Jeff2d->Draw("surf");

}


 JeffreysPriorDemo.C:1
 JeffreysPriorDemo.C:2
 JeffreysPriorDemo.C:3
 JeffreysPriorDemo.C:4
 JeffreysPriorDemo.C:5
 JeffreysPriorDemo.C:6
 JeffreysPriorDemo.C:7
 JeffreysPriorDemo.C:8
 JeffreysPriorDemo.C:9
 JeffreysPriorDemo.C:10
 JeffreysPriorDemo.C:11
 JeffreysPriorDemo.C:12
 JeffreysPriorDemo.C:13
 JeffreysPriorDemo.C:14
 JeffreysPriorDemo.C:15
 JeffreysPriorDemo.C:16
 JeffreysPriorDemo.C:17
 JeffreysPriorDemo.C:18
 JeffreysPriorDemo.C:19
 JeffreysPriorDemo.C:20
 JeffreysPriorDemo.C:21
 JeffreysPriorDemo.C:22
 JeffreysPriorDemo.C:23
 JeffreysPriorDemo.C:24
 JeffreysPriorDemo.C:25
 JeffreysPriorDemo.C:26
 JeffreysPriorDemo.C:27
 JeffreysPriorDemo.C:28
 JeffreysPriorDemo.C:29
 JeffreysPriorDemo.C:30
 JeffreysPriorDemo.C:31
 JeffreysPriorDemo.C:32
 JeffreysPriorDemo.C:33
 JeffreysPriorDemo.C:34
 JeffreysPriorDemo.C:35
 JeffreysPriorDemo.C:36
 JeffreysPriorDemo.C:37
 JeffreysPriorDemo.C:38
 JeffreysPriorDemo.C:39
 JeffreysPriorDemo.C:40
 JeffreysPriorDemo.C:41
 JeffreysPriorDemo.C:42
 JeffreysPriorDemo.C:43
 JeffreysPriorDemo.C:44
 JeffreysPriorDemo.C:45
 JeffreysPriorDemo.C:46
 JeffreysPriorDemo.C:47
 JeffreysPriorDemo.C:48
 JeffreysPriorDemo.C:49
 JeffreysPriorDemo.C:50
 JeffreysPriorDemo.C:51
 JeffreysPriorDemo.C:52
 JeffreysPriorDemo.C:53
 JeffreysPriorDemo.C:54
 JeffreysPriorDemo.C:55
 JeffreysPriorDemo.C:56
 JeffreysPriorDemo.C:57
 JeffreysPriorDemo.C:58
 JeffreysPriorDemo.C:59
 JeffreysPriorDemo.C:60
 JeffreysPriorDemo.C:61
 JeffreysPriorDemo.C:62
 JeffreysPriorDemo.C:63
 JeffreysPriorDemo.C:64
 JeffreysPriorDemo.C:65
 JeffreysPriorDemo.C:66
 JeffreysPriorDemo.C:67
 JeffreysPriorDemo.C:68
 JeffreysPriorDemo.C:69
 JeffreysPriorDemo.C:70
 JeffreysPriorDemo.C:71
 JeffreysPriorDemo.C:72
 JeffreysPriorDemo.C:73
 JeffreysPriorDemo.C:74
 JeffreysPriorDemo.C:75
 JeffreysPriorDemo.C:76
 JeffreysPriorDemo.C:77
 JeffreysPriorDemo.C:78
 JeffreysPriorDemo.C:79
 JeffreysPriorDemo.C:80
 JeffreysPriorDemo.C:81
 JeffreysPriorDemo.C:82
 JeffreysPriorDemo.C:83
 JeffreysPriorDemo.C:84
 JeffreysPriorDemo.C:85
 JeffreysPriorDemo.C:86
 JeffreysPriorDemo.C:87
 JeffreysPriorDemo.C:88
 JeffreysPriorDemo.C:89
 JeffreysPriorDemo.C:90
 JeffreysPriorDemo.C:91
 JeffreysPriorDemo.C:92
 JeffreysPriorDemo.C:93
 JeffreysPriorDemo.C:94
 JeffreysPriorDemo.C:95
 JeffreysPriorDemo.C:96
 JeffreysPriorDemo.C:97
 JeffreysPriorDemo.C:98
 JeffreysPriorDemo.C:99
 JeffreysPriorDemo.C:100
 JeffreysPriorDemo.C:101
 JeffreysPriorDemo.C:102
 JeffreysPriorDemo.C:103
 JeffreysPriorDemo.C:104
 JeffreysPriorDemo.C:105
 JeffreysPriorDemo.C:106
 JeffreysPriorDemo.C:107
 JeffreysPriorDemo.C:108
 JeffreysPriorDemo.C:109
 JeffreysPriorDemo.C:110
 JeffreysPriorDemo.C:111
 JeffreysPriorDemo.C:112
 JeffreysPriorDemo.C:113
 JeffreysPriorDemo.C:114
 JeffreysPriorDemo.C:115
 JeffreysPriorDemo.C:116
 JeffreysPriorDemo.C:117
 JeffreysPriorDemo.C:118
 JeffreysPriorDemo.C:119
 JeffreysPriorDemo.C:120
 JeffreysPriorDemo.C:121
 JeffreysPriorDemo.C:122
 JeffreysPriorDemo.C:123
 JeffreysPriorDemo.C:124
 JeffreysPriorDemo.C:125
 JeffreysPriorDemo.C:126
 JeffreysPriorDemo.C:127
 JeffreysPriorDemo.C:128
 JeffreysPriorDemo.C:129
 JeffreysPriorDemo.C:130
 JeffreysPriorDemo.C:131
 JeffreysPriorDemo.C:132
 JeffreysPriorDemo.C:133
 JeffreysPriorDemo.C:134
 JeffreysPriorDemo.C:135
 JeffreysPriorDemo.C:136
 JeffreysPriorDemo.C:137
 JeffreysPriorDemo.C:138
 JeffreysPriorDemo.C:139
 JeffreysPriorDemo.C:140
 JeffreysPriorDemo.C:141
 JeffreysPriorDemo.C:142
 JeffreysPriorDemo.C:143
 JeffreysPriorDemo.C:144
 JeffreysPriorDemo.C:145
 JeffreysPriorDemo.C:146
 JeffreysPriorDemo.C:147
 JeffreysPriorDemo.C:148
 JeffreysPriorDemo.C:149
 JeffreysPriorDemo.C:150
 JeffreysPriorDemo.C:151
 JeffreysPriorDemo.C:152
 JeffreysPriorDemo.C:153
 JeffreysPriorDemo.C:154
 JeffreysPriorDemo.C:155
 JeffreysPriorDemo.C:156
 JeffreysPriorDemo.C:157
 JeffreysPriorDemo.C:158
 JeffreysPriorDemo.C:159
 JeffreysPriorDemo.C:160
 JeffreysPriorDemo.C:161
 JeffreysPriorDemo.C:162
 JeffreysPriorDemo.C:163
 JeffreysPriorDemo.C:164
 JeffreysPriorDemo.C:165
 JeffreysPriorDemo.C:166
 JeffreysPriorDemo.C:167
 JeffreysPriorDemo.C:168
 JeffreysPriorDemo.C:169
 JeffreysPriorDemo.C:170
 JeffreysPriorDemo.C:171
 JeffreysPriorDemo.C:172
 JeffreysPriorDemo.C:173
 JeffreysPriorDemo.C:174
 JeffreysPriorDemo.C:175
 JeffreysPriorDemo.C:176
 JeffreysPriorDemo.C:177
 JeffreysPriorDemo.C:178
 JeffreysPriorDemo.C:179
 JeffreysPriorDemo.C:180
 JeffreysPriorDemo.C:181
 JeffreysPriorDemo.C:182
 JeffreysPriorDemo.C:183
 JeffreysPriorDemo.C:184
 JeffreysPriorDemo.C:185
 JeffreysPriorDemo.C:186
 JeffreysPriorDemo.C:187
 JeffreysPriorDemo.C:188
 JeffreysPriorDemo.C:189
 JeffreysPriorDemo.C:190
 JeffreysPriorDemo.C:191
 JeffreysPriorDemo.C:192
 JeffreysPriorDemo.C:193
 JeffreysPriorDemo.C:194
 JeffreysPriorDemo.C:195
 JeffreysPriorDemo.C:196
 JeffreysPriorDemo.C:197
 JeffreysPriorDemo.C:198
 JeffreysPriorDemo.C:199
 JeffreysPriorDemo.C:200
 JeffreysPriorDemo.C:201
 JeffreysPriorDemo.C:202
 JeffreysPriorDemo.C:203
 JeffreysPriorDemo.C:204
 JeffreysPriorDemo.C:205
 JeffreysPriorDemo.C:206
 JeffreysPriorDemo.C:207
 JeffreysPriorDemo.C:208
 JeffreysPriorDemo.C:209
 JeffreysPriorDemo.C:210
 JeffreysPriorDemo.C:211
 JeffreysPriorDemo.C:212
 JeffreysPriorDemo.C:213
 JeffreysPriorDemo.C:214
 JeffreysPriorDemo.C:215
 JeffreysPriorDemo.C:216
 JeffreysPriorDemo.C:217
 JeffreysPriorDemo.C:218
 JeffreysPriorDemo.C:219
 JeffreysPriorDemo.C:220
 JeffreysPriorDemo.C:221
 JeffreysPriorDemo.C:222
 JeffreysPriorDemo.C:223
 JeffreysPriorDemo.C:224
 JeffreysPriorDemo.C:225
 JeffreysPriorDemo.C:226
 JeffreysPriorDemo.C:227
 JeffreysPriorDemo.C:228
 JeffreysPriorDemo.C:229
 JeffreysPriorDemo.C:230
 JeffreysPriorDemo.C:231
 JeffreysPriorDemo.C:232
 JeffreysPriorDemo.C:233
 JeffreysPriorDemo.C:234
 JeffreysPriorDemo.C:235
 JeffreysPriorDemo.C:236
 JeffreysPriorDemo.C:237
 JeffreysPriorDemo.C:238
 JeffreysPriorDemo.C:239
 JeffreysPriorDemo.C:240
 JeffreysPriorDemo.C:241
 JeffreysPriorDemo.C:242
 JeffreysPriorDemo.C:243
 JeffreysPriorDemo.C:244