Skip to article frontmatterSkip to article content

Load relevant python packages

Load relevant python packages

Check Installed Packages

import sys
import importlib.metadata
def test_package(package_name):
    """Test if package exists and returns version or -1"""
    try:
        version = importlib.metadata.version(package_name)
    except importlib.metadata.PackageNotFoundError:
        version = '-1'
    return version

if test_package('pyTEMlib') < '0.2024.2.3':
    print('installing pyTEMlib')
    !{sys.executable} -m pip install  --upgrade pyTEMlib -q

print('done')
done

First we import the essential libraries

All we need here should come with the annaconda or any other package

%matplotlib widget
import matplotlib.pyplot as plt
import numpy as np
import sys
import os
if 'google.colab' in sys.modules:
    from google.colab import output
    from google.colab import drive
    output.enable_custom_widget_manager()
    
from pyTEMlib.xrpa_x_sections import x_sections

__notebook__ = 'CH4_14-Characteristic-X_Rays'
__notebook_version__ = '2019_08_21'

X-Ray Families

The case is not always as simple as in the case of the carbon atom in the Introduction

As the atomic number ZZ increases the number of electrons in the respective energy states increases. With increasing complexity of the shell structure more options for relaxtions are available with different probabilities.

For example a Na atom which has an M-shell The 1s state can be filled by an L- or an M-shell, producing two different characteristic X-rays:

  • K-L2,3(_{2,3} (K\alpha):): E_X = EKELE_K- E_L = 104 eV

  • K-M2,3(_{2,3} (K\beta):): E_X = EKEME_K- E_M = 1071 eV

For heavier atoms than sodium more options exist:

Nomenclature

X-ray Nomenclature

Two systems are in use for naming characteristic X-ray lines.

The oldest one is the Siegbahn system in wich first the shell where the ionization occured is listed and then a greek letter that suggests the order of their families by their relative intensity (α>β>γ>η>ζ\alpha>\beta>\gamma>\eta>\zeta).

For closely related memebers of a family additionally numebrs are attched such as Lβ1L \beta_1.

While most commercial software still uses the Siegbahn system the International Union of Pure and Applied Chemistry (IUPAC) has officially changed the system to a protocol that first dentoes the subshell were the ionization occured and followed with the term that indicates from which subshell the relaxation originates.

So Kα1K\alpha_1 is replaced by KL3K-L_3.

eds-lines
Siegbahn-----IUPAC-----Siegbahn-----IUPAC-----Siegbahn-----IUPAC-----
Kα1K\alpha_1KL3K-L_3Lα1L\alpha_1L3M5L_3-M_5Mα1M\alpha_1M5N7M_5-N_7
Kα2K\alpha_2KL2K-L_2Lα2L\alpha_2L3M4L_3-M_4Mα2M\alpha_2M5N6M_5-N_6
Kβ1K\beta_1KM3K-M_3Lβ1L\beta_1L2M4L_2-M_4MβM\betaM4N6M_4-N_6
Kβ2K\beta_2KN2,3K-N_{2,3}Lβ2L\beta_2L3N5L_3-N_5MγM\gammaM3N5M_3-N_5
Lβ3L\beta_3L1M3L_1-M_3MζM\zetaM4,5N2,3M_{4,5}-N_{2,3}
Lβ4L\beta_4L1M2L_1-M_2M3N1M_3-N_1
Lγ1L\gamma_1L2N4L_2-N_4M2N1M_2-N_1
Lγ2L\gamma_2L1N2L_1-N_2M3N4,5M_3-N_{4,5}
Lγ3L\gamma_3L1N3L_1-N_3M3O1M_3-O_1
Lγ4L\gamma_4L1O4L_1-O_4M3O4,5M_3-O_{4,5}
LζL\zetaL2M1L_2-M_1M2N4M_2-N_4
LιL\iotaL3M1L_3-M_1

X-ray Weight of Lines

Within the excitation probaility of the characteristic X-ray lines are not equal.

For sodium (see above for energies), the ratio of KL2,3K-L_{2,3} to KMK-M is approximatively 150: 1.

This ratios between the lines are a strong function of the atomic number ZZ.

We load the data of the X-Ray lines from data from NIST, the line weights are taken from the Program DTSA-II, which is the quasi-standard in EDS analysis.

K_M5 = []
ele_K_M5 = []
L3_M1 = []
ele_M3_M1 = []
L1_N3 = []
ele_L1_N3 = []
L3_N5 =[]
ele_L3_N5 = []
L2_M4 = []
ele_L2_M4 = []
for element in range(5,82):
    if 'K-M5' in x_sections[str(element)]['lines']:
        K_M5.append(x_sections[str(element)]['lines']['K-M5']['weight']/x_sections[str(element)]['lines']['K-L3']['weight'])
        ele_K_M5.append(element)
    if 'L3-M5' in x_sections[str(element)]['lines']:
    
        if 'L3-M1' in x_sections[str(element)]['lines']:
            L3_M1.append(x_sections[str(element)]['lines']['L3-M1']['weight']/x_sections[str(element)]['lines']['L3-M5']['weight'])
            ele_M3_M1.append(element)
        
        if 'L1-N3' in x_sections[str(element)]['lines']:
            L1_N3.append(x_sections[str(element)]['lines']['L1-N3']['weight']/x_sections[str(element)]['lines']['L3-M5']['weight'])
            ele_L1_N3.append(element)
        
        if 'L3-N5' in x_sections[str(element)]['lines']:
            L3_N5.append(x_sections[str(element)]['lines']['L3-N5']['weight']/x_sections[str(element)]['lines']['L3-M5']['weight'])
            ele_L3_N5.append(element)
        
        if 'L2-M4' in x_sections[str(element)]['lines']:
            L2_M4.append(x_sections[str(element)]['lines']['L2-M4']['weight']/x_sections[str(element)]['lines']['L3-M5']['weight'])
            ele_L2_M4.append(element)
    
ele = np.linspace(1,94,94)

plt.figure()
plt.plot(ele_K_M5 ,K_M5, label = 'K-M$_3$ / K-L$_3$')
plt.plot(ele_M3_M1,L3_M1, label = 'L$_3$-M$_1$ / L$_3$-M$_5$')
plt.plot(ele_L1_N3,L1_N3, label = 'L$_1$-N$_3$ / L$_3$-M$_5$')
plt.plot(ele_L3_N5,L3_N5, label = 'L$_3$-N$_5$ / L$_3$-M$_5$')
plt.plot(ele_L2_M4,L2_M4, label = 'L$_2$-M$_4$ / L$_3$-M$_5$')
plt.ylabel('')
plt.gca().set_yscale('log')
plt.xlabel('atomic number')
plt.ylabel('relative weights of lines')

plt.legend();
Loading...

Characteristic X-ray Intensity

The cross section QIQ_I (probability of excitation expressed as area) of an isolated atom ejecting an electron bound with energy EcE_c (keV) by an electron with energy EE (keV) is:

QI(ionizationse(atoms/cm2))=6.51×1020[nsbsEEc]loge(csE/Ec)Q_I \left(\frac{ionizations}{e^- (atoms/cm^2)} \right) = 6.51 \times 10^{-20} \left[ \frac{n_s b_s}{E E_c}\right]\log_e (c_s E / E_c)

where:

  • nsn_s: number of electrons in shell or subshell ss

  • bsb_s, csc_s: constants for a given shell ss

  • EE: energy of the exciting electron

  • E𝑐E_𝑐: Critical ionization energy

For example for a K shell (Powell 1979): nK=2n_K = 2, bK=0.35b_K = 0.35, and ck=1c_k = 1

For silion the characteristic energy or binding energy for the K shell: Ec=1.838E_c = 1.838 keV

The relationship between energy of the exciting electron and critical energy is important and is expressed as overvoltage UU:

U=EEcU =\frac{E}{E_c}

The overvoltage of the primary electron with energy E0E_0 is expressed as:

U0=E0EcU_0 =\frac{E_0}{E_c}

We can express the cross section with the overvoltage:

QI=6.51×1020[nsbsUEc2]loge(csU)Q_I = 6.51 \times 10^{-20} \left[ \frac{n_s b_s}{U E_c^2}\right]\log_e (c_s U)
n_K = 2.0
b_K = 0.35
c_K = 1.0

# Silicon
E_c_Si = 1.838 
# Iron
E_c_Fe = 6.401

E = np.linspace(0,30,2048)+0.05
U = E/E_c_Si

Q_Si = 6.51*1e-20*n_K*b_K/(U * E_c_Si**2)* np.log(c_K * U)
U = E/E_c_Fe
Q_Fe = 6.51*1e-20*n_K*b_K/(U * E_c_Fe**2)* np.log(c_K * U)
plt.figure()
plt.plot(E,Q_Si, label ='Si')
plt.plot(E,Q_Fe, label ='Fe')

plt.ylim(0.,Q_Si.max()*1.1)
plt.xlabel('excitation energy (keV)')
plt.ylabel('Q (inizations/[e$^-$ (atoms /cm$^2$)])')
plt.legend();
Loading...
x_sections['25']['M4']
{'filename': 'None', 'excl before': 5, 'excl after': 50, 'onset': 7.26159, 'factor': 0.6666666666666666}
 """        
 (Casnati's equation) was found to fit cross-section data to
 typically better than +-10% over the range 1<=Uk<=20 and 6<=Z<=79."
 
 Note: This result is for K shell. L & M are much less well characterized.
 C. Powell indicated in conversation that he believed that Casnati's
 expression was the best available for L & M also.
"""
shell_occupancy={'K':2,'L1':2,'L2':2,'L3':4,'M1':2,'M1':2,'M2':2,'M3':4,'M4':4,'M5':6}
import scipy.constants as const
res = 0.0;
beamE = 30
rel = []
Z= []
shell = 'M4'
for element in range(25,56):
    ee = x_sections[str(element)][shell]['onset']#getEdgeEnergy();
    u =  ee/beamE;
    #print(u)
    if(u > 1.0):
        u2 = u * u;
        phi = 10.57 * np.exp((-1.736 / u) + (0.317 / u2));
        #psi = Math.pow(ee / PhysicalConstants.RydbergEnergy, -0.0318 + (0.3160 / u) + (-0.1135 / u2));
        psi = np.power(ee / const.Rydberg, -0.0318 + (0.3160 / u) + (-0.1135 / u2));

        i = ee / const.electron_mass# PhysicalConstants.ElectronRestMass;
        t = beamE / const.electron_mass#PhysicalConstants.ElectronRestMass;
        f = ((2.0 + i) / (2.0 + t)) * np.sqrt((1.0 + t) / (1.0 + i)) * np.power(((i + t) * (2.0 + t) * np.sqrt(1.0 + i))/ ((t * (2.0 + t) * np.sqrt(1.0 + i)) + (i * (2.0 + i))), 1.5);
        getGroundStateOccupancy = shell_occupancy[shell]
        res = ((getGroundStateOccupancy * np.sqrt((const.value('Bohr radius') * const.Rydberg) / ee) * f * psi * phi * np.log(u)) / u);
        
        rel.append(res)
        Z.append(element)
    #print(res)
    
plt.figure()
plt.title(f"Casnati's cross section for beam energy {beamE:.0f} keV")
plt.plot(Z,rel)

plt.xlabel('atomic number Z')
plt.ylabel('Q [barns]');
Loading...

Even though the cross section raises fast with overvoltage UU, too low overvoltage leads to a small cross section, which results in poor excitation of the X-ray line.

We can also see that the intial overvoltage U0U_0 varies with atomic number ZZ, which will affect the relative generation of X-rays from different elements.

X-ray Production in a Thick Solid Sample

If the sample is sufficient thick so that all electrons interact ( several micrometers) the X-ray intensity is found to follow an expression fo the form:

Iip[(E0Ec)/E0]nip[U01]nI \approx i_p \left[ (E_0-E_c)/E_0\right]^n \approx i_p [U_0-1]^n

where:

  • ipi_p: beam current

  • nn: exponent nn depends on particular element and shell (Lifshin et al. 1980)

The exponent nn is ususally between 1.5 and 2. See what changes in the plot below if you change this exponent.

n = 1.5

U_0 = np.linspace(1,10, 2048)
i_p = 1.0 # in nA
I = i_p * (U_0-1.0)**n

plt.figure()
plt.plot(U_0,I)
plt.axhline(y=0., color='gray', linewidth=0.5)
plt.xlabel('overvoltage $U_0$ [kV]')
plt.ylabel('$I$ [nA]');

X-ray Production in a Thin Foil

Now we have all the ingeedients to look at the total generation of X-rays.

The number of photons nXn_X produced in a thin foil of thickness tt is :

nx=QI(E) ωNA1Aρ tn_x = Q_I(E) \ \omega N_A \frac{1}{A} \rho \ t
  • nXn_X [photons/e^-]

  • QI(E)Q_I(E) [ ionizations/e^- (atoms / cm2^2)): ionization cross section

  • ω\omega [X-rays/ ionization]: fluorescent yield = number of X-rays generated per ionization

  • NA N_A [atoms per mol]: Avogadro’s number

  • AA [g/moles]: atomic weight

  • ρ\rho [g/cm3^3]: density of sample

  • tt [cm]: thickness of sample

The number of X-rays increase linearly with the number of atoms per unit area (NA1Aρ tN_A \frac{1}{A} \rho \ t ).

In the graph above, we can see the importance of the overvoltage UU by how the intensity increase with increasing U0U_0

Quiz

Why is the overvoltage increasing so much while the cross section remains rather constant above the threshold?

Navigation

References
  1. Powell, C. J. (1989). Cross sections for inelastic electron scattering in solids. Ultramicroscopy, 28(1–4), 24–31. 10.1016/0304-3991(89)90264-7
  2. Casnati, E., Tartari, A., & Baraldi, C. (1982). An empirical approach to K-shell ionisation cross section by electrons. Journal of Physics B: Atomic and Molecular Physics, 15(1), 155–167. 10.1088/0022-3700/15/1/022
  3. Bote, D., & Salvat, F. (2008). Calculations of inner-shell ionization by electron impact with the distorted-wave and plane-wave Born approximations. Physical Review A, 77(4). 10.1103/physreva.77.042701