Beispiel #1
0
    # Averaging the reconstructed profiles
    all_profiles_time, all_profiles_current = [], []
    for profile in all_profiles:
        profile.shift('Right_fit')
        #all_profiles_time.append(profile.time - profile.time[np.argmax(profile.current)])
        all_profiles_time.append(profile.time)
    new_time = np.linspace(min(x.min() for x in all_profiles_time), max(x.max() for x in all_profiles_time), len_profile)
    for tt, profile in zip(all_profiles_time, all_profiles):
        new_current = np.interp(new_time, tt, profile.current, left=0, right=0)
        new_current *= charge/new_current.sum()
        all_profiles_current.append(new_current)
    all_profiles_current = np.array(all_profiles_current)
    mean_profile = np.mean(all_profiles_current, axis=0)
    std_profile = np.std(all_profiles_current, axis=0)
    average_profile = tracking.BeamProfile(new_time, mean_profile, tracker.energy_eV, charge)
    average_profile.plot_standard(sp_profile_comp, label='Reconstructed', norm=True, center='Right_fit')


    ms.figure('Test averaging %s' % main_label)
    sp = plt.subplot(1,1,1)
    for yy in all_profiles_current:
        sp.plot(new_time, yy/np.trapz(yy, new_time), lw=0.5)

    to_plot = [
            ('Average', new_time, mean_profile, 'black', 3),
            ('+1 STD', new_time, mean_profile+std_profile, 'black', 1),
            ('-1 STD', new_time, mean_profile-std_profile, 'black', 1),
            ]

    integral = np.trapz(mean_profile, new_time)
Beispiel #2
0
    screen = copy.deepcopy(screen)
    screen.reshape(n_particles)
    t_interp0 = np.interp(screen.x, wake_x, wake_time)
    charge_interp, hist_edges = np.histogram(t_interp0,
                                             bins=n_particles // 100,
                                             weights=screen.intensity,
                                             density=True)
    charge_interp[0] = 0
    charge_interp[-1] = 0
    t_interp = np.linspace(t_interp0[0], t_interp0[-1], len(charge_interp))

    if t_interp[1] < t_interp[0]:
        t_interp = t_interp[::-1]
        charge_interp = charge_interp[::-1]
    t_interp -= t_interp.min()
    bp = tracking.BeamProfile(t_interp, charge_interp, 1, charge)
    bp.plot_standard(sp_profile, label=label)

final_profile.plot_standard(sp_profile, label='From module')

profile_arr = np.interp(new_t_axis, final_profile.time, final_profile.current)

new_img_sum = new_img.sum(axis=-2)
new_img_sum[new_img_sum == 0] = np.inf
image3 = new_img / new_img_sum / profile_arr.sum() * profile_arr
image3 = image3 / image3.sum() * new_img.sum()
sp = subplot(sp_ctr, 'From profile', xlabel='time [fs]')
sp_ctr += 1
plot_img_and_proj(sp, image3, new_t_axis, y_axis, x_factor=1e15)

sp_screen.legend()
Beispiel #3
0
        final_baf = tracker.back_and_forward(meas_screen, reconstructed_profile, gaps, beam_offsets, n_streaker)
        final_bp = final_baf['beam_profile']
        final_screen = final_baf['screen']
        final_screen.normalize()
        final_profile_list.append(final_bp)
        final_bp.center()

        sp_profile.plot(final_bp.time*1e15, final_bp.current/final_bp.integral, color=color)

        label2 = 'Reconstructed' if n_bo == 0 else None
        sp_screen.plot(final_screen.x*1e3, final_screen.intensity, color=color, ls='--', label=label2)


    xx, yy = tracking.get_average_profile(final_profile_list)
    avg_profile = tracking.BeamProfile(xx, yy, tracker.energy_eV, charge)

    avg_profile.center()
    sp_profile.plot(avg_profile.time*1e15, avg_profile.current/avg_profile.integral, label='Average', color='red')
    sp_profile0.plot(avg_profile.time*1e15, avg_profile.current/avg_profile.integral, label='%i / %i' % (offset_error_s1*1e6, avg_profile.gaussfit.sigma*1e15))


    total_diff = 0
    for n_bo, beam_offsets0 in enumerate(beam_offset_list):

        beam_offsets = np.array(beam_offsets0) + np.array(offset_error)
        f_avg = tracker.matrix_forward(avg_profile, gaps, beam_offsets)
        screen_avg = f_avg['screen']
        diff = screen_avg.compare(meas_screen_dict[n_bo])
        total_diff += diff
def main():
    fig_paper = ms.figure('Comparison plots')
    subplot = ms.subplot_factory(2, 2)
    sp_ctr_paper = 1

    #images0 = dict0['projx'][-1]
    #x_axis = dict0['x_axis']*1e-6

    #if np.diff(x_axis)[0] < 0:
    #    x_axis = x_axis[::-1]
    #    invert_x = True
    #else:
    #    invert_x = False

    process_dict = {
        'Long': {
            'filename': file38,
            'main_dict': dict38,
            'proj0': dict0['projx'][-1],
            'x_axis0': dict0['x_axis'] * 1e-6,
            'n_offset': None,
            'filename0': file0,
            'blmeas': blmeas38,
            'flipx': False,
        },
        'Medium': {
            'filename': file25,
            'main_dict': dict25,
            'proj0': dict25['projx'][7],
            'x_axis0': dict25['x_axis'] * 1e-6,
            'n_offset': 0,
            'filename0': file25,
            'blmeas': blmeas25,
            'flipx': False,
        },
    }

    for main_label, p_dict in process_dict.items():
        #if main_label != 'Medium':
        #    continue

        projx0 = p_dict['proj0']
        x_axis0 = p_dict['x_axis0']
        if np.diff(x_axis0)[0] < 0:
            x_axis0 = x_axis0[::-1]
            invert_x0 = True

        all_mean = []
        for proj in projx0:
            screen = get_screen_from_proj(proj, x_axis0, invert_x0)
            xx, yy = screen._xx, screen._yy
            gf = gaussfit.GaussFit(xx, yy)
            all_mean.append(gf.mean)

        mean0 = np.mean(all_mean)

        timestamp0 = misc.get_timestamp(os.path.basename(p_dict['filename0']))
        tracker0 = tracking.Tracker(
            archiver_dir + 'archiver_api_data/2020-10-03.h5', timestamp0,
            struct_lengths, n_particles, n_emittances, screen_bins,
            screen_cutoff, smoothen, profile_cutoff, len_profile)

        bp_test = tracking.get_gaussian_profile(40e-15, tt_halfrange,
                                                len_profile, charge,
                                                tracker0.energy_eV)
        screen_sim = tracker0.matrix_forward(bp_test, [10e-3, 10e-3],
                                             [0, 0])['screen']
        all_emittances = []
        for proj in projx0:
            screen_meas = get_screen_from_proj(proj, x_axis0, invert_x0)
            emittance_fit = misc.fit_nat_beamsize(screen_meas, screen_sim,
                                                  n_emittances[0])
            all_emittances.append(emittance_fit)

        new_emittance = np.mean(all_emittances)
        print(main_label, 'Emittance [nm]', new_emittance * 1e9)
        n_emittances[0] = new_emittance

        dict_ = p_dict['main_dict']
        file_ = p_dict['filename']
        x_axis = dict_['x_axis'] * 1e-6
        y_axis = dict_['y_axis'] * 1e-6
        n_offset = p_dict['n_offset']

        if np.diff(x_axis)[0] < 0:
            x_axis = x_axis[::-1]
            invert_x = True
        else:
            invert_x = False

        if np.diff(y_axis)[0] < 0:
            y_axis = y_axis[::-1]
            invert_y = True
        else:
            invert_y = False

        timestamp = misc.get_timestamp(os.path.basename(file_))
        tracker = tracking.Tracker(
            archiver_dir + 'archiver_api_data/2020-10-03.h5', timestamp,
            struct_lengths, n_particles, n_emittances, screen_bins,
            screen_cutoff, smoothen, profile_cutoff, len_profile)

        blmeas = p_dict['blmeas']
        flip_measured = p_dict['flipx']
        profile_meas = tracking.profile_from_blmeas(blmeas,
                                                    tt_halfrange,
                                                    charge,
                                                    tracker.energy_eV,
                                                    subtract_min=True)
        profile_meas.reshape(len_profile)
        profile_meas2 = tracking.profile_from_blmeas(blmeas,
                                                     tt_halfrange,
                                                     charge,
                                                     tracker.energy_eV,
                                                     subtract_min=True,
                                                     zero_crossing=2)
        profile_meas2.reshape(len_profile)
        if flip_measured:
            profile_meas.flipx()
        else:
            profile_meas2.flipx()

        profile_meas.cutoff(1e-2)
        profile_meas2.cutoff(1e-2)

        beam_offsets = [0., -(dict_['value'] * 1e-3 - mean_struct2)]
        distance_um = (gaps[n_streaker] / 2. - beam_offsets[n_streaker]) * 1e6
        if n_offset is not None:
            distance_um = distance_um[n_offset]
            beam_offsets = [beam_offsets[0], beam_offsets[1][n_offset]]

        tdc_screen1 = tracker.matrix_forward(profile_meas, gaps,
                                             beam_offsets)['screen']
        tdc_screen2 = tracker.matrix_forward(profile_meas, gaps,
                                             beam_offsets)['screen']

        plt.figure(fig_paper.number)
        sp_profile_comp = subplot(sp_ctr_paper,
                                  title=main_label,
                                  xlabel='t [fs]',
                                  ylabel='Intensity (arb. units)')
        sp_ctr_paper += 1
        profile_meas.plot_standard(sp_profile_comp,
                                   norm=True,
                                   color='black',
                                   label='TDC',
                                   center='Right')

        ny, nx = 2, 4
        subplot = ms.subplot_factory(ny, nx)
        sp_ctr = np.inf

        all_profiles, all_screens = [], []

        if n_offset is None:
            projections = dict_['projx']
        else:
            projections = dict_['projx'][n_offset]

        for n_image in range(len(projections)):
            screen = get_screen_from_proj(projections[n_image], x_axis,
                                          invert_x)
            screen.crop()
            screen._xx = screen._xx - mean0

            gauss_dict = tracker.find_best_gauss(
                sig_t_range,
                tt_halfrange,
                screen,
                gaps,
                beam_offsets,
                n_streaker,
                charge,
                self_consistent=self_consistent)
            best_screen = gauss_dict['reconstructed_screen']
            best_screen.cutoff(1e-3)
            best_screen.crop()
            best_profile = gauss_dict['reconstructed_profile']
            if n_image == 0:
                screen00 = screen
                bp00 = best_profile
                best_screen00 = best_screen
            best_gauss = gauss_dict['best_gauss']

            if sp_ctr > (ny * nx):
                ms.figure('All reconstructions Distance %i %s' %
                          (distance_um, main_label))
                sp_ctr = 1

            if n_image % 2 == 0:
                sp_profile = subplot(sp_ctr, title='Reconstructions')
                sp_ctr += 1
                sp_screen = subplot(sp_ctr, title='Screens')
                sp_ctr += 1
                profile_meas.plot_standard(sp_profile,
                                           color='black',
                                           label='Measured',
                                           norm=True,
                                           center='Right')
                tdc_screen1.plot_standard(sp_screen, color='black')

            color = screen.plot_standard(sp_screen,
                                         label=n_image)[0].get_color()
            best_screen.plot_standard(sp_screen, color=color, ls='--')
            best_profile.plot_standard(sp_profile,
                                       label=n_image,
                                       norm=True,
                                       center='Right')
            sp_profile.legend()
            sp_screen.legend()

            all_profiles.append(best_profile)

        # Averaging the reconstructed profiles
        all_profiles_time, all_profiles_current = [], []
        for profile in all_profiles:
            profile.shift('Right')
            #all_profiles_time.append(profile.time - profile.time[np.argmax(profile.current)])
            all_profiles_time.append(profile.time)
        new_time = np.linspace(min(x.min() for x in all_profiles_time),
                               max(x.max() for x in all_profiles_time),
                               len_profile)
        for tt, profile in zip(all_profiles_time, all_profiles):
            new_current = np.interp(new_time,
                                    tt,
                                    profile.current,
                                    left=0,
                                    right=0)
            new_current *= charge / new_current.sum()
            all_profiles_current.append(new_current)
        all_profiles_current = np.array(all_profiles_current)
        mean_profile = np.mean(all_profiles_current, axis=0)
        std_profile = np.std(all_profiles_current, axis=0)
        average_profile = tracking.BeamProfile(new_time, mean_profile,
                                               tracker.energy_eV, charge)
        average_profile.plot_standard(sp_profile_comp,
                                      label='Reconstructed',
                                      norm=True,
                                      center='Right')

        ms.figure('Test averaging %s' % main_label)
        sp = plt.subplot(1, 1, 1)
        for yy in all_profiles_current:
            sp.plot(new_time, yy / np.trapz(yy, new_time), lw=0.5)

        to_plot = [
            ('Average', new_time, mean_profile, 'black', 3),
            ('+1 STD', new_time, mean_profile + std_profile, 'black', 1),
            ('-1 STD', new_time, mean_profile - std_profile, 'black', 1),
        ]

        integral = np.trapz(mean_profile, new_time)
        for pm, ctr, color in [(profile_meas, 1, 'red'),
                               (profile_meas2, 2, 'green')]:
            #factor = integral/np.trapz(pm.current, pm.time)
            #t_meas = pm.time-pm.time[np.argmax(pm.current)]
            i_meas = np.interp(new_time, pm.time, pm.current)
            bp = tracking.BeamProfile(new_time,
                                      i_meas,
                                      energy_eV=tracker.energy_eV,
                                      charge=charge)
            bp.shift('Right')

            to_plot.append(('TDC %i' % ctr, bp.time, bp.current, color, 3))

        for label, tt, profile, color, lw in to_plot:
            gf = gaussfit.GaussFit(tt, profile)
            width_fs = gf.sigma * 1e15
            if label is None:
                label = ''
            label = (label + ' %i fs' % width_fs).strip()
            factor = np.trapz(profile, tt)
            sp.plot(tt, profile / factor, color=color, lw=lw, label=label)

        sp.legend(title='Gaussian fit $\sigma$')

    plt.show()
                      xlabel='t [fs]',
                      ylabel='$\Delta$ x',
                      scix=True,
                      sciy=True)
    sp_ctr += 1

    baf_tdc = tracker.back_and_forward(meas_screen, profile_meas, gaps,
                                       beam_offsets, n_streaker)
    bp_back_tdc = baf_tdc['beam_profile']
    screen_tdc = baf_tdc['screen']
    #bp_back_tdc = tracker.track_backward2(meas_screen, profile_meas, gaps, beam_offsets, n_streaker)
    bp_back_tdc.plot_standard(sp_profile, norm=True, label='Use measured')
    bp_back_tdc.plot_standard(sp_profile_rec, norm=True, ls='--')
    mask = np.logical_and(bp_back_tdc.time > -1e-13, bp_back_tdc.time < 1e-13)
    bp_back_tdc2 = tracking.BeamProfile(bp_back_tdc.time[mask],
                                        bp_back_tdc.current[mask],
                                        bp_back_tdc.energy_eV,
                                        bp_back_tdc.charge)

    sp_profile.legend()

    for bp, label in [(best_profile, 'Use self'), (best_gauss, 'Best Gauss'),
                      (bp_back_tdc2, 'Use measured'),
                      (profile_meas, 'TDC measured')]:
        wake_dict = bp.calc_wake(gaps[n_streaker], beam_offsets[n_streaker],
                                 struct_lengths[n_streaker])
        wake = wake_dict['dipole']['wake_potential']
        wake_t = wake_dict['input']['charge_xx'] / c

        sp_wake.plot(wake_t, wake / tracker.energy_eV * r12, label=label)

    sp_wake.legend()
Beispiel #6
0
    all_profiles.append(best_profile)

# Averaging the reconstructed profiles
all_profiles_time, all_profiles_current = [], []
for profile in all_profiles:
    all_profiles_time.append(profile.time -
                             profile.time[np.argmax(profile.current)])
new_time = np.linspace(min(x.min() for x in all_profiles_time),
                       max(x.max() for x in all_profiles_time), len_profile)
for tt, profile in zip(all_profiles_time, all_profiles):
    all_profiles_current.append(
        np.interp(new_time, tt, profile.current, left=0, right=0))
all_profiles_current = np.array(all_profiles_current)
mean_profile = np.mean(all_profiles_current, axis=0)
std_profile = np.std(all_profiles_current, axis=0)
average_profile = tracking.BeamProfile(new_time, mean_profile, energy_eV,
                                       charge)
average_profile.plot_standard(sp_profile_comp,
                              label='Reconstructed',
                              norm=True,
                              center_max=True)

ms.figure('Test averaging')
sp = plt.subplot(1, 1, 1)
for yy in all_profiles_current:
    sp.plot(new_time, yy, lw=0.5)

to_plot = [
    ('Average', new_time, mean_profile, 'black', 3),
    ('+1 STD', new_time, mean_profile + std_profile, 'black', 1),
    ('-1 STD', new_time, mean_profile - std_profile, 'black', 1),
]
Beispiel #7
0
    profile_meas.plot_standard(sp_profile, label='TDC', color='black', norm=True)
    best_profile.plot_standard(sp_profile, norm=True, label='Use self')
    color_rec = best_profile.plot_standard(sp_profile_rec, norm=True, label='%i' % distance_um)[0].get_color()
    best_gauss.plot_standard(sp_profile, norm=True, label='Best Gauss')

    sp_wake = subplot(sp_ctr, title='Wake effect', xlabel='t [fs]', ylabel='$\Delta$ x', scix=True, sciy=True)
    sp_ctr += 1

    baf_tdc = tracker.back_and_forward(meas_screen, profile_meas, gaps, beam_offsets, n_streaker)
    bp_back_tdc = baf_tdc['beam_profile']
    screen_tdc = baf_tdc['screen']
    #bp_back_tdc = tracker.track_backward2(meas_screen, profile_meas, gaps, beam_offsets, n_streaker)
    bp_back_tdc.plot_standard(sp_profile, norm=True, label='Use measured')
    bp_back_tdc.plot_standard(sp_profile_rec, norm=True, ls='--')
    mask = np.logical_and(bp_back_tdc.time > -1e-13, bp_back_tdc.time < 1e-13)
    bp_back_tdc2 = tracking.BeamProfile(bp_back_tdc.time[mask], bp_back_tdc.current[mask], bp_back_tdc.energy_eV, bp_back_tdc.charge)

    sp_profile.legend()

    for bp, label in [(best_profile, 'Use self'), (best_gauss, 'Best Gauss'), (bp_back_tdc2, 'Use measured'), (profile_meas, 'TDC measured')]:
        wake_dict = bp.calc_wake(gaps[n_streaker], beam_offsets[n_streaker], struct_lengths[n_streaker])
        wake = wake_dict['dipole']['wake_potential']
        wake_t = wake_dict['input']['charge_xx']/c

        sp_wake.plot(wake_t, wake/tracker.energy_eV*r12, label=label)

    sp_wake.legend()

    meas_screen0.plot_standard(sp_screen, label='Measured 0')
    meas_screen.plot_standard(sp_screen, label='Measured')
    best_screen.plot_standard(sp_screen, label='Reconstructed')
    dirname1 = '/sf/data/measurements/2020/10/03/'
    dirname2 = '/sf/data/measurements/2020/10/04/'
elif hostname == 'pubuntu':
    dirname1 = '/home/work/data_2020-10-03/'
    dirname2 = '/home/work/data_2020-10-04/'
    archiver_dir = '/home/work/'



bp_gauss = tracking.get_gaussian_profile(40e-15, 200e-15, len_profile, charge, energy_eV)

flat_current = np.zeros_like(bp_gauss.current)
flat_time = bp_gauss.time
flat_current[np.logical_and(flat_time > -40e-15, flat_time < 40e-15)] = 1

bp_flat = tracking.BeamProfile(flat_time, flat_current, energy_eV, charge)

sig = 5e-15
dhf_current = doublehornfit.DoublehornFit.fit_func(flat_time, -20e-15, 20e-15, sig, sig, sig, sig, 0.5, 1, 1)
dhf_current *= charge / dhf_current.sum()

bp_dhf = tracking.BeamProfile(flat_time, dhf_current, energy_eV, charge)
bp_dhf.cutoff(1e-3)




for bp, bp_label in [(bp_gauss, 'Gauss'), (bp_flat, 'Flat'), (bp_dhf, 'Double horn')]:

    ms.figure('Test quadrupole wake %s emittance %i nm' % (bp_label, n_emittances[0]*1e9))
    subplot = ms.subplot_factory(2,2)