Example #1
0
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()
Example #2
0
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()