def setUp(self): circumference = 110.4 # [m] energy = 2.5e9 # [eV] alpha = 0.0082 self.R_bend = 5.559 # bending radius [m] # C_gamma = e**2 / (3*epsilon_0 * (m_e*c**2)**4) # [m J^3] # C_gamma *= e**3 # [m eV^3] harmonic_number = 184 voltage = 800e3 # eV phi_offsets = 0 self.seed = 1234 self.intensity = 2.299e9 self.n_macroparticles = int(1e2) self.sigma_dt = 10e-12 # RMS, [s] self.ring = Ring(circumference, alpha, energy, Positron(), synchronous_data_type='total energy', n_turns=1) self.rf_station = RFStation(self.ring, harmonic_number, voltage, phi_offsets, n_rf=1) self.beam = Beam(self.ring, self.n_macroparticles, self.intensity) bigaussian(self.ring, self.rf_station, self.beam, self.sigma_dt, seed=self.seed)
def test_synchrotron_radiation_python_vs_C_double_kick(self): atol = 0 rtol = 1e-7 iSR = SynchrotronRadiation(self.ring, self.rf_station, self.beam, self.R_bend, n_kicks=2, shift_beam=False, python=True, quantum_excitation=False, seed=self.seed) iSR.track() # Python implementation beam_C = Beam(self.ring, self.n_macroparticles, self.intensity) bigaussian(self.ring, self.rf_station, beam_C, self.sigma_dt, seed=self.seed) iSR = SynchrotronRadiation(self.ring, self.rf_station, beam_C, self.R_bend, n_kicks=2, shift_beam=False, python=False, quantum_excitation=False, seed=self.seed) iSR.track() # C implementation np.testing.assert_allclose([np.mean(self.beam.dE)], [np.mean(beam_C.dE)], atol=atol, rtol=rtol, err_msg='Python anc C yield different avg beam.dE for two kicks') np.testing.assert_allclose([np.std(self.beam.dE)], [np.std(beam_C.dE)], atol=atol, rtol=rtol, err_msg='Python anc C yield different std beam.dE for two kicks')
def setUp(self): self.ring = Ring(self.C, self.alpha, np.linspace( self.p_i, self.p_f, self.N_t + 1), Proton(), self.N_t) self.beam = Beam(self.ring, self.N_p, self.N_b) self.rf = RFStation( self.ring, [self.h], self.V * np.linspace(1, 1.1, self.N_t+1), [self.dphi]) bigaussian(self.ring, self.rf, self.beam, self.tau_0/4, reinsertion=True, seed=1) self.profile = Profile(self.beam, CutOptions(n_slices=100, cut_left=0, cut_right=self.rf.t_rf[0, 0]), FitOptions(fit_option='gaussian')) self.long_tracker = RingAndRFTracker( self.rf, self.beam, Profile=self.profile)
def test_4(self): # Create a batch of 100 equal, short bunches bunches = 100 T_s = 5 * self.rf.t_rev[0] / self.rf.harmonic[0, 0] N_m = int(1e5) N_b = 2.3e11 bigaussian(self.ring, self.rf, self.beam, 0.1e-9, seed=1234, reinsertion=True) beam2 = Beam(self.ring, bunches * N_m, bunches * N_b) bunch_spacing = 5 * self.rf.t_rf[0, 0] buckets = 5 * bunches for i in range(bunches): beam2.dt[i * N_m:(i + 1) * N_m] = self.beam.dt + i * bunch_spacing beam2.dE[i * N_m:(i + 1) * N_m] = self.beam.dE profile2 = Profile(beam2, CutOptions=CutOptions(cut_left=0, cut_right=bunches * bunch_spacing, n_slices=1000 * buckets)) profile2.track() tot_charges = np.sum(profile2.n_macroparticles)/\ beam2.n_macroparticles*beam2.intensity self.assertAlmostEqual(tot_charges, 2.3000000000e+13, 9) # Calculate fine- and coarse-grid RF current rf_current_fine, rf_current_coarse = rf_beam_current( profile2, self.rf.omega_rf[0, 0], self.ring.t_rev[0], lpf=False, downsample={ 'Ts': T_s, 'points': self.rf.harmonic[0, 0] / 5 }) rf_current_coarse /= T_s # Peak RF current on coarse grid peak_rf_current = np.max(np.absolute(rf_current_coarse)) self.assertAlmostEqual(peak_rf_current, 2.9285808008, 7)
def setUp(self): self.ring = Ring(self.C, self.alpha, np.linspace(self.p_i, self.p_f, self.N_t + 1), Proton(), self.N_t) self.beam = Beam(self.ring, self.N_p, self.N_b) self.rf = RFStation(self.ring, [self.h], self.V * np.linspace(1, 1.1, self.N_t + 1), [self.dphi]) bigaussian(self.ring, self.rf, self.beam, self.tau_0 / 4, reinsertion=True, seed=1) self.profile = Profile( self.beam, CutOptions(n_slices=100, cut_left=0, cut_right=self.rf.t_rf[0, 0]), FitOptions(fit_option='gaussian')) self.long_tracker = RingAndRFTracker(self.rf, self.beam, Profile=self.profile)
def setUp(self): n_turns = 200 intensity_pb = 1.2e6 # protons per bunch n_macroparticles = int(1e6) # macropartilces per bunch sigma = 0.05e-9 # sigma for gaussian bunch [s] self.time_offset = 0.1e-9 # time by which to offset the bunch # Ring parameters SPS C = 6911.5038 # Machine circumference [m] sync_momentum = 25.92e9 # SPS momentum at injection [eV/c] gamma_transition = 17.95142852 # Q20 Transition gamma momentum_compaction = 1./gamma_transition**2 # Momentum compaction array self.ring = Ring(C, momentum_compaction, sync_momentum, Proton(), n_turns=n_turns) # RF parameters SPS harmonic = 4620 # Harmonic numbers voltage = 4.5e6 # [V] phi_offsets = 0 self.rf_station = RFStation(self.ring, harmonic, voltage, phi_offsets) t_rf = self.rf_station.t_rf[0, 0] # Beam setup self.beam = Beam(self.ring, n_macroparticles, intensity_pb) bigaussian(self.ring, self.rf_station, self.beam, sigma, seed=1234, reinsertion=True) # displace beam to see effect of phase error and phase loop self.beam.dt += self.time_offset # Profile setup self.profile = Profile(self.beam, CutOptions=CutOptions(cut_left=0, cut_right=t_rf, n_slices=1024))
def setUp(self): n_turns = 200 intensity_pb = 1.2e6 # protons per bunch n_macroparticles = int(1e6) # macropartilces per bunch sigma = 0.05e-9 # sigma for gaussian bunch [s] self.time_offset = 0.1e-9 # time by which to offset the bunch # Ring parameters SPS C = 6911.5038 # Machine circumference [m] sync_momentum = 25.92e9 # SPS momentum at injection [eV/c] gamma_transition = 17.95142852 # Q20 Transition gamma momentum_compaction = 1./gamma_transition**2 # Momentum compaction array self.ring = Ring(C, momentum_compaction, sync_momentum, Proton(), n_turns=n_turns) # RF parameters SPS harmonic = 4620 # Harmonic numbers voltage = 4.5e6 # [V] phi_offsets = 0 self.rf_station = RFStation(self.ring, harmonic, voltage, phi_offsets) t_rf = self.rf_station.t_rf[0,0] # Beam setup self.beam = Beam(self.ring, n_macroparticles, intensity_pb) bigaussian(self.ring, self.rf_station, self.beam, sigma, seed = 1234, reinsertion = True) ### displace beam to see effect of phase error and phase loop self.beam.dt += self.time_offset # Profile setup self.profile = Profile(self.beam, CutOptions = CutOptions(cut_left=0, cut_right=t_rf, n_slices=1024))
# Logger for messages on console & in file Logger(debug=True) # Set up machine parameters ring = Ring(C, alpha, p_s, Particle=Proton(), n_turns=N_t) logging.info("...... Machine parameters set!") # Set up RF parameters rf = RFStation(ring, h, V, phi, n_rf=1) logging.info("RF frequency %.6e Hz", rf.omega_rf[0, 0] / (2 * np.pi)) logging.info("Revolution period %.6e s", rf.t_rev[0]) logging.info("...... RF parameters set!") # Single bunch bunch = Beam(ring, N_m, N_b) bigaussian(ring, rf, bunch, 3.2e-9 / 4, seed=1234, reinsertion=True) logging.info("Bunch spacing %.3e s", rf.t_rf[0, 0] * bunch_spacing) # Create beam beam = Beam(ring, n_bunches * N_m, n_bunches * N_b) for i in range(n_bunches): beam.dt[int(i * N_m):int((i + 1) * N_m)] = bunch.dt + i * rf.t_rf[0, 0] * bunch_spacing beam.dE[int(i * N_m):int((i + 1) * N_m)] = bunch.dE profile = Profile(beam, CutOptions=CutOptions(cut_left=0.e-9, cut_right=rf.t_rev[0], n_slices=46200)) profile.track()
def test_2(self): RF = RFStation(self.ring, 4620, 4.5e6, 0) bigaussian(self.ring, RF, self.beam, 3.2e-9/4, seed = 1234, reinsertion = True) self.profile.track() rf_current = rf_beam_current(self.profile, self.omega, self.ring.t_rev[0], lpf=False) Iref_real = np.array( [0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 4.17276535e-13, 4.58438681e-13, 2.48023976e-13, 5.29812878e-13, 2.79735891e-13, 0.00000000e+00, 1.21117141e-12, 9.32525023e-13, 3.16481489e-13, 6.39337176e-13, 0.00000000e+00, 0.00000000e+00, 4.08671434e-12, 4.92294314e-12, 6.56965575e-12, 1.06279981e-11, 1.36819774e-11, 2.16648778e-11, 3.09847740e-11, 3.52971849e-11, 4.70378842e-11, 4.53538351e-11, 4.87255679e-11, 5.36705228e-11, 5.13609263e-11, 4.32833543e-11, 3.41417624e-11, 1.57452091e-11, -1.09005668e-11, -4.60465929e-11, -9.12872553e-11, -1.48257171e-10, -2.08540597e-10, -2.77630608e-10, -3.72157667e-10, -4.56272786e-10, -5.57978710e-10, -6.46554672e-10, -7.48006839e-10, -8.21493943e-10, -9.37522966e-10, -1.03729659e-09, -1.06159943e-09, -1.08434837e-09, -1.15738771e-09, -1.17887328e-09, -1.17146946e-09, -1.10964397e-09, -1.10234198e-09, -1.08852433e-09, -9.85866185e-10, -9.11727492e-10, -8.25604179e-10, -7.34122902e-10, -6.47294094e-10, -5.30372699e-10, -4.40357820e-10, -3.61273445e-10, -2.76871612e-10, -2.02227691e-10, -1.45430219e-10, -8.88675652e-11, -4.28984525e-11, -8.85451321e-12, 1.79026289e-11, 3.48384211e-11, 4.50190278e-11, 5.62413467e-11, 5.27322593e-11, 4.98163111e-11, 4.83288193e-11, 4.18200848e-11, 3.13334266e-11, 2.44082106e-11, 2.12572803e-11, 1.37397871e-11, 1.00879346e-11, 7.78502206e-12, 4.00790815e-12, 2.51830412e-12, 1.91301488e-12, 0.00000000e+00, 9.58518921e-13, 3.16123806e-13, 1.24116545e-12, 1.20821671e-12, 5.82952178e-13, 8.35917228e-13, 5.27285250e-13, 4.93205915e-13, 0.00000000e+00, 2.06937011e-13, 1.84618141e-13, 1.60868490e-13, 0.00000000e+00, 1.09822742e-13]) I_real = np.around(rf_current.real, 14) # round Iref_real = np.around(Iref_real, 14) self.assertSequenceEqual(I_real.tolist(), Iref_real.tolist(), msg="In TestRFCurrent test_2, mismatch in real part of RF current") Iref_imag = np.array([ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -4.86410815e-13, -4.47827158e-13, -2.02886432e-13, -3.60573852e-13, -1.56290206e-13, 0.00000000e+00, -4.19433613e-13, -2.33465744e-13, -5.01823105e-14, -4.43075921e-14, 0.00000000e+00, 0.00000000e+00, 8.07144709e-13, 1.43192280e-12, 2.55659168e-12, 5.25480064e-12, 8.33669524e-12, 1.59729353e-11, 2.73609511e-11, 3.71844853e-11, 5.92134758e-11, 6.87376280e-11, 9.02226570e-11, 1.24465616e-10, 1.55478762e-10, 1.84035433e-10, 2.37241518e-10, 2.86677989e-10, 3.28265272e-10, 3.77882012e-10, 4.29727720e-10, 4.83759029e-10, 5.13978173e-10, 5.41841031e-10, 5.91537968e-10, 6.00658643e-10, 6.13928028e-10, 5.96367636e-10, 5.76920099e-10, 5.25297875e-10, 4.89104065e-10, 4.29776324e-10, 3.33901906e-10, 2.38690921e-10, 1.49673305e-10, 4.78223853e-11, -5.57081558e-11, -1.51374774e-10, -2.50724894e-10, -3.50731761e-10, -4.16547058e-10, -4.83765618e-10, -5.36075032e-10, -5.74421794e-10, -6.05459147e-10, -5.91794283e-10, -5.88179055e-10, -5.83222843e-10, -5.49774151e-10, -5.08571646e-10, -4.86623358e-10, -4.33179012e-10, -3.73737133e-10, -3.37622742e-10, -2.89119788e-10, -2.30660798e-10, -1.85597518e-10, -1.66348322e-10, -1.19981335e-10, -9.07232680e-11, -7.21467862e-11, -5.18977454e-11, -3.25510912e-11, -2.12524272e-11, -1.54447488e-11, -8.24107056e-12, -4.90052047e-12, -2.96720377e-12, -1.13551262e-12, -4.79152734e-13, -1.91861296e-13, 0.00000000e+00, 7.31481456e-14, 5.23883203e-14, 3.19951675e-13, 4.27870459e-13, 2.66236636e-13, 4.74712082e-13, 3.64260145e-13, 4.09222572e-13, 0.00000000e+00, 2.44654594e-13, 2.61906356e-13, 2.77128356e-13, 0.00000000e+00, 3.01027843e-13]) I_imag = np.around(rf_current.imag, 14) # round Iref_imag = np.around(Iref_imag, 14) self.assertSequenceEqual(I_imag.tolist(), Iref_imag.tolist(), msg="In TestRFCurrent test_2, mismatch in imaginary part of" + " RF current")
# Plot settings plt.rc('axes', labelsize=12, labelweight='normal') plt.rc('lines', linewidth=1.5, markersize=6) plt.rc('font', family='sans-serif') plt.rc('legend', fontsize=12) # Logger for messages on console & in file Logger(debug=True) ring = Ring(C, alpha, p_s, Particle=Proton(), n_turns=1) rf = RFStation(ring, [h], [3.1e6], [dphi]) # SPS-equivalent for 0.57 eVs, 1.65 ns bunch = Beam(ring, N_m, N_p) bigaussian(ring, rf, bunch, sigma_dt=1.65e-9 / 4) #tau_0) # Real RF voltage rf = RFStation(ring, [h], [V], [dphi]) beam = Beam(ring, N_m * NB, N_p * NB) buckets = rf.t_rf[0, 0] * 10 for i in range(12): beam.dt[i * N_m:(i + 1) * N_m] = bunch.dt[0:N_m] + i * buckets beam.dE[i * N_m:(i + 1) * N_m] = bunch.dE[0:N_m] for i in range(12, 60): beam.dt[i * N_m:(i + 1) * N_m] = bunch.dt[0:N_m] + i * buckets + 32 * buckets beam.dE[i * N_m:(i + 1) * N_m] = bunch.dE[0:N_m] for i in range(60, 108): beam.dt[i * N_m:(i + 1) * N_m] = bunch.dt[0:N_m] + i * buckets + 40 * buckets
# Simulation setup ------------------------------------------------------------ print("Setting up the simulation...") print("") # Define general parameters ring = Ring(C, alpha, np.linspace(p_i, p_f, N_t + 1), Proton(), N_t) # Define beam and distribution beam = Beam(ring, N_p, N_b) # Define RF station parameters and corresponding tracker rf = RFStation(ring, [h], [V], [dphi]) long_tracker = RingAndRFTracker(rf, beam) bigaussian(ring, rf, beam, tau_0 / 4, reinsertion=True, seed=1) # Need slices for the Gaussian fit # profile = Profile(beam, CutOptions(n_slices=N_p//1000), # FitOptions(fit_option='gaussian')) # Define what to save in file # bunchmonitor = BunchMonitor(ring, rf, beam, # this_directory + '../output_files/EX_01_output_data', Profile=profile) # format_options = {'dirname': this_directory + '../output_files/EX_01_fig'} # plots = Plot(ring, rf, beam, dt_plt, N_t, 0, 0.0001763*h, # -400e6, 400e6, xunit='rad', separatrix_plot=True, # Profile=profile, h5file=this_directory + '../output_files/EX_01_output_data', # format_options=format_options) end = time.time()
# DEFINE RING------------------------------------------------------------------ general_params = Ring(C, momentum_compaction, sync_momentum, Proton(), n_turns) RF_sct_par = RFStation(general_params, [harmonic_numbers], [voltage_program], [phi_offset], n_rf_systems) my_beam = Beam(general_params, n_macroparticles, n_particles) ring_RF_section = RingAndRFTracker(RF_sct_par, my_beam) # DEFINE BEAM------------------------------------------------------------------ bigaussian(general_params, RF_sct_par, my_beam, sigma_dt, seed=1) # DEFINE SLICES---------------------------------------------------------------- slice_beam = Profile(my_beam, CutOptions(cut_left= -5.72984173562e-7, cut_right=5.72984173562e-7, n_slices=100)) # MONITOR---------------------------------------------------------------------- bunchmonitor = BunchMonitor(general_params, RF_sct_par, my_beam, this_directory + '../output_files/EX_02_output_data', buffer_time=1) # LOAD IMPEDANCE TABLES-------------------------------------------------------- var = str(kin_beam_energy / 1e9) # ejection kicker
phi_s_test = rf_params.phi_s #: *Synchronous phase omega_RF_d_test = rf_params.omega_rf_d #: *Design RF frequency of the RF systems in the station [GHz]* omega_RF_test = rf_params.omega_rf #: *Initial, actual RF frequency of the RF systems in the station [GHz]* phi_RF_test = rf_params.omega_rf #: *Initial, actual RF phase of each harmonic system* E_increment_test = rf_params.delta_E #Energy increment (acceleration/deceleration) between two turns, long_tracker = RingAndRFTracker(rf_params, beam) eta_0_test = rf_params.eta_0 #: *Slippage factor (0th order) for the given RF section* eta_1_test = rf_params.eta_1 #: *Slippage factor (1st order) for the given RF section* eta_2_test = rf_params.eta_2 #: *Slippage factor (2nd order) for the given RF section* alpha_order_test = rf_params.alpha_order bigaussian(general_params, rf_params, beam, tau_0 / 4, reinsertion='on', seed=1) # Need slices for the Gaussian fit slice_beam = Profile(beam, CutOptions(n_slices=100)) # Define what to save in file bunchmonitor = BunchMonitor(general_params, rf_params, beam, this_directory + '../output_files/EX_07_output_data', Profile=slice_beam) format_options = {'dirname': this_directory + '../output_files/EX_07_fig'}
rf = RFStation(ring, [h], [V[0:n_turns+1]], [0.]) mpiprint("RF parameters set...") # Generate RF phase noise LHCnoise = FlatSpectrum(ring, rf, fmin_s0=0.8571, fmax_s0=1.001, initial_amplitude=1.e-5, predistortion='weightfunction') LHCnoise.dphi = np.load( os.path.join(inputDir, 'LHCNoise_fmin0.8571_fmax1.001_ampl1e-5_weightfct_6.5TeV.npz'))['arr_0'] LHCnoise.dphi = np.ascontiguousarray(LHCnoise.dphi[0:n_turns+1]) mpiprint("RF phase noise loaded...") # FULL BEAM bunch = Beam(ring, n_particles, N_b) beam = Beam(ring, n_particles*n_bunches, N_b) bigaussian(ring, rf, bunch, 0.3e-9, reinsertion=True, seed=seed) bunch_spacing_buckets = 10 for i in np.arange(n_bunches): beam.dt[i*n_particles:(i+1) * n_particles] = bunch.dt[0:n_particles] + i*rf.t_rf[0, 0]*10 beam.dE[i*n_particles:(i+1)*n_particles] = bunch.dE[0:n_particles] # Profile required for PL cutRange = (n_bunches-1)*25.e-9+3.5e-9 n_slices = np.int(cutRange/0.025e-9 + 1) n_slices = next_regular(n_slices) profile = Profile(beam, CutOptions(n_slices=n_slices, cut_left=-0.5e-9, cut_right=(cutRange-0.5e-9))) mpiprint("Beam generated, profile set...")
if LOGGING == True: Logger(debug = True) else: Logger().disable() # Set up machine parameters ring = Ring(C, alpha, p_s, Particle=Proton(), n_turns=N_t) logging.info("...... Machine parameters set!") # Set up RF parameters rf = RFStation(ring, h, V, phi, n_rf=1) logging.info("...... RF parameters set!") # Define beam and fill it beam = Beam(ring, N_m, N_b) bigaussian(ring, rf, beam, 3.2e-9/4, seed = 1234, reinsertion = True) logging.info("...... Beam set!") logging.info("Number of particles %d" %len(beam.dt)) logging.info("Time coordinates are in range %.4e to %.4e s" %(np.min(beam.dt), np.max(beam.dt))) profile = Profile(beam, CutOptions=CutOptions(cut_left=-1.e-9, cut_right=6.e-9, n_slices=100)) profile.track() if RF_CURRENT == True: # RF current calculation for Gaussian profile rf_current = rf_beam_current(profile, 2*np.pi*f_rf, ring.t_rev[0], lpf=False) rf_current_filt = rf_beam_current(profile, 2*np.pi*f_rf, ring.t_rev[0],
print("") # Define general parameters ring = Ring(C, alpha, np.linspace(p_i, p_f, 2001), Proton(), N_t) # Define beam and distribution beam = Beam(ring, N_p, N_b) # Define RF station parameters and corresponding tracker rf = RFStation(ring, [h], [V], [dphi]) long_tracker = RingAndRFTracker(rf, beam) bigaussian(ring, rf, beam, tau_0/4, reinsertion = True, seed=1) # Need slices for the Gaussian fit profile = Profile(beam, CutOptions(n_slices=100), FitOptions(fit_option='gaussian')) # Define what to save in file bunchmonitor = BunchMonitor(ring, rf, beam, this_directory + '../output_files/EX_01_output_data', Profile=profile) format_options = {'dirname': this_directory + '../output_files/EX_01_fig'} plots = Plot(ring, rf, beam, dt_plt, N_t, 0, 0.0001763*h, -400e6, 400e6, xunit='rad', separatrix_plot=True, Profile=profile, h5file=this_directory + '../output_files/EX_01_output_data', format_options=format_options)
def test_beam_fine_coarse(self): # Test beam impulse response and induced voltage # Compare on coarse and fine grid # Create a batch of 100 equal, short bunches at HL-LHC intensity ring = Ring(2*np.pi*1100.009, 1/18**2, 25.92e9, Particle=Proton()) rf = RFStation(ring, [4620], [4.5e6], [0], n_rf=1) bunches = 100 N_m = int(1e5) N_b = 2.3e11 beam = Beam(ring, N_m, N_b) bigaussian(ring, rf, beam, 1.8e-9/4, seed=1234, reinsertion=True) beam2 = Beam(ring, bunches*N_m, bunches*N_b) bunch_spacing = 5 * rf.t_rf[0, 0] buckets = 5 * bunches for i in range(bunches): beam2.dt[i * N_m:(i + 1) * N_m] = beam.dt + i * bunch_spacing beam2.dE[i * N_m:(i + 1) * N_m] = beam.dE profile2 = Profile(beam2, CutOptions=CutOptions(cut_left=0, cut_right=bunches*bunch_spacing,n_slices=1000*buckets)) profile2.track() # Calculate impulse response and induced voltage OTFB = SPSOneTurnFeedback(rf, beam2, profile2, 3, n_cavities=1, Commissioning=CavityFeedbackCommissioning(open_FF=True)) OTFB.TWC.impulse_response_beam(OTFB.omega_c, OTFB.profile.bin_centers, OTFB.rf_centers) OTFB.beam_induced_voltage(lpf=False) imp_fine_meas = (OTFB.TWC.h_beam[::1000])[:100] imp_coarse_meas = OTFB.TWC.h_beam_coarse[:100] imp_fine_ref = np.array([1.0504062083e+12+0.0000000000e+00j, 2.0781004955e+12+2.7183115978e+09j, 2.0553850965e+12+5.3772054987e+09j, 2.0326663360e+12+7.9766773057e+09j, 2.0099443306e+12+1.0516722825e+10j, 1.9872191969e+12+1.2997338066e+10j, 1.9644910516e+12+1.5418519242e+10j, 1.9417600113e+12+1.7780262770e+10j, 1.9190261924e+12+2.0082565269e+10j, 1.8962897118e+12+2.2325423561e+10j, 1.8735506859e+12+2.4508834674e+10j, 1.8508092314e+12+2.6632795838e+10j, 1.8280654649e+12+2.8697304485e+10j, 1.8053195030e+12+3.0702358252e+10j, 1.7825714624e+12+3.2647954978e+10j, 1.7598214597e+12+3.4534092708e+10j, 1.7370696115e+12+3.6360769688e+10j, 1.7143160345e+12+3.8127984368e+10j, 1.6915608452e+12+3.9835735402e+10j, 1.6688041604e+12+4.1484021645e+10j, 1.6460460966e+12+4.3072842159e+10j, 1.6232867705e+12+4.4602196207e+10j, 1.6005262987e+12+4.6072083256e+10j, 1.5777647978e+12+4.7482502976e+10j, 1.5550023845e+12+4.8833455241e+10j, 1.5322391754e+12+5.0124940128e+10j, 1.5094752871e+12+5.1356957918e+10j, 1.4867108362e+12+5.2529509093e+10j, 1.4639459395e+12+5.3642594342e+10j, 1.4411807134e+12+5.4696214555e+10j, 1.4184152746e+12+5.5690370826e+10j, 1.3956497397e+12+5.6625064451e+10j, 1.3728842254e+12+5.7500296932e+10j, 1.3501188481e+12+5.8316069972e+10j, 1.3273537246e+12+5.9072385477e+10j, 1.3045889714e+12+5.9769245560e+10j, 1.2818247051e+12+6.0406652532e+10j, 1.2590610424e+12+6.0984608912e+10j, 1.2362980996e+12+6.1503117419e+10j, 1.2135359936e+12+6.1962180977e+10j, 1.1907748407e+12+6.2361802713e+10j, 1.1680147576e+12+6.2701985956e+10j, 1.1452558608e+12+6.2982734240e+10j, 1.1224982669e+12+6.3204051301e+10j, 1.0997420924e+12+6.3365941080e+10j, 1.0769874538e+12+6.3468407718e+10j, 1.0542344676e+12+6.3511455561e+10j, 1.0314832504e+12+6.3495089159e+10j, 1.0087339187e+12+6.3419313265e+10j, 9.8598658892e+11+6.3284132832e+10j, 9.6324137757e+11+6.3089553021e+10j, 9.4049840113e+11+6.2835579191e+10j, 9.1775777605e+11+6.2522216909e+10j, 8.9501961879e+11+6.2149471941e+10j, 8.7228404579e+11+6.1717350259e+10j, 8.4955117347e+11+6.1225858036e+10j, 8.2682111826e+11+6.0675001648e+10j, 8.0409399656e+11+6.0064787676e+10j, 7.8136992476e+11+5.9395222903e+10j, 7.5864901923e+11+5.8666314312e+10j, 7.3593139635e+11+5.7878069094e+10j, 7.1321717247e+11+5.7030494640e+10j, 6.9050646392e+11+5.6123598543e+10j, 6.6779938704e+11+5.5157388601e+10j, 6.4509605813e+11+5.4131872814e+10j, 6.2239659348e+11+5.3047059384e+10j, 5.9970110939e+11+5.1902956716e+10j, 5.7700972210e+11+5.0699573420e+10j, 5.5432254788e+11+4.9436918305e+10j, 5.3163970295e+11+4.8115000386e+10j, 5.0896130353e+11+4.6733828878e+10j, 4.8628746583e+11+4.5293413201e+10j, 4.6361830601e+11+4.3793762975e+10j, 4.4095394026e+11+4.2234888026e+10j, 4.1829448472e+11+4.0616798379e+10j, 3.9564005551e+11+3.8939504264e+10j, 3.7299076875e+11+3.7203016111e+10j, 3.5034674052e+11+3.5407344556e+10j, 3.2770808692e+11+3.3552500435e+10j, 3.0507492397e+11+3.1638494786e+10j, 2.8244736773e+11+2.9665338851e+10j, 2.5982553421e+11+2.7633044074e+10j, 2.3720953939e+11+2.5541622099e+10j, 2.1459949925e+11+2.3391084776e+10j, 1.9199552975e+11+2.1181444154e+10j, 1.6939774681e+11+1.8912712486e+10j, 1.4680626634e+11+1.6584902227e+10j, 1.2422120423e+11+1.4198026033e+10j, 1.0164267634e+11+1.1752096764e+10j, 7.9070798521e+10+9.2471274799e+09j, 5.6505686581e+10+6.6831314440e+09j, 3.3947456317e+10+4.0601221211e+09j, 1.1396223503e+10+1.3781131781e+09j, 0.0000000000e+00+0.0000000000e+00j, 0.0000000000e+00+0.0000000000e+00j, 0.0000000000e+00+0.0000000000e+00j, 0.0000000000e+00+0.0000000000e+00j, 0.0000000000e+00+0.0000000000e+00j, 0.0000000000e+00+0.0000000000e+00j, 0.0000000000e+00+0.0000000000e+00j]) imp_coarse_ref = np.array([1.0504062083e+12+0.0000000000e+00j, 2.0781004955e+12+2.7183115978e+09j, 2.0553850965e+12+5.3772054987e+09j, 2.0326663360e+12+7.9766773057e+09j, 2.0099443306e+12+1.0516722825e+10j, 1.9872191969e+12+1.2997338066e+10j, 1.9644910516e+12+1.5418519242e+10j, 1.9417600113e+12+1.7780262770e+10j, 1.9190261924e+12+2.0082565269e+10j, 1.8962897118e+12+2.2325423561e+10j, 1.8735506859e+12+2.4508834674e+10j, 1.8508092314e+12+2.6632795838e+10j, 1.8280654649e+12+2.8697304485e+10j, 1.8053195030e+12+3.0702358252e+10j, 1.7825714624e+12+3.2647954978e+10j, 1.7598214597e+12+3.4534092708e+10j, 1.7370696115e+12+3.6360769688e+10j, 1.7143160345e+12+3.8127984368e+10j, 1.6915608452e+12+3.9835735402e+10j, 1.6688041604e+12+4.1484021645e+10j, 1.6460460966e+12+4.3072842159e+10j, 1.6232867705e+12+4.4602196207e+10j, 1.6005262987e+12+4.6072083256e+10j, 1.5777647978e+12+4.7482502976e+10j, 1.5550023845e+12+4.8833455241e+10j, 1.5322391754e+12+5.0124940128e+10j, 1.5094752871e+12+5.1356957918e+10j, 1.4867108362e+12+5.2529509093e+10j, 1.4639459395e+12+5.3642594342e+10j, 1.4411807134e+12+5.4696214555e+10j, 1.4184152746e+12+5.5690370826e+10j, 1.3956497397e+12+5.6625064451e+10j, 1.3728842254e+12+5.7500296932e+10j, 1.3501188481e+12+5.8316069972e+10j, 1.3273537246e+12+5.9072385477e+10j, 1.3045889714e+12+5.9769245560e+10j, 1.2818247051e+12+6.0406652532e+10j, 1.2590610424e+12+6.0984608912e+10j, 1.2362980996e+12+6.1503117419e+10j, 1.2135359936e+12+6.1962180977e+10j, 1.1907748407e+12+6.2361802713e+10j, 1.1680147576e+12+6.2701985956e+10j, 1.1452558608e+12+6.2982734240e+10j, 1.1224982669e+12+6.3204051301e+10j, 1.0997420924e+12+6.3365941080e+10j, 1.0769874538e+12+6.3468407718e+10j, 1.0542344676e+12+6.3511455561e+10j, 1.0314832504e+12+6.3495089159e+10j, 1.0087339187e+12+6.3419313265e+10j, 9.8598658892e+11+6.3284132832e+10j, 9.6324137757e+11+6.3089553021e+10j, 9.4049840113e+11+6.2835579191e+10j, 9.1775777605e+11+6.2522216909e+10j, 8.9501961879e+11+6.2149471941e+10j, 8.7228404579e+11+6.1717350259e+10j, 8.4955117347e+11+6.1225858036e+10j, 8.2682111826e+11+6.0675001648e+10j, 8.0409399656e+11+6.0064787676e+10j, 7.8136992476e+11+5.9395222903e+10j, 7.5864901923e+11+5.8666314312e+10j, 7.3593139635e+11+5.7878069094e+10j, 7.1321717247e+11+5.7030494640e+10j, 6.9050646392e+11+5.6123598543e+10j, 6.6779938704e+11+5.5157388601e+10j, 6.4509605813e+11+5.4131872814e+10j, 6.2239659348e+11+5.3047059384e+10j, 5.9970110939e+11+5.1902956716e+10j, 5.7700972210e+11+5.0699573420e+10j, 5.5432254788e+11+4.9436918305e+10j, 5.3163970295e+11+4.8115000386e+10j, 5.0896130353e+11+4.6733828878e+10j, 4.8628746583e+11+4.5293413201e+10j, 4.6361830601e+11+4.3793762975e+10j, 4.4095394026e+11+4.2234888026e+10j, 4.1829448472e+11+4.0616798379e+10j, 3.9564005551e+11+3.8939504264e+10j, 3.7299076875e+11+3.7203016111e+10j, 3.5034674052e+11+3.5407344556e+10j, 3.2770808692e+11+3.3552500435e+10j, 3.0507492397e+11+3.1638494786e+10j, 2.8244736773e+11+2.9665338851e+10j, 2.5982553421e+11+2.7633044074e+10j, 2.3720953939e+11+2.5541622099e+10j, 2.1459949925e+11+2.3391084776e+10j, 1.9199552975e+11+2.1181444154e+10j, 1.6939774681e+11+1.8912712486e+10j, 1.4680626634e+11+1.6584902227e+10j, 1.2422120423e+11+1.4198026033e+10j, 1.0164267634e+11+1.1752096764e+10j, 7.9070798521e+10+9.2471274799e+09j, 5.6505686581e+10+6.6831314440e+09j, 3.3947456317e+10+4.0601221211e+09j, 1.1396223503e+10+1.3781131781e+09j, 0.0000000000e+00+0.0000000000e+00j, 0.0000000000e+00+0.0000000000e+00j, 0.0000000000e+00+0.0000000000e+00j, 0.0000000000e+00+0.0000000000e+00j, 0.0000000000e+00+0.0000000000e+00j, 0.0000000000e+00+0.0000000000e+00j, 0.0000000000e+00+0.0000000000e+00j]) np.testing.assert_allclose(imp_fine_meas[:-7], imp_fine_ref[:-7], rtol=1e-8, atol=0, err_msg="In TestTravelingWaveCavity test_beam_fine_coarse," "mismatch in beam impulse response on fine grid") np.testing.assert_allclose(imp_coarse_meas[:-7], imp_coarse_ref[:-7], rtol=1e-8, atol=0, err_msg="In TestTravelingWaveCavity test_beam_fine_coarse," "mismatch in beam impulse response on coarse grid") Vind_fine_meas = (OTFB.V_fine_ind_beam[::1000])[:100] Vind_coarse_meas = OTFB.V_coarse_ind_beam[:100] Vind_fine_ref = np.array([-3.0517578125e-11+2.0599365234e-10j, 1.3119591242e+05+2.5059688582e+02j, 1.2976951147e+05+4.1841300342e+02j, 1.2834289840e+05+5.8249788025e+02j, 1.2691608056e+05+7.4285125172e+02j, 1.2548906524e+05+8.9947286604e+02j, 2.5525777220e+05+1.3029593700e+03j, 2.5240398296e+05+1.6199328833e+03j, 2.4954980612e+05+1.9294427198e+03j, 2.4669525631e+05+2.2314884143e+03j, 2.4384034818e+05+2.5260695271e+03j, 3.7218100878e+05+3.0637825296e+03j, 3.6789902698e+05+3.5112493792e+03j, 3.6361651869e+05+3.9475192402e+03j, 3.5933350586e+05+4.3725915103e+03j, 3.5505001047e+05+4.7864656258e+03j, 4.8196196690e+05+5.4397379469e+03j, 4.7625117134e+05+5.9990303323e+03j, 4.7053974700e+05+6.5433918605e+03j, 4.6482772318e+05+7.0728218563e+03j, 4.5911512918e+05+7.5873196955e+03j, 5.8459790670e+05+8.3374816909e+03j, 5.7745785924e+05+8.9899296666e+03j, 5.7031711736e+05+9.6237126791e+03j, 5.6317571767e+05+1.0238830044e+04j, 5.5603369679e+05+1.0835281141e+04j, 6.8008700374e+05+1.1663662299e+04j, 6.7151744935e+05+1.2390595370e+04j, 6.6294717151e+05+1.3095129455e+04j, 6.5437621413e+05+1.3777263922e+04j, 6.4580462118e+05+1.4436998220e+04j, 7.6842834898e+05+1.5324928756e+04j, 7.5842921570e+05+1.6107677477e+04j, 7.4842936654e+05+1.6864293588e+04j, 7.3842885274e+05+1.7594776578e+04j, 7.2842772557e+05+1.8299126023e+04j, 8.4962194870e+05+1.9227938478e+04j, 8.3819334760e+05+2.0047836046e+04j, 8.2676407480e+05+2.0837868101e+04j, 8.1533418885e+05+2.1598034313e+04j, 8.0390374836e+05+2.2328334456e+04j, 9.2366872430e+05+2.3279365291e+04j, 9.1081094946e+05+2.4117749141e+04j, 8.9795258369e+05+2.4922535614e+04j, 8.8509369287e+05+2.5693724627e+04j, 8.7223434290e+05+2.6431316212e+04j, 9.9057051210e+05+2.7385907402e+04j, 9.7628404055e+05+2.8224120805e+04j, 9.6199709542e+05+2.9025006325e+04j, 9.4770974992e+05+2.9788564189e+04j, 9.3342207725e+05+3.0514794752e+04j, 1.0503300630e+06+3.1454295383e+04j, 1.0346155547e+06+3.2273689037e+04j, 1.0189007267e+06+3.3052025980e+04j, 1.0031856595e+06+3.3789306812e+04j, 9.8747043377e+05+3.4485532275e+04j, 1.1029510423e+06+3.5391300137e+04j, 1.0858093399e+06+3.6173233764e+04j, 1.0686675083e+06+3.6910383847e+04j, 1.0515256353e+06+3.7602751424e+04j, 1.0343838088e+06+3.8250337687e+04j, 1.1484380290e+06+3.9103740866e+04j, 1.1298701579e+06+3.9829584804e+04j, 1.1113023846e+06+4.0506920680e+04j, 1.0927348043e+06+4.1135750033e+04j, 1.0741675120e+06+4.1716074567e+04j, 1.1867965154e+06+4.2498493041e+04j, 1.1668036837e+06+4.3149629836e+04j, 1.1468112133e+06+4.3748536684e+04j, 1.1268192067e+06+4.4295215687e+04j, 1.1068277662e+06+4.4789669129e+04j, 1.2180329068e+06+4.5482496357e+04j, 1.1966165050e+06+4.6040322356e+04j, 1.1752007645e+06+4.6542199472e+04j, 1.1537857950e+06+4.6988130437e+04j, 1.1323717063e+06+4.7378118176e+04j, 1.2421545205e+06+4.7962762689e+04j, 1.2193161215e+06+4.8408689628e+04j, 1.1964787202e+06+4.8794952019e+04j, 1.1736424337e+06+4.9121553285e+04j, 1.1508073790e+06+4.9388497055e+04j, 1.2591695854e+06+4.9846384046e+04j, 1.2349109442e+06+5.0161840642e+04j, 1.2106536737e+06+5.0413920610e+04j, 1.1863978981e+06+5.0602628129e+04j, 1.1621437417e+06+5.0727967597e+04j, 1.2690872411e+06+5.1040540511e+04j, 1.2434102950e+06+5.1206974048e+04j, 1.2177351287e+06+5.1306322781e+04j, 1.1920618739e+06+5.1338591709e+04j, 1.1663906621e+06+5.1303786060e+04j, 1.2719175372e+06+5.1452508178e+04j, 1.2448244051e+06+5.1451386094e+04j, 1.2177768552e+06+5.1349872757e+04j, 1.1920618739e+06+5.1338591709e+04j, 1.1663906621e+06+5.1303786060e+04j, 1.2719175372e+06+5.1452508178e+04j, 1.2448244051e+06+5.1451386094e+04j, 1.2177768552e+06+5.1349872757e+04j, 1.1920618739e+06+5.1338591709e+04j]) Vind_coarse_ref = np.array([65950.402941899 +4.6204946754e+01j, 130474.7043137922+2.6208172207e+02j, 129048.3869868867+4.2802282083e+02j, 127621.8612230706+5.9023291883e+02j, 126195.13434267 +7.4871175790e+02j, 190718.6166082232+9.4966403938e+02j, 253815.81082876 +1.3165564125e+03j, 250962.2071966935+1.6297811521e+03j, 248108.2232953706+1.9355427270e+03j, 245253.8737668068+2.2338406848e+03j, 308349.5761954412+2.5708795450e+03j, 370018.8407123919+3.0701257882e+03j, 365737.1648323309+3.5119715333e+03j, 361454.9734610094+3.9426211057e+03j, 357172.2885629754+4.3620739225e+03j, 418839.5350453047+4.8165343856e+03j, 479080.2303618401+5.4294688706e+03j, 473369.8793500392+5.9812694041e+03j, 467658.9142384843+6.5181402322e+03j, 461947.3643145755+7.0400807053e+03j, 522185.6618082431+7.5932951716e+03j, 580997.3314961634+8.3012499653e+03j, 573857.8855385883+8.9443370849e+03j, 566717.7634868335+9.5687607609e+03j, 559577.0019509497+1.0174520341e+04j, 618386.0404834162+1.0807820183e+04j, 675768.4111833326+1.1592126644e+04j, 667199.6335332314+1.2307831758e+04j, 658630.1544065415+1.3001139804e+04j, 650060.0177352416+1.3672050190e+04j, 707439.6703935305+1.4366767349e+04j, 763392.6518020012+1.5208757723e+04j, 753394.4887644283+1.5978413447e+04j, 743395.635475215 +1.6721938911e+04j, 733396.1431870223+1.7439333649e+04j, 789346.4660944196+1.8176802229e+04j, 843870.1509380381+1.9057811247e+04j, 832442.7318413376+1.9862752998e+04j, 821014.6703180319+2.0637832050e+04j, 809586.0249396971+2.1383048124e+04j, 864107.2572194036+2.2144605992e+04j, 917201.9212158447+2.3045972461e+04j, 904345.5583700862+2.3867540055e+04j, 891488.6375129672+2.4655513581e+04j, 878631.2245326925+2.5409893014e+04j, 931723.7882584379+2.6176883388e+04j, 983389.8900644641+2.7079951792e+04j, 969105.0787068398+2.7899491038e+04j, 954819.8303308268+2.8681706237e+04j, 940534.2181384464+2.9426597680e+04j, 992198.7182720678+3.0180370731e+04j, 1042436.8994184991+3.1066492820e+04j, 1026724.3176456908+3.1865357114e+04j, 1011011.4564100985+3.2623169090e+04j, 995298.3962242305+3.3339929421e+04j, 1045535.6205402148+3.4061843863e+04j, 1094346.7053538668+3.4912380250e+04j, 1077207.2140413758+3.5671932169e+04j, 1060067.6373666434+3.6386705528e+04j, 1042928.0631488134+3.7056701442e+04j, 1091738.982145815 +3.7728126125e+04j, 1139123.977658412 +3.8524447879e+04j, 1120558.6203668672+3.9226060775e+04j, 1101993.4083382622+3.9879171214e+04j, 1083428.4366940013+4.0483780818e+04j, 1130814.2034933397+4.1086096322e+04j, 1176774.2993374085+4.1809586562e+04j, 1156784.3022058595+4.2434646152e+04j, 1136794.717464163 +4.3007482052e+04j, 1116805.6475310936+4.3528096457e+04j, 1162767.5977622345+4.4042696684e+04j, 1207304.1660539836+4.4674752165e+04j, 1185890.9376801767+4.5204658125e+04j, 1164478.425299364 +4.5678622145e+04j, 1143066.738622277 +4.6096647054e+04j, 1187606.39029531 +4.6504940818e+04j, 1230720.9855045064+4.7026973527e+04j, 1207886.116812161 +4.7443141080e+04j, 1185052.3041640767+4.7799651744e+04j, 1162219.6645570078+4.8096509044e+04j, 1205338.7179221238+4.8379921659e+04j, 1247033.0767289733+4.8773360403e+04j, 1222778.3408220657+4.9057221909e+04j, 1198525.0374281076+4.9277715194e+04j, 1174273.2908234247+4.9434844546e+04j, 1215973.628217406 +4.9574819417e+04j, 1256249.6693564458+4.9821111408e+04j, 1230577.0213605044+4.9954117952e+04j, 1204906.2187303253+5.0020048879e+04j, 1179237.3930148352+5.0018909302e+04j, 1219521.0786945666+4.9996909510e+04j, 1258380.9027855818+5.0077521955e+04j, 1231292.4796760113+5.0041144933e+04j, 1204906.2187303249+5.0020048879e+04j, 1179237.3930148345+5.0018909302e+04j, 1219521.0786945664+4.9996909510e+04j, 1258380.9027855818+5.0077521955e+04j, 1231292.4796760113+5.0041144933e+04j, 1204906.2187303246+5.0020048879e+04j, 1179237.3930148345+5.0018909302e+04j]) np.testing.assert_allclose(Vind_fine_meas, Vind_fine_ref, rtol=1e-8, atol=1e-9, err_msg="In TestTravelingWaveCavity test_beam_fine_coarse," "mismatch in beam-induced voltage on fine grid") np.testing.assert_allclose(Vind_coarse_meas, Vind_coarse_ref, rtol=1e-8, atol=0, err_msg="In TestTravelingWaveCavity test_beam_fine_coarse," "mismatch in beam-induced voltage on coarse grid")
# Plot settings plt.rc('axes', labelsize=12, labelweight='normal') plt.rc('lines', linewidth=1.5, markersize=6) plt.rc('font', family='sans-serif') plt.rc('legend', fontsize=12) # Logger for messages on console & in file Logger(debug=True) ring = Ring(C, alpha, p_s, Particle=Proton(), n_turns=1) rf = RFStation(ring, [h], [3.1e6], [dphi]) # SPS-equivalent for 0.57 eVs, 1.65 ns bunch = Beam(ring, N_m, N_p) bigaussian(ring, rf, bunch, sigma_dt=tau_0) # Real RF voltage rf = RFStation(ring, [h], [V], [dphi]) beam = Beam(ring, N_m * NB, N_p * NB) buckets = rf.t_rf[0, 0] * 10 for i in range(0, 144): beam.dt[i * N_m:(i + 1) * N_m] = bunch.dt[0:N_m] + i * buckets + 200 * buckets beam.dE[i * N_m:(i + 1) * N_m] = bunch.dE[0:N_m] #for i in range(0,48): # beam.dt[i*N_m:(i+1)*N_m] = bunch.dt[0:N_m] + i*buckets + 200*buckets # beam.dE[i*N_m:(i+1)*N_m] = bunch.dE[0:N_m] #for i in range(48,96): # beam.dt[i*N_m:(i+1)*N_m] = bunch.dt[0:N_m] + i*buckets + 208*buckets # beam.dE[i*N_m:(i+1)*N_m] = bunch.dE[0:N_m]
n_rf=n_rf_systems) # Beam single_bunch = Beam(ring, n_macroparticles_per_bunch, intensity) beam = Beam(ring, n_macroparticles, intensity * n_bunches) # Profile cut_opt = CutOptions(cut_left=cut_left, cut_right=cut_right, n_slices=n_slices, RFSectionParameters=rf_params) profile = Profile(beam, CutOptions=cut_opt) # DEFINE BEAM------------------------------------------------------------------ bigaussian(ring, rf_params, single_bunch, bunch_length / 4, seed=1) for i in range(n_bunches): beam.dt[int(i * n_macroparticles_per_bunch):int((i + 1) * n_macroparticles_per_bunch)] \ = np.copy(single_bunch.dt[:]) + i*bunch_spacing*rf_params.t_rf[0,0] beam.dE[int(i * n_macroparticles_per_bunch):int( (i + 1) * n_macroparticles_per_bunch)] = np.copy(single_bunch.dE[:]) beam.id = np.arange(n_macroparticles) # Impedance model R_shunt = 1e6 f_res = 915e6 Q_factor = 5000 resonator = Resonators(R_shunt, f_res, Q_factor)
print(" Sigma of RF noise is %.4e" %np.std(RFnoise.dphi)) print(" Time step of RF noise is %.4e" %RFnoise.t[1]) print("") beam = Beam(general_params, N_p, N_b) long_tracker = RingAndRFTracker(rf_params, beam) print("General and RF parameters set...") # Define beam and distribution # Generate new distribution bigaussian(general_params, rf_params, beam, tau_0/4, reinsertion = True, seed=1) print("Beam set and distribution generated...") # Need slices for the Gaussian fit; slice for the first plot slice_beam = Profile(beam, CutOptions(n_slices=100), FitOptions(fit_option='gaussian')) slice_beam.track() # Define what to save in file bunchmonitor = BunchMonitor(general_params, rf_params, beam, this_directory + '../output_files/EX_03_output_data', Profile=slice_beam) # PLOTS
def test_3(self): # Set up SPS conditions ring = Ring(2*np.pi*1100.009, 1/18**2, 25.92e9, Proton(), 1000) RF = RFStation(ring, 4620, 4.5e6, 0) beam = Beam(ring, 1e5, 1e11) bigaussian(ring, RF, beam, 3.2e-9/4, seed = 1234, reinsertion = True) profile = Profile(beam, CutOptions(cut_left=-1.e-9, cut_right=6.e-9, n_slices=100)) profile.track() self.assertEqual(len(beam.dt), np.sum(profile.n_macroparticles), "In" + " TestBeamCurrent: particle number mismatch in Beam vs Profile") # RF current calculation with low-pass filter rf_current = rf_beam_current(profile, 2*np.pi*200.222e6, ring.t_rev[0]) Iref_real = np.array([ -9.4646042539e-12, -7.9596801534e-10, -2.6993572787e-10, 2.3790828610e-09, 6.4007063190e-09, 9.5444302650e-09, 9.6957462918e-09, 6.9944771120e-09, 5.0040512366e-09, 8.2427583408e-09, 1.6487066238e-08, 2.2178930587e-08, 1.6497620890e-08, 1.9878201568e-09, -2.4862807497e-09, 2.0862096916e-08, 6.6115473293e-08, 1.1218114710e-07, 1.5428441607e-07, 2.1264254596e-07, 3.1213935713e-07, 4.6339212948e-07, 6.5039440158e-07, 8.2602190806e-07, 9.4532001396e-07, 1.0161170159e-06, 1.0795840334e-06, 1.1306004256e-06, 1.1081141333e-06, 9.7040873320e-07, 7.1863437325e-07, 3.3833950889e-07, -2.2273124358e-07, -1.0035204008e-06, -1.9962696992e-06, -3.1751183137e-06, -4.5326227784e-06, -6.0940850385e-06, -7.9138578879e-06, -9.9867317826e-06, -1.2114906338e-05, -1.4055138779e-05, -1.5925650405e-05, -1.8096693885e-05, -2.0418813156e-05, -2.2142865862e-05, -2.3038234657e-05, -2.3822481250e-05, -2.4891969829e-05, -2.5543384520e-05, -2.5196086909e-05, -2.4415522211e-05, -2.3869116251e-05, -2.3182951665e-05, -2.1723128723e-05, -1.9724625363e-05, -1.7805112266e-05, -1.5981218737e-05, -1.3906226012e-05, -1.1635865568e-05, -9.5381189596e-06, -7.7236624815e-06, -6.0416822483e-06, -4.4575806261e-06, -3.0779237834e-06, -1.9274519396e-06, -9.5699993457e-07, -1.7840768971e-07, 3.7780452612e-07, 7.5625231388e-07, 1.0158886027e-06, 1.1538975409e-06, 1.1677937652e-06, 1.1105424636e-06, 1.0216131672e-06, 8.8605026541e-07, 7.0783694846e-07, 5.4147914020e-07, 4.1956457226e-07, 3.2130062098e-07, 2.2762751268e-07, 1.4923020411e-07, 9.5683463322e-08, 5.8942895620e-08, 3.0515695233e-08, 1.2444834300e-08, 8.9413517889e-09, 1.6154761941e-08, 2.3261993674e-08, 2.3057968490e-08, 1.8354179928e-08, 1.4938991667e-08, 1.2506841004e-08, 8.1230022648e-09, 3.7428821201e-09, 2.8368110506e-09, 3.6536247240e-09, 2.8429736524e-09, 1.6640835314e-09, 2.3960087967e-09]) I_real = np.around(rf_current.real, 9) # round Iref_real = np.around(Iref_real, 9) self.assertSequenceEqual(I_real.tolist(), Iref_real.tolist(), msg="In TestRFCurrent test_3, mismatch in real part of RF current") Iref_imag = np.array([ -1.3134886055e-11, 1.0898262206e-09, 3.9806900984e-10, -3.0007980073e-09, -7.4404909183e-09, -9.5619658077e-09, -7.9029982105e-09, -4.5153699012e-09, -2.8337010673e-09, -4.0605999910e-09, -5.7035811935e-09, -4.9421561822e-09, -2.6226262365e-09, -1.0904425703e-09, 1.5886725829e-10, 3.6061564044e-09, 1.2213233410e-08, 3.0717134774e-08, 6.2263860975e-08, 1.0789908935e-07, 1.8547368321e-07, 3.3758410599e-07, 5.8319210090e-07, 8.7586115583e-07, 1.1744525681e-06, 1.5330067491e-06, 2.0257108185e-06, 2.6290348930e-06, 3.3065045701e-06, 4.1218136471e-06, 5.1059358251e-06, 6.1421308306e-06, 7.1521192647e-06, 8.2164613957e-06, 9.3474086978e-06, 1.0368027059e-05, 1.1176114701e-05, 1.1892303251e-05, 1.2600522466e-05, 1.3142991032e-05, 1.3286611961e-05, 1.2972067098e-05, 1.2344251145e-05, 1.1561930031e-05, 1.0577353622e-05, 9.1838382917e-06, 7.3302333455e-06, 5.2367297732e-06, 3.1309520147e-06, 1.0396785645e-06, -1.1104442284e-06, -3.3300486963e-06, -5.5129705406e-06, -7.4742790081e-06, -9.1003715719e-06, -1.0458342224e-05, -1.1632423668e-05, -1.2513736332e-05, -1.2942309414e-05, -1.2975831165e-05, -1.2799952495e-05, -1.2469945465e-05, -1.1941176358e-05, -1.1222986380e-05, -1.0349594257e-05, -9.3491445482e-06, -8.2956327726e-06, -7.2394219079e-06, -6.1539590898e-06, -5.0802321519e-06, -4.1512021086e-06, -3.3868884793e-06, -2.6850344653e-06, -2.0327038471e-06, -1.5048854341e-06, -1.0965986189e-06, -7.4914749272e-07, -4.7128817088e-07, -2.9595396024e-07, -1.9387567373e-07, -1.1597751838e-07, -5.5766761837e-08, -2.3991059778e-08, -1.1910924971e-08, -4.7797889603e-09, 9.0715301612e-11, 1.5744084129e-09, 2.8217939283e-09, 5.5919203984e-09, 7.7259433940e-09, 8.5033504655e-09, 9.1509256107e-09, 8.6746085156e-09, 5.8909590412e-09, 3.5957212556e-09, 4.3347189168e-09, 5.3331969589e-09, 3.9322184713e-09, 3.3616434953e-09, 6.5154351819e-09]) I_imag = np.around(rf_current.imag, 9) # round Iref_imag = np.around(Iref_imag, 9) self.assertSequenceEqual(I_imag.tolist(), Iref_imag.tolist(), msg="In TestRFCurrent test_3, mismatch in imaginary part of RF current")
def test_vind(self): # randomly chose omega_c from allowed range np.random.seed(1980) factor = np.random.uniform(0.9, 1.1) # round results to this digits digit_round = 8 # SPS parameters C = 2*np.pi*1100.009 # Ring circumference [m] gamma_t = 18.0 # Gamma at transition alpha = 1/gamma_t**2 # Momentum compaction factor p_s = 25.92e9 # Synchronous momentum at injection [eV] h = 4620 # 200 MHz system harmonic V = 4.5e6 # 200 MHz RF voltage phi = 0. # 200 MHz RF phase # Beam and tracking parameters N_m = 1e5 # Number of macro-particles for tracking N_b = 1.0e11 # Bunch intensity [ppb] N_t = 1 # Number of turns to track ring = Ring(C, alpha, p_s, Proton(), n_turns=N_t) rf = RFStation(ring, h, V, phi) beam = Beam(ring, N_m, N_b) bigaussian(ring, rf, beam, 3.2e-9/4, seed=1234, reinsertion=True) n_shift = 5 # how many rf-buckets to shift beam beam.dt += n_shift * rf.t_rf[0,0] profile = Profile(beam, CutOptions= CutOptions(cut_left=(n_shift-1.5)*rf.t_rf[0,0], cut_right=(n_shift+1.5)*rf.t_rf[0,0], n_slices=140)) profile.track() l_cav = 16.082 v_g = 0.0946 tau = l_cav/(v_g*c)*(1 + v_g) TWC_impedance_source = TravelingWaveCavity(l_cav**2 * 27.1e3 / 8, 200.222e6, 2*np.pi*tau) # Beam loading by convolution of beam and wake from cavity inducedVoltageTWC = InducedVoltageTime(beam, profile, [TWC_impedance_source]) induced_voltage = TotalInducedVoltage(beam, profile, [inducedVoltageTWC]) induced_voltage.induced_voltage_sum() V_ind_impSource = np.around(induced_voltage.induced_voltage, digit_round) # Beam loading via feed-back system OTFB_4 = SPSOneTurnFeedback(rf, beam, profile, 4, n_cavities=1) OTFB_4.counter = 0 # First turn OTFB_4.omega_c = factor * OTFB_4.TWC.omega_r # Compute impulse response OTFB_4.TWC.impulse_response_beam(OTFB_4.omega_c, profile.bin_centers) # Compute induced voltage in (I,Q) coordinates OTFB_4.beam_induced_voltage(lpf=False) # convert back to time V_ind_OTFB \ = OTFB_4.V_fine_ind_beam.real \ * np.cos(OTFB_4.omega_c*profile.bin_centers) \ + OTFB_4.V_fine_ind_beam.imag \ * np.sin(OTFB_4.omega_c*profile.bin_centers) V_ind_OTFB = np.around(V_ind_OTFB, digit_round) self.assertListEqual(V_ind_impSource.tolist(), V_ind_OTFB.tolist(), msg="In TravelingWaveCavity test_vind: induced voltages differ")
RF_sct_par_freq = RFStation(general_params_freq, [harmonic_number], [voltage_program], [phi_offset], n_rf_systems) RF_sct_par_res = RFStation(general_params_res, [harmonic_number], [voltage_program], [phi_offset], n_rf_systems) my_beam = Beam(general_params, n_macroparticles, n_particles) my_beam_freq = Beam(general_params_freq, n_macroparticles, n_particles) my_beam_res = Beam(general_params_res, n_macroparticles, n_particles) ring_RF_section = RingAndRFTracker(RF_sct_par, my_beam) ring_RF_section_freq = RingAndRFTracker(RF_sct_par_freq, my_beam_freq) ring_RF_section_res = RingAndRFTracker(RF_sct_par_res, my_beam_res) # DEFINE BEAM------------------------------------------------------------------ bigaussian(general_params, RF_sct_par, my_beam, tau_0 / 4, seed=1) bigaussian(general_params_freq, RF_sct_par_freq, my_beam_freq, tau_0 / 4, seed=1) bigaussian(general_params_res, RF_sct_par_res, my_beam_res, tau_0 / 4, seed=1) number_slices = 2**8 cut_options = CutOptions(cut_left=0, cut_right=2 * np.pi, n_slices=number_slices, RFSectionParameters=RF_sct_par, cuts_unit='rad') slice_beam = Profile(my_beam, cut_options, FitOptions(fit_option='gaussian')) cut_options_freq = CutOptions(cut_left=0,
def test_2(self): bigaussian(self.ring, self.rf, self.beam, 3.2e-9 / 4, seed=1234, reinsertion=True) self.profile.track() rf_current = rf_beam_current(self.profile, self.omega, self.ring.t_rev[0], lpf=False) Iref_real = np.array([ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 4.17276535e-13, 4.58438681e-13, 2.48023976e-13, 5.29812878e-13, 2.79735891e-13, 0.00000000e+00, 1.21117141e-12, 9.32525023e-13, 3.16481489e-13, 6.39337176e-13, 0.00000000e+00, 0.00000000e+00, 4.08671434e-12, 4.92294314e-12, 6.56965575e-12, 1.06279981e-11, 1.36819774e-11, 2.16648778e-11, 3.09847740e-11, 3.52971849e-11, 4.70378842e-11, 4.53538351e-11, 4.87255679e-11, 5.36705228e-11, 5.13609263e-11, 4.32833543e-11, 3.41417624e-11, 1.57452091e-11, -1.09005668e-11, -4.60465929e-11, -9.12872553e-11, -1.48257171e-10, -2.08540597e-10, -2.77630608e-10, -3.72157667e-10, -4.56272786e-10, -5.57978710e-10, -6.46554672e-10, -7.48006839e-10, -8.21493943e-10, -9.37522966e-10, -1.03729659e-09, -1.06159943e-09, -1.08434837e-09, -1.15738771e-09, -1.17887328e-09, -1.17146946e-09, -1.10964397e-09, -1.10234198e-09, -1.08852433e-09, -9.85866185e-10, -9.11727492e-10, -8.25604179e-10, -7.34122902e-10, -6.47294094e-10, -5.30372699e-10, -4.40357820e-10, -3.61273445e-10, -2.76871612e-10, -2.02227691e-10, -1.45430219e-10, -8.88675652e-11, -4.28984525e-11, -8.85451321e-12, 1.79026289e-11, 3.48384211e-11, 4.50190278e-11, 5.62413467e-11, 5.27322593e-11, 4.98163111e-11, 4.83288193e-11, 4.18200848e-11, 3.13334266e-11, 2.44082106e-11, 2.12572803e-11, 1.37397871e-11, 1.00879346e-11, 7.78502206e-12, 4.00790815e-12, 2.51830412e-12, 1.91301488e-12, 0.00000000e+00, 9.58518921e-13, 3.16123806e-13, 1.24116545e-12, 1.20821671e-12, 5.82952178e-13, 8.35917228e-13, 5.27285250e-13, 4.93205915e-13, 0.00000000e+00, 2.06937011e-13, 1.84618141e-13, 1.60868490e-13, 0.00000000e+00, 1.09822742e-13 ]) I_real = np.around(rf_current.real, 14) # round Iref_real = np.around(Iref_real, 14) self.assertSequenceEqual( I_real.tolist(), Iref_real.tolist(), msg="In TestRFCurrent test_2, mismatch in real part of RF current") Iref_imag = np.array([ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -4.86410815e-13, -4.47827158e-13, -2.02886432e-13, -3.60573852e-13, -1.56290206e-13, 0.00000000e+00, -4.19433613e-13, -2.33465744e-13, -5.01823105e-14, -4.43075921e-14, 0.00000000e+00, 0.00000000e+00, 8.07144709e-13, 1.43192280e-12, 2.55659168e-12, 5.25480064e-12, 8.33669524e-12, 1.59729353e-11, 2.73609511e-11, 3.71844853e-11, 5.92134758e-11, 6.87376280e-11, 9.02226570e-11, 1.24465616e-10, 1.55478762e-10, 1.84035433e-10, 2.37241518e-10, 2.86677989e-10, 3.28265272e-10, 3.77882012e-10, 4.29727720e-10, 4.83759029e-10, 5.13978173e-10, 5.41841031e-10, 5.91537968e-10, 6.00658643e-10, 6.13928028e-10, 5.96367636e-10, 5.76920099e-10, 5.25297875e-10, 4.89104065e-10, 4.29776324e-10, 3.33901906e-10, 2.38690921e-10, 1.49673305e-10, 4.78223853e-11, -5.57081558e-11, -1.51374774e-10, -2.50724894e-10, -3.50731761e-10, -4.16547058e-10, -4.83765618e-10, -5.36075032e-10, -5.74421794e-10, -6.05459147e-10, -5.91794283e-10, -5.88179055e-10, -5.83222843e-10, -5.49774151e-10, -5.08571646e-10, -4.86623358e-10, -4.33179012e-10, -3.73737133e-10, -3.37622742e-10, -2.89119788e-10, -2.30660798e-10, -1.85597518e-10, -1.66348322e-10, -1.19981335e-10, -9.07232680e-11, -7.21467862e-11, -5.18977454e-11, -3.25510912e-11, -2.12524272e-11, -1.54447488e-11, -8.24107056e-12, -4.90052047e-12, -2.96720377e-12, -1.13551262e-12, -4.79152734e-13, -1.91861296e-13, 0.00000000e+00, 7.31481456e-14, 5.23883203e-14, 3.19951675e-13, 4.27870459e-13, 2.66236636e-13, 4.74712082e-13, 3.64260145e-13, 4.09222572e-13, 0.00000000e+00, 2.44654594e-13, 2.61906356e-13, 2.77128356e-13, 0.00000000e+00, 3.01027843e-13 ]) I_imag = np.around(rf_current.imag, 14) # round Iref_imag = np.around(Iref_imag, 14) self.assertSequenceEqual( I_imag.tolist(), Iref_imag.tolist(), msg="In TestRFCurrent test_2, mismatch in imaginary part of" + " RF current")
[phi_offset], n_rf_systems) RF_sct_par_res = RFStation(general_params_res, [harmonic_number], [voltage_program], [phi_offset], n_rf_systems) my_beam = Beam(general_params, n_macroparticles, n_particles) my_beam_freq = Beam(general_params_freq, n_macroparticles, n_particles) my_beam_res = Beam(general_params_res, n_macroparticles, n_particles) ring_RF_section = RingAndRFTracker(RF_sct_par, my_beam) ring_RF_section_freq = RingAndRFTracker(RF_sct_par_freq, my_beam_freq) ring_RF_section_res = RingAndRFTracker(RF_sct_par_res, my_beam_res) # DEFINE BEAM------------------------------------------------------------------ bigaussian(general_params, RF_sct_par, my_beam, tau_0/4, seed=1) bigaussian(general_params_freq, RF_sct_par_freq, my_beam_freq, tau_0/4, seed=1) bigaussian(general_params_res, RF_sct_par_res, my_beam_res, tau_0/4, seed=1) number_slices = 2**8 cut_options = CutOptions(cut_left= 0, cut_right=2*np.pi, n_slices=number_slices, RFSectionParameters=RF_sct_par, cuts_unit = 'rad') slice_beam = Profile(my_beam, cut_options, FitOptions(fit_option='gaussian')) cut_options_freq = CutOptions(cut_left= 0, cut_right=2*np.pi, n_slices=number_slices, RFSectionParameters=RF_sct_par_freq, cuts_unit = 'rad') slice_beam_freq = Profile(my_beam_freq, cut_options_freq, FitOptions(fit_option='gaussian')) cut_options_res = CutOptions(cut_left= 0, cut_right=2*np.pi, n_slices=number_slices, RFSectionParameters=ring_RF_section_res, cuts_unit = 'rad') slice_beam_res = Profile(my_beam_res, cut_options_res, FitOptions(fit_option='gaussian'))
def test_3(self): bigaussian(self.ring, self.rf, self.beam, 3.2e-9 / 4, seed=1234, reinsertion=True) self.profile.track() self.assertEqual( len(self.beam.dt), np.sum(self.profile.n_macroparticles), "In" + " TestBeamCurrent: particle number mismatch in Beam vs Profile") # RF current calculation with low-pass filter rf_current = rf_beam_current(self.profile, self.omega, self.ring.t_rev[0], lpf=True) Iref_real = np.array([ -7.1511909689e-12, -7.1512708858e-12, -7.1513482919e-12, -7.1514232388e-12, -7.1514957777e-12, -7.1515659593e-12, -7.1516338342e-12, -7.1516994523e-12, -7.1517628634e-12, -7.1518241168e-12, -7.1518832613e-12, -7.1519403454e-12, -7.1519954170e-12, -7.1520485239e-12, -7.1520997131e-12, -7.1521490313e-12, -7.1521965247e-12, -7.1522422392e-12, -7.1522862199e-12, -7.1523285117e-12, -7.1523691587e-12, -7.1524082048e-12, -7.1524456933e-12, -7.1524816668e-12, -7.1525161676e-12, -7.1525492372e-12, -7.1525809169e-12, -7.1526112471e-12, -7.1526402679e-12, -7.1526680187e-12, -7.1526945383e-12, -7.1527198650e-12, -7.1527440365e-12, -7.1527670898e-12, -7.1527890615e-12, -7.1528099874e-12, -7.1528299028e-12, -7.1528488424e-12, -7.1528668402e-12, -7.1528839295e-12, -7.1529001433e-12, -7.1529155136e-12, -7.1529300719e-12, -7.1529438491e-12, -7.1529568755e-12, -7.1529691807e-12, -7.1529807935e-12, -7.1529917422e-12, -7.1530020545e-12, -7.1530117574e-12, -7.1530208772e-12, -7.1530294395e-12, -7.1530374694e-12, -7.1530449913e-12, -7.1530520287e-12, -7.1530586049e-12, -7.1530647421e-12, -7.1530704621e-12, -7.1530757860e-12, -7.1530807343e-12, -7.1530853267e-12, -7.1530895824e-12, -7.1530935199e-12, -7.1530971572e-12, -7.1531005114e-12, -7.1531035991e-12, -7.1531064365e-12, -7.1531090389e-12, -7.1531114211e-12, -7.1531135972e-12, -7.1531155809e-12, -7.1531173853e-12, -7.1531190226e-12, -7.1531205049e-12, -7.1531218433e-12, -7.1531230488e-12, -7.1531241314e-12, -7.1531251010e-12, -7.1531259666e-12, -7.1531267370e-12, -7.1531274203e-12, -7.1531280242e-12, -7.1531285560e-12, -7.1531290223e-12, -7.1531294297e-12, -7.1531297839e-12, -7.1531300904e-12, -7.1531303544e-12, -7.1531305805e-12, -7.1531307730e-12, -7.1531309360e-12, -7.1531310731e-12, -7.1531311875e-12, -7.1531312824e-12, -7.1531313603e-12, -7.1531314238e-12, -7.1531314750e-12, -7.1531315159e-12, -7.1531315482e-12, -7.1531315733e-12 ]) np.testing.assert_allclose( rf_current.real, Iref_real, rtol=1e-6, atol=0, err_msg= "In TestRFCurrent test_3, mismatch in real part of RF current") Iref_imag = np.array([ -2.1797211489e-12, -2.1796772456e-12, -2.1796347792e-12, -2.1795937182e-12, -2.1795540314e-12, -2.1795156879e-12, -2.1794786570e-12, -2.1794429085e-12, -2.1794084122e-12, -2.1793751384e-12, -2.1793430575e-12, -2.1793121404e-12, -2.1792823581e-12, -2.1792536822e-12, -2.1792260843e-12, -2.1791995365e-12, -2.1791740112e-12, -2.1791494811e-12, -2.1791259193e-12, -2.1791032992e-12, -2.1790815944e-12, -2.1790607792e-12, -2.1790408280e-12, -2.1790217154e-12, -2.1790034169e-12, -2.1789859077e-12, -2.1789691639e-12, -2.1789531618e-12, -2.1789378779e-12, -2.1789232894e-12, -2.1789093736e-12, -2.1788961083e-12, -2.1788834718e-12, -2.1788714425e-12, -2.1788599995e-12, -2.1788491222e-12, -2.1788387903e-12, -2.1788289840e-12, -2.1788196838e-12, -2.1788108708e-12, -2.1788025262e-12, -2.1787946320e-12, -2.1787871702e-12, -2.1787801236e-12, -2.1787734750e-12, -2.1787672079e-12, -2.1787613061e-12, -2.1787557538e-12, -2.1787505357e-12, -2.1787456369e-12, -2.1787410427e-12, -2.1787367390e-12, -2.1787327121e-12, -2.1787289486e-12, -2.1787254356e-12, -2.1787221605e-12, -2.1787191111e-12, -2.1787162758e-12, -2.1787136430e-12, -2.1787112020e-12, -2.1787089419e-12, -2.1787068527e-12, -2.1787049244e-12, -2.1787031475e-12, -2.1787015131e-12, -2.1787000122e-12, -2.1786986365e-12, -2.1786973779e-12, -2.1786962288e-12, -2.1786951818e-12, -2.1786942299e-12, -2.1786933662e-12, -2.1786925846e-12, -2.1786918789e-12, -2.1786912433e-12, -2.1786906724e-12, -2.1786901610e-12, -2.1786897043e-12, -2.1786892977e-12, -2.1786889367e-12, -2.1786886175e-12, -2.1786883361e-12, -2.1786880890e-12, -2.1786878729e-12, -2.1786876847e-12, -2.1786875215e-12, -2.1786873806e-12, -2.1786872597e-12, -2.1786871564e-12, -2.1786870686e-12, -2.1786869946e-12, -2.1786869325e-12, -2.1786868808e-12, -2.1786868381e-12, -2.1786868031e-12, -2.1786867746e-12, -2.1786867517e-12, -2.1786867335e-12, -2.1786867192e-12, -2.1786867081e-12 ]) np.testing.assert_allclose( rf_current.imag, Iref_imag, rtol=1e-6, atol=0, err_msg= "In TestRFCurrent test_3, mismatch in imaginary part of RF current" )
def test_3(self): # Set up SPS conditions ring = Ring(2 * np.pi * 1100.009, 1 / 18**2, 25.92e9, Proton(), 1000) RF = RFStation(ring, 4620, 4.5e6, 0) beam = Beam(ring, 1e5, 1e11) bigaussian(ring, RF, beam, 3.2e-9 / 4, seed=1234, reinsertion=True) profile = Profile( beam, CutOptions(cut_left=-1.e-9, cut_right=6.e-9, n_slices=100)) profile.track() self.assertEqual( len(beam.dt), np.sum(profile.n_macroparticles), "In" + " TestBeamCurrent: particle number mismatch in Beam vs Profile") # RF current calculation with low-pass filter rf_current = rf_beam_current(profile, 2 * np.pi * 200.222e6, ring.t_rev[0]) Iref_real = np.array([ -9.4646042539e-12, -7.9596801534e-10, -2.6993572787e-10, 2.3790828610e-09, 6.4007063190e-09, 9.5444302650e-09, 9.6957462918e-09, 6.9944771120e-09, 5.0040512366e-09, 8.2427583408e-09, 1.6487066238e-08, 2.2178930587e-08, 1.6497620890e-08, 1.9878201568e-09, -2.4862807497e-09, 2.0862096916e-08, 6.6115473293e-08, 1.1218114710e-07, 1.5428441607e-07, 2.1264254596e-07, 3.1213935713e-07, 4.6339212948e-07, 6.5039440158e-07, 8.2602190806e-07, 9.4532001396e-07, 1.0161170159e-06, 1.0795840334e-06, 1.1306004256e-06, 1.1081141333e-06, 9.7040873320e-07, 7.1863437325e-07, 3.3833950889e-07, -2.2273124358e-07, -1.0035204008e-06, -1.9962696992e-06, -3.1751183137e-06, -4.5326227784e-06, -6.0940850385e-06, -7.9138578879e-06, -9.9867317826e-06, -1.2114906338e-05, -1.4055138779e-05, -1.5925650405e-05, -1.8096693885e-05, -2.0418813156e-05, -2.2142865862e-05, -2.3038234657e-05, -2.3822481250e-05, -2.4891969829e-05, -2.5543384520e-05, -2.5196086909e-05, -2.4415522211e-05, -2.3869116251e-05, -2.3182951665e-05, -2.1723128723e-05, -1.9724625363e-05, -1.7805112266e-05, -1.5981218737e-05, -1.3906226012e-05, -1.1635865568e-05, -9.5381189596e-06, -7.7236624815e-06, -6.0416822483e-06, -4.4575806261e-06, -3.0779237834e-06, -1.9274519396e-06, -9.5699993457e-07, -1.7840768971e-07, 3.7780452612e-07, 7.5625231388e-07, 1.0158886027e-06, 1.1538975409e-06, 1.1677937652e-06, 1.1105424636e-06, 1.0216131672e-06, 8.8605026541e-07, 7.0783694846e-07, 5.4147914020e-07, 4.1956457226e-07, 3.2130062098e-07, 2.2762751268e-07, 1.4923020411e-07, 9.5683463322e-08, 5.8942895620e-08, 3.0515695233e-08, 1.2444834300e-08, 8.9413517889e-09, 1.6154761941e-08, 2.3261993674e-08, 2.3057968490e-08, 1.8354179928e-08, 1.4938991667e-08, 1.2506841004e-08, 8.1230022648e-09, 3.7428821201e-09, 2.8368110506e-09, 3.6536247240e-09, 2.8429736524e-09, 1.6640835314e-09, 2.3960087967e-09 ]) I_real = np.around(rf_current.real, 9) # round Iref_real = np.around(Iref_real, 9) self.assertSequenceEqual( I_real.tolist(), Iref_real.tolist(), msg="In TestRFCurrent test_3, mismatch in real part of RF current") Iref_imag = np.array([ -1.3134886055e-11, 1.0898262206e-09, 3.9806900984e-10, -3.0007980073e-09, -7.4404909183e-09, -9.5619658077e-09, -7.9029982105e-09, -4.5153699012e-09, -2.8337010673e-09, -4.0605999910e-09, -5.7035811935e-09, -4.9421561822e-09, -2.6226262365e-09, -1.0904425703e-09, 1.5886725829e-10, 3.6061564044e-09, 1.2213233410e-08, 3.0717134774e-08, 6.2263860975e-08, 1.0789908935e-07, 1.8547368321e-07, 3.3758410599e-07, 5.8319210090e-07, 8.7586115583e-07, 1.1744525681e-06, 1.5330067491e-06, 2.0257108185e-06, 2.6290348930e-06, 3.3065045701e-06, 4.1218136471e-06, 5.1059358251e-06, 6.1421308306e-06, 7.1521192647e-06, 8.2164613957e-06, 9.3474086978e-06, 1.0368027059e-05, 1.1176114701e-05, 1.1892303251e-05, 1.2600522466e-05, 1.3142991032e-05, 1.3286611961e-05, 1.2972067098e-05, 1.2344251145e-05, 1.1561930031e-05, 1.0577353622e-05, 9.1838382917e-06, 7.3302333455e-06, 5.2367297732e-06, 3.1309520147e-06, 1.0396785645e-06, -1.1104442284e-06, -3.3300486963e-06, -5.5129705406e-06, -7.4742790081e-06, -9.1003715719e-06, -1.0458342224e-05, -1.1632423668e-05, -1.2513736332e-05, -1.2942309414e-05, -1.2975831165e-05, -1.2799952495e-05, -1.2469945465e-05, -1.1941176358e-05, -1.1222986380e-05, -1.0349594257e-05, -9.3491445482e-06, -8.2956327726e-06, -7.2394219079e-06, -6.1539590898e-06, -5.0802321519e-06, -4.1512021086e-06, -3.3868884793e-06, -2.6850344653e-06, -2.0327038471e-06, -1.5048854341e-06, -1.0965986189e-06, -7.4914749272e-07, -4.7128817088e-07, -2.9595396024e-07, -1.9387567373e-07, -1.1597751838e-07, -5.5766761837e-08, -2.3991059778e-08, -1.1910924971e-08, -4.7797889603e-09, 9.0715301612e-11, 1.5744084129e-09, 2.8217939283e-09, 5.5919203984e-09, 7.7259433940e-09, 8.5033504655e-09, 9.1509256107e-09, 8.6746085156e-09, 5.8909590412e-09, 3.5957212556e-09, 4.3347189168e-09, 5.3331969589e-09, 3.9322184713e-09, 3.3616434953e-09, 6.5154351819e-09 ]) I_imag = np.around(rf_current.imag, 9) # round Iref_imag = np.around(Iref_imag, 9) self.assertSequenceEqual( I_imag.tolist(), Iref_imag.tolist(), msg= "In TestRFCurrent test_3, mismatch in imaginary part of RF current" )
section_index=2) long_tracker_2 = RingAndRFTracker(rf_params_2, beam) # Define full voltage over one turn and a corresponding "overall" set of #parameters, which is used for the separatrix (in plotting and losses) Vtot = total_voltage([rf_params_1, rf_params_2]) rf_params_tot = RFStation(general_params, [h], [Vtot], [dphi]) beam_dummy = Beam(general_params, 1, N_b) long_tracker_tot = RingAndRFTracker(rf_params_tot, beam_dummy) print("General and RF parameters set...") # Define beam and distribution bigaussian(general_params, rf_params_tot, beam, tau_0/4, reinsertion = 'on', seed=1) print("Beam set and distribution generated...") # Need slices for the Gaussian fit; slice for the first plot slice_beam = Profile(beam, CutOptions(n_slices=100), FitOptions(fit_option='gaussian')) # Define what to save in file bunchmonitor = BunchMonitor(general_params, rf_params_tot, beam, this_directory + '../output_files/EX_04_output_data', Profile=slice_beam, buffer_time=1) # PLOTS format_options = {'dirname': this_directory + '../output_files/EX_04_fig', 'linestyle': '.'} plots = Plot(general_params, rf_params_tot, beam, dt_plt, dt_plt, 0,
voltage_program = 8e3 #[V] phi_offset = np.pi # DEFINE RING------------------------------------------------------------------ general_params = Ring(C, momentum_compaction, sync_momentum, Proton(), n_turns) RF_sct_par = RFStation(general_params, [harmonic_numbers], [voltage_program], [phi_offset], n_rf_systems) my_beam = Beam(general_params, n_macroparticles, n_particles) ring_RF_section = RingAndRFTracker(RF_sct_par, my_beam) # DEFINE BEAM------------------------------------------------------------------ bigaussian(general_params, RF_sct_par, my_beam, sigma_dt, seed=1) # DEFINE SLICES---------------------------------------------------------------- slice_beam = Profile( my_beam, CutOptions(cut_left=-5.72984173562e-7, cut_right=5.72984173562e-7, n_slices=100)) # MONITOR---------------------------------------------------------------------- bunchmonitor = BunchMonitor(general_params, RF_sct_par, my_beam, this_directory + '../output_files/EX_02_output_data',
def setUp(self): C = 2*np.pi*1100.009 # Ring circumference [m] gamma_t = 18.0 # Gamma at transition alpha = 1/gamma_t**2 # Momentum compaction factor p_s = 25.92e9 # Synchronous momentum at injection [eV] h = 4620 # 200 MHz system harmonic phi = 0. # 200 MHz RF phase # With this setting, amplitude in the two four-section, five-section # cavities must converge, respectively, to # 2.0 MV = 4.5 MV * 4/18 * 2 # 2.5 MV = 4.5 MV * 5/18 * 2 V = 4.5e6 # 200 MHz RF voltage N_t = 1 # Number of turns to track self.ring = Ring(C, alpha, p_s, Particle=Proton(), n_turns=N_t) self.rf = RFStation(self.ring, h, V, phi) N_m = 1e6 # Number of macro-particles for tracking N_b = 72*1.0e11 # Bunch intensity [ppb] # Gaussian beam profile self.beam = Beam(self.ring, N_m, N_b) sigma = 1.0e-9 bigaussian(self.ring, self.rf, self.beam, sigma, seed=1234, reinsertion=False) n_shift = 1550 # how many rf-buckets to shift beam self.beam.dt += n_shift * self.rf.t_rf[0,0] self.profile = Profile( self.beam, CutOptions=CutOptions( cut_left=(n_shift-1.5)*self.rf.t_rf[0,0], cut_right=(n_shift+2.5)*self.rf.t_rf[0,0], n_slices=4*64)) self.profile.track() # Cavities l_cav = 43*0.374 v_g = 0.0946 tau = l_cav/(v_g*c)*(1 + v_g) f_cav = 200.222e6 n_cav = 2 # factor 2 because of two four/five-sections cavities short_cavity = TravelingWaveCavity(l_cav**2 * n_cav * 27.1e3 / 8, f_cav, 2*np.pi*tau) shortInducedVoltage = InducedVoltageTime(self.beam, self.profile, [short_cavity]) l_cav = 54*0.374 tau = l_cav/(v_g*c)*(1 + v_g) long_cavity = TravelingWaveCavity(l_cav**2 * n_cav * 27.1e3 / 8, f_cav, 2*np.pi*tau) longInducedVoltage = InducedVoltageTime(self.beam, self.profile, [long_cavity]) self.induced_voltage = TotalInducedVoltage( self.beam, self.profile, [shortInducedVoltage, longInducedVoltage]) self.induced_voltage.induced_voltage_sum() self.cavity_tracker = RingAndRFTracker( self.rf, self.beam, Profile=self.profile, interpolation=True, TotalInducedVoltage=self.induced_voltage) self.OTFB = SPSCavityFeedback( self.rf, self.beam, self.profile, G_llrf=5, G_tx=0.5, a_comb=15/16, turns=50, Commissioning=CavityFeedbackCommissioning()) self.OTFB_tracker = RingAndRFTracker(self.rf, self.beam, Profile=self.profile, TotalInducedVoltage=None, CavityFeedback=self.OTFB, interpolation=True)
def setUp(self): C = 2*np.pi*1100.009 # Ring circumference [m] gamma_t = 18.0 # Gamma at transition alpha = 1/gamma_t**2 # Momentum compaction factor p_s = 25.92e9 # Synchronous momentum at injection [eV] h = 4620 # 200 MHz system harmonic phi = 0. # 200 MHz RF phase # With this setting, amplitude in the two four-section, five-section # cavities must converge, respectively, to # 2.0 MV = 4.5 MV * 4/18 * 2 # 2.5 MV = 4.5 MV * 5/18 * 2 V = 4.5e6 # 200 MHz RF voltage N_t = 1 # Number of turns to track self.ring = Ring(C, alpha, p_s, Particle=Proton(), n_turns=N_t) self.rf = RFStation(self.ring, h, V, phi) N_m = 1e6 # Number of macro-particles for tracking N_b = 72*1.0e11 # Bunch intensity [ppb] # Gaussian beam profile self.beam = Beam(self.ring, N_m, N_b) sigma = 1.0e-9 bigaussian(self.ring, self.rf, self.beam, sigma, seed=1234, reinsertion=False) n_shift = 1550 # how many rf-buckets to shift beam self.beam.dt += n_shift * self.rf.t_rf[0, 0] self.profile = Profile( self.beam, CutOptions=CutOptions( cut_left=(n_shift-1.5)*self.rf.t_rf[0, 0], cut_right=(n_shift+2.5)*self.rf.t_rf[0, 0], n_slices=4*64)) self.profile.track() # Cavities l_cav = 43*0.374 v_g = 0.0946 tau = l_cav/(v_g*c)*(1 + v_g) f_cav = 200.222e6 n_cav = 2 # factor 2 because of two four/five-sections cavities short_cavity = TravelingWaveCavity(l_cav**2 * n_cav * 27.1e3 / 8, f_cav, 2*np.pi*tau) shortInducedVoltage = InducedVoltageTime(self.beam, self.profile, [short_cavity]) l_cav = 54*0.374 tau = l_cav/(v_g*c)*(1 + v_g) long_cavity = TravelingWaveCavity(l_cav**2 * n_cav * 27.1e3 / 8, f_cav, 2*np.pi*tau) longInducedVoltage = InducedVoltageTime(self.beam, self.profile, [long_cavity]) self.induced_voltage = TotalInducedVoltage( self.beam, self.profile, [shortInducedVoltage, longInducedVoltage]) self.induced_voltage.induced_voltage_sum() self.cavity_tracker = RingAndRFTracker( self.rf, self.beam, Profile=self.profile, interpolation=True, TotalInducedVoltage=self.induced_voltage) self.OTFB = SPSCavityFeedback( self.rf, self.beam, self.profile, G_llrf=5, G_tx=0.5, a_comb=15/16, turns=50, Commissioning=CavityFeedbackCommissioning()) self.OTFB_tracker = RingAndRFTracker(self.rf, self.beam, Profile=self.profile, TotalInducedVoltage=None, CavityFeedback=self.OTFB, interpolation=True)
def test_vind(self): # randomly chose omega_c from allowed range np.random.seed(1980) factor = np.random.uniform(0.9, 1.1) # round results to this digits digit_round = 8 # SPS parameters C = 2 * np.pi * 1100.009 # Ring circumference [m] gamma_t = 18.0 # Gamma at transition alpha = 1 / gamma_t**2 # Momentum compaction factor p_s = 25.92e9 # Synchronous momentum at injection [eV] h = 4620 # 200 MHz system harmonic V = 4.5e6 # 200 MHz RF voltage phi = 0. # 200 MHz RF phase # Beam and tracking parameters N_m = 1e5 # Number of macro-particles for tracking N_b = 1.0e11 # Bunch intensity [ppb] N_t = 1 # Number of turns to track ring = Ring(C, alpha, p_s, Proton(), n_turns=N_t) rf = RFStation(ring, h, V, phi) beam = Beam(ring, N_m, N_b) bigaussian(ring, rf, beam, 3.2e-9 / 4, seed=1234, reinsertion=True) n_shift = 5 # how many rf-buckets to shift beam beam.dt += n_shift * rf.t_rf[0, 0] profile = Profile(beam, CutOptions=CutOptions( cut_left=(n_shift - 1.5) * rf.t_rf[0, 0], cut_right=(n_shift + 1.5) * rf.t_rf[0, 0], n_slices=140)) profile.track() l_cav = 16.082 v_g = 0.0946 tau = l_cav / (v_g * c) * (1 + v_g) TWC_impedance_source = TravelingWaveCavity(l_cav**2 * 27.1e3 / 8, 200.222e6, 2 * np.pi * tau) # Beam loading by convolution of beam and wake from cavity inducedVoltageTWC = InducedVoltageTime(beam, profile, [TWC_impedance_source]) induced_voltage = TotalInducedVoltage(beam, profile, [inducedVoltageTWC]) induced_voltage.induced_voltage_sum() V_ind_impSource = np.around(induced_voltage.induced_voltage, digit_round) # Beam loading via feed-back system OTFB_4 = SPSOneTurnFeedback(rf, beam, profile, 4, n_cavities=1) OTFB_4.counter = 0 # First turn OTFB_4.omega_c = factor * OTFB_4.TWC.omega_r # Compute impulse response OTFB_4.TWC.impulse_response_beam(OTFB_4.omega_c, profile.bin_centers) # Compute induced voltage in (I,Q) coordinates OTFB_4.beam_induced_voltage(lpf=False) # convert back to time V_ind_OTFB \ = OTFB_4.V_fine_ind_beam.real \ * np.cos(OTFB_4.omega_c*profile.bin_centers) \ + OTFB_4.V_fine_ind_beam.imag \ * np.sin(OTFB_4.omega_c*profile.bin_centers) V_ind_OTFB = np.around(V_ind_OTFB, digit_round) self.assertListEqual( V_ind_impSource.tolist(), V_ind_OTFB.tolist(), msg="In TravelingWaveCavity test_vind: induced voltages differ")
def setUp(self): """ Slicing of the same Gaussian profile using four distinct settings to test different features. """ np.random.seed(1984) intensity_pb = 1.0e11 sigma = 0.2e-9 # Gauss sigma, [s] n_macroparticles_pb = int(1e4) n_bunches = 2 # --- Ring and RF ---------------------------------------------- intensity = n_bunches * intensity_pb # total intensity SPS n_turns = 1 # Ring parameters SPS circumference = 6911.5038 # Machine circumference [m] sync_momentum = 25.92e9 # SPS momentum at injection [eV/c] gamma_transition = 17.95142852 # Q20 Transition gamma momentum_compaction = 1. / gamma_transition**2 # Momentum compaction array ring = Ring(circumference, momentum_compaction, sync_momentum, Proton(), n_turns=n_turns) # RF parameters SPS harmonic_number = 4620 # harmonic number voltage = 3.5e6 # [V] phi_offsets = 0 self.rf_station = RFStation(ring, harmonic_number, voltage, phi_offsets, n_rf=1) t_rf = self.rf_station.t_rf[0, 0] bunch_spacing = 5 # RF buckets n_macroparticles = n_bunches * n_macroparticles_pb self.beam = Beam(ring, n_macroparticles, intensity) for bunch in range(n_bunches): bunchBeam = Beam(ring, n_macroparticles_pb, intensity_pb) bigaussian(ring, self.rf_station, bunchBeam, sigma, reinsertion=True, seed=1984 + bunch) self.beam.dt[bunch*n_macroparticles_pb : (bunch+1)*n_macroparticles_pb] \ = bunchBeam.dt + bunch*bunch_spacing * t_rf self.beam.dE[bunch * n_macroparticles_pb:(bunch + 1) * n_macroparticles_pb] = bunchBeam.dE self.filling_pattern = np.zeros(bunch_spacing * (n_bunches - 1) + 1) self.filling_pattern[::bunch_spacing] = 1 # uniform profile profile_margin = 0 * t_rf t_batch_begin = 0 * t_rf t_batch_end = (bunch_spacing * (n_bunches - 1) + 1) * t_rf self.n_slices_rf = 32 # number of slices per RF-bucket cut_left = t_batch_begin - profile_margin cut_right = t_batch_end + profile_margin # number of rf-buckets of the self.beam # + rf-buckets before the self.beam + rf-buckets after the self.beam n_slices = self.n_slices_rf * ( bunch_spacing * (n_bunches - 1) + 1 + int(np.round((t_batch_begin - cut_left) / t_rf)) + int(np.round((cut_right - t_batch_end) / t_rf))) self.uniform_profile = Profile(self.beam, CutOptions=CutOptions( cut_left=cut_left, n_slices=n_slices, cut_right=cut_right)) self.uniform_profile.track()
def setUp(self, negativeEta=True, acceleration=True, singleRF=True): # Defining parameters ------------------------------------------------- # Bunch parameters N_b = 1.e9 # Intensity N_p = 100000 # Macro-particles tau_0 = 50.e-9 # Initial bunch length, 4 sigma [s] # Machine parameters C = 1567.5 # Machine circumference [m] p_1i = 3.e9 # Synchronous momentum [eV/c] p_1f = 30.0e9 # Synchronous momentum, final p_2f = 40.e9 # Synchronous momentum [eV/c] p_2i = 60.e9 # Synchronous momentum, final gamma_t = 31.6 # Transition gamma alpha_1 = -1. / gamma_t / gamma_t # First order mom. comp. factor alpha_2 = 1. / gamma_t / gamma_t # First order mom. comp. factor # RF parameters h = [9, 18] # Harmonic number V = [1800.e3, 110.e3] # RF voltage [V] phi_1 = [np.pi + 1., np.pi / 6 + 2.] # Phase modulation/offset phi_2 = [1., np.pi / 6 + 2.] # Phase modulation/offset N_t = 43857 # Defining classes ---------------------------------------------------- # Define general parameters if (negativeEta == True): if acceleration == True: # eta < 0, acceleration general_params = Ring(C, alpha_1, np.linspace(p_1i, p_1f, N_t + 1), Proton(), N_t) elif acceleration == False: # eta < 0, deceleration general_params = Ring(C, alpha_1, np.linspace(p_1f, p_1i, N_t + 1), Proton(), N_t) if singleRF == True: rf_params = RFStation(general_params, 9, 1.8e6, np.pi + 1., n_rf=1) elif singleRF == False: rf_params = RFStation(general_params, h, V, phi_1, n_rf=2) rf_params.phi_s = calculate_phi_s( rf_params, Particle=general_params.Particle, accelerating_systems='all') elif (negativeEta == False): if acceleration == True: # eta > 0, acceleration general_params = Ring(C, alpha_2, np.linspace(p_2i, p_2f, N_t + 1), Proton(), N_t) elif acceleration == False: # eta > 0, deceleration general_params = Ring(C, alpha_2, np.linspace(p_2f, p_2i, N_t + 1), Proton(), N_t) if singleRF == True: rf_params = RFStation(general_params, 9, 1.8e6, 1., n_rf=1) elif singleRF == False: rf_params = RFStation(general_params, h, V, phi_2, n_rf=2) rf_params.phi_s = calculate_phi_s( rf_params, Particle=general_params.Particle, accelerating_systems='all') # Define beam and distribution beam = Beam(general_params, N_p, N_b) bigaussian(general_params, rf_params, beam, tau_0 / 4, seed=1234) #print(np.mean(beam.dt)) slices = Profile( beam, CutOptions(cut_left=0.e-9, cut_right=600.e-9, n_slices=1000)) slices.track() configuration = { 'machine': 'LHC', 'PL_gain': 0.1 * general_params.t_rev[0] } PL = BeamFeedback(general_params, rf_params, slices, configuration) PL.beam_phase() # Quantities to be compared self.phi_s = rf_params.phi_s[0] self.phi_b = PL.phi_beam self.phi_rf = rf_params.phi_rf[0, 0] self.dE_sep = separatrix(general_params, rf_params, [-5.e-7, -3.e-7, 1.e-7, 3.e-7, 7.e-7, 9.e-7])