35 ClassImp(RooStats::HybridPlot);
37 using namespace RooStats;
42 HybridPlot::HybridPlot(
const char* name,
44 const std::vector<double> & sb_vals,
45 const std::vector<double> & b_vals,
51 fSb_histo_shaded(NULL),
53 fB_histo_shaded(NULL),
54 fData_testStat_line(0),
59 int nToysSB = sb_vals.size();
60 int nToysB = sb_vals.size();
65 double min = *std::min_element(sb_vals.begin(), sb_vals.end());
66 double max = *std::max_element(sb_vals.begin(), sb_vals.end());
68 double min_b = *std::min_element(b_vals.begin(), b_vals.end());
69 double max_b = *std::max_element(b_vals.begin(), b_vals.end());
72 if ( min_b < min) min = min_b;
73 if ( max_b > max) max = max_b;
75 if (testStat_data<min) min = testStat_data;
76 if (testStat_data>max) max = testStat_data;
83 fSb_histo =
new TH1F (
"SB_model",title,n_bins,min,max);
84 fSb_histo->SetTitle(fSb_histo->GetTitle());
85 fSb_histo->SetLineColor(kBlue);
86 fSb_histo->GetXaxis()->SetTitle(
"test statistics");
87 fSb_histo->SetLineWidth(2);
89 fB_histo =
new TH1F (
"B_model",title,n_bins,min,max);
90 fB_histo->SetTitle(fB_histo->GetTitle());
91 fB_histo->SetLineColor(kRed);
92 fB_histo->GetXaxis()->SetTitle(
"test statistics");
93 fB_histo->SetLineWidth(2);
95 for (
int i=0;i<nToysSB;++i) fSb_histo->Fill(sb_vals[i]);
96 for (
int i=0;i<nToysB;++i) fB_histo->Fill(b_vals[i]);
98 double histos_max_y = fSb_histo->GetMaximum();
99 double line_hight = histos_max_y/nToysSB;
100 if (histos_max_y<fB_histo->GetMaximum()) histos_max_y = fB_histo->GetMaximum()/nToysB;
103 fData_testStat_line =
new TLine(testStat_data,0,testStat_data,line_hight);
104 fData_testStat_line->SetLineWidth(3);
105 fData_testStat_line->SetLineColor(kBlack);
108 double golden_section = (std::sqrt(5.)-1)/2;
110 fLegend =
new TLegend(0.75,0.95-0.2*golden_section,0.95,0.95);
111 TString title_leg=
"test statistics distributions ";
112 title_leg+=sb_vals.size();
114 fLegend->SetName(title_leg.Data());
115 fLegend->AddEntry(fSb_histo,
"SB toy datasets");
116 fLegend->AddEntry(fB_histo,
"B toy datasets");
117 fLegend->AddEntry((TLine*)fData_testStat_line,
"test statistics on data",
"L");
118 fLegend->SetFillColor(0);
124 HybridPlot::~HybridPlot()
127 if (fSb_histo)
delete fSb_histo;
128 if (fB_histo)
delete fB_histo;
129 if (fSb_histo_shaded)
delete fSb_histo_shaded;
130 if (fB_histo_shaded)
delete fB_histo_shaded;
131 if (fData_testStat_line)
delete fData_testStat_line;
132 if (fLegend)
delete fLegend;
138 void HybridPlot::Draw(
const char* )
141 gStyle->SetOptStat(0);
145 if (fSb_histo->GetMaximum()>fB_histo->GetMaximum()){
146 fSb_histo->DrawNormalized();
147 fB_histo->DrawNormalized(
"same");
150 fB_histo->DrawNormalized();
151 fSb_histo->DrawNormalized(
"same");
155 fB_histo_shaded = (TH1F*)fB_histo->Clone(
"b_shaded");
156 fB_histo_shaded->SetFillStyle(3005);
157 fB_histo_shaded->SetFillColor(kRed);
159 fSb_histo_shaded = (TH1F*)fSb_histo->Clone(
"sb_shaded");
160 fSb_histo_shaded->SetFillStyle(3004);
161 fSb_histo_shaded->SetFillColor(kBlue);
164 double data_m2lnq= fData_testStat_line->GetX1();
165 for (
int i=1;i<=fSb_histo->GetNbinsX();++i){
166 if (fSb_histo->GetBinCenter(i)<data_m2lnq){
167 fSb_histo_shaded->SetBinContent(i,0);
168 fB_histo_shaded->SetBinContent(i,fB_histo->GetBinContent(i)/fB_histo->GetSumOfWeights());
171 fB_histo_shaded->SetBinContent(i,0);
172 fSb_histo_shaded->SetBinContent(i,fSb_histo->GetBinContent(i)/fSb_histo->GetSumOfWeights());
177 fB_histo_shaded->Draw(
"same");
178 fSb_histo_shaded->Draw(
"same");
181 fData_testStat_line->Draw(
"same");
184 fLegend->Draw(
"same");
187 gPad->SetName(GetName());
188 gPad->SetTitle(GetTitle() );
198 void HybridPlot::DumpToFile (
const char* RootFileName,
const char* options)
201 TFile ofile(RootFileName,options);
209 if (fB_histo_shaded!=NULL && fSb_histo_shaded!=NULL){
210 fB_histo_shaded->Write();
211 fSb_histo_shaded->Write();
215 fData_testStat_line->Write(
"Measured test statistics line tag");
226 void HybridPlot::DumpToImage(
const char * filename) {
228 Error(
"HybridPlot",
"Hybrid plot has not yet been drawn ");
231 fPad->Print(filename);
239 double HybridPlot::GetHistoCenter(TH1* histo_orig,
double n_rms,
bool display_result){
242 TString optfit =
"Q0";
243 if (display_result) optfit =
"Q";
245 TH1F* histo = (TH1F*)histo_orig->Clone();
248 double x_min = histo->GetXaxis()->GetXmin();
249 double x_max = histo->GetXaxis()->GetXmax();
253 TF1* gaus =
new TF1(
"mygaus",
"gaus", x_min, x_max);
255 gaus->SetParameter(
"Constant",histo->GetEntries());
256 gaus->SetParameter(
"Mean",histo->GetMean());
257 gaus->SetParameter(
"Sigma",histo->GetRMS());
259 histo->Fit(gaus,optfit);
262 double sigma = gaus->GetParameter(
"Sigma");
263 double mean = gaus->GetParameter(
"Mean");
267 std::cout <<
"Center is 1st pass = " << mean << std::endl;
269 double skewness = histo->GetSkewness();
271 x_min = mean - n_rms*sigma - sigma*skewness/2;
272 x_max = mean + n_rms*sigma - sigma*skewness/2;;
274 TF1* gaus2 =
new TF1(
"mygaus2",
"gaus", x_min, x_max);
275 gaus2->SetParameter(
"Mean",mean);
279 histo->Fit(gaus2,optfit,
"", x_min, x_max);
282 double center = gaus2->GetParameter(
"Mean");
284 if (display_result) {
302 double* HybridPlot::GetHistoPvals (TH1* histo,
double percentage){
305 std::cerr <<
"Percentage greater or equal to 1!\n";
310 double* h_integral=histo->GetIntegral();
313 std::map<int,int> extremes_map;
315 for (
int i=0;i<histo->GetNbinsX();++i){
316 for (
int j=0;j<histo->GetNbinsX();++j){
317 double integral = h_integral[j]-h_integral[i];
318 if (integral>percentage){
326 std::map<int,int>::iterator it;
328 double left_bin_center(0.),right_bin_center(0.);
331 for (it = extremes_map.begin();it != extremes_map.end();++it){
334 current_diff=std::fabs(histo->GetBinContent(a)-histo->GetBinContent(b));
335 if (current_diff<diff){
338 left_bin_center=histo->GetBinCenter(a);
339 right_bin_center=histo->GetBinCenter(b);
343 double* d =
new double[2];
344 d[0]=left_bin_center;
345 d[1]=right_bin_center;
352 double HybridPlot::GetMedian(TH1* histo){
355 Double_t* integral = histo->GetIntegral();
357 for (
int j=0;j<histo->GetNbinsX(); j++)
362 histo->GetBinCenter(median_i)+
363 (histo->GetBinCenter(median_i+1)-
364 histo->GetBinCenter(median_i))*
365 (0.5-integral[median_i])/(integral[median_i+1]-integral[median_i]);