def pvalue_plot(poi, pvalues, pad=None, xtitle='X', ytitle='P_{0}', linestyle=None, linecolor=None, yrange=None, verbose=False): """ Draw a pvalue plot Parameters ---------- poi : list List of POI values tested pvalues : list List of p-values or list of lists of p-values to overlay multiple p-value curves pad : Canvas or Pad, optional (default=None) Pad to draw onto. Create new pad if None. xtitle : str, optional (default='X') The x-axis label (POI name) ytitle : str, optional (default='P_{0}') The y-axis label linestyle : str or list, optional (default=None) Line style for the p-value graph or a list of linestyles for multiple p-value graphs. linecolor : str or list, optional (default=None) Line color for the p-value graph or a list of linestyles for multiple p-value graphs. Returns ------- pad : Canvas The pad. graphs : list of Graph The p-value graphs """ if not pvalues: raise ValueError("pvalues is empty") if not poi: raise ValueError("poi is empty") # determine if pvalues is list or list of lists if not isinstance(pvalues[0], (list, tuple)): pvalues = [pvalues] if linecolor is not None: if not isinstance(linecolor, list): linecolor = [linecolor] linecolor = cycle(linecolor) if linestyle is not None: if not isinstance(linestyle, list): linestyle = [linestyle] linestyle = cycle(linestyle) with preserve_current_canvas(): if pad is None: pad = Canvas() pad.cd() pad.SetLogy() # create the axis min_poi, max_poi = min(poi), max(poi) haxis = Hist(1000, min_poi, max_poi) xaxis = haxis.xaxis yaxis = haxis.yaxis xaxis.SetRangeUser(min_poi, max_poi) haxis.Draw('AXIS') min_pvalue = float('inf') graphs = [] for ipv, pv in enumerate(pvalues): graph = Graph(len(poi), linestyle='dashed', drawstyle='L', linewidth=2) for idx, (point, pvalue) in enumerate(zip(poi, pv)): graph.SetPoint(idx, point, pvalue) if linestyle is not None: graph.linestyle = linestyle.next() if linecolor is not None: graph.linecolor = linecolor.next() graphs.append(graph) curr_min_pvalue = min(pv) if curr_min_pvalue < min_pvalue: min_pvalue = curr_min_pvalue if verbose: for graph in graphs: log.info(['{0:1.1f}'.format(xval) for xval in list(graph.x())]) log.info(['{0:0.3f}'.format(yval) for yval in list(graph.y())]) # automatically handles axis limits axes, bounds = draw(graphs, pad=pad, same=True, logy=True, xtitle=xtitle, ytitle=ytitle, xaxis=xaxis, yaxis=yaxis, ypadding=(0.2, 0.1), logy_crop_value=1E-300) if yrange is not None: xaxis, yaxis = axes yaxis.SetLimits(*yrange) yaxis.SetRangeUser(*yrange) min_pvalue = yrange[0] # draw sigma levels up to minimum of pvalues line = Line() line.SetLineStyle(2) line.SetLineColor(2) latex = ROOT.TLatex() latex.SetNDC(False) latex.SetTextSize(20) latex.SetTextColor(2) sigma = 0 while True: pvalue = gaussian_cdf_c(sigma) if pvalue < min_pvalue: break keepalive(pad, latex.DrawLatex(max_poi, pvalue, " {0}#sigma".format(sigma))) keepalive(pad, line.DrawLine(min_poi, pvalue, max_poi, pvalue)) sigma += 1 pad.RedrawAxis() pad.Update() return pad, graphs
tmphandles.append(a[0]) tmplabels.append(b) # use them in the legend axes.legend(tmphandles, tmplabels, loc='best',numpoints=1) if 'Data' in hists: # print list(stack.sum.y()) # ratioplot = Graph.divide( Graph(hists['Data']), stack.sum ) ratioplot = Graph() ratioplot.Divide( hists['Data'], stack.sum , 'pois' ) ratioplot.color = "black" if hists["Data"].Integral(): tmpyerror,tmpyerror2 = zip(*list(ratioplot.yerr()) ) tmpx = list(ratioplot.x()) tmpy = list(ratioplot.y()) tmpxy = zip(tmpx,tmpy,tmpyerror) # print tmpxy tmpxy = [tmp for tmp in tmpxy if tmp[1]!=0 ] # print tmpxy tmpx,tmpy,tmpyerror = zip(*tmpxy) # print tmpyerror axes_ratio.errorbar(tmpx, tmpy, # list(ratioplot.y()), yerr = tmpyerror, # yerr=[ x[0] for x in list(ratioplot.yerr() ) ] , # xerr=list(ratioplot.y()), # emptybins=False, fmt='o', lw=1, color="black")
axislabel = "" for chunk in histogramName.split("_"): if "SR" in chunk or "minus" in chunk: continue axislabel += chunk # axislabel = " ".join(histogramName.split("_")[2:]) axislabel = axislabel.split("<")[0].split(">")[0] if 'DataMain' in hists: if hists["DataMain"].Integral() and plotWithMPL: ratioplot = Graph() ratioplot.Divide(hists['DataMain'], stack.sum, 'pois') # ratioplot.color = "green" tmpyerror, tmpyerror2 = zip(*list(ratioplot.yerr())) tmpx = list(ratioplot.x()) tmpy = list(ratioplot.y()) tmpxy = zip(tmpx, tmpy, tmpyerror) # print tmpxy tmpxy = [tmp for tmp in tmpxy if tmp[1] != 0] # print tmpxy tmpx, tmpy, tmpyerror = zip(*tmpxy) # print tmpyerror # axes_ratio.errorbar(tmpx,tmpy, yerr = tmpyerror,xerr=False, emptybins=False, marker='o', lw=1, color="black") axes_ratio.errorbar( tmpx, tmpy, # list(ratioplot.y()), yerr=tmpyerror, # yerr=[ x[0] for x in list(ratioplot.yerr() ) ] , # xerr=list(ratioplot.y()),
if "SR" in chunk or "minus" in chunk: continue axislabel += chunk # axislabel = " ".join(histogramName.split("_")[2:]) axislabel = axislabel.split("<")[0].split(">")[0] if 'DataMain' in hists: if hists["DataMain"].Integral() and plotWithMPL: ratioplot = Graph() ratioplot.Divide( hists['DataMain'], stack.sum , 'pois' ) # ratioplot.color = "green" tmpyerror,tmpyerror2 = zip(*list(ratioplot.yerr()) ) tmpx = list(ratioplot.x()) tmpy = list(ratioplot.y()) tmpxy = zip(tmpx,tmpy,tmpyerror) # print tmpxy tmpxy = [tmp for tmp in tmpxy if tmp[1]!=0 ] # print tmpxy tmpx,tmpy,tmpyerror = zip(*tmpxy) # print tmpyerror # axes_ratio.errorbar(tmpx,tmpy, yerr = tmpyerror,xerr=False, emptybins=False, marker='o', lw=1, color="black") axes_ratio.errorbar(tmpx, tmpy, # list(ratioplot.y()), yerr = tmpyerror, # yerr=[ x[0] for x in list(ratioplot.yerr() ) ] , # xerr=list(ratioplot.y()), # emptybins=False, fmt='o', lw=1,
def pvalue_plot(poi, pvalues, pad=None, xtitle='X', ytitle='P_{0}', linestyle=None, linecolor=None, yrange=None, verbose=False): """ Draw a pvalue plot Parameters ---------- poi : list List of POI values tested pvalues : list List of p-values or list of lists of p-values to overlay multiple p-value curves pad : Canvas or Pad, optional (default=None) Pad to draw onto. Create new pad if None. xtitle : str, optional (default='X') The x-axis label (POI name) ytitle : str, optional (default='P_{0}') The y-axis label linestyle : str or list, optional (default=None) Line style for the p-value graph or a list of linestyles for multiple p-value graphs. linecolor : str or list, optional (default=None) Line color for the p-value graph or a list of linestyles for multiple p-value graphs. Returns ------- pad : Canvas The pad. graphs : list of Graph The p-value graphs """ if not pvalues: raise ValueError("pvalues is empty") if not poi: raise ValueError("poi is empty") # determine if pvalues is list or list of lists if not isinstance(pvalues[0], (list, tuple)): pvalues = [pvalues] if linecolor is not None: if not isinstance(linecolor, list): linecolor = [linecolor] linecolor = cycle(linecolor) if linestyle is not None: if not isinstance(linestyle, list): linestyle = [linestyle] linestyle = cycle(linestyle) with preserve_current_canvas(): if pad is None: pad = Canvas() pad.cd() pad.SetLogy() # create the axis min_poi, max_poi = min(poi), max(poi) haxis = Hist(1000, min_poi, max_poi) xaxis = haxis.xaxis yaxis = haxis.yaxis xaxis.SetRangeUser(min_poi, max_poi) haxis.Draw('AXIS') min_pvalue = float('inf') graphs = [] for ipv, pv in enumerate(pvalues): graph = Graph(len(poi), linestyle='dashed', drawstyle='L', linewidth=2) for idx, (point, pvalue) in enumerate(zip(poi, pv)): graph.SetPoint(idx, point, pvalue) if linestyle is not None: graph.linestyle = linestyle.next() if linecolor is not None: graph.linecolor = linecolor.next() graphs.append(graph) curr_min_pvalue = min(pv) if curr_min_pvalue < min_pvalue: min_pvalue = curr_min_pvalue if verbose: for graph in graphs: log.info(['{0:1.1f}'.format(xval) for xval in list(graph.x())]) log.info(['{0:0.3f}'.format(yval) for yval in list(graph.y())]) # automatically handles axis limits axes, bounds = draw(graphs, pad=pad, same=True, logy=True, xtitle=xtitle, ytitle=ytitle, xaxis=xaxis, yaxis=yaxis, ypadding=(0.2, 0.1), logy_crop_value=1E-300) if yrange is not None: xaxis, yaxis = axes yaxis.SetLimits(*yrange) yaxis.SetRangeUser(*yrange) min_pvalue = yrange[0] # draw sigma levels up to minimum of pvalues line = Line() line.SetLineStyle(2) line.SetLineColor(2) latex = ROOT.TLatex() latex.SetNDC(False) latex.SetTextSize(20) latex.SetTextColor(2) sigma = 0 while True: pvalue = gaussian_cdf_c(sigma) if pvalue < min_pvalue: break keepalive( pad, latex.DrawLatex(max_poi, pvalue, " {0}#sigma".format(sigma))) keepalive(pad, line.DrawLine(min_poi, pvalue, max_poi, pvalue)) sigma += 1 pad.RedrawAxis() pad.Update() return pad, graphs