55 #if !defined(__CINT__) || defined(__MAKECINT__)
56 #include "../tutorials/roostats/NuMuToNuE_Oscillation.h"
57 #include "../tutorials/roostats/NuMuToNuE_Oscillation.cxx"
59 #include "../tutorials/roostats/NuMuToNuE_Oscillation.cxx+"
63 using namespace RooFit;
64 using namespace RooStats;
66 void rs401d_FeldmanCousins(
bool doFeldmanCousins =
false,
bool doMCMC =
true)
93 RooRealVar E(
"E",
"", 15, 10, 60,
"GeV");
94 RooRealVar L(
"L",
"", .800, .600, 1.0,
"km");
95 RooRealVar deltaMSq(
"deltaMSq",
"#Delta m^{2}", 40, 1, 300,
"eV/c^{2}");
96 RooRealVar sinSq2theta(
"sinSq2theta",
"sin^{2}(2#theta)", .006, .0, .02);
103 NuMuToNuE_Oscillation PnmuTone(
"PnmuTone",
"P(#nu_{#mu} #rightarrow #nu_{e}", L, E, deltaMSq);
106 RooAbsPdf *sigModel = PnmuTone.createProjection(L);
118 RooRealVar EPrime(
"EPrime",
"", 15, 10, 60,
"GeV");
119 RooRealVar LPrime(
"LPrime",
"", .800, .600, 1.0,
"km");
120 NuMuToNuE_Oscillation PnmuTonePrime(
"PnmuTonePrime",
"P(#nu_{#mu} #rightarrow #nu_{e}", LPrime, EPrime, deltaMSq);
121 RooAbsReal *intProbToOscInExp = PnmuTonePrime.createIntegral(RooArgSet(EPrime, LPrime));
130 RooConstVar maxEventsTot(
"maxEventsTot",
"maximum number of sinal events", 50000);
131 RooConstVar inverseArea(
"inverseArea",
"1/(#Delta E #Delta L)",
132 1. / (EPrime.getMax() - EPrime.getMin()) / (LPrime.getMax() - LPrime.getMin()));
135 RooProduct sigNorm(
"sigNorm",
"", RooArgSet(maxEventsTot, *intProbToOscInExp, inverseArea, sinSq2theta));
137 RooConstVar bkgNorm(
"bkgNorm",
"normalization for background", 500);
140 RooPolynomial bkgEShape(
"bkgEShape",
"flat bkg shape", E);
143 RooAddPdf model(
"model",
"", RooArgList(*sigModel, bkgEShape), RooArgList(sigNorm, bkgNorm));
150 RooMsgService::instance().setStreamStatus(0, kFALSE);
151 RooMsgService::instance().setStreamStatus(1, kFALSE);
152 RooMsgService::instance().setStreamStatus(2, kFALSE);
156 Int_t nEventsData = bkgNorm.getVal() + sigNorm.getVal();
157 cout <<
"generate toy data with nEvents = " << nEventsData << endl;
160 RooRandom::randomGenerator()->SetSeed(3);
162 RooDataSet *data = model.generate(RooArgSet(E), nEventsData);
166 TCanvas *dataCanvas =
new TCanvas(
"dataCanvas");
167 dataCanvas->Divide(2, 2);
171 TH1 *hh = PnmuTone.createHistogram(
"hh", E, Binning(40), YVar(L, Binning(40)), Scaling(kFALSE));
172 hh->SetLineColor(kBlue);
173 hh->SetTitle(
"True Signal Model");
178 RooPlot *Eframe = E.frame();
179 data->plotOn(Eframe);
180 model.fitTo(*data, Extended());
181 model.plotOn(Eframe);
182 model.plotOn(Eframe, Components(*sigModel), LineColor(kRed));
183 model.plotOn(Eframe, Components(bkgEShape), LineColor(kGreen));
184 model.plotOn(Eframe);
185 Eframe->SetTitle(
"toy data with best fit model (and sig+bkg components)");
190 RooNLLVar nll(
"nll",
"nll", model, *data, Extended());
191 RooProfileLL pll(
"pll",
"", nll, RooArgSet(deltaMSq, sinSq2theta));
193 TH1 *hhh = pll.createHistogram(
"hhh", sinSq2theta, Binning(40), YVar(deltaMSq, Binning(40)), Scaling(kFALSE));
194 hhh->SetLineColor(kBlue);
195 hhh->SetTitle(
"Likelihood Function");
198 dataCanvas->Update();
203 RooArgSet parameters(deltaMSq, sinSq2theta);
204 RooWorkspace *w =
new RooWorkspace();
206 ModelConfig modelConfig;
207 modelConfig.SetWorkspace(*w);
208 modelConfig.SetPdf(model);
209 modelConfig.SetParametersOfInterest(parameters);
211 RooStats::FeldmanCousins fc(*data, modelConfig);
213 fc.UseAdaptiveSampling(
true);
217 ConfInterval *interval = 0;
218 if (doFeldmanCousins)
219 interval = fc.GetInterval();
223 RooStats::ProfileLikelihoodCalculator plc(*data, modelConfig);
226 ConfInterval *plcInterval = plc.GetInterval();
230 MCMCInterval *mcInt = NULL;
234 RooMsgService::instance().setStreamStatus(0, kTRUE);
235 RooMsgService::instance().setStreamStatus(1, kTRUE);
237 TStopwatch mcmcWatch;
240 RooArgList axisList(deltaMSq, sinSq2theta);
241 MCMCCalculator mc(*data, modelConfig);
242 mc.SetNumIters(5000);
243 mc.SetNumBurnInSteps(100);
246 mc.SetAxes(axisList);
248 mcInt = (MCMCInterval *)mc.GetInterval();
259 if (doFeldmanCousins) {
260 RooDataHist *parameterScan = (RooDataHist *)fc.GetPointsToScan();
261 TH2F *hist = (TH2F *)parameterScan->createHistogram(
"sinSq2theta:deltaMSq", 30, 30);
263 TH2F *forContour = (TH2F *)hist->Clone();
268 for (Int_t i = 0; i < parameterScan->numEntries(); ++i) {
270 tmpPoint = (RooArgSet *)parameterScan->get(i)->clone(
"temp");
273 if (interval->IsInInterval(*tmpPoint)) {
274 forContour->SetBinContent(
275 hist->FindBin(tmpPoint->getRealValue(
"sinSq2theta"), tmpPoint->getRealValue(
"deltaMSq")), 1);
277 forContour->SetBinContent(
278 hist->FindBin(tmpPoint->getRealValue(
"sinSq2theta"), tmpPoint->getRealValue(
"deltaMSq")), 0);
286 Double_t level = 0.5;
287 forContour->SetContour(1, &level);
288 forContour->SetLineWidth(2);
289 forContour->SetLineColor(kRed);
290 forContour->Draw(
"cont2,same");
294 MCMCIntervalPlot *mcPlot = NULL;
296 cout <<
"MCMC actual confidence level: " << mcInt->GetActualConfidenceLevel() << endl;
297 mcPlot =
new MCMCIntervalPlot(*mcInt);
298 mcPlot->SetLineColor(kMagenta);
301 dataCanvas->Update();
303 LikelihoodIntervalPlot plotInt((LikelihoodInterval *)plcInterval);
304 plotInt.SetTitle(
"90% Confidence Intervals");
306 plotInt.Draw(
"same");
309 dataCanvas->Update();