|
| 1 | +import sys, os |
| 2 | +BIN=os.path.expanduser('../../') |
| 3 | +sys.path.append(BIN) |
| 4 | + |
| 5 | + |
| 6 | +import numpy as np |
| 7 | +import pylab as pl |
| 8 | +import mystyle as ms |
| 9 | +import time |
| 10 | + |
| 11 | +show_movie = False |
| 12 | + |
| 13 | + |
| 14 | +filename = '../../PyECLOUD/testing/tests_PyEC4PyHT/headtail_for_test/test_protons/SPS_Q20_proton_check_dipole_3kicks_20150212_prb.dat' |
| 15 | +B_multip = [0.5] |
| 16 | +N_kicks = 3 |
| 17 | + |
| 18 | +n_part_per_turn = 5000 |
| 19 | + |
| 20 | +appo = np.loadtxt(filename) |
| 21 | + |
| 22 | +parid = np.reshape(appo[:,0], (-1, n_part_per_turn))[::N_kicks,:] |
| 23 | +x = np.reshape(appo[:,1], (-1, n_part_per_turn))[::N_kicks,:] |
| 24 | +xp = np.reshape(appo[:,2], (-1, n_part_per_turn))[::N_kicks,:] |
| 25 | +y = np.reshape(appo[:,3], (-1, n_part_per_turn))[::N_kicks,:] |
| 26 | +yp =np.reshape(appo[:,4], (-1, n_part_per_turn))[::N_kicks,:] |
| 27 | +z = np.reshape(appo[:,5], (-1, n_part_per_turn))[::N_kicks,:] |
| 28 | +zp = np.reshape(appo[:,6], (-1, n_part_per_turn))[::N_kicks,:] |
| 29 | +N_turns = len(x[:,0]) |
| 30 | + |
| 31 | +pl.close('all') |
| 32 | +ms.mystyle(fontsz=14) |
| 33 | + |
| 34 | + |
| 35 | +# define machine for PyHEADTAIL |
| 36 | +from PyHEADTAIL.particles.slicing import UniformBinSlicer |
| 37 | +from machines_for_testing import SPS |
| 38 | +machine = SPS(n_segments = N_kicks, machine_configuration = 'Q20-injection', accQ_x=20., accQ_y=20.) |
| 39 | +#machine.one_turn_map.remove(machine.longitudinal_map) |
| 40 | + |
| 41 | + |
| 42 | +# compute sigma x and y |
| 43 | +epsn_x = 2.5e-6 |
| 44 | +epsn_y = 2.5e-6 |
| 45 | + |
| 46 | +inj_optics = machine.transverse_map.get_injection_optics() |
| 47 | +sigma_x = np.sqrt(inj_optics['beta_x']*epsn_x/machine.betagamma) |
| 48 | +sigma_y = np.sqrt(inj_optics['beta_y']*epsn_y/machine.betagamma) |
| 49 | + |
| 50 | +# define apertures and Dh_sc to simulate headtail conditions |
| 51 | +x_aper = 20*sigma_x |
| 52 | +y_aper = 20*sigma_y |
| 53 | +Dh_sc = 2*x_aper/128/2 |
| 54 | +if show_movie: Dh_sc*=2 |
| 55 | + |
| 56 | +# ecloud |
| 57 | +import PyECLOUD.PyEC4PyHT as PyEC4PyHT |
| 58 | +from PyHEADTAIL.particles.slicing import UniformBinSlicer |
| 59 | +slicer = UniformBinSlicer(n_slices = 64, n_sigma_z = 3.) |
| 60 | + |
| 61 | +init_unif_edens_flag=1 |
| 62 | +init_unif_edens=2e11 |
| 63 | +N_MP_ele_init = 100000 |
| 64 | +N_mp_max = N_MP_ele_init*4. |
| 65 | + |
| 66 | +nel_mp_ref_0 = init_unif_edens*4*x_aper*y_aper/N_MP_ele_init |
| 67 | + |
| 68 | + |
| 69 | +ecloud = PyEC4PyHT.Ecloud(L_ecloud=machine.circumference/N_kicks, slicer=slicer, |
| 70 | + Dt_ref=25e-12, pyecl_input_folder='../../PyECLOUD/testing/tests_PyEC4PyHT/drift_sim/', |
| 71 | + x_aper=x_aper, y_aper=y_aper, Dh_sc=Dh_sc, |
| 72 | + init_unif_edens_flag=init_unif_edens_flag, |
| 73 | + init_unif_edens=init_unif_edens, |
| 74 | + N_MP_ele_init=N_MP_ele_init, |
| 75 | + N_mp_max=N_mp_max, |
| 76 | + nel_mp_ref_0=nel_mp_ref_0, |
| 77 | + B_multip=B_multip) |
| 78 | +machine.install_after_each_transverse_segment(ecloud) |
| 79 | + |
| 80 | +if show_movie: |
| 81 | + ecloud.save_ele_distributions_last_track = True |
| 82 | + ecloud.save_ele_potential_and_field = True |
| 83 | + |
| 84 | +# generate a bunch |
| 85 | +bunch = machine.generate_6D_Gaussian_bunch(n_macroparticles=300000, intensity=1.15e11, epsn_x=epsn_x, epsn_y=epsn_y, sigma_z=0.2) |
| 86 | + |
| 87 | + |
| 88 | +# replace first particles with HEADTAIL ones |
| 89 | +bunch.x[:n_part_per_turn] = x[0,:] |
| 90 | +bunch.xp[:n_part_per_turn] = xp[0,:] |
| 91 | +bunch.y[:n_part_per_turn] = y[0,:] |
| 92 | +bunch.yp[:n_part_per_turn] = yp[0,:] |
| 93 | +bunch.z[:n_part_per_turn] = z[0,:] |
| 94 | +bunch.dp[:n_part_per_turn] =zp[0,:] |
| 95 | + |
| 96 | +# save id and momenta before track |
| 97 | +id_before = bunch.id[bunch.id<=n_part_per_turn] |
| 98 | +xp_before = bunch.xp[bunch.id<=n_part_per_turn] |
| 99 | +yp_before = bunch.yp[bunch.id<=n_part_per_turn] |
| 100 | + |
| 101 | +rms_err_x_list = [] |
| 102 | +rms_err_y_list = [] |
| 103 | +for ii in xrange(N_turns-1): |
| 104 | + # track |
| 105 | + machine.track(bunch)#, verbose = True) |
| 106 | + print 'Turn', ii |
| 107 | + |
| 108 | + # id and momenta after track |
| 109 | + id_after = bunch.id[bunch.id<=n_part_per_turn] |
| 110 | + xp_after = bunch.xp[bunch.id<=n_part_per_turn] |
| 111 | + z_after = bunch.z[bunch.id<=n_part_per_turn] |
| 112 | + yp_after = bunch.yp[bunch.id<=n_part_per_turn] |
| 113 | + |
| 114 | + # sort id and momenta after track |
| 115 | + indsort = np.argsort(id_after) |
| 116 | + id_after = np.take(id_after, indsort) |
| 117 | + xp_after = np.take(xp_after, indsort) |
| 118 | + yp_after = np.take(yp_after, indsort) |
| 119 | + z_after = np.take(z_after, indsort) |
| 120 | + |
| 121 | + fig = pl.figure(100, figsize=(18,10)) |
| 122 | + pl.clf() |
| 123 | + sp1 = pl.subplot(2,3,1) |
| 124 | + pl.plot(z_after, (100*np.abs((xp_after-xp_before)-(xp[ii+1, :]-xp[0, :]))/np.std(xp[ii+1, :]-xp[0, :])), '.r', markersize = 2) |
| 125 | + pl.grid('on') |
| 126 | + pl.ylabel('''error($\Delta$x')/$\Delta$x' [%]''') |
| 127 | + pl.subplot(2,3,4, sharex=sp1) |
| 128 | + pl.plot(z_after, (xp[ii+1, :]-xp[0, :]), '.r', label='HT', markersize = 2) |
| 129 | + pl.plot(z_after, (xp_after-xp_before), '.b', label='PyHT', markersize = 2) |
| 130 | + ms.sciy() |
| 131 | + pl.grid('on') |
| 132 | + pl.ylabel("$\Delta$x'") |
| 133 | + pl.xlabel('z[m]') |
| 134 | + pl.legend(prop = {'size':14}) |
| 135 | + pl.subplot(2,3,3) |
| 136 | + pl.hist((100*np.abs((xp_after-xp_before)-(xp[ii+1, :]-xp[0, :]))/np.std(xp[ii+1, :]-xp[0, :])), bins=100, range=(0,100)) |
| 137 | + pl.xlabel('Error_x [%]') |
| 138 | + pl.ylabel('Occurrences') |
| 139 | + pl.xlim(0,100) |
| 140 | + rms_err_x = np.std(100*np.abs((xp_after-xp_before)-(xp[ii+1, :]-xp[0, :]))/np.std(xp[ii+1, :]-xp[0, :])) |
| 141 | + |
| 142 | + sp1 = pl.subplot(2,3,2) |
| 143 | + pl.plot(z_after, (100*np.abs((yp_after-yp_before)-(yp[ii+1, :]-yp[0, :]))/np.std(yp[ii+1, :]-yp[0, :])), '.r', markersize = 2) |
| 144 | + pl.grid('on') |
| 145 | + pl.ylabel('''error($\Delta$y')/$\Delta$y' [%]''') |
| 146 | + pl.subplot(2,3,5, sharex=sp1) |
| 147 | + pl.plot(z_after, (yp[ii+1, :]-yp[0, :]), '.r', label='HT', markersize = 2) |
| 148 | + pl.plot(z_after, (yp_after-yp_before), '.b', label='PyHT', markersize = 2) |
| 149 | + ms.sciy() |
| 150 | + pl.grid('on') |
| 151 | + pl.ylabel("$\Delta$y'") |
| 152 | + pl.xlabel('z[m]') |
| 153 | + pl.legend(prop = {'size':14}) |
| 154 | + pl.subplot(2,3,6) |
| 155 | + pl.hist((100*np.abs((yp_after-yp_before)-(yp[ii+1, :]-yp[0, :]))/np.std(yp[ii+1, :]-yp[0, :])), bins=100, range=(0,100)) |
| 156 | + pl.xlim(0,100) |
| 157 | + pl.xlabel('Error_y [%]') |
| 158 | + pl.ylabel('Occurrences') |
| 159 | + rms_err_y = np.std(100*np.abs((yp_after-yp_before)-(yp[ii+1, :]-yp[0, :]))/np.std(yp[ii+1, :]-yp[0, :])) |
| 160 | + |
| 161 | + |
| 162 | + pl.suptitle('Turn %d rms_err_x = %e rms_err_y = %e'%(ii, rms_err_x, rms_err_y)) |
| 163 | + |
| 164 | + pl.savefig(filename.split('_prb.dat')[0]+'_%02d.png'%ii, dpi=150) |
| 165 | + |
| 166 | + rms_err_x_list.append(rms_err_x) |
| 167 | + rms_err_y_list.append(rms_err_y) |
| 168 | + |
| 169 | + pl.ion() |
| 170 | + pl.draw() |
| 171 | + time.sleep(1.) |
| 172 | + |
| 173 | +pl.figure(1000) |
| 174 | +pl.plot(rms_err_x_list, '.-', markersize = 10, linewidth=2, label='x') |
| 175 | +pl.plot(rms_err_y_list, '.-', markersize = 10, linewidth=2, label='y') |
| 176 | +pl.grid('on') |
| 177 | +pl.ylabel('''Relative r.m.s. error [%]''') |
| 178 | +pl.xlabel('Turn') |
| 179 | +pl.legend() |
| 180 | +pl.savefig(filename.split('_prb.dat')[0]+'_errors.png', dpi=200) |
| 181 | +pl.show() |
| 182 | + |
| 183 | +slices = bunch.get_slices(ecloud.slicer) |
| 184 | +if show_movie: |
| 185 | + n_frames = ecloud.rho_ele_last_track.shape[0] |
| 186 | + pl.close(1) |
| 187 | + pl.figure(1, figsize=(8,8)) |
| 188 | + vmax = np.max(ecloud.rho_ele_last_track[:]) |
| 189 | + vmin = np.min(ecloud.rho_ele_last_track[:]) |
| 190 | + for ii in xrange(n_frames-1, 0, -1): |
| 191 | + pl.subplot2grid((10,1),(0,0), rowspan=3) |
| 192 | + pl.plot(slices.z_centers, np.float_(slices.n_macroparticles_per_slice)/np.max(slices.n_macroparticles_per_slice)) |
| 193 | + pl.xlabel('z [m]');pl.ylabel('Long. profile') |
| 194 | + pl.axvline(x = slices.z_centers[ii], color='r') |
| 195 | + pl.subplot2grid((10,1),(4,0), rowspan=6) |
| 196 | + pl.pcolormesh(ecloud.spacech_ele.xg*1e3, ecloud.spacech_ele.yg*1e3, ecloud.rho_ele_last_track[ii,:,:].T, vmax=vmax, vmin=vmin) |
| 197 | + pl.xlabel('x [mm]');pl.ylabel('y [mm]') |
| 198 | + pl.axis('equal') |
| 199 | + pl.subplots_adjust(hspace=.5) |
| 200 | + pl.draw() |
| 201 | + time.sleep(.2) |
| 202 | + pl.show() |
| 203 | + |
| 204 | + |
0 commit comments