Last modified by rangeadm on 2025/04/23 16:13

From version 3.1
edited by sendels
on 2019/08/23 08:24
Change comment: There is no comment for this version
To version 6.1
edited by sndueste
on 2020/07/03 11:19
Change comment: There is no comment for this version

Summary

Details

Page properties
Author
... ... @@ -1,1 +1,1 @@
1 -XWiki.sendels
1 +XWiki.sndueste
Content
... ... @@ -1,15 +1,84 @@
1 -Here you can find a small python script (by (% class="twikiNewLink" %)[[MartinB>>url:http://hasfweb.desy.de/bin/edit/Setup/MartinB?topicparent=Setup.PartialCoherenceSimulation;nowysiwyg=0||rel="nofollow" shape="rect"]](%%)) implementing the partial coherence methode as described in Thomas Pfeifer, Yuhai Jiang, Stefan Düsterer, Robert Moshammer, and Joachim Ullrich, 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"]]
2 -\\\\Simulations like this:
1 +In order to simulate the temporal and spectral distribution of SASE pulses there is an easy way based random fluctuations filtered spectraly and temporally.
3 3  
4 -[[image:attach:partia__coherence2.png]]
3 +The only input parameters are the spectral bandwidth and the pulse duration.
5 5  
5 +Here you can find a small python script (by (% class="twikiNewLink" %)MartinB(%%)) implementing the partial coherence methode as described in 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"]]
6 +
7 +The pulse shapes in time AND corresponding spectral dstribution can be easily created with:
8 +
9 +* (((
10 +a python script
11 +
12 +{{expand title="Click here to expand the script ..."}}
13 +import numpy as np
14 +import matplotlib.pyplot as plt
15 +
16 +def GetSASE(CentralEnergy, dE_FWHM, dt_FWHM, samples=0, Axis=True):
17 +h=4.135667662 #in eV*fs
18 +dE=dE_FWHM/2.355 #in eV, converts to sigma
19 +dt=dt_FWHM/2.355 #in fs, converts to sigma
20 +if samples == 0:
21 +samples=int(400.*dt*CentralEnergy/h)
22 +else:
23 +if (samples < 400.*dt*CentralEnergy/h):
24 +print("Number of samples is a little small, proceeding anyway. Got", samples, "prefer more than",400.*dt*CentralEnergy/h)
25 +
26 +EnAxis=np.linspace(0.,20.*CentralEnergy,num=samples)
27 +EnInput=np.zeros(samples, dtype=np.complex64)
28 +#for i in range(samples):
29 +EnInput=np.exp(-(EnAxis-CentralEnergy)~*~*2/2./dE~*~*2+2*np.pi*1j*np.random.random(size=samples))
30 +En_FFT=np.fft.fft(EnInput)
31 +TAxis=np.fft.fftfreq(samples,d=(20.*CentralEnergy)/samples)*h
32 +TOutput=np.exp(-TAxis~*~*2/2./dt~*~*2)*En_FFT
33 +EnOutput=np.fft.ifft(TOutput)
34 +if (Axis):
35 +return EnAxis, EnOutput, TAxis, TOutput
36 +else:
37 +return EnOutput, TOutput
38 +
6 6  \\
7 7  
41 +# set the main parameters here:
42 +CentralEnergy=80. # in eV
43 +bandwidth=0.5 # bandwidth in %
44 +dt_FWHM=30. # FWHM of the temporal duration on average
45 +
46 +dE_FWHM=CentralEnergy/100 *bandwidth # calculate bandwidth of the spectrum in eV
47 +
48 +# calculate 3 SASE pulses
49 +EnAxis, EnOutput, TAxis, TOutput = GetSASE(CentralEnergy=CentralEnergy, dE_FWHM=dE_FWHM, dt_FWHM=dt_FWHM)
50 +EnAxis2, EnOutput2, TAxis2, TOutput2 = GetSASE(CentralEnergy=CentralEnergy, dE_FWHM=dE_FWHM, dt_FWHM=dt_FWHM)
51 +EnAxis3, EnOutput3, TAxis3, TOutput3 = GetSASE(CentralEnergy=CentralEnergy, dE_FWHM=dE_FWHM, dt_FWHM=dt_FWHM)
52 +
53 +
54 +# plot spectrum
55 +ax1 = plt.subplot(1, 2, 1)
56 +plt.plot(EnAxis,np.absolute(EnOutput),EnAxis2,np.absolute(EnOutput2),EnAxis3,np.absolute(EnOutput3) )
57 +plt.xlim(CentralEnergy-2.*dE_FWHM,CentralEnergy+2.*dE_FWHM)
58 +plt.title('Average pulse duration: %.1f fs' % dt_FWHM )
59 +ax1.set_xlabel('Photon energy in eV')
60 +ax1.set_ylabel('spectral intensity')
61 +
62 +# plot time structure
63 +ax1 =plt.subplot(1, 2, 2)
64 +plt.plot(TAxis,np.absolute(TOutput),TAxis2,np.absolute(TOutput2), TAxis3,np.absolute(TOutput3))
65 +plt.xlim(-2.*dt_FWHM,+2.*dt_FWHM)
66 +ax1.set_xlabel('time in fs')
67 +ax1.set_ylabel('pulse amplitude')
68 +
69 +plt.show()
70 +{{/expand}}
71 +)))
72 +* the Jupyter Notebook**[[attach:SASEPulseGenV4.ipynb]]**
73 +
74 +
75 +Some examples of results:
76 +
8 8  \\
9 9  
79 +[[image:attach:partia__coherence2.png]] or: [[image:attach:image2020-2-5_15-14-4.png||width="480"]]
10 10  
11 -
12 -\\can be easily created with the script ( the script can be downloaded in the attachment table below):
81 +\\
13 13  
14 14  \\
15 15  
... ... @@ -19,10 +19,12 @@
19 19  
20 20  \\
21 21  
22 -[[image:attach:partia__coherence1.png]]
91 +\\
23 23  
24 24  \\
25 25  
26 -[[attach:SASEPulseGenV2.ipynb]]
95 +\\
27 27  
28 -Jupyter Notebook
97 +\\
98 +
99 +\\