def _plot_eff_array(array_dict, use_contour = True, out_name = 'rejrej.pdf'): eff_array = array_dict['eff'] eff_array = _maximize_efficiency(eff_array) x_min, x_max = array_dict['x_range'] y_min, y_max = array_dict['y_range'] eff_array[np.nonzero(eff_array < 0.0)] = np.nan fig = plt.figure() gs = GridSpec(20,21) ax = plt.subplot(gs[:,0:-1]) aspect = float(x_max - x_min) / (y_max - y_min) im = ax.imshow( eff_array, origin = 'upper', extent = (x_min,x_max, y_min, y_max), aspect = aspect, interpolation = 'nearest', vmin = 0, vmax = 1, ) if use_contour: im.set_cmap('Greys') ct = ax.contour( eff_array, origin = 'upper', extent = (x_min,x_max, y_min, y_max), aspect = aspect, linewidths = 2, levels = np.arange(0.1,1.0,0.1), ) im.get_cmap().set_bad(alpha=0) ax.set_xticks([]) ax.set_yticks([]) ax.invert_yaxis() cb_ax = plt.subplot(gs[:,-1]) plt.subplots_adjust(left = 0.25) # FIXME: use OO call here # cb = plt.colorbar() cb = Colorbar(ax = cb_ax, mappable = im) cb.set_label('{} efficiency'.format(array_dict['signal'])) if use_contour: cb.add_lines(ct) position = ax.get_position() new_aspect = ax.get_aspect() # ax.set_position(position) ax_log = fig.add_subplot(111, frameon = False) ax_log.set_xscale('log') ax_log.set_yscale('log') ax_log.axis((10**x_min, 10**x_max, 10**y_min, 10**y_max)) ax_log.set_aspect(aspect) ax_log.set_xlabel('{} rejection'.format(array_dict['x_bg'])) ax_log.set_ylabel('{} rejection'.format(array_dict['y_bg'])) ax_log.grid(True) ax_log.set_aspect(new_aspect) ax_log.set_position(position) plt.savefig(out_name, bbox_inches = 'tight') plt.close()
def _overlay_rejrej(array_one, array_two, out_name = 'rejrej.pdf', do_rel = False, do_contour = False, do_abs_contour = False, do_equal_contour = False, z_range = None, extra_cuts=[]): if do_contour and do_abs_contour: warnings.warn("can't do both abs_contour and contour, " "won't use abs_contour") do_abs_contour = False array_one['eff'] = _maximize_efficiency(array_one['eff']) array_two['eff'] = _maximize_efficiency(array_two['eff']) arrays = array_one, array_two # pretty sure the 'nonzero' calls here aren't needed (bool array returned # by the inequality should work) array_one['eff'][np.nonzero(array_one['eff'] <= 0.0)] = np.NaN array_two['eff'][np.nonzero(array_two['eff'] <= 0.0)] = np.NaN if do_rel: old_warn_set = np.seterr(divide = 'ignore') eff_array = array_one['eff'] / array_two['eff'] np.seterr(**old_warn_set) else: eff_array = array_one['eff'] - array_two['eff'] for a in arrays: if not 'tagger' in a: warnings.warn('no tagger name given',stacklevel = 2) a['tagger'] = 'unknown' if _get_rel_plot_alignment(array_one, array_two) > 1e-6: ranges = [(p['x_range'], p['y_range']) for p in arrays] raise ValueError("ranges {} don't match {}".format(*ranges)) if not _check_sig_bg_match(*arrays): err = 'array mismatch ---' for a in arrays: err += 'sig: {signal}, bgx: {x_bg}, bgy: {y_bg} '.format(**a) raise ValueError(err) x_min, x_max = array_one['x_range'] y_min, y_max = array_one['y_range'] fig = plt.figure() gs = GridSpec(20,21) ax = plt.subplot(gs[:,0:-1]) aspect = float(x_max - x_min) / (y_max - y_min) # cmap = mp.colors.Colormap('rainbow') rel_min = np.min(eff_array[np.isfinite(eff_array)]) rel_max = np.max(eff_array[np.isfinite(eff_array)]) if z_range: rel_min, rel_max = z_range if do_abs_contour: contour_array = array_one['eff'] signal = array_one['signal'] contour_range = (0,0.5) if signal == 'charm' else (0.5,1) else: contour_array = eff_array contour_range = (rel_min, rel_max) contour_order, c_lines = _get_contour_order_and_lines(contour_range) print 'plot range: {: .2f}--{:.2f}'.format( rel_min, rel_max) im = ax.imshow( eff_array, origin = 'upper', extent = (x_min,x_max, y_min, y_max), aspect = aspect, interpolation = 'nearest', vmin = rel_min, vmax = rel_max, ) if len(c_lines) == 0: do_contour = False if do_contour or do_abs_contour: ct = ax.contour( contour_array, origin = 'upper', extent = (x_min,x_max, y_min, y_max), aspect = aspect, linewidths = 2, levels = c_lines, colors = 'k', ) plt.clabel(ct, fontsize=12, inline=1, fmt = '%.{}f'.format(-contour_order + 1 )) equal_contour_level = 1.0 if do_rel else 0.0 if do_equal_contour: equal_ct = ax.contour( eff_array, origin = 'upper', extent = (x_min,x_max, y_min, y_max), aspect = aspect, linewidths = 2, levels = [equal_contour_level], colors = 'r', ) plt.clabel(equal_ct, fontsize=9, inline=True, fmt={equal_contour_level:'equal'}) im.get_cmap().set_bad(alpha=0) ax.set_xticks([]) ax.set_yticks([]) ax.invert_yaxis() cb_ax = plt.subplot(gs[:,-1]) plt.subplots_adjust(left = 0.25) # FIXME: use OO call here # cb = plt.colorbar() cb = Colorbar(ax = cb_ax, mappable = im) taggers = [_simplify_tagger_name(x) for x in arrays] flav_char = _flav_to_char[array_one['signal']] sig_label = '$\epsilon_\mathrm{{ {} }}$'.format(flav_char) cb_lab_string = '{} $/$ {} {s}' if do_rel else '{} $-$ {} {s}' cb.set_label(cb_lab_string.format(*taggers, s = sig_label )) if do_contour: cb.add_lines(ct) if do_equal_contour: if rel_min < equal_contour_level < rel_max: cb.add_lines(equal_ct) position = ax.get_position() new_aspect = ax.get_aspect() # ax.set_position(position) ax_log = fig.add_subplot(111, frameon = False) ax_log.set_xscale('log') ax_log.set_yscale('log') ax_log.axis((10**x_min, 10**x_max, 10**y_min, 10**y_max)) ax_log.set_aspect(aspect) ax_log.set_xlabel('{} rejection'.format(array_one['x_bg'])) ax_log.set_ylabel('{} rejection'.format(array_one['y_bg'])) ax_log.grid(True) cuts_to_display = array_one['cuts_to_display'] for cut in extra_cuts: cut.point_type = 'wo' cuts_to_display.append(cut) for cut in cuts_to_display: x, y, z = cut.xyz # print cut.xyz ax_log.plot([x],[y],cut.point_type) fmt_dict = dict(cut1=cut.cut1, cut2=cut.cut2, eff=z) ax_log.annotate(cut.plot_string.format(**fmt_dict), (x,y), **cut.ann_opts) ax_log.set_aspect(new_aspect) ax_log.set_position(position) plt.savefig(out_name, bbox_inches = 'tight') plt.close()