1 #include "SensitivityCalculator.h" 2 #include "TGraphErrors.h" 7 #include "RooWorkspace.h" 8 #include "RooStats/FeldmanCousins.h" 9 #include "RooStats/HypoTestResult.h" 10 #include "RooStats/ProfileLikelihoodCalculator.h" 14 SensitivityCalculator::~SensitivityCalculator()
24 SensitivityCalculator::SensitivityCalculator(
double CL,
bool FC)
31 fprintf(stderr,
"Need to build with USE_ROOSTATS to use Sensitivity Calculator\n");
35 w =
new RooWorkspace(
"w");
39 w->factory(
"Poisson::obsModel(nobs[0,0,20], sum(prod(s[1,0,50], eff[0.7,0,1]),banthro[1,0,30],bthermal[0.3,0,30]))");
42 w->factory(
"Poisson::thermalModel(nthermal[1,0,30], prod::taubthermal(bthermal, tauthermal[3,0,10]))");
45 w->factory(
"Poisson::anthroModel(nanthro[1,0,30], prod::taubanthro(banthro, tauanthro[1,0,10]))");
48 w->factory(
"Gaussian::anthroTauErrorModel(mean_tauanthro[1,0,10],tauanthro, sigma_tau_anthro[0.1,0,1])");
51 w->factory(
"Gaussian::effModel(mean_eff[0.7,0,1], eff, sigma_eff[0.05,0,0.2])");
54 w->factory(
"PROD::model(obsModel,thermalModel,anthroModel,effModel, anthroTauErrorModel)");
62 w->var(
"tauthermal")->setConstant();
63 w->var(
"mean_tauanthro")->setConstant();
64 w->var(
"sigma_tau_anthro")->setConstant();
65 w->var(
"nthermal")->setConstant();
66 w->var(
"nanthro")->setConstant();
67 w->var(
"mean_eff")->setConstant();
68 w->var(
"sigma_eff")->setConstant();
70 w->defineSet(
"poi",
"s");
71 w->defineSet(
"nuis",
"bthermal,banthro,eff,tauanthro");
72 w->defineSet(
"gobs",
"nthermal,nanthro,tauthermal,mean_tauanthro,sigma_tau_anthro,mean_eff,sigma_eff");
73 w->defineSet(
"obs",
"nobs");
74 w->defineSet(
"sens",
"bthermal,banthro,eff,nobs,tauanthro");
75 w->defineSet(
"bkg_anthro",
"banthro,tauanthro");
76 w->defineSet(
"bkg_thermal",
"bthermal");
77 w->defineSet(
"bkg_total",
"banthro,tauanthro,bthermal");
79 setEfficiency(0.7,0.05);
80 setThermalBackground(1,3);
81 setAnthroBackground(1,1,0.1);
86 void SensitivityCalculator::SensitivityCalculator::setThermalBackground(
int nobs,
double tau)
89 w->var(
"tauthermal")->setVal(tau);
90 w->var(
"nthermal")->setVal(nobs);
95 void SensitivityCalculator::SensitivityCalculator::setAnthroBackground(
int nobs,
double tau,
double sigma_tau)
98 w->var(
"mean_tauanthro")->setVal(tau);
99 w->var(
"sigma_tau_anthro")->setVal(sigma_tau);
100 w->var(
"nanthro")->setVal(nobs);
105 void SensitivityCalculator::SensitivityCalculator::setEfficiency(
double mean,
double sigma)
110 w->var(
"eff")->setVal(mean);
111 w->var(
"eff")->setConstant(
true);
116 w->var(
"eff")->setConstant(
false);
117 w->var(
"mean_eff")->setVal(mean);
118 w->var(
"sigma_eff")->setVal(sigma);
125 double SensitivityCalculator::getLimit(
int nobs,
double * lower,
double * upper)
128 w->var(
"s")->setConstant(
false);
129 w->var(
"nobs")->setVal(nobs);
130 RooDataSet data(
"data",
"",*w->var(
"nobs"));
131 data.add(*w->var(
"nobs"));
134 RooStats::ModelConfig m(
"mod");
136 m.SetPdf(*w->pdf(
"model"));
137 m.SetObservables(*w->var(
"nobs"));
138 m.SetGlobalObservables(*w->set(
"gobs"));
139 m.SetParametersOfInterest(*w->set(
"poi"));
140 m.SetNuisanceParameters(*w->set(
"nuis"));
144 RooStats::FeldmanCousins fc(data,m);
145 fc.SetConfidenceLevel(cl);
146 fc.FluctuateNumDataEntries(
false);
147 fc.UseAdaptiveSampling(
true);
149 RooStats::PointSetInterval * ci = fc.GetInterval();
151 if (upper) *upper=ci->UpperLimit(*w->var(
"s"));
152 if (lower) *lower=ci->LowerLimit(*w->var(
"s"));
158 RooStats::ProfileLikelihoodCalculator pl(data, m);
159 pl.SetConfidenceLevel(cl);
160 pl.SetNullParameters(*w->set(
"poi"));
161 RooStats::LikelihoodInterval * ci = pl.GetInterval();
162 pl.GetHypoTest()->Print();
163 if (upper) *upper=ci->UpperLimit(*w->var(
"s"));
164 if (lower) *lower=ci->LowerLimit(*w->var(
"s"));
173 TGraphErrors * SensitivityCalculator::confidenceBands(
int start,
int stop)
175 TGraphErrors * g =
new TGraphErrors(stop-start+1);
176 g->SetMarkerStyle(0);
177 g->SetTitle(TString::Format(
"%g%% bands", cl * 100));
178 g->GetXaxis()->SetTitle(
"Nobserved");
179 g->GetYaxis()->SetTitle(
"Signal");
182 for (
int i = start; i <= stop; i++)
187 g->SetPoint(ii, i, (l+u)/2);
188 g->SetPointError(ii, 0, (u-l)/2);
197 TH1 * SensitivityCalculator::histBAnthro()
200 RooDataSet * data = w->pdf(
"model")->generate(*w->set(
"bkg_anthro"),10000);
201 TH1 * hist = data->createHistogram(
"B_{anthro}", *w->var(
"banthro"));
202 hist->Scale(1./10000);
210 TH1 * SensitivityCalculator::histBThermal()
213 RooDataSet * data = w->pdf(
"model")->generate(*w->set(
"bkg_thermal"),10000);
214 TH1 * hist = data->createHistogram(
"B_{thermal}", *w->var(
"bthermal"));
215 hist->Scale(1./10000);
223 TH1 * SensitivityCalculator::histBTotal()
225 TH1 * banthro = histBAnthro();
226 TH1 * bthermal = histBThermal();
227 TH1 * btotal =
new TH1D(
"total",
"Total", 100,0,20);
229 for (
int i = 0; i < 10000; i++)
231 btotal->Fill(banthro->GetRandom() + bthermal->GetRandom());
233 btotal->Scale(1./btotal->Integral());
242 TH1 * SensitivityCalculator::histNObserved(
double S)
246 w->var(
"s")->setVal(S);
247 w->var(
"s")->setConstant(
true);
248 RooDataSet * data = w->pdf(
"model")->generate(*w->set(
"sens"),10000);
251 str.Form(
"observed_s_%g",S);
252 TH1 * hist = data->createHistogram(str.Data(), *w->var(
"nobs"),RooFit::Binning(20,0,20));
253 hist->Scale(1./10000);
255 w->var(
"s")->setConstant(
false);