Skip to content

Commit

Permalink
Merge pull request #271 from vicha-w/plotgof-autogaus
Browse files Browse the repository at this point in the history
Added goodness-of-fit plot range auto adjustment based on gaussian fit
  • Loading branch information
adewit authored Jul 22, 2022
2 parents b7ca691 + 32fcdd7 commit 84ebbde
Showing 1 changed file with 50 additions and 3 deletions.
53 changes: 50 additions & 3 deletions CombineTools/scripts/plotGof.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
parser.add_argument('--table_vals', help='Amount of values to be written in a table for different masses', default=10)
parser.add_argument("--bins", default=100, type=int, help="Number of bins in histogram")
parser.add_argument("--range", nargs=2, type=float, help="Range of histograms. Requires two arguments in the form of <min> <max>")
parser.add_argument("--percentile", nargs=2, type=float, help="Range of percentile from the distribution to be included. Requires two arguments in the form of <min> <max>. Overrides range option.")
args = parser.parse_args()


Expand Down Expand Up @@ -106,7 +107,11 @@ def DrawAxisHists(pads, axis_hists, def_pad=None):
# if key not in titles:
# continue
toy_graph = plot.ToyTGraphFromJSON(js, [args.mass,key,'toy'])
if args.range: toy_hist = plot.makeHist1D("toys", args.bins, toy_graph, 1.15, absoluteXrange=args.range)
if args.percentile:
min_range = toy_graph.GetX()[int(toy_graph.GetN()*args.percentile[0])]
max_range = toy_graph.GetX()[int(toy_graph.GetN()*args.percentile[1])]
toy_hist = plot.makeHist1D("toys", args.bins, toy_graph, absoluteXrange=(min_range, max_range))
elif args.range: toy_hist = plot.makeHist1D("toys", args.bins, toy_graph, absoluteXrange=args.range)
else: toy_hist = plot.makeHist1D("toys", args.bins, toy_graph, 1.15)
for i in range(toy_graph.GetN()):
toy_hist.Fill(toy_graph.GetX()[i])
Expand Down Expand Up @@ -180,11 +185,17 @@ def DrawAxisHists(pads, axis_hists, def_pad=None):
js = json.load(jsfile)
# graph_sets.append(plot.StandardLimitsFromJSONFile(file, args.show.split(',')))
toy_graph = plot.ToyTGraphFromJSON(js, [args.mass, "toy"])
if args.range: toy_hist = plot.makeHist1D("toys", args.bins, toy_graph, absoluteXrange=args.range)
else: toy_hist = plot.makeHist1D("toys", args.bins, toy_graph)
if args.percentile:
min_range = toy_graph.GetX()[int(toy_graph.GetN()*args.percentile[0])]
max_range = toy_graph.GetX()[int(toy_graph.GetN()*args.percentile[1])]
toy_hist = plot.makeHist1D("toys", args.bins, toy_graph, absoluteXrange=(min_range, max_range))
elif args.range: toy_hist = plot.makeHist1D("toys", args.bins, toy_graph, absoluteXrange=args.range)
else: toy_hist = plot.makeHist1D("toys", args.bins, toy_graph, 1.15)
for i in range(toy_graph.GetN()):
toy_hist.Fill(toy_graph.GetX()[i])
pValue = js[args.mass]["p"]
underflow_count = toy_hist.GetBinContent(0)
overflow_count = toy_hist.GetBinContent(args.bins+1)
obs = plot.ToyTGraphFromJSON(js, [args.mass,"obs"])
arr = ROOT.TArrow(obs.GetX()[0], 0.001, obs.GetX()[0], toy_hist.GetMaximum()/8, 0.02, "<|");
# if axis is None:
Expand Down Expand Up @@ -246,5 +257,41 @@ def DrawAxisHists(pads, axis_hists, def_pad=None):
pvalue.AddText("p-value = %0.3f"%pValue)
pvalue.Draw()

arrow_not_in_range = (obs.GetX()[0] > toy_hist.GetBinLowEdge(args.bins+1)) or (obs.GetX()[0] < toy_hist.GetBinLowEdge(0))

warningtext1 = ROOT.TPaveText(0.68, 0.78, 0.80, 0.82, "NDC")
warningtext1.SetBorderSize( 0 )
warningtext1.SetFillStyle ( 0 )
warningtext1.SetTextAlign ( 32 )
warningtext1.SetTextSize (0.04 )
warningtext1.SetTextColor ( 2 )
warningtext1.SetTextFont ( 62 )

if arrow_not_in_range and ((underflow_count != 0) or (overflow_count != 0)):
warningstrings = []
if underflow_count != 0: warningstrings.append("%d underflow"%underflow_count)
if overflow_count != 0: warningstrings.append("%d overflow"%overflow_count)
warningtext1.AddText(', '.join(warningstrings))
warningtext1.Draw()

warningtext2 = ROOT.TPaveText(0.68, 0.73, 0.80, 0.77, "NDC")
warningtext2.SetBorderSize( 0 )
warningtext2.SetFillStyle ( 0 )
warningtext2.SetTextAlign ( 32 )
warningtext2.SetTextSize (0.04 )
warningtext2.SetTextColor ( 2 )
warningtext2.SetTextFont ( 62 )
warningtext2.AddText("observed value not in range")
warningtext2.Draw()
else:
if ((underflow_count != 0) or (overflow_count != 0)):
warningstrings = []
if underflow_count != 0: warningstrings.append("%d underflow"%underflow_count)
if overflow_count != 0: warningstrings.append("%d overflow"%overflow_count)
warningtext1.AddText(', '.join(warningstrings))
elif arrow_not_in_range:
warningtext1.AddText("observed value not in range")
warningtext1.Draw()

canv.Print('.pdf')
canv.Print('.png')

0 comments on commit 84ebbde

Please sign in to comment.