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)
(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)
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()
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()
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()
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()
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