# setup transverse losses (to "protect" the ecloud)
import PyHEADTAIL.aperture.aperture as aperture
apt_xy = aperture.EllipticalApertureXY(x_aper=ecloud.impact_man.chamb.x_aper,
                                       y_aper=ecloud.impact_man.chamb.y_aper)
machine.one_turn_map.append(apt_xy)

# generate a bunch
bunch = machine.generate_6D_Gaussian_bunch_matched(n_macroparticles=300000,
                                                   intensity=intensity,
                                                   epsn_x=epsn_x,
                                                   epsn_y=epsn_y,
                                                   sigma_z=1.35e-9 / 4 * c)

# apply initial displacement
bunch.x += x_kick
bunch.y += y_kick

# define a bunch monitor
from PyHEADTAIL.monitors.monitors import BunchMonitor
bunch_monitor = BunchMonitor('bunch_evolution.h5',
                             N_turns, {'Comment': 'PyHDTL simulation'},
                             write_buffer_every=8)

# simulate
import time
for i_turn in xrange(N_turns):
    print '%s Turn %d' % (time.strftime("%d/%m/%Y %H:%M:%S",
                                        time.localtime()), i_turn)
    machine.track(bunch, verbose=False)
    bunch_monitor.dump(bunch)
					write_buffer_every = 8)


if not SimSt.first_run:
	# If not first part, load saved bunch and ecloud
	bunch = SLS.beam_from_h5status('bunch_status_part%02d.h5'%(SimSt.present_simulation_part-1))
	SLS.reinit_ecloud_from_h5status('ecloud_init_status.h5', ecloud)
else:
	#save ecloud particles status
	SLS.dump_ecloud_status(ecloud, 'ecloud_init_status.h5')

# simulate
import time
for i_turn in xrange(N_turns_per_run):
	print '%s Turn %d'%(time.strftime("%d/%m/%Y %H:%M:%S", time.localtime()), i_turn)
	machine.track(bunch, verbose = False)
	bunch_monitor.dump(bunch)
	


# save data for multijob operation and launch new job
SLS.dump_beam_status(bunch, 'bunch_status_part%02d.h5'%(SimSt.present_simulation_part))
if not SimSt.first_run:
	os.system('rm bunch_status_part%02d.h5'%(SimSt.present_simulation_part-1))
SimSt.after_simulation()