Wiki source code of Partial Coherence Simulation

Version 9.1 by sndueste on 2020/07/07 16:55

Hide last authors
sndueste 9.1 1 In order to simulate the temporal and spectral distribution of SASE pulses there is an easy way based random fluctuations filtered spectrally and temporally.
sendels 2.1 2
sndueste 9.1 3 The only input parameters are the center wavelength, spectral bandwidth and the pulse duration.
sendels 2.1 4
sndueste 9.1 5 Here you can find a small python script (by (% class="twikiNewLink" %)MartinB(%%)) implementing the partial coherence method as described in:
sendels 2.1 6
sndueste 9.1 7 * **Thomas Pfeifer et al. //Partial-coherence method to model experimental free-electron laser pulse statistics,// Opt. Lett. 35, 3441-3443 (2010);** [[link to the paper>>url:http://dx.doi.org/10.1364/OL.35.003441||shape="rect"]]
sendels 2.1 8
sndueste 9.1 9 \\
10
11 The pulse shapes in time AND corresponding spectral distribution can be easily created with:
12
sndueste 5.1 13 * (((
14 a python script
sendels 2.1 15
sndueste 6.1 16 {{expand title="Click here to expand the script ..."}}
sndueste 5.1 17 import numpy as np
18 import matplotlib.pyplot as plt
19
20 def GetSASE(CentralEnergy, dE_FWHM, dt_FWHM, samples=0, Axis=True):
21 h=4.135667662 #in eV*fs
22 dE=dE_FWHM/2.355 #in eV, converts to sigma
23 dt=dt_FWHM/2.355 #in fs, converts to sigma
24 if samples == 0:
25 samples=int(400.*dt*CentralEnergy/h)
26 else:
27 if (samples < 400.*dt*CentralEnergy/h):
28 print("Number of samples is a little small, proceeding anyway. Got", samples, "prefer more than",400.*dt*CentralEnergy/h)
29
30 EnAxis=np.linspace(0.,20.*CentralEnergy,num=samples)
31 EnInput=np.zeros(samples, dtype=np.complex64)
32 EnInput=np.exp(-(EnAxis-CentralEnergy)~*~*2/2./dE~*~*2+2*np.pi*1j*np.random.random(size=samples))
33 En_FFT=np.fft.fft(EnInput)
34 TAxis=np.fft.fftfreq(samples,d=(20.*CentralEnergy)/samples)*h
35 TOutput=np.exp(-TAxis~*~*2/2./dt~*~*2)*En_FFT
36 EnOutput=np.fft.ifft(TOutput)
37 if (Axis):
38 return EnAxis, EnOutput, TAxis, TOutput
39 else:
40 return EnOutput, TOutput
41
42 \\
43
44 # set the main parameters here:
45 CentralEnergy=80. # in eV
46 bandwidth=0.5 # bandwidth in %
47 dt_FWHM=30. # FWHM of the temporal duration on average
48
49 dE_FWHM=CentralEnergy/100 *bandwidth # calculate bandwidth of the spectrum in eV
50
51 # calculate 3 SASE pulses
52 EnAxis, EnOutput, TAxis, TOutput = GetSASE(CentralEnergy=CentralEnergy, dE_FWHM=dE_FWHM, dt_FWHM=dt_FWHM)
53 EnAxis2, EnOutput2, TAxis2, TOutput2 = GetSASE(CentralEnergy=CentralEnergy, dE_FWHM=dE_FWHM, dt_FWHM=dt_FWHM)
54 EnAxis3, EnOutput3, TAxis3, TOutput3 = GetSASE(CentralEnergy=CentralEnergy, dE_FWHM=dE_FWHM, dt_FWHM=dt_FWHM)
55
56
57 # plot spectrum
58 ax1 = plt.subplot(1, 2, 1)
59 plt.plot(EnAxis,np.absolute(EnOutput),EnAxis2,np.absolute(EnOutput2),EnAxis3,np.absolute(EnOutput3) )
60 plt.xlim(CentralEnergy-2.*dE_FWHM,CentralEnergy+2.*dE_FWHM)
61 plt.title('Average pulse duration: %.1f fs' % dt_FWHM )
62 ax1.set_xlabel('Photon energy in eV')
63 ax1.set_ylabel('spectral intensity')
64
65 # plot time structure
66 ax1 =plt.subplot(1, 2, 2)
67 plt.plot(TAxis,np.absolute(TOutput),TAxis2,np.absolute(TOutput2), TAxis3,np.absolute(TOutput3))
68 plt.xlim(-2.*dt_FWHM,+2.*dt_FWHM)
69 ax1.set_xlabel('time in fs')
70 ax1.set_ylabel('pulse amplitude')
71
72 plt.show()
73 {{/expand}}
74 )))
sndueste 9.1 75 * or the same as a Jupyter Notebook** [[attach:GenerateSASE.ipynb]] **
sndueste 5.1 76
sndueste 9.1 77 ==
78 Some examples: ==
sndueste 5.1 79
sndueste 9.1 80 //CentralEnergy=80 # in eV//
sendels 2.1 81
sndueste 9.1 82 //bandwidth=0.5 # bandwidth in %//
sendels 2.1 83
sndueste 9.1 84 //dt_FWHM=10, 30., 70  # FWHM of the temporal duration on average//
sndueste 4.1 85
sendels 2.1 86
sndueste 9.1 87
88
89 [[image:attach:2020-07-07 16_51_14-Window.png||height="250"]]
90
sendels 2.1 91 \\
92
sndueste 9.1 93 [[image:attach:2020-07-07 16_53_22-Window.png||height="250"]]
94
95 [[image:attach:2020-07-07 16_52_27-Window.png||height="250"]]
96
sendels 2.1 97 \\
98
sndueste 4.1 99 \\
100
sndueste 6.1 101 \\
sndueste 4.1 102
sndueste 6.1 103 \\
sendels 2.1 104
105 \\
106
sndueste 4.1 107 \\
sendels 2.1 108
sndueste 4.1 109 \\
110
111 \\