示例#1
0
def energy_results(dl2_data, points_outfile=None, plot_outfile=None):
    """
    Plot energy resolution, energy bias and energy migration matrix in the same figure

    Parameters
    ----------
    dl2_data: `pandas.DataFrame`
        dl2 MC gamma data - must include the columns `mc_energy` and `reco_energy`
    points_outfile: None or str
        if specified, save the resolution and bias in hdf5 format
    plot_outfile: None or str
        if specified, save the figure

    Returns
    -------
    fig, axes: `matplotlib.pyplot.figure`, `matplotlib.pyplot.axes`
    """
    fig, axes = plt.subplots(2, 2, figsize=(12, 8))

    ctaplot.plot_energy_resolution(dl2_data.mc_energy.values * u.TeV,
                                   dl2_data.reco_energy.values * u.TeV,
                                   ax=axes[0, 0], bias_correction=False)
    ctaplot.plot_energy_resolution_cta_requirement('north', ax=axes[0, 0], color='black')

    ctaplot.plot_energy_bias(dl2_data.mc_energy.values * u.TeV, dl2_data.reco_energy.values * u.TeV, ax=axes[1, 0])
    ctaplot.plot_migration_matrix(dl2_data.mc_energy.apply(np.log10),
                                  dl2_data.reco_energy.apply(np.log10),
                                  ax=axes[0, 1],
                                  colorbar=True,
                                  xy_line=True,
                                  hist2d_args=dict(norm=matplotlib.colors.LogNorm()),
                                  line_args=dict(color='black'),
                                  )
    axes[0, 0].legend()
    axes[0, 1].set_xlabel('log(mc energy/[TeV])')
    axes[0, 1].set_ylabel('log(reco energy/[TeV])')
    axes[0, 0].set_title("")
    axes[0, 0].label_outer()
    axes[1, 0].set_title("")
    axes[1, 0].set_ylabel("Energy bias")
    for ax in axes.ravel():
        ax.grid(True, which='both')
    axes[1, 1].remove()

    fig.tight_layout()

    if points_outfile:
        e_bins, e_res = ctaplot.energy_resolution_per_energy(dl2_data.mc_energy.values * u.TeV,
                                                             dl2_data.reco_energy.values * u.TeV)
        e_bins, e_bias = ctaplot.energy_bias(dl2_data.mc_energy.values * u.TeV, dl2_data.reco_energy.values * u.TeV)
        write_energy_resolutions(points_outfile, e_bins, e_res, e_bias)

    if plot_outfile:
        fig.savefig(plot_outfile)

    return fig, axes
示例#2
0
def plot_energy_resolution(dl2_data, ax=None, bias_correction=False, cta_req_north=False, **kwargs):
    """
    Plot the energy resolution from a pandas dataframe of DL2 data.
    See `~ctaplot.plot_energy_resolution` for doc.

    Parameters
    ----------
    dl2_data: `pandas.DataFrame`
        Reconstructed MC events at DL2+ level.
    ax: `matplotlib.pyplot.axes` or None
    bias_correction: `bool`
        correct for systematic bias
    cta_req_north: `bool`
        if True, includes CTA requirement curve
    kwargs: args for `matplotlib.pyplot.plot`

    Returns
    -------
    ax: `matplotlib.pyplot.axes`
    """

    ax = ctaplot.plot_energy_resolution(dl2_data.mc_energy.values * u.TeV,
                                        dl2_data.reco_energy.values * u.TeV,
                                        ax=ax,
                                        bias_correction=bias_correction,
                                        **kwargs,
                                        )
    ax.grid(which='both')
    if cta_req_north:
        ax = ctaplot.plot_energy_resolution_cta_requirement('north', ax=ax, color='black')
    return ax
示例#3
0
def show_angular_resolution(predicted_alt, predicted_az, true_alt, true_az, true_mc_energy,
                           percentile=68.27, confidence_level=0.95, bias_correction=False,
                           label="this method", include_requirement=[], 
                           xlim=None, ylim=None, fmt=None, ax=None):
    """
    Show absolute angular error for a model's predictions.
    """
    # Create new figure
    if ax is None:
        plt.figure(figsize=(6,6))
        ax = plt.gca()
    # Style
    fmt = fmt or 'o'
    # Ctaplot - Angular resolution
    ax = ctaplot.plot_angular_resolution_per_energy(
        predicted_alt, predicted_az, true_alt, true_az, true_mc_energy, 
        percentile, confidence_level, bias_correction, ax,
        fmt=fmt, label=label)
    if xlim is not None:
        ax.set_xlim(xlim)
    if ylim is not None:
        ax.set_ylim(ylim)
    ax.legend()
    try:
        for include in include_requirement:
            ax = ctaplot.plot_energy_resolution_cta_requirement(include, ax)
    except:
        print("Unable to display cta requirements.")
    return ax
示例#4
0
def show_energy_resolution(predicted_mc_energy, true_mc_energy, 
                           percentile=68.27, confidence_level=0.95, bias_correction=False,
                           label="this method", include_requirement=[], 
                           xlim=None, ylim=None, fmt=None, ax=None):
    """
    Show the energy resolution for a model's predictions.
    """
    
    # Create new figure
    if ax is None:
        plt.figure(figsize=(6,6))
        ax = plt.gca()
    fmt = fmt or "o"
    ax = ctaplot.plot_energy_resolution(
        true_mc_energy, predicted_mc_energy, percentile=percentile, 
        confidence_level=confidence_level, bias_correction=bias_correction, 
        fmt=fmt, label=label, ax=ax
    )
    if xlim is not None:
        ax.set_xlim(xlim)
    if ylim is not None:
        ax.set_ylim(ylim)
    ax.legend()

    try:
        for include in include_requirement:
            ax = ctaplot.plot_energy_resolution_cta_requirement(include, ax)
    except:
        print("Unable to display cta requirements.")
    return ax
示例#5
0
def plot_energy_resolution_comparison(evaluation_results_dict, include_requirement=[], 
                                     percentile=68.27, confidence_level=0.95, bias_correction=False,
                                     percentile_plot_range=80, xlim=None, ylim=None, fmts=None, save_to=None):
    """
    Display comparison of the energy resolution for different models.
    """
    # Create Figure and axis
    fig = plt.figure(figsize=(8, 8))
    ax = plt.gca()
    #plt.title("Energy Resolution Comparison")
    fmts = fmts or ["o" for _ in range(len(evaluation_results_dict))]
    for label, results in evaluation_results_dict.items():
        # Prediction values
        if "pred_mc_energy" in results:
            predicted_mc_energy = results["pred_mc_energy"]
        else:
            predicted_log10_mc_energy = results["pred_log10_mc_energy"]
            predicted_mc_energy = np.power(10, predicted_log10_mc_energy)
        true_mc_energy = results["true_mc_energy"]
        fmt = fmts.pop(0)
        show_energy_resolution(
            predicted_mc_energy, true_mc_energy, 
            percentile=percentile, confidence_level=confidence_level, 
            bias_correction=bias_correction, label=label, 
            include_requirement=[], xlim=xlim, ylim=ylim, fmt=fmt, ax=ax)
        ax.xaxis.grid(False, which='minor')

    try:
        for include in include_requirement:
            ax = ctaplot.plot_energy_resolution_cta_requirement(include, ax)
    except:
        print("Unable to display cta requirements.")
    # Save or Show
    if save_to is not None:
        plt.savefig(save_to)
        plt.close(fig)
    else:
        plt.show()
def main():
    ntelescopes_gamma = 1
    ntelescopes_protons = 1
    n_bins_energy = 20  #  Number of energy bins
    obstime = 50 * 3600 * u.s
    noff = 5
    geff_gammaness = 0.8  #Gamma efficincy of gammaness cut
    geff_theta2 = 0.68
    #Gamma efficiency of theta2 cut

    # Calculate the sensitivity
    '''
    energy,sensitivity,result,events, gcut, tcut = sensitivity_gamma_efficiency(args.dl2_file_g,
                                                                                         args.dl2_file_p,
                                                                                         ntelescopes_gamma,
                                                                                         ntelescopes_protons,
                                                                                         n_bins_energy,
                                                                                         geff_gammaness,
                                                                                         geff_theta2,
                                                                                         noff,
                                                                                         obstime)


    '''

    mc_energy, mc_sensitivity, mc_result, mc_events, gcut, tcut = sensitivity_gamma_efficiency_real_protons(
        args.dl2_file_g, args.dl2_file_p, ntelescopes_gamma, n_bins_energy,
        geff_gammaness, geff_theta2, noff, obstime)

    # Saves the results
    #   mc_events.to_hdf(args.output_path+'/mc_sensitivity.h5', key='data', mode='w')
    mc_result.to_hdf(args.output_path + '/mc_sensitivity.h5', key='results')

    print("\nOptimal gammaness cuts:", gcut)
    print("Optimal theta2 cuts: {} \n".format(tcut))

    energy, sensitivity, result, events, gcut, tcut = sensitivity_gamma_efficiency_real_data(
        args.dl2_file_on, args.dl2_file_p, gcut, tcut, n_bins_energy,
        mc_energy, geff_gammaness, geff_theta2, noff, obstime)
    print("\nOptimal gammaness cuts:", gcut)
    print("Optimal theta2 cuts: {} \n".format(tcut))

    #events[events.mc_type==0].alt_tel = events[events.mc_type==0].mc_alt
    #events[events.mc_type==0].az_tel = events[events.mc_type==0].mc_az

    if not os.path.exists(args.output_path):
        os.makedirs(args.output_path)

    # Saves the results


#    events.to_hdf(args.output_path+'/sensitivity.h5', key='data', mode='w')
    result.to_hdf(args.output_path + '/sensitivity.h5', key='results')

    # Plots

    #Sensitivity
    ax = plt.axes()
    plot_utils.format_axes_sensitivity(ax)
    plot_utils.plot_MAGIC_sensitivity(ax, color='C0')
    plot_utils.plot_Crab_SED(ax, 100, 50, 5e4,
                             label="100% Crab")  #Energy in GeV
    plot_utils.plot_Crab_SED(ax, 10, 50, 5e4, linestyle='--',
                             label="10% Crab")  #Energy in GeV
    plot_utils.plot_Crab_SED(ax, 1, 50, 5e4, linestyle=':',
                             label="1% Crab")  #Energy in GeV
    plot_utils.plot_sensitivity(energy,
                                sensitivity,
                                ax,
                                color='orange',
                                label="Sensitivity real data")
    plot_utils.plot_sensitivity(energy,
                                mc_sensitivity,
                                ax,
                                color='green',
                                label="Sensitivity MC gammas")
    plt.legend(prop={'size': 12})
    plt.savefig(args.output_path + "/sensitivity.png")
    plt.show()

    #Rates

    egeom = np.sqrt(energy[1:] * energy[:-1])
    plt.plot(egeom, result['proton_rate'], label='Proton rate', marker='o')
    plt.plot(egeom, result['gamma_rate'], label='Gamma rate', marker='o')
    plt.legend()
    plt.grid()
    plt.xscale('log')
    plt.yscale('log')
    plt.xlabel('Energy (TeV)')
    plt.ylabel('events / min')
    plt.savefig(args.output_path + "/rates.png")
    plt.show()

    #Gammaness
    gammas_mc = pd.read_hdf(args.dl2_file_g, key=dl2_params_lstcam_key)
    protons_mc = pd.read_hdf(args.dl2_file_p, key=dl2_params_lstcam_key)
    sns.distplot(gammas_mc.gammaness, label='gammas')
    sns.distplot(protons_mc.gammaness, label='protons')
    plt.legend()
    plt.tight_layout()
    plt.savefig(args.output_path + "/distplot_gammaness.png")
    plt.show()
    '''
    #True Energy
    sns.distplot(gammas_mc.mc_energy, label='gammas');
    sns.distplot(protons_mc.mc_energy, label='protons');
    plt.legend()
    plt.tight_layout()
    plt.savefig(args.output_path+"/distplot_mc_energy.png")
    plt.show()

    #Reconstructed Energy
    sns.distplot(gammas_mc.reco_energy.apply(np.log10), label='gammas')
    sns.distplot(protons_mc.reco_energy.apply(np.log10), label='protons')
    plt.legend()
    plt.tight_layout()
    plt.savefig(args.output_path+"/distplot_energy_apply.png")
    plt.show()
    '''

    #Theta2
    ctaplot.plot_theta2(events.reco_alt,
                        events.reco_az,
                        events.alt_tel,
                        events.az_tel,
                        range=(0, 1),
                        bins=100)
    plt.savefig(args.output_path + "/theta2.png")
    plt.show()

    #Angular resolution
    ctaplot.plot_angular_resolution_per_energy(events.reco_alt, events.reco_az,
                                               events.alt_tel, events.az_tel,
                                               events.reco_energy)
    ctaplot.plot_angular_resolution_cta_requirement('north', color='black')

    plt.legend()
    plt.tight_layout()
    plt.savefig(args.output_path + "/angular_resolution.png")
    plt.show()

    #Energy resolution

    ctaplot.plot_energy_resolution(events[events.mc_type == 0].mc_energy,
                                   events[events.mc_type == 0].reco_energy)
    ctaplot.plot_energy_resolution_cta_requirement('north', color='black')
    plt.legend()
    plt.tight_layout()
    plt.savefig(args.output_path + "/effective_area.png")
    plt.show()

    #Energy bias

    ctaplot.plot_energy_bias(events[events.mc_type == 0].mc_energy,
                             events[events.mc_type == 0].reco_energy)
    plt.savefig(args.output_path + "/energy_bias.png")
    plt.show()

    #Effective Area

    gamma_ps_simu_info = read_simu_info_merged_hdf5(args.dl2_file_g)
    emin = gamma_ps_simu_info.energy_range_min.value
    emax = gamma_ps_simu_info.energy_range_max.value
    total_number_of_events = gamma_ps_simu_info.num_showers * gamma_ps_simu_info.shower_reuse * ntelescopes_gamma
    spectral_index = gamma_ps_simu_info.spectral_index
    area = (gamma_ps_simu_info.max_scatter_range.value -
            gamma_ps_simu_info.min_scatter_range.value)**2 * np.pi
    ctaplot.plot_effective_area_per_energy_power_law(emin,
                                                     emax,
                                                     total_number_of_events,
                                                     spectral_index,
                                                     events.reco_energy,
                                                     area,
                                                     label='selected gammas',
                                                     linestyle='--')

    ctaplot.plot_effective_area_cta_requirement('north', color='black')
    plt.ylim([2 * 10**3, 10**6])
    plt.legend()
    plt.tight_layout()
    plt.savefig(args.output_path + "/effective_area.png")
    plt.show()
示例#7
0
def create_resolution_fig(site='south', ref=None):
    """
    Create the figure holding the resolution plots for the dashboard
    axes = [[ax_ang_res, ax_ene_res],[ax_imp_res, None]]
    Args
        site (string)

    Returns
        fig, axes
    """
    fig, axes = plt.subplots(3, 2, figsize=(12, 12))
    ax_ang_res = axes[0][0]
    ax_ene_res = axes[0][1]
    ax_imp_res = axes[1][0]
    ax_eff_area = axes[1][1]
    ax_roc = axes[2][0]
    ax_legend = axes[2][1]

    if ref == 'performances':
        ctaplot.plot_angular_resolution_cta_performance(site,
                                                        ax=ax_ang_res,
                                                        color='black')
        ctaplot.plot_energy_resolution_cta_performance(site,
                                                       ax=ax_ene_res,
                                                       color='black')
        ctaplot.plot_effective_area_cta_performance(site,
                                                    ax=ax_eff_area,
                                                    color='black')
    elif ref == 'requirements':
        ctaplot.plot_angular_resolution_cta_requirement(site,
                                                        ax=ax_ang_res,
                                                        color='black')
        ctaplot.plot_energy_resolution_cta_requirement(site,
                                                       ax=ax_ene_res,
                                                       color='black')
        ctaplot.plot_effective_area_cta_requirement(site,
                                                    ax=ax_eff_area,
                                                    color='black')
    else:
        ax_eff_area.set_xscale('log')
        ax_eff_area.set_yscale('log')
        ax_eff_area.set_xlabel('Energy [TeV]')
    if ref is not None:
        ax_ang_res.legend()
        ax_ene_res.legend()
        ax_eff_area.legend()

    ax_roc.plot([0, 1], [0, 1], linestyle='--', color='r', alpha=.5)
    ax_roc.set_xlim([-0.05, 1.05])
    ax_roc.set_ylim([-0.05, 1.05])
    ax_roc.set_xlabel('False Positive Rate')
    ax_roc.set_ylabel('True Positive Rate')
    ax_roc.set_title('Receiver Operating Characteristic')
    # ax_roc.axis('equal')

    ax_legend.set_axis_off()

    fig.tight_layout()

    for ax in fig.get_axes():
        for item in ([ax.title, ax.xaxis.label, ax.yaxis.label] +
                     ax.get_xticklabels() + ax.get_yticklabels()):
            item.set_fontsize(10)

    return fig, axes
def main():
    ntelescopes_gamma = 4
    ntelescopes_protons = 1
    n_bins_energy = 20  #  Number of energy bins
    n_bins_gammaness = 10  #  Number of gammaness bins
    n_bins_theta2 = 10  #  Number of theta2 bins
    obstime = 50 * 3600 * u.s
    noff = 5

    # Finds the best cuts for the computation of the sensitivity
    '''energy, best_sens, result, units, gcut, tcut = find_best_cuts_sensitivity(args.dl1file_gammas,
                                                                              args.dl1file_protons,
                                                                              args.dl2_file_g_sens,
                                                                              args.dl2_file_p_sens,
                                                                              ntelescopes_gamma, ntelescopes_protons,
                                                                              n_bins_energy, n_bins_gammaness,
                                                                              n_bins_theta2, noff,
                                                                              obstime)
    '''
    #For testing using fixed cuts
    gcut = np.ones(n_bins_energy) * 0.8
    tcut = np.ones(n_bins_energy) * 0.01

    print("\nApplying optimal gammaness cuts:", gcut)
    print("Applying optimal theta2 cuts: {} \n".format(tcut))

    # Computes the sensitivity
    energy, best_sens, result, units, dl2 = sensitivity(
        args.dl1file_gammas, args.dl1file_protons,
        args.dl2_file_g_cuts, args.dl2_file_p_cuts, 1, 1, n_bins_energy, gcut,
        tcut * (u.deg**2), noff, obstime)

    egeom = np.sqrt(energy[1:] * energy[:-1])
    dFdE, par = crab_hegra(egeom)
    sensitivity_flux = best_sens / 100 * (dFdE * egeom * egeom).to(
        u.erg / (u.cm**2 * u.s))

    # Saves the results
    dl2.to_hdf('test_sens.h5', key='data')
    result.to_hdf('test_sens.h5', key='results')

    tab = Table.from_pandas(result)

    for i, key in enumerate(tab.columns.keys()):
        tab[key].unit = units[i]
        if key == 'sensitivity':
            continue
        tab[key].format = '8f'

    # Plots

    plt.figure(figsize=(12, 8))
    plt.plot(egeom[:-1], tab['hadron_rate'], label='Hadron rate', marker='o')
    plt.plot(egeom[:-1], tab['gamma_rate'], label='Gamma rate', marker='o')
    plt.legend()
    plt.xscale('log')
    plt.xlabel('Energy (TeV)')
    plt.ylabel('events / min')
    plt.show()
    plt.savefig("rates.png")

    plt.figure(figsize=(12, 8))
    gammas_mc = dl2[dl2.mc_type == 0]
    protons_mc = dl2[dl2.mc_type == 101]
    sns.distplot(gammas_mc.gammaness, label='gammas')
    sns.distplot(protons_mc.gammaness, label='protons')
    plt.legend()
    plt.tight_layout()
    plt.show()
    plt.savefig("distplot_gammaness.png")

    plt.figure(figsize=(12, 8))
    sns.distplot(gammas_mc.mc_energy, label='gammas')
    sns.distplot(protons_mc.mc_energy, label='protons')
    plt.legend()
    plt.tight_layout()
    plt.show()
    plt.savefig("distplot_mc_energy.png")

    plt.figure(figsize=(12, 8))
    sns.distplot(gammas_mc.reco_energy.apply(np.log10), label='gammas')
    sns.distplot(protons_mc.reco_energy.apply(np.log10), label='protons')
    plt.legend()
    plt.tight_layout()
    plt.show()
    plt.savefig("distplot_energy_apply.png")

    plt.figure(figsize=(12, 8))
    ctaplot.plot_theta2(gammas_mc.reco_alt,
                        gammas_mc.reco_az,
                        gammas_mc.mc_alt,
                        gammas_mc.mc_az,
                        range=(0, 1),
                        bins=100)
    plt.show()
    plt.savefig("theta2.png")

    plt.figure(figsize=(12, 8))
    ctaplot.plot_angular_resolution_per_energy(gammas_mc.reco_alt,
                                               gammas_mc.reco_az,
                                               gammas_mc.mc_alt,
                                               gammas_mc.mc_az,
                                               gammas_mc.reco_energy)
    ctaplot.plot_angular_resolution_cta_requirement('north', color='black')

    plt.legend()
    plt.tight_layout()
    plt.show()
    plt.savefig("angular_resolution.png")

    plt.figure(figsize=(12, 8))
    ctaplot.plot_energy_resolution(gammas_mc.mc_energy, gammas_mc.reco_energy)
    ctaplot.plot_energy_resolution_cta_requirement('north', color='black')
    plt.legend()
    plt.tight_layout()
    plt.show()
    plt.savefig("effective_area.png")

    plt.figure(figsize=(12, 8))
    ctaplot.plot_energy_bias(gammas_mc.mc_energy, gammas_mc.reco_energy)
    plt.show()
    plt.savefig("energy_bias.png")

    plt.figure(figsize=(12, 8))
    gamma_ps_simu_info = read_simu_info_merged_hdf5(args.dl1file_gammas)
    emin = gamma_ps_simu_info.energy_range_min.value
    emax = gamma_ps_simu_info.energy_range_max.value
    total_number_of_events = gamma_ps_simu_info.num_showers * gamma_ps_simu_info.shower_reuse
    spectral_index = gamma_ps_simu_info.spectral_index
    area = (gamma_ps_simu_info.max_scatter_range.value -
            gamma_ps_simu_info.min_scatter_range.value)**2 * np.pi
    ctaplot.plot_effective_area_per_energy_power_law(
        emin,
        emax,
        total_number_of_events,
        spectral_index,
        gammas_mc.reco_energy[gammas_mc.tel_id == 1],
        area,
        label='selected gammas',
        linestyle='--')

    ctaplot.plot_effective_area_cta_requirement('north', color='black')
    plt.ylim([2 * 10**3, 10**6])
    plt.legend()
    plt.tight_layout()
    plt.show()
    plt.savefig("effective_area.png")

    plt.figure(figsize=(12, 8))
    plt.plot(energy[0:len(sensitivity_flux)],
             sensitivity_flux,
             '-',
             color='red',
             markersize=0,
             label='LST mono')
    plt.xscale('log')
    plt.yscale('log')

    plt.ylabel('$\mathsf{E^2 F \; [erg \, cm^{-2} s^{-1}]}$', fontsize=16)
    plt.xlabel('E [TeV]')
    plt.xlim([10**-2, 100])
    plt.ylim([10**-14, 10**-9])
    plt.tight_layout()
    plt.savefig('sensitivity.png')

    plt.figure(figsize=(12, 8))
    ctaplot.plot_energy_resolution(gammas_mc.mc_energy,
                                   gammas_mc.reco_energy,
                                   percentile=68.27,
                                   confidence_level=0.95,
                                   bias_correction=False)
    ctaplot.plot_energy_resolution_cta_requirement('north', color='black')
    plt.xscale('log')
    plt.ylabel('\u0394 E/E 68\%')
    plt.xlabel('E [TeV]')
    plt.xlim([10**-2, 100])
    plt.ylim([0.08, 0.48])
    plt.tight_layout()

    plt.savefig('energy_resolution.png', dpi=100)