47 ClassImp(RooStats::HybridResult);
49 using namespace RooStats;
54 HybridResult::HybridResult(
const char *name) :
56 fTestStat_data(-999.),
57 fComputationsNulDoneFlag(false),
58 fComputationsAltDoneFlag(false),
59 fSumLargerValues(false)
67 HybridResult::HybridResult(
const char *name,
68 const std::vector<double>& testStat_sb_vals,
69 const std::vector<double>& testStat_b_vals,
70 bool sumLargerValues ) :
71 HypoTestResult(name,0,0),
72 fTestStat_data(-999.),
73 fComputationsNulDoneFlag(false),
74 fComputationsAltDoneFlag(false),
75 fSumLargerValues(sumLargerValues)
79 int vector_size_sb = testStat_sb_vals.size();
80 assert(vector_size_sb>0);
82 int vector_size_b = testStat_b_vals.size();
83 assert(vector_size_b>0);
85 fTestStat_sb.reserve(vector_size_sb);
86 for (
int i=0;i<vector_size_sb;++i)
87 fTestStat_sb.push_back(testStat_sb_vals[i]);
89 fTestStat_b.reserve(vector_size_b);
90 for (
int i=0;i<vector_size_b;++i)
91 fTestStat_b.push_back(testStat_b_vals[i]);
98 HybridResult::~HybridResult()
101 fTestStat_sb.clear();
108 void HybridResult::SetDataTestStatistics(
double testStat_data_val)
110 fComputationsAltDoneFlag =
false;
111 fComputationsNulDoneFlag =
false;
112 fTestStat_data = testStat_data_val;
119 double HybridResult::NullPValue()
const
121 if (fComputationsNulDoneFlag==
false) {
122 int nToys = fTestStat_b.size();
124 std::cout <<
"Error: no toy data present. Returning -1.\n";
128 double larger_than_measured=0;
129 if (fSumLargerValues) {
130 for (
int iToy=0;iToy<nToys;++iToy)
131 if ( fTestStat_b[iToy] >= fTestStat_data ) ++larger_than_measured;
133 for (
int iToy=0;iToy<nToys;++iToy)
134 if ( fTestStat_b[iToy] <= fTestStat_data ) ++larger_than_measured;
137 if (larger_than_measured==0) std::cout <<
"Warning: CLb = 0 ... maybe more toys are needed!\n";
139 fComputationsNulDoneFlag =
true;
140 fNullPValue = 1-larger_than_measured/nToys;
149 double HybridResult::AlternatePValue()
const
151 if (fComputationsAltDoneFlag==
false) {
152 int nToys = fTestStat_b.size();
154 std::cout <<
"Error: no toy data present. Returning -1.\n";
158 double larger_than_measured=0;
159 if (fSumLargerValues) {
160 for (
int iToy=0;iToy<nToys;++iToy)
161 if ( fTestStat_sb[iToy] >= fTestStat_data ) ++larger_than_measured;
163 for (
int iToy=0;iToy<nToys;++iToy)
164 if ( fTestStat_sb[iToy] <= fTestStat_data ) ++larger_than_measured;
167 if (larger_than_measured==0) std::cout <<
"Warning: CLsb = 0 ... maybe more toys are needed!\n";
169 fComputationsAltDoneFlag =
true;
170 fAlternatePValue = larger_than_measured/nToys;
173 return fAlternatePValue;
183 Double_t HybridResult::CLbError()
const
185 unsigned const int n = fTestStat_b.size();
186 return TMath::Sqrt(CLb() * (1. - CLb()) / n);
196 Double_t HybridResult::CLsplusbError()
const
198 unsigned const int n = fTestStat_sb.size();
199 return TMath::Sqrt(CLsplusb() * (1. - CLsplusb()) / n);
209 Double_t HybridResult::CLsError()
const
211 unsigned const int n_b = fTestStat_b.size();
212 unsigned const int n_sb = fTestStat_sb.size();
214 if (CLb() == 0 || CLsplusb() == 0)
217 double cl_b_err = (1. - CLb()) / (n_b * CLb());
218 double cl_sb_err = (1. - CLsplusb()) / (n_sb * CLsplusb());
220 return CLs() * TMath::Sqrt(cl_b_err + cl_sb_err);
228 void HybridResult::Add(HybridResult* other)
231 int other_size_sb = other->GetTestStat_sb().size();
232 for (
int i=0;i<other_size_sb;++i)
233 fTestStat_sb.push_back(other->GetTestStat_sb()[i]);
235 int other_size_b = other->GetTestStat_b().size();
236 for (
int i=0;i<other_size_b;++i)
237 fTestStat_b.push_back(other->GetTestStat_b()[i]);
240 if (fTestStat_data==-999.)
241 fTestStat_data = other->GetTestStat_data();
243 fComputationsAltDoneFlag =
false;
244 fComputationsNulDoneFlag =
false;
253 HybridPlot* HybridResult::GetPlot(
const char* name,
const char* title,
int n_bins)
257 if ( TString(name)==
"" ) {
258 plot_name += GetName();
259 plot_name +=
"_plot";
260 }
else plot_name = name;
264 if ( TString(title)==
"" ) {
265 plot_title += GetTitle();
266 plot_title +=
"_plot (";
267 plot_title += fTestStat_b.size();
268 plot_title +=
" toys)";
269 }
else plot_title = title;
271 HybridPlot* plot =
new HybridPlot( plot_name.Data(),
284 void HybridResult::PrintMore(
const char* )
286 std::cout <<
"\nResults " << GetName() <<
":\n"
287 <<
" - Number of S+B toys: " << fTestStat_b.size() << std::endl
288 <<
" - Number of B toys: " << fTestStat_sb.size() << std::endl
289 <<
" - test statistics evaluated on data: " << fTestStat_data << std::endl
290 <<
" - CL_b " << CLb() << std::endl
291 <<
" - CL_s+b " << CLsplusb() << std::endl
292 <<
" - CL_s " << CLs() << std::endl;