Wiki source code of Partial Coherence Simulation
Version 9.1 by sndueste on 2020/07/07 16:55
Hide last authors
| author | version | line-number | content |
|---|---|---|---|
| |
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. |
| |
2.1 | 2 | |
| |
9.1 | 3 | The only input parameters are the center wavelength, spectral bandwidth and the pulse duration. |
| |
2.1 | 4 | |
| |
9.1 | 5 | Here you can find a small python script (by (% class="twikiNewLink" %)MartinB(%%)) implementing the partial coherence method as described in: |
| |
2.1 | 6 | |
| |
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"]] |
| |
2.1 | 8 | |
| |
9.1 | 9 | \\ |
| 10 | |||
| 11 | The pulse shapes in time AND corresponding spectral distribution can be easily created with: | ||
| 12 | |||
| |
5.1 | 13 | * ((( |
| 14 | a python script | ||
| |
2.1 | 15 | |
| |
6.1 | 16 | {{expand title="Click here to expand the script ..."}} |
| |
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 | ))) | ||
| |
9.1 | 75 | * or the same as a Jupyter Notebook** [[attach:GenerateSASE.ipynb]] ** |
| |
5.1 | 76 | |
| |
9.1 | 77 | == |
| 78 | Some examples: == | ||
| |
5.1 | 79 | |
| |
9.1 | 80 | //CentralEnergy=80 # in eV// |
| |
2.1 | 81 | |
| |
9.1 | 82 | //bandwidth=0.5 # bandwidth in %// |
| |
2.1 | 83 | |
| |
9.1 | 84 | //dt_FWHM=10, 30., 70 # FWHM of the temporal duration on average// |
| |
4.1 | 85 | |
| |
2.1 | 86 | |
| |
9.1 | 87 | |
| 88 | |||
| 89 | [[image:attach:2020-07-07 16_51_14-Window.png||height="250"]] | ||
| 90 | |||
| |
2.1 | 91 | \\ |
| 92 | |||
| |
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 | |||
| |
2.1 | 97 | \\ |
| 98 | |||
| |
4.1 | 99 | \\ |
| 100 | |||
| |
6.1 | 101 | \\ |
| |
4.1 | 102 | |
| |
6.1 | 103 | \\ |
| |
2.1 | 104 | |
| 105 | \\ | ||
| 106 | |||
| |
4.1 | 107 | \\ |
| |
2.1 | 108 | |
| |
4.1 | 109 | \\ |
| 110 | |||
| 111 | \\ |