IRF

Compare three kinds of instrument response function (cauchy, gaussian, pseudo voigt)

# import needed module
import numpy as np
import matplotlib.pyplot as plt
import TRXASprefitpack
from TRXASprefitpack import gau_irf, cauchy_irf, pvoigt_irf
from TRXASprefitpack import model_n_comp_conv
plt.rcParams["figure.figsize"] = (14,10)

version infromation

print(TRXASprefitpack.__version__)
0.5.0

Define function for IRF

for pseudo voigt profile eta is chosen according to J. Appl. Cryst. (2000). 33, 1311-1316

def calc_eta(fwhm):
    f = fwhm[0]**5+2.69269*fwhm[0]**4*fwhm[1]+2.42843*fwhm[0]**3*fwhm[1]**2 + \
                    4.47163*fwhm[0]**2*fwhm[1]**3 + 0.07842*fwhm[0]*fwhm[1]**4 + fwhm[1]**5
    f = f**(1/5)
    eta = 1.36603*(fwhm[1]/f)-0.47719*(fwhm[1]/f)**2+0.11116*(fwhm[1]/f)**3
    return eta
help(gau_irf)
Help on function gau_irf in module TRXASprefitpack.mathfun.irf:

gau_irf(t: Union[float, numpy.ndarray], fwhm: float) -> Union[float, numpy.ndarray]
    Compute gaussian shape irf function
    
    Args:
      t: time
      fwhm: full width at half maximum of gaussian distribution
    
    Returns:
     normalized gaussian function.
help(cauchy_irf)
Help on function cauchy_irf in module TRXASprefitpack.mathfun.irf:

cauchy_irf(t: Union[float, numpy.ndarray], fwhm: float) -> Union[float, numpy.ndarray]
    Compute lorenzian shape irf function
    
    Args:
      t: time
      fwhm: full width at half maximum of cauchy distribution
    
    Returns:
     normalized lorenzian function.
help(pvoigt_irf)
Help on function pvoigt_irf in module TRXASprefitpack.mathfun.irf:

pvoigt_irf(t: Union[float, numpy.ndarray], fwhm_G: float, fwhm_L: float, eta: float) -> Union[float, numpy.ndarray]
    Compute pseudo voight shape irf function
    (i.e. linear combination of gaussian and lorenzian function)
    
    Args:
      t: time
      fwhm_G: full width at half maximum of gaussian part
      fwhm_L: full width at half maximum of lorenzian part
      eta: mixing parameter
    Returns:
     linear combination of gaussian and lorenzian function with mixing parameter eta.
# get basic information of model_n_comp_conv
help(model_n_comp_conv)
Help on function model_n_comp_conv in module TRXASprefitpack.mathfun.exp_decay_fit:

model_n_comp_conv(t: numpy.ndarray, fwhm: Union[float, numpy.ndarray], tau: numpy.ndarray, c: numpy.ndarray, base: Union[bool, NoneType] = True, irf: Union[str, NoneType] = 'g', eta: Union[float, NoneType] = None) -> numpy.ndarray
    Constructs the model for the convolution of n exponential and
    instrumental response function
    Supported instrumental response function are
    
      * g: gaussian distribution
      * c: cauchy distribution
      * pv: pseudo voigt profile
    
    Args:
       t: time
       fwhm: full width at half maximum of instrumental response function
       tau: life time for each component
       c: coefficient for each component
       base: whether or not include baseline [default: True]
       irf: shape of instrumental
            response function [default: g]
    
              * 'g': normalized gaussian distribution,
              * 'c': normalized cauchy distribution,
              * 'pv': pseudo voigt profile :math:`(1-\eta)g + \eta c`
       eta: mixing parameter for pseudo voigt profile
            (only needed for pseudo voigt profile,
            default value is guessed according to
            Journal of Applied Crystallography. 33 (6): 1311–1316.)
    
    Returns:
      Convolution of the sum of n exponential decays and instrumental
      response function.
    
    Note:
     1. *fwhm* For gaussian and cauchy distribution,
        only one value of fwhm is needed,
        so fwhm is assumed to be float
        However, for pseudo voigt profile,
        it needs two value of fwhm, one for gaussian part and
        the other for cauchy part.
        So, in this case,
        fwhm is assumed to be numpy.ndarray with size 2.
     2. *c* size of c is assumed to be
        num_comp+1 when base is set to true.
        Otherwise, it is assumed to be num_comp.

Compare cauchy and gaussian IRF with same fwhm

fwhm = 0.15 # 150 fs
t = np.linspace(-1,1,200)
cauchy = cauchy_irf(t,fwhm)
gau = gau_irf(t,fwhm)
plt.plot(t, cauchy, label='cauchy irf')
plt.plot(t, gau, label='gaussian irf')
plt.legend()
plt.show()

png

Cauchy irf is more diffuse then Gaussian irf

Compare pseudo voigt irf with different combination of (fwhm_G, fwhm_L)

  1. (0.25, 0.1)

  2. (0.15, 0.3)

  3. (0.1, 0.5)

fwhm_1 = [0.25, 0.1]
fwhm_2 = [0.15, 0.3]
fwhm_3 = [0.1, 0.5]
eta_1 = calc_eta(fwhm_1)
eta_2 = calc_eta(fwhm_2)
eta_3 = calc_eta(fwhm_3)
pvoigt1 = pvoigt_irf(t, fwhm_1[0], fwhm_1[1], eta_1)
pvoigt2 = pvoigt_irf(t, fwhm_2[0], fwhm_2[1], eta_2)
pvoigt3 = pvoigt_irf(t, fwhm_3[0], fwhm_3[1], eta_3)
plt.plot(t, pvoigt1, label=f'pvoigt (fwhm_G, fwhm_L)=({fwhm_1[0]}, {fwhm_1[1]})')
plt.plot(t, pvoigt2, label=f'pvoigt (fwhm_G, fwhm_L)=({fwhm_2[0]}, {fwhm_2[1]})')
plt.plot(t, pvoigt3, label=f'pvoigt (fwhm_G, fwhm_L)=({fwhm_3[0]}, {fwhm_3[1]})')
plt.legend()
plt.show()

png

Compare baseline signal (IRF: cauchy, gaussian with same fwhm=0.15)

fwhm = np.array([0.15])
tau = np.zeros(0)
c = np.ones(1)
cauchy_baseline = model_n_comp_conv(t, fwhm, tau, c, base=True, irf='c')
gauss_baseline = model_n_comp_conv(t, fwhm, tau, c, base=True, irf='g')
plt.plot(t, cauchy_baseline, label='cauchy baseline')
plt.plot(t, gauss_baseline, label='gaussian baseline')
plt.legend()
plt.show()

png

gaussian baseline is sharper than cauchy baseline

Compare pseudo voigt irf baseline signal with different combination of (fwhm_G, fwhm_L)

  1. (0.25, 0.1)

  2. (0.15, 0.3)

  3. (0.1, 0.5)

fwhm_1 = [0.25, 0.1]
fwhm_2 = [0.15, 0.3]
fwhm_3 = [0.1, 0.5]
tau = np.zeros(0)
c = np.ones(1)
pv1_baseline = model_n_comp_conv(t, fwhm_1, tau, c, base=True, irf='pv')
pv2_baseline = model_n_comp_conv(t, fwhm_2, tau, c, base=True, irf='pv')
pv3_baseline = model_n_comp_conv(t, fwhm_3, tau, c, base=True, irf='pv')
plt.plot(t, pv1_baseline, label=f'pvoigt baseline (fwhm_G, fwhm_L)=({fwhm_1[0]}, {fwhm_1[1]})')
plt.plot(t, pv2_baseline, label=f'pvoigt baseline (fwhm_G, fwhm_L)=({fwhm_2[0]}, {fwhm_2[1]})')
plt.plot(t, pv3_baseline, label=f'pvoigt baseline (fwhm_G, fwhm_L)=({fwhm_3[0]}, {fwhm_3[1]})')
plt.legend()
plt.show()

png

As lorenzian (cauchy) character smaller, sharper the baseline.

Compare exponential decay convolved with irf(cauchy, gaussian) with (tau=fwhm/2)

fwhm = np.array([0.15])
tau = np.array([fwhm[0]/2])
c = np.ones(1)
cauchy_expdecay = model_n_comp_conv(t, fwhm, tau, c, base=False, irf='c')
gauss_expdecay = model_n_comp_conv(t, fwhm, tau, c, base=False, irf='g')
plt.plot(t, cauchy_expdecay, label='cauchy exponential decay with tau=fwhm/2')
plt.plot(t, gauss_expdecay, label='gaussian expoential decay with tau=fwhm/2')
plt.legend()
plt.show()

png

if tau: time constant is less than irf, we can only see little portion of exponetial decay feature.

Compare exponential decay convolved with irf(cauchy, gaussian) with (tau=fwhm)

fwhm = np.array([0.15])
tau = np.array([fwhm[0]])
c = np.ones(1)
cauchy_expdecay = model_n_comp_conv(t, fwhm, tau, c, base=False, irf='c')
gauss_expdecay = model_n_comp_conv(t, fwhm, tau, c, base=False, irf='g')
plt.plot(t, cauchy_expdecay, label='cauchy exponential decay with tau=fwhm')
plt.plot(t, gauss_expdecay, label='gaussian expoential decay with tau=fwhm')
plt.legend()
plt.show()

png

Compare exponential decay convolved with irf(cauchy, gaussian) with (tau=2fwhm)

fwhm = np.array([0.15])
tau = np.array([2*fwhm[0]])
c = np.ones(1)
cauchy_expdecay = model_n_comp_conv(t, fwhm, tau, c, base=False, irf='c')
gauss_expdecay = model_n_comp_conv(t, fwhm, tau, c, base=False, irf='g')
plt.plot(t, cauchy_expdecay, label='cauchy exponential decay with tau=2fwhm')
plt.plot(t, gauss_expdecay, label='gaussian expoential decay with tau=2fwhm')
plt.legend()
plt.show()

png

Compare exponential decay convolved with irf(cauchy, gaussian) with (tau=10fwhm)

fwhm = np.array([0.15])
tau = np.array([10*fwhm[0]])
c = np.ones(1)
cauchy_expdecay = model_n_comp_conv(t, fwhm, tau, c, base=False, irf='c')
gauss_expdecay = model_n_comp_conv(t, fwhm, tau, c, base=False, irf='g')
plt.plot(t, cauchy_expdecay, label='cauchy exponential decay with tau=10fwhm')
plt.plot(t, gauss_expdecay, label='gaussian expoential decay with tau=10fwhm')
plt.legend()
plt.show()

png

Compare exponential decay convolved with irf(cauchy, gaussian) with (tau=0.1fwhm)

fwhm = np.array([0.15])
tau = np.array([0.1*fwhm[0]])
c = np.ones(1)
cauchy_expdecay = model_n_comp_conv(t, fwhm, tau, c, base=False, irf='c')
gauss_expdecay = model_n_comp_conv(t, fwhm, tau, c, base=False, irf='g')
plt.plot(t, cauchy_expdecay, label='cauchy exponential decay with tau=fwhm/10')
plt.plot(t, gauss_expdecay, label='gaussian expoential decay with tau=fwhm/10')
plt.legend()
plt.show()

png

signal is very small and we can only see irf feature.

3rd generation x-ray source with fs dynamics

  • fwhm = 80 ps

  • tau1 = 300 fs

  • tau2 = 3 ps

  • tau3 = 30 ps

fwhm = 80 # 80 ps
t = np.arange(-1000, 1000, 10)
cauchy = cauchy_irf(t,fwhm)
gau = gau_irf(t,fwhm)
plt.plot(t, cauchy, label='cauchy irf')
plt.plot(t, gau, label='gaussian irf')
plt.legend()
plt.show()

png

fwhm = np.array([fwhm])
tau = np.array([0.3])
c = np.ones(1)
cauchy_expdecay = model_n_comp_conv(t, fwhm, tau, c, base=False, irf='c')
gauss_expdecay = model_n_comp_conv(t, fwhm, tau, c, base=False, irf='g')
plt.plot(t, cauchy_expdecay, label='cauchy exponential decay with tau= 300 fs')
plt.plot(t, gauss_expdecay, label='gaussian expoential decay with tau= 300 fs')
plt.legend()
plt.show()

png

tau = np.array([3])
c = np.ones(1)
cauchy_expdecay = model_n_comp_conv(t, fwhm, tau, c, base=False, irf='c')
gauss_expdecay = model_n_comp_conv(t, fwhm, tau, c, base=False, irf='g')
plt.plot(t, cauchy_expdecay, label='cauchy exponential decay with tau= 3 ps')
plt.plot(t, gauss_expdecay, label='gaussian expoential decay with tau= 3 ps')
plt.legend()
plt.show()

png

tau = np.array([30])
c = np.ones(1)
cauchy_expdecay = model_n_comp_conv(t, fwhm, tau, c, base=False, irf='c')
gauss_expdecay = model_n_comp_conv(t, fwhm, tau, c, base=False, irf='g')
plt.plot(t, cauchy_expdecay, label='cauchy exponential decay with tau= 30 ps')
plt.plot(t, gauss_expdecay, label='gaussian expoential decay with tau= 30 ps')
plt.legend()
plt.show()

png

Conclusion

3rd gen X-ray source with 80 ps fwhm could not see fs dynamics.