53 using namespace RooFit;
54 using namespace RooStats;
56 void MultivariateGaussianTest(Int_t dim = 4, Int_t nPOI = 2)
70 for (i = 0; i < dim; i++) {
71 char *name = Form(
"x%d", i);
72 x =
new RooRealVar(name, name, 0, -3, 3);
75 char *mu_name = Form(
"mu_x%d", i);
76 mu_x =
new RooRealVar(mu_name, mu_name, 0, -2, 2);
81 for (i = 0; i < nPOI; i++) {
82 poi.add(*muVec.at(i));
87 for (i = 0; i < dim; i++) {
88 for (j = 0; j < dim; j++) {
97 RooMultiVarGaussian mvg(
"mvg",
"mvg", xVec, muVec, cov);
101 RooDataSet *data = mvg.generate(xVec, 100);
104 RooWorkspace *w =
new RooWorkspace(
"MVG");
105 ModelConfig modelConfig(w);
106 modelConfig.SetPdf(mvg);
107 modelConfig.SetParametersOfInterest(poi);
115 RooFitResult *fit = mvg.fitTo(*data, Save(
true));
117 ph.SetVariables((RooArgSet &)fit->floatParsFinal());
118 ph.SetCovMatrix(fit->covarianceMatrix());
119 ph.SetUpdateProposalParameters(
true);
120 ph.SetCacheSize(100);
121 ProposalFunction *pdfProp = ph.GetProposalFunction();
124 MCMCCalculator mc(*data, modelConfig);
125 mc.SetConfidenceLevel(0.95);
126 mc.SetNumBurnInSteps(100);
127 mc.SetNumIters(10000);
129 mc.SetProposalFunction(*pdfProp);
131 MCMCInterval *mcInt = mc.GetInterval();
132 RooArgList *poiList = mcInt->GetAxes();
135 ProfileLikelihoodCalculator plc(*data, modelConfig);
136 plc.SetConfidenceLevel(0.95);
137 LikelihoodInterval *plInt = (LikelihoodInterval *)plc.GetInterval();
140 MCMCIntervalPlot mcPlot(*mcInt);
142 TCanvas *c1 =
new TCanvas();
143 mcPlot.SetLineColor(kGreen);
144 mcPlot.SetLineWidth(2);
147 LikelihoodIntervalPlot plPlot(plInt);
150 if (poiList->getSize() == 1) {
151 RooRealVar *p = (RooRealVar *)poiList->at(0);
152 Double_t ll = mcInt->LowerLimit(*p);
153 Double_t ul = mcInt->UpperLimit(*p);
154 cout <<
"MCMC interval: [" << ll <<
", " << ul <<
"]" << endl;
157 if (poiList->getSize() == 2) {
158 RooRealVar *p0 = (RooRealVar *)poiList->at(0);
159 RooRealVar *p1 = (RooRealVar *)poiList->at(1);
160 TCanvas *scatter =
new TCanvas();
161 Double_t ll = mcInt->LowerLimit(*p0);
162 Double_t ul = mcInt->UpperLimit(*p0);
163 cout <<
"MCMC interval on p0: [" << ll <<
", " << ul <<
"]" << endl;
164 ll = mcInt->LowerLimit(*p0);
165 ul = mcInt->UpperLimit(*p0);
166 cout <<
"MCMC interval on p1: [" << ll <<
", " << ul <<
"]" << endl;
171 mcPlot.DrawChainScatter(*p0, *p1);