Ejemplo n.º 1
0
def center_check(data_list):
    x_axis_mm = np.linspace(-23, 23, 2**9)
    r_axis_mm = np.linspace(0, 23, 2**9 + 1)[1::2]
    th_axis_rad = np.linspace(0, np.pi * 2, 2**9 + 1)[1::2]
    xy_center_slice = slice(x_axis_mm.searchsorted(-1),
                            x_axis_mm.searchsorted(1, side='right'))
    x = []
    y = []
    r = []
    th = []
    for data in data_list:
        x.extend(data.electrons.pos_x.value)
        y.extend(data.electrons.pos_y.value)

        if np.any(data.electrons.pos_t.value > np.pi * 2):
            data.electrons.recalculate_polar_coordinates()

        r.extend(data.electrons.pos_r.value)
        th.extend(data.electrons.pos_t.value)

    image_xy = epicea.center_histogram_2d(x, y, x_axis_mm)
    x_slice = image_xy[xy_center_slice, :].sum(axis=0)
    y_slice = image_xy[:, xy_center_slice].sum(axis=1)
    image_rt = epicea.center_histogram_2d(r, th, r_axis_mm, th_axis_rad)

    plt_func.figure_wrapper('Electron data {} eV pass'.format(
        data_list[0].electron_center_energy()))
    plt.subplot(231)
    plt_func.imshow_wrapper(image_xy, x_axis_mm)

    plt.subplot(234)
    plt_func.imshow_wrapper(image_rt,
                            r_axis_mm,
                            th_axis_rad,
                            kw_args={'aspect': 'auto'})

    plt.subplot(132)
    plt.plot(x_axis_mm, x_slice, label='normal')
    plt.plot(x_axis_mm[::-1], x_slice, label='flipped')
    plt_func.title_wrapper('x slice')
    plt_func.legend_wrapper()
    plt.xlim(xmin=7)

    plt.subplot(133)
    plt.plot(x_axis_mm, y_slice, label='normal')
    plt.plot(x_axis_mm[::-1], y_slice, label='flipped')
    plt_func.title_wrapper('y slice')
    plt_func.legend_wrapper()
    plt.xlim(xmin=7)
Ejemplo n.º 2
0
                        (r_axis_mm <= centers[i_th]))
        low_radius_centers[i_th] = (
            (r_th_img[i_th, I_low_radius] * r_axis_mm[I_low_radius]).sum() /
            r_th_img[i_th, I_low_radius].sum())

    radial_factors = low_radius_centers.mean() / low_radius_centers

    ax_origaninl.plot(centers, th_axis_rad, 'm')
    ax_origaninl.plot(low_radius_centers, th_axis_rad, 'c')

    plt_func.figure_wrapper('centers ' + data.name())
    plt.subplot(121)
    plt.plot(centers, th_axis_rad, label='full center')
    plt.plot(low_radius_centers, th_axis_rad, label='first center')
    plt.title('center position')
    plt_func.legend_wrapper()
    plt.subplot(122)
    plt.plot(radial_factors, th_axis_rad)
    plt.title('r factors')

    r = data.electrons.pos_r.value
    th = data.electrons.pos_t.value

    for i in range(len(th_axis_rad)):
        selection = (th_limits[i] < th) & (th < th_limits[i + 1])
        r[selection] *= radial_factors[i]

    r_th_img_corrected = epicea.center_histogram_2d(r, th, r_axis_mm,
                                                    th_axis_rad)

    r_proj_corrected = r_th_img_corrected.sum(axis=0)
Ejemplo n.º 3
0
def plot_e_spec(data, verbose=False):
    """First view of the electron spectra."""

    if verbose:
        print('Plotting electron spectra for {}.'.format(data.name()))
    plt_func.figure_wrapper('Electron data {}'.format(data.name()))

    valid_pos = data.get_filter('has_position_electrons', verbose=verbose)

    NN_O_events_electrons = data.get_filter('NN_O_events_electrons',
                                            verbose=verbose)

    NO_N_events_electrons = data.get_filter('NO_N_events_electrons',
                                            verbose=verbose)

    if verbose:
        print('Valid positions for {} electrons.'.format(valid_pos.sum()))

    x_axis_mm = np.linspace(-23, 23, 512)
    r_axis_mm = np.linspace(0, 23, 513)[1::2]
    th_axis_rad = np.linspace(0, 2 * np.pi, 513)[1::2]
    xy_center_slice = slice(x_axis_mm.searchsorted(-3),
                            x_axis_mm.searchsorted(3, side='right'))

    e_axis_ev = np.linspace(320, 380, 2**8 + 1)[1::2]

    #    e_all_image_xy = data.get_e_xy_image(x_axis_mm, verbose=verbose)
    e_all_image_xy, _ = data.get_e_xy_image(
        x_axis_mm,
        verbose=verbose,
        electrons_filter=data.electrons.event_id.value >
        0.9 * data.events.len())
    e_all_x_slice = e_all_image_xy[xy_center_slice, :].sum(axis=0)
    e_all_y_slice = e_all_image_xy[:, xy_center_slice].sum(axis=1)
    #    e_all_image_rth = data.get_e_rth_image(r_axis_mm, th_axis_rad,
    #                                           verbose=verbose)
    e_all_image_rth, _ = data.get_e_rth_image(
        r_axis_mm,
        th_axis_rad,
        verbose=verbose,
        electrons_filter=data.electrons.event_id.value >
        0.9 * data.events.len())
    e_all_radial_dist = e_all_image_rth.sum(axis=0)

    #    e_NN_O_image_xy = data.get_e_xy_image(
    #        x_axis_mm, electrons_filter=NN_O_events_electrons)
    #    e_NO_N_image_xy = data.get_e_xy_image(
    #        x_axis_mm, electrons_filter=NO_N_events_electrons)

    e_NN_O_image_rth, _ = data.get_e_rth_image(
        r_axis_mm,
        th_axis_rad,
        electrons_filter=NN_O_events_electrons,
        verbose=verbose)
    e_NN_O_radial_dist = e_NN_O_image_rth.sum(axis=0)
    e_NO_N_image_rth, _ = data.get_e_rth_image(
        r_axis_mm,
        th_axis_rad,
        electrons_filter=NO_N_events_electrons,
        verbose=verbose)
    e_NO_N_radial_dist = e_NO_N_image_rth.sum(axis=0)

    e_NN_O_energy_dist, _ = data.get_e_spectrum(
        e_axis_ev, electrons_filter=NN_O_events_electrons, verbose=verbose)
    e_NO_N_energy_dist, _ = data.get_e_spectrum(
        e_axis_ev, electrons_filter=NO_N_events_electrons, verbose=verbose)

    plt.subplot(231)
    plt_func.imshow_wrapper(e_all_image_xy, x_axis_mm)
    plt_func.title_wrapper('2D image')
    plt_func.xlabel_wrapper('Position (mm)')
    plt_func.ylabel_wrapper('Position (mm)')
    plt_func.tick_fontsize()

    plt.subplot(437)
    plt.plot(x_axis_mm, e_all_x_slice, label='normal')
    plt.plot(x_axis_mm[::-1], e_all_x_slice, label='flipped')
    plt_func.title_wrapper('x slice')
    plt_func.xlabel_wrapper('Position (mm)')
    plt_func.ylabel_wrapper('Number of ions')
    plt_func.tick_fontsize()
    plt_func.legend_wrapper()

    plt.subplot(4, 3, 10)
    plt.plot(x_axis_mm, e_all_y_slice, label='normal')
    plt.plot(x_axis_mm[::-1], e_all_y_slice, label='flipped')
    plt_func.title_wrapper('y slice')
    plt_func.xlabel_wrapper('Position (mm)')
    plt_func.ylabel_wrapper('Number of ions')
    plt_func.tick_fontsize()
    plt_func.legend_wrapper()

    plt.subplot(232)
    plt_func.imshow_wrapper(e_all_image_rth,
                            r_axis_mm,
                            th_axis_rad,
                            kw_args={'aspect': 'auto'})
    plt_func.title_wrapper('2D image')
    plt_func.xlabel_wrapper('Position (mm)')
    plt_func.ylabel_wrapper('Angle (rad)')
    plt_func.tick_fontsize()

    plt.subplot(235)
    plt.plot(r_axis_mm, e_all_radial_dist)
    plt_func.title_wrapper('Radial distribution')
    plt_func.xlabel_wrapper('Position (mm)')
    plt_func.ylabel_wrapper('Number of electrons')
    plt_func.tick_fontsize()

    #    plt.subplot(233)
    #    plt_func.imshow_wrapper(e_NN_O_image_xy, x_axis_mm)
    #    plt_func.title_wrapper('NN+ O+ events')
    #    plt_func.xlabel_wrapper('Position (mm)')
    #    plt_func.ylabel_wrapper('Position (mm)')
    #    plt_func.tick_fontsize()
    #
    #    plt.subplot(236)
    #    plt_func.imshow_wrapper(e_NO_N_image_xy, x_axis_mm)
    #    plt_func.title_wrapper('NO+ N+ events')
    #    plt_func.xlabel_wrapper('Position (mm)')
    #    plt_func.ylabel_wrapper('Position (mm)')
    #    plt_func.tick_fontsize()
    #
    #    plt.subplot(233)
    #    plt_func.imshow_wrapper(e_NN_O_image_rth, r_axis_mm, th_axis_rad)
    #    plt_func.title_wrapper('NN+ O+ events')
    #    plt_func.xlabel_wrapper('Position (mm)')
    #    plt_func.ylabel_wrapper('Angle (rad)')
    #    plt_func.tick_fontsize()
    #
    #    plt.subplot(236)
    #    plt_func.imshow_wrapper(e_NO_N_image_rth, r_axis_mm, th_axis_rad)
    #    plt_func.title_wrapper('NO+ N+ events')
    #    plt_func.xlabel_wrapper('Position (mm)')
    #    plt_func.ylabel_wrapper('Angle (rad)')
    #    plt_func.tick_fontsize()

    plt.subplot(233)
    plt.plot(r_axis_mm, e_NN_O_radial_dist, 'y', label=r'N$_2$$^+$ + O$^+$')
    plt.plot(r_axis_mm, e_NO_N_radial_dist, 'm', label=r'NO$^+$ + N$^+$')
    plt_func.title_wrapper('on radial grid')
    plt_func.xlabel_wrapper('Position (mm)')
    plt_func.ylabel_wrapper('Number of electrons')
    plt_func.tick_fontsize()
    plt_func.legend_wrapper()

    plt.subplot(236)
    plt.plot(e_axis_ev, e_NN_O_energy_dist, 'y', label=r'N$_2$$^+$ + O$^+$')
    plt.plot(e_axis_ev, e_NO_N_energy_dist, 'm', label=r'NO$^+$ + N$^+$')
    plt_func.title_wrapper('On an energy grid')
    plt_func.xlabel_wrapper('Energy (eV)')
    plt_func.ylabel_wrapper('Number of electrons')
    plt_func.tick_fontsize()
    plt_func.legend_wrapper()

    plt.tight_layout()
    plt_func.savefig_wrapper()
Ejemplo n.º 4
0
def plot_two_ion_corelations(data, verbose=False):
    if verbose:
        print('In plot_two_ion_corelations.')
    # Get some ions filters
    data.get_filter('two_ions_events_ions')
    double_ions_e_start = data.get_filter('two_ion_e_start_events_ions')
    data.get_filter('two_ion_rand_start_events_ions')
    NN_O_events_ions = data.get_filter('NN_O_events_ions', verbose=verbose)
    NO_N_events_ions = data.get_filter('NO_N_events_ions', verbose=verbose)

    # Plot distribution of nomber of ions
    num_ions = data.events.num_i.value

    num_ions_axis = np.arange(5)
    hist_ions_all = epicea.center_histogram(num_ions, num_ions_axis)
    hist_ions_e_start = epicea.center_histogram(
        num_ions[data.get_filter('e_start_events')], num_ions_axis)
    hist_ions_rand_start = epicea.center_histogram(
        num_ions[data.get_filter('rand_start_events')], num_ions_axis)

    plt_func.figure_wrapper('Two-ion correlations {}'.format(data.name()))
    plt.subplot(221)
    plt.plot(num_ions_axis, hist_ions_all, 'o-', label='All events')
    plt.plot(num_ions_axis, hist_ions_rand_start, 'o-', label='random start')
    plt.plot(num_ions_axis, hist_ions_e_start, 'o-', label='e start')
    plt_func.legend_wrapper()
    plt_func.title_wrapper('Ion number distributions.')
    plt_func.xlabel_wrapper('Number of ions per event')
    plt_func.ylabel_wrapper('Number of events')
    plt_func.tick_fontsize()

    # Look at some two ions, e start event correlations
    # Angle information
    # plt_func.figure_wrapper('two ion angles {}'.format(data.name()))
    plt.subplot(222)
    if verbose:
        print('Get angles.')
    th_e_start = data.ions.pos_t[double_ions_e_start]
    th_NN_O = data.ions.pos_t[NN_O_events_ions]
    th_NO_N = data.ions.pos_t[NO_N_events_ions]

    th_axis_rad = np.linspace(0, np.pi, 513)[1::2]
    th_hist_e_start, th_diff_e_start = calc_angle_diffs_hist(
        th_e_start, th_axis_rad)
    th_hist_NN_O, _ = calc_angle_diffs_hist(th_NN_O, th_axis_rad)
    th_hist_NO_N, _ = calc_angle_diffs_hist(th_NO_N, th_axis_rad)

    plt_func.bar_wrapper(th_axis_rad,
                         th_hist_e_start,
                         label='e start ion pairs')
    sl = slice(th_axis_rad.searchsorted(ANGLE_CUT), None)
    plt_func.bar_wrapper(th_axis_rad[sl],
                         th_hist_e_start[sl],
                         'r',
                         label='selection')
    plt_func.bar_wrapper(th_axis_rad,
                         th_hist_NN_O,
                         'y',
                         label='NN+ O+ ion pairs')
    plt_func.bar_wrapper(th_axis_rad,
                         th_hist_NO_N,
                         'm',
                         label='NO+ N+ ion pairs')
    #    plt.hist(angle_diff[np.isfinite(angle_diff)],
    #             bins=np.linspace(-0.1, np.pi, 256))
    plt_func.xlabel_wrapper('Angle difference between tow ions (rad)')
    plt_func.ylabel_wrapper('Number of ion pairs')
    plt_func.title_wrapper('Two ion angles.')
    plt_func.legend_wrapper()
    plt_func.tick_fontsize()

    if verbose:
        print('{} events with two ions and electron start identified.'.format(
            data.get_filter('two_ion_e_start_events').sum()))
        print('{} valid angle diffs found.'.format(th_hist_e_start.sum()))

    # Radial information
    # plt_func.figure_wrapper('radii {}'.format(data.name()))
    plt.subplot(223)
    if verbose:
        print('Get radii.')
    r_frac_axis = np.linspace(1., 3.5, 257)[1::2]
    r_e_start = data.ions.pos_r[double_ions_e_start]
    r_NN_O = data.ions.pos_r[NN_O_events_ions]
    r_NO_N = data.ions.pos_r[NO_N_events_ions]

    r_frac_e_start_hist = calc_radius_fraction_hist(r_e_start, r_frac_axis)
    r_frac_selection_hist = calc_radius_fraction_hist(
        r_e_start.reshape(-1, 2)[th_diff_e_start > ANGLE_CUT, :], r_frac_axis)
    r_frac_NN_O_hist = calc_radius_fraction_hist(r_NN_O, r_frac_axis)
    r_frac_NO_N_hist = calc_radius_fraction_hist(r_NO_N, r_frac_axis)

    plt_func.bar_wrapper(r_frac_axis, r_frac_e_start_hist, label='e start')
    plt_func.bar_wrapper(r_frac_axis,
                         r_frac_selection_hist,
                         'r',
                         label='selection')
    plt_func.bar_wrapper(r_frac_axis,
                         r_frac_NN_O_hist,
                         'y',
                         label='NN+ O+ ions')
    plt_func.bar_wrapper(r_frac_axis,
                         r_frac_NO_N_hist,
                         'm',
                         label='NO+ N+ ions')
    # plt.hist(r_frac, bins=np.linspace(0.9, 3., 256))
    plt_func.xlabel_wrapper('Radial quotient for two ions r1/r2')
    plt_func.ylabel_wrapper('Number of ion pairs')
    plt_func.title_wrapper('Radius quotient')
    plt_func.legend_wrapper()
    plt_func.tick_fontsize()
    plt_func.savefig_wrapper()

    ###########################
    # TOF-TOF correlation plot
    plt_func.figure_wrapper('tof-tof hist {}'.format(data.name()))
    t_axis_us = np.linspace(3.3, 5.3, 512)
    t_axis = t_axis_us * 1e6

    #    names = ['e start', 'all', 'random start']
    #    for i, ions_filter in enumerate([double_ions_e_start,
    #                                     double_ions,
    #                                     double_ions_rand_start]):
    #        plt.subplot(2, 2, i+1)
    names = ['electrons']
    for i, ions_filter in enumerate([double_ions_e_start]):
        i_tof = data.ions.tof_falling_edge[ions_filter]
        i_tof = i_tof.reshape(-1, 2)
        i_tof.sort(axis=1)
        i_tof = i_tof[np.isfinite(i_tof).sum(1) == 2, :]

        tof_tof_hist = epicea.center_histogram_2d(i_tof[:, 0], i_tof[:, 1],
                                                  t_axis)
        tof_tof_sym_hist = tof_tof_hist + tof_tof_hist.T
        #        plt_func.imshow_wrapper(tof_tof_sym_hist, t_axis_us)
        plt_func.imshow_wrapper(np.log(tof_tof_sym_hist + 1), t_axis_us)
        #        plt.plot(t_axis_us,
        #                 glob.NN_O_TIME_SUM_RANGE_US[data.name()][0] - t_axis_us,
        #                 'y', label='NN+ O+ selection')
        #        plt.plot(t_axis_us,
        #                 glob.NN_O_TIME_SUM_RANGE_US[data.name()][1] - t_axis_us,
        #                 'y')
        #        plt.plot(t_axis_us,
        #                 glob.NN_O_TIME_DIFF_RANGE_US[data.name()][0] + t_axis_us,
        #                 'y')
        #        plt.plot(t_axis_us,
        #                 glob.NN_O_TIME_DIFF_RANGE_US[data.name()][1] + t_axis_us,
        #                 'y')

        for sum_range, diff_range, label, c in zip([
                glob.NO_N_TIME_SUM_RANGE_US[data.name()],
                glob.NN_O_TIME_SUM_RANGE_US[data.name()]
        ], [
                glob.NO_N_TIME_DIFF_RANGE_US[data.name()],
                glob.NN_O_TIME_DIFF_RANGE_US[data.name()]
        ], ['NO+ N+ selection', 'NN+ O+ selection'], ['m', 'y']):
            s = sum_range[[0, 1, 1, 0, 0]]
            d = diff_range[[1, 1, 0, 0, 1]]
            x = (s - d) / 2
            y = (s + d) / 2
            plt.plot(x, y, c, label=label)

        plt_func.title_wrapper(names[i])
        plt.axis([
            t_axis_us.min(),
            t_axis_us.max(),
            t_axis_us.min(),
            t_axis_us.max()
        ])
        plt_func.ylabel_wrapper('Time of flight (us)')
        plt_func.xlabel_wrapper('Time of flight (us)')
        plt_func.legend_wrapper(loc='center right')
        plt_func.colorbar_wrapper('log(counts + 1)')
        plt_func.tick_fontsize()

#        if i == 0:
#            tof_tof_hist_e_start = tof_tof_sym_hist.copy()
#        if i == 2:
#            tof_tof_hist_random = tof_tof_sym_hist.copy()
#
#    sl = slice(t_axis.searchsorted(5.5e6))
#    factor = (tof_tof_hist_e_start[sl, :].sum() /
#              tof_tof_hist_random[sl, :].sum())
#    pure = tof_tof_hist_e_start - tof_tof_hist_random * factor
#
#    plt.subplot(224)
#    plt_func.imshow_wrapper(pure, t_axis_us)
#    plt_func.tick_fontsize()
    plt_func.savefig_wrapper()
Ejemplo n.º 5
0
def plot_ion_image(data, verbose=False):
    """Plot some ion images."""
    if verbose:
        print('\nPlot some ion image data.')
    x_axis_mm = np.arange(-40, 40, 0.1)
    if verbose:
        print('Get full image.')
    i_image = data.get_i_xy_image(x_axis_mm)
    if verbose:
        print('Get e start image.')
    i_image_e_start = data.get_i_xy_image(
        x_axis_mm, ions_filter=data.get_filter('e_start_ions'))
    if verbose:
        print('Get rand start iage.')
    i_image_random_start = data.get_i_xy_image(
        x_axis_mm, ions_filter=~data.get_filter('e_start_ions'))

    plt_func.figure_wrapper('Ion image {}'.format(data.name()))
    plt.subplot(331)
    plt_func.imshow_wrapper(i_image, x_axis_mm)
    plt_func.title_wrapper('all ions')
    plt_func.xlabel_wrapper('Position (mm)')
    plt_func.ylabel_wrapper('Position (mm)')
    plt_func.colorbar_wrapper()
    plt_func.tick_fontsize()

    plt.subplot(332)
    plt_func.imshow_wrapper(i_image_e_start, x_axis_mm)
    plt_func.title_wrapper('electron start')
    plt_func.xlabel_wrapper('Position (mm)')
    plt_func.ylabel_wrapper('Position (mm)')
    plt_func.colorbar_wrapper()
    plt_func.tick_fontsize()

    plt.subplot(334)
    plt_func.imshow_wrapper(i_image_random_start, x_axis_mm)
    plt_func.title_wrapper('random start')
    plt_func.xlabel_wrapper('Position (mm)')
    plt_func.ylabel_wrapper('Position (mm)')
    plt_func.colorbar_wrapper()
    plt_func.tick_fontsize()

    # Make a slice selection around the center of the image
    selection = slice(x_axis_mm.searchsorted(-5), x_axis_mm.searchsorted(5))
    # Project along x and y
    x_projection = i_image_e_start[selection, :].sum(axis=0)
    y_projection = i_image_e_start[:, selection].sum(axis=1)
    plt.subplot(638)
    plt.plot(x_axis_mm, x_projection, label='normal')
    plt.plot(x_axis_mm[::-1], x_projection, label='reverse')
    plt_func.title_wrapper('x slice')
    plt_func.xlabel_wrapper('Position (mm)')
    plt_func.legend_wrapper()
    plt_func.tick_fontsize()
    plt.subplot(6, 3, 11)
    plt.plot(x_axis_mm, y_projection, label='nomral')
    plt.plot(x_axis_mm[::-1], y_projection, label='reversed')
    plt_func.title_wrapper('y slice')
    plt_func.xlabel_wrapper('Position (mm)')
    plt_func.legend_wrapper()
    plt_func.tick_fontsize()

    r_axis_mm = np.linspace(0, 40, 201)[1::2]
    th_axis_rad = np.linspace(0, 2 * np.pi, 513)[1::2]

    rt_image = data.get_i_rth_image(r_axis_mm=r_axis_mm,
                                    th_axis_rad=th_axis_rad)
    NN_O_ions = data.get_filter('NN_O_events_ions')
    NO_N_ions = data.get_filter('NO_N_events_ions')
    NN_O_rth_image = data.get_i_rth_image(r_axis_mm,
                                          th_axis_rad,
                                          ions_filter=NN_O_ions)
    NO_N_rth_image = data.get_i_rth_image(r_axis_mm,
                                          th_axis_rad,
                                          ions_filter=NO_N_ions)
    NN_O_r_proj = NN_O_rth_image.sum(axis=0)
    NO_N_r_proj = NO_N_rth_image.sum(axis=0)

    plt.subplot(333)
    plt_func.imshow_wrapper(rt_image,
                            r_axis_mm,
                            th_axis_rad,
                            kw_args={'aspect': 'auto'})
    plt_func.tick_fontsize()
    plt_func.title_wrapper('electron start polar')
    plt_func.xlabel_wrapper('Radius (mm)')
    plt_func.ylabel_wrapper('Angle (rad)')

    plt.subplot(336)
    r_projection = rt_image.sum(axis=0)
    plt.plot(r_axis_mm, r_projection, label='e start')
    plt_func.xlabel_wrapper('Radius (mm)')
    plt_func.ylabel_wrapper('Number of counts')
    plt_func.legend_wrapper()
    plt_func.tick_fontsize()

    plt.subplot(337)
    plt.plot(r_axis_mm, NN_O_r_proj, 'y', label='NN+ O+ ions')
    plt_func.xlabel_wrapper('Radius (mm)')
    plt_func.ylabel_wrapper('Number of counts')
    plt_func.legend_wrapper()
    plt_func.tick_fontsize()

    plt.subplot(338)
    r_projection = rt_image.sum(axis=0)
    plt.plot(r_axis_mm, NO_N_r_proj, 'm', label='NO+ N+ ions')
    plt_func.xlabel_wrapper('Radius (mm)')
    plt_func.ylabel_wrapper('Number of counts')
    plt_func.legend_wrapper()
    plt_func.tick_fontsize()

    plt_func.savefig_wrapper()
Ejemplo n.º 6
0
def plot_ion_tof(data, verbose=False):
    """Plot some ions tof spectra."""
    if verbose:
        print('\nPlotting tof spectra')
    plt_func.figure_wrapper('Ion TOF {}'.format(data.name()))
    ax1 = plt.subplot(211)

    t_axis_us = np.arange(2., 6.5, 0.01)
    t_axis_ns = t_axis_us * 1e6
    if verbose:
        print('Get tof specturm for all ions.')
    i_tof_all = data.get_i_tof_spectrum(t_axis_ns)
    plt.plot(t_axis_us, i_tof_all, 'k', label='All ions')

    if verbose:
        print('Get tof specturm for e start ions.')
    i_tof_e_start = data.get_i_tof_spectrum(t_axis_ns,
                                            data.get_filter('e_start_ions'))
    if verbose:
        print('Get tof specturm for rand start ions.')
    i_tof_random_start = data.get_i_tof_spectrum(
        t_axis_ns, data.get_filter('rand_start_ions'))
    if verbose:
        print('Plot e start and rand start tof spectra.')
    plt.plot(t_axis_us, i_tof_e_start, 'b', label='electron start ions')
    plt.plot(t_axis_us, i_tof_random_start, 'g', label='random start ions')

    plt_func.xlabel_wrapper('flight time (us)')
    plt_func.ylabel_wrapper('number of ions per bin')
    plt_func.legend_wrapper()
    plt_func.tick_fontsize()

    plt.subplot(212, sharex=ax1)
    i_tof_NN_O = data.get_i_tof_spectrum(t_axis_ns,
                                         data.get_filter('NN_O_events_ions'))
    i_tof_NO_N = data.get_i_tof_spectrum(t_axis_ns,
                                         data.get_filter('NO_N_events_ions'))

    if verbose:
        print('Finding random start rescaling factor.')
    rescale_region = slice(t_axis_us.searchsorted(5.5),
                           t_axis_us.searchsorted(6.5))
    random_start_scaling = (i_tof_e_start[rescale_region].sum(dtype=float) /
                            i_tof_random_start[rescale_region].sum())

    plt.plot(t_axis_us, i_tof_e_start, 'b', label='electron start ions')
    plt.plot(t_axis_us,
             i_tof_random_start * random_start_scaling,
             'g',
             label='random start ions, rescaled')
    plt.plot(t_axis_us,
             i_tof_e_start - i_tof_random_start * random_start_scaling,
             'r',
             label='pure coincidence ions')
    plt.plot(t_axis_us, i_tof_NN_O * 5, 'y', label='NN+ O+ ions x 5')
    plt.plot(t_axis_us, i_tof_NO_N * 5, 'm', label='NO+ N+ ions x 5')

    plt_func.xlabel_wrapper('flight time (us)')
    plt_func.ylabel_wrapper('number of ions per bin')
    plt_func.legend_wrapper()
    plt_func.tick_fontsize()

    plt_func.savefig_wrapper()
Ejemplo n.º 7
0
def make_new_bg(setting, *, plot=False, verbose=False):
    try:
        calib_data_list = electron_calibration_data.get_data_in_list(
            setting, verbose=False)
    except electron_calibration_data.CenterEnergyError as e:
        print(e)
        raise

    calib_data_list.sort()

    if plot:
        proj_fig = plt_func.figure_wrapper('proj')
        proj_ax = proj_fig.add_subplot(111)
        dev_fig = plt_func.figure_wrapper('deviations')
        dev_ax = dev_fig.add_subplot(111)
        number_fig = plt_func.figure_wrapper('number')
        number_ax = number_fig.add_subplot(111)

    proj_list = []

    for d in calib_data_list:
        straight_image, s_i_time_stamp, fig = \
            make_electron_calibration.get_straight_image(
                d, r_axis_mm, th_axis_rad, 0, 'N2',
                verbose=True, plot=True)
        #        straight_image, s_i_time_stamp = d.load_derived_data(
        #            'e_rth_image_straight', 'no_filter',
        #            match_data_dict={'r_axis_mm': r_axis_mm,
        #                             'th_axis_rad': th_axis_rad})

        #        no_filter = d._derived_data['e_rth_image_straight/no_filter']
        #        time_stamp = 0
        #        for dset_tmp in no_filter.values():
        #            if (('time_stamp' in dset_tmp.attrs) and
        #                    (dset_tmp.attrs['time_stamp'] > time_stamp)):
        #                time_stamp = dset_tmp.attrs['time_stamp']
        #                dset = dset_tmp

        #        proj = dset['data'].value.sum(axis=0) / d.data_scaling
        proj = straight_image.sum(axis=0) / d.data_scaling
        #        r_axis = dset['r_axis_mm'].value
        proj_list.append(proj)
        if plot:
            for ax in [proj_ax, dev_ax]:
                plt.sca(ax)
                plt.plot(r_axis_mm, proj, label=d.name())

    if plot:
        proj_array_0 = np.array(proj_list)
        for remove_i in range(7):
            m = np.nanmean(proj_array_0, axis=0)
            d = np.nanstd(proj_array_0, axis=0)
            n = np.isfinite(proj_array_0).sum(axis=0)
            dev_ax.errorbar(r_axis_mm,
                            m,
                            d,
                            label=str(remove_i),
                            fmt='.',
                            capsize=0)
            number_ax.plot(r_axis_mm, n, label=str(remove_i))
            i_r_list = np.where((d * 4 > m) & (n > 3))[0]
            if len(i_r_list) == 0:
                break
            for i_r in i_r_list:
                maxdev = np.nanargmax(np.abs(proj_array_0[:, i_r] - m[i_r]))
                proj_array_0[maxdev, i_r] = np.nan
        plt_func.legend_wrapper(ax=number_ax)
        plt_func.legend_wrapper(ax=dev_ax)


#    proj_array = np.array(proj_list)
#    for i_r in range(len(r_axis)):
#        for i in range(2):
#            proj_array[np.nanargmax(proj_array[:, i_r]), i_r] = np.nan

    proj_mean = np.nanmean(proj_array_0, axis=0)

    if plot:
        plt.sca(proj_ax)
        plt.plot(r_axis_mm, proj_mean, linewidth=2, label='bg')
        plt_func.legend_wrapper()

    with h5py.File(_file_name(setting)) as h5:
        dset_name = 'background_{}'.format(len(proj_mean))
        try:
            dset = h5.require_dataset(dset_name,
                                      proj_mean.shape,
                                      float,
                                      exact=True)

            dset[:] = proj_mean
        except TypeError:
            del h5[dset_name]
            dset = h5.create_dataset(dset_name, data=proj_mean)
        dset.attrs['time_stamp'] = time.time()

    return proj_list