1 |
kkotov |
1.1 |
#include "RooPlot.h"
|
2 |
|
|
#include "RooRandom.h"
|
3 |
|
|
#include "RooRealVar.h"
|
4 |
|
|
#include "RooGaussian.h"
|
5 |
|
|
#include "RooPolynomial.h"
|
6 |
|
|
#include "RooArgSet.h"
|
7 |
|
|
#include "RooAddPdf.h"
|
8 |
|
|
#include "RooDataSet.h"
|
9 |
|
|
#include "RooExtendPdf.h"
|
10 |
|
|
#include "RooConstVar.h"
|
11 |
|
|
|
12 |
|
|
|
13 |
|
|
#ifndef __CINT__ // problem including this file with CINT
|
14 |
|
|
#include "RooGlobalFunc.h"
|
15 |
|
|
#endif
|
16 |
|
|
|
17 |
|
|
#include "RooStats/FeldmanCousins.h"
|
18 |
|
|
#include "RooStats/PointSetInterval.h"
|
19 |
|
|
|
20 |
|
|
#include "RooStats/ProfileLikelihoodCalculator.h"
|
21 |
|
|
#include "RooStats/LikelihoodIntervalPlot.h"
|
22 |
|
|
|
23 |
|
|
#include "TCanvas.h"
|
24 |
|
|
#include "TH1F.h"
|
25 |
|
|
#include "TFile.h"
|
26 |
|
|
#include "TChain.h"
|
27 |
|
|
|
28 |
|
|
#include "RooWorkspace.h"
|
29 |
|
|
|
30 |
|
|
#include "RooDataHist.h"
|
31 |
|
|
|
32 |
|
|
//#include "./_tdrstyle.C"
|
33 |
|
|
|
34 |
|
|
void stat(int ntoys = 10000){
|
35 |
|
|
using namespace RooFit;
|
36 |
|
|
using namespace RooStats;
|
37 |
|
|
// setTDRStyle();
|
38 |
|
|
RooRandom::randomGenerator()->SetSeed(10);
|
39 |
|
|
|
40 |
|
|
// Create a workspace to manage the project.
|
41 |
|
|
RooWorkspace* wspace = new RooWorkspace("myWS");
|
42 |
|
|
|
43 |
|
|
// qT observable and its the range:
|
44 |
|
|
wspace->factory("qT[30.0, 1200.0]");
|
45 |
|
|
|
46 |
|
|
// Luminosity:
|
47 |
|
|
wspace->factory("luminosity[35., 25., 45.]"); // Expect to accumulate up to 30/pb in 2010
|
48 |
|
|
// wspace->factory("Gaussian::prior_lumi(luminosity, 10.9, 0.05)"); // Assume 5% gaussian uncertainty for the luminosity
|
49 |
|
|
// Drell-Yan cross section:
|
50 |
|
|
wspace->factory("dy_xsec[1737.9, 1500, 2000]"); // NNLO Drell-Yan cross section given by FEWZz with m>20 (in pb)
|
51 |
|
|
// wspace->factory("Gaussian::prior_dy_xsec(dy_xsec, 1.7379, 0.0168)"); // see https://alcaraz.web.cern.ch/alcaraz/CROSS_SECTIONS.txt for details
|
52 |
|
|
// Drell-Yan acceptance:
|
53 |
|
|
wspace->factory("dy_acceptance[0.235, 0.0, 1.0]"); // Assuming 60<m<120 && VBTF selection
|
54 |
|
|
// wspace->factory("Gaussian::prior_dy_acc(dy_acceptance, 0.235, 0.00025)"); // Accuracy's estimate for an acceptance (difference between accTrue and accSim)
|
55 |
|
|
// Fraction of Drell-Yan in qT>30 range:
|
56 |
|
|
wspace->factory("dy_qTcut[0.166, 0.0, 1.0]"); // Number of Drell-Yan events with in the spectrum
|
57 |
|
|
// wspace->factory("Gaussian::prior_dy_qTcut(dy_qTcut, 0.166, 0.0001)"); // Accuracy's estimate for an acceptance (out of the blue)
|
58 |
|
|
// Net Drell-Yan yield:
|
59 |
|
|
wspace->factory("prod::dy_yield(luminosity, dy_xsec, dy_acceptance, dy_qTcut)");
|
60 |
|
|
// Make a simple model of Drell-Yan background
|
61 |
|
|
wspace->factory("dy_slope[0.64, 0.6, 0.8]");
|
62 |
|
|
// wspace->factory("Gaussian::prior_dy_slope(dy_slope, 0.64, 0.05)"); // I'll have to come up with something better here
|
63 |
|
|
wspace->factory("CEXPR::background('exp(-sqrt(qT)*dy_slope)', qT, dy_slope)");
|
64 |
|
|
|
65 |
|
|
// Make a simple model of signal (no uncertainties here)
|
66 |
|
|
// wspace->factory("CEXPR::signal('4.38397e-01/14.55/(7.43366e-01 + exp(4.51335e-02*(qT-7.08881e+02)) + 2.27385e-04*(qT-8.47767e+02)*(qT-8.47767e+02))', qT)"); // Z' m=1500 GeV/c/c
|
67 |
|
|
// wspace->factory("CEXPR::signal('4.92212e+02/14.5/(-3.04459e+05 + exp(3.80391e-02*(qT-7.55088e+02)) + 9.11595e-03*(qT-6.81130e+03)*(qT-6.81130e+03))', qT)"); // Z' m=2000 GeV/c/c
|
68 |
|
|
wspace->factory("CEXPR::signal('343989./(2435.4 + exp(-0.008824*(qT-234.877)) + 0.087526879*(qT-234.877)*(qT-234.877))', qT)"); //ci05
|
69 |
|
|
wspace->factory("CEXPR::signal('1714311/(13545.8+ exp(-0.034854*(qT-401.749)) + 0.484819424*(qT-401.749)*(qT-401.749))', qT)"); //ci10
|
70 |
|
|
wspace->factory("CEXPR::signal('783571./(8064.4 + exp(-0.024829*(qT-558.958)) + 0.208610709*(qT-558.958)*(qT-558.958))', qT)"); //ci15
|
71 |
|
|
wspace->factory("CEXPR::signal('10.8808/(-0.102 + exp( 0.019262*(qT-366.378)) + 3.11203e-06*(qT-366.378)*(qT-366.378))', qT)"); //gi05
|
72 |
|
|
wspace->factory("CEXPR::signal('878.946/(2.7015 + exp( 0.021975*(qT-459.043)) + 2.58958e-04*(qT-459.043)*(qT-459.043))', qT)"); //gi10
|
73 |
|
|
wspace->factory("CEXPR::signal('1819.48/(12.188 + exp( 0.015487*(qT-639.073)) + 4.15408e-04*(qT-639.073)*(qT-639.073))', qT)"); //gi15
|
74 |
|
|
wspace->factory("CEXPR::signal('296.407/(2.6339 + exp( 0.06652 *(qT-220.041)) + 2.17778e-03*(qT-220.041)*(qT-220.041))', qT)"); //zp05
|
75 |
|
|
wspace->factory("CEXPR::signal('611.231/(3.6656 + exp( 0.030314*(qT-468.111)) + 6.99505e-04*(qT-468.111)*(qT-468.111))', qT)"); //zp10
|
76 |
|
|
wspace->factory("CEXPR::signal('567.34 /(10.927 + exp( 0.02028 *(qT-687.772)) + 5.33170e-04*(qT-687.772)*(qT-687.772))', qT)"); //zp15
|
77 |
|
|
|
78 |
|
|
// Put signal and background together
|
79 |
|
|
wspace->factory("SUM::model(sig_yield[0,0,10]*signal, dy_yield*background)");
|
80 |
|
|
|
81 |
|
|
// Background only model
|
82 |
|
|
wspace->factory("ExtendPdf::null(background, dy_yield)");
|
83 |
|
|
|
84 |
|
|
RooAbsPdf* model = wspace->pdf("model");
|
85 |
|
|
RooAbsPdf* null = wspace->pdf("null");
|
86 |
|
|
RooRealVar* sig_yield = wspace->var("sig_yield");
|
87 |
|
|
|
88 |
|
|
RooRealVar* luminosity = wspace->var("luminosity");
|
89 |
|
|
//luminosity->setConstant();
|
90 |
|
|
RooRealVar* dy_xsec = wspace->var("dy_xsec");
|
91 |
|
|
dy_xsec->setConstant();
|
92 |
|
|
RooRealVar* dy_acceptance = wspace->var("dy_acceptance");
|
93 |
|
|
dy_acceptance->setConstant();
|
94 |
|
|
RooRealVar* dy_qTcut = wspace->var("dy_qTcut");
|
95 |
|
|
dy_qTcut->setConstant();
|
96 |
|
|
RooRealVar* dy_slope = wspace->var("dy_slope");
|
97 |
|
|
//dy_slope->setConstant();
|
98 |
|
|
|
99 |
|
|
// RooArgList observable( *(wspace->var("qT")) );
|
100 |
|
|
|
101 |
|
|
ModelConfig modelConfig("sigBg");
|
102 |
|
|
modelConfig.SetWorkspace(*wspace);
|
103 |
|
|
modelConfig.SetPdf(*model);
|
104 |
|
|
RooArgSet POI(*sig_yield);
|
105 |
|
|
modelConfig.SetParameters(POI);
|
106 |
|
|
// modelConfig.SetObservables(observable);
|
107 |
|
|
wspace->Print();
|
108 |
|
|
|
109 |
|
|
//wspace->writeToFile("myWS.root");
|
110 |
|
|
|
111 |
|
|
RooRealVar* qT = wspace->var("qT");
|
112 |
|
|
|
113 |
|
|
// Pseudo data:
|
114 |
|
|
// RooDataSet* data = model->generate(*qT,);
|
115 |
|
|
// RooDataSet* data = null->generate(*qT,RooFit::Extended());
|
116 |
|
|
|
117 |
|
|
// Real data:
|
118 |
|
|
TFile *qTdata = new TFile("boostedZnew.root");
|
119 |
|
|
TTree *skim = (TTree*)qTdata->Get("skim");
|
120 |
|
|
// TChain *dataTree = new TChain("tree");
|
121 |
|
|
// dataTree->AddFile("../11pb/dimuons_merged_6860InvNb_nocosmics.root");
|
122 |
|
|
// dataTree->AddFile("../11pb/dimuons_Run2010B_PromptReco_v2_run147117to147454.root");
|
123 |
|
|
RooArgSet vars(*qT);
|
124 |
|
|
// RooDataSet* data = new RooDataSet("recoCandPt","recoCandPt",dataTree,vars,"recoCandMass>60 && recoCandMass<120");
|
125 |
|
|
RooDataSet* data = new RooDataSet("qTdata","qTdata",skim,vars);
|
126 |
|
|
|
127 |
|
|
/*
|
128 |
|
|
TCanvas *q = new TCanvas();
|
129 |
|
|
RooPlot* frame = qT->frame();
|
130 |
|
|
data->plotOn(frame);
|
131 |
|
|
model->plotOn(frame);
|
132 |
|
|
frame->Draw();
|
133 |
|
|
return;
|
134 |
|
|
*/
|
135 |
|
|
/*
|
136 |
|
|
// Set up the ProfileLikelihoodCalculator
|
137 |
|
|
ProfileLikelihoodCalculator plc(*data, *model, POI);
|
138 |
|
|
// ProfileLikelihoodCalculator usually make intervals: the 95% CL one-sided upper-limit is the same as the two-sided upper-limit of a 90% CL interval
|
139 |
|
|
plc.SetTestSize(0.10);
|
140 |
|
|
// Pointer to the confidence interval
|
141 |
|
|
model->fitTo(*data,SumW2Error(kFALSE)); // <-- problem
|
142 |
|
|
LikelihoodInterval* plcInterval = plc.GetInterval();
|
143 |
|
|
// Compute the upper limit: a fit is needed first in order to locate the minimum of the -log(likelihood) and ease the upper limit computation
|
144 |
|
|
model->fitTo(*data,SumW2Error(kFALSE)); // <-- problem
|
145 |
|
|
const double upperLimit = plcInterval->UpperLimit(*sig_yield); // <-- to simplify
|
146 |
|
|
// Make a plot of the profile-likelihood and confidence interval
|
147 |
|
|
LikelihoodIntervalPlot plot(plcInterval);
|
148 |
|
|
plot.Draw();
|
149 |
|
|
|
150 |
|
|
std::cout << "One sided upper limit at 95% CL: "<< upperLimit << std::endl;
|
151 |
|
|
return;
|
152 |
|
|
*/
|
153 |
|
|
RooStats::FeldmanCousins fc(*data,modelConfig);
|
154 |
|
|
fc.AdditionalNToysFactor(10);
|
155 |
|
|
fc.CreateConfBelt(true);
|
156 |
|
|
fc.SaveBeltToFile(true);
|
157 |
|
|
fc.SetTestSize(.05); // set size of test
|
158 |
|
|
fc.UseAdaptiveSampling(true);
|
159 |
|
|
fc.FluctuateNumDataEntries(true); // number counting analysis: dataset always has 1 entry with N events observed
|
160 |
|
|
fc.SetNBins(100); // number of points to test per parameter
|
161 |
|
|
// use the Feldman-Cousins tool
|
162 |
|
|
PointSetInterval* interval = (PointSetInterval*)fc.GetInterval();
|
163 |
|
|
std::cout << "is this point in the interval? " <<
|
164 |
|
|
interval->IsInInterval(RooArgSet(*sig_yield)) << std::endl;
|
165 |
|
|
std::cout << "interval is ["<<
|
166 |
|
|
interval->LowerLimit(*sig_yield) << ", " <<
|
167 |
|
|
interval->UpperLimit(*sig_yield) << "]" << endl;
|
168 |
|
|
}
|
169 |
|
|
|