Chapter 4: Spectroscopy
4.3. Analysing Low-Loss Spectra with Drude Theory#
part of
MSE672: Introduction to Transmission Electron Microscopy
Spring 2024
Gerd Duscher | Khalid Hattar |
Microscopy Facilities | Tennessee Ion Beam Materials Laboratory |
Materials Science & Engineering | Nuclear Engineering |
Institute of Advanced Materials & Manufacturing | |
Background and methods to analysis and quantification of data acquired with transmission electron microscopes.
4.3.1. Content#
The main feature in a low-loss EELS spectrum is the volume plasmon
peak.
This volume plasmon
and all other features in the low-loss
region of an EELS spectrum are described by Dielectric Theory of Electrodynamics.
The simplest theory to interprete this energy range is the Drude theory.
Another easy to observe component is the multiple scattering of this plasmon peak, which we can correct for or use for thickness determination.
4.3.2. Load important packages#
4.3.2.1. 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
4.3.2.2. Import all relevant libraries#
Please note that the EELS_tools package from pyTEMlib is essential.
import sys
%matplotlib ipympl
if 'google.colab' in sys.modules:
from google.colab import output
from google.colab import drive
output.enable_custom_widget_manager()
import matplotlib.pyplot as plt
import numpy as np
# additional package
import ipywidgets as ipyw
from scipy.optimize import leastsq ## fitting routine of scipy
# Import libraries from the book
import pyTEMlib
import pyTEMlib.file_tools as ft # File input/ output library
from pyTEMlib import file_tools # File input/ output library
from pyTEMlib import eels_tools
import pyTEMlib.kinematic_scattering as ks # Kinematic sCattering Library
# Atomic form factors from Kirklands book
# For archiving reasons it is a good idea to print the version numbers out at this point
print('pyTEM version: ',pyTEMlib.__version__)
pyTEM version: 0.2025.03.0
4.3.3. Dielectric Theory#
4.3.3.1. Comparison to Optical Spectroscopy#
The interaction of a transmitted electron with a solid is here described in terms of
a dielectric response function
The same response function
The difference is that there is no momentum transfer in an optical transition and, therefore, the relevant dielectric function is
The optical dielectric function (permittivity) is a transverse property of the medium, in the sense that the electric field of an electromagnetic wave displaces electrons in a direction perpendicular to the direction of propagation, the electron density remaining unchanged.
The relation between the ac conductivity
The relation between the complex refractive index
Optical absorption spectrum is obtained through
ABS=
So, the dielectric function describes the electrical and optical response of a material almost completely.
4.3.3.2. Dispersion#
From the Fourier representation of the Maxwell equations in the source free case, we get:
$
which we transform into:
which gives for non-magnetic materials:
for
while for
for light in vacuum the permittivity
4.3.3.3. Cross Section#
The partial cross section
There are three compenents, first a term that depends on the atom density
And the third term is the (Lorentzian) angle dependence
with the characteristic angle $
The second term is the loss-function
.
The loss function of a dielectric function
4.3.4. Load and plot a spectrum#
# ---- Input ------
load_example = True
# -----------------
if not load_example:
if 'google.colab' in sys.modules:
drive.mount("/content/drive")
fileWidget = file_tools.FileWidget()
# ---- Input ------
load_example = True
file_name = 'AL-DFoffset0.00.dm3'
# -----------------
if load_example:
if 'google.colab' in sys.modules:
if not os.path.exists('./'+file_name):
!wget https://github.com/gduscher/MSE672-Introduction-to-TEM/raw/main/example_data/AL-DFoffset0.00.dm3
else:
datasets = file_tools.open_file('../example_data/'+file_name)
eels_dataset = datasets['Channel_000']
else:
datasets = fileWidget.datasets
eels_dataset = fileWidget.selected_dataset
sum_spectrum = eels_dataset.sum()
eels_dataset = eels_dataset/sum_spectrum*100.
eels_dataset.units = '%'
eels_dataset.quantity = 'scattering probability'
view = eels_dataset.plot()
4.3.4.1. Fix energy scale and resolution function#
please see Fitting the Zero-Loss Peak for details
4.3.4.2. Relative Thickness Determination#
The probabaility of an low-loss function in a solid angle is then:
$
Please see Kroeger Formalism for inclusion of retardation effects, and surface plasmons.
The integration over the (effective) collection angle gives:
$
So we need to get the loss-function, calculate
The specimen thickness
The big problem however, is that one has to know the dielectric function. In the case of the Drude theory, that means we need to know the electron density.
Any approximation, therefore, needs to approximate this dielectric function, which cannot be generally applicable.
The relative thickness
When you use a tabulated value for the IMFP, be aware that this value depends on:
acceleration voltage
effective collection angle
material density
and may not be applicable for your experimental setup.
The measurement of the relative thickness
We already did this in the Fit Zero-Loss part.
The inelastic scattering can be viewed in terms of independent collisions, whose occurrences obey Poisson statistics. The probability that a transmitted electron suffers
where
For a given order
FWHM, energy_shift = eels_tools.get_channel_zero(np.array(eels_dataset), eels_dataset.energy_loss)
print(f'Zero Loss with energy resolution of {FWHM:.2f} eV at position {energy_shift:.3f} eV')
eels_dataset.energy_loss -= energy_shift
eels_dataset.energy_loss.dimension_type ='SPECTRAL'
zero_loss = eels_tools.get_resolution_functions(eels_dataset)
plt.figure()
plt.plot(eels_dataset.energy_loss, eels_dataset, label='spectrum')
plt.plot(eels_dataset.energy_loss, zero_loss, label = 'zero-loss')
plt.plot(eels_dataset.energy_loss, np.array(eels_dataset)-zero_loss , label = 'difference')
plt.title ('Lorentzian Product Fit of Zero-Loss Peak')
#plt.xlim(-5,30)
plt.legend();
Izl = zero_loss.sum()
Itotal = np.array(eels_dataset).sum()
tmfp = np.log(Itotal/Izl)
print(f'Sum of Zero-Loss: {Izl:.0f} counts')
print(f'Sum of Spectrum: {Itotal:.0f} counts')
print (f'thickness [IMFP]: {tmfp:.5f}')
Zero Loss with energy resolution of -0.15 eV at position -0.000 eV
Sum of Zero-Loss: 84 counts
Sum of Spectrum: 100 counts
thickness [IMFP]: 0.17734
4.3.5. Single Scattering Deconvolution#
For thicker samples (relative thickness larger than half the inelastic MFP), the scattered electrons are likely to be scattered a second time by plasmon excitations. This results for thicknesses around 0.5 MFP in more intensity in the high energy tail of the plasmon peak. For thicker areas a second plasmon peak will appear at double the energy loss and for very thick areas we have a whole series of plasmon peaks.
In spectra of very thick areas the zero-loss peak may completely vanish. Multiple scattering is easily recognized by the positions of the peaks (multiple of
Multiple scattering influences the high energy side of the first plasmon peak, and makes it difficult to quantify the spectra, whether it is in the low-loss or core–loss region. Figure \ref{fig:ssd} shows how the correction improves the determination of the width of the plasmon width. Fortunately, we can correct this multiple scattering, because mathematically, it is a kind of self-convolution. The procedure is called single scattering deconvolution (SSD).
Electrons that lost energy can interact with the sample again. The average path between two interaction is the above introduced IMFP
It can be shown the the single scattering spectrum in fourier space
The above formula would also correct for any instument broadening and a very noisy spectrum would result, so we need to convolute (multiplication in Fourier space) a new broadening function, which could be a well behaved Gaussian with slightly smaller energy width than the original zero-loss peak.
# Single scattering deconvolution
# Use resolution Function as ZL
j = np.fft.fft(np.array(eels_dataset))
z = np.fft.fft(zero_loss)
z2 = z ## Could be a different zl i.e. extracted from Spectrum
j1 = z2*np.log(j/z)
ssd_low_loss =np.fft.ifft(j1).real#,'fourier-log deconvolution')
plt.figure()
#plt.plot(s.tags['ene'][start:end], zLoss[start:end]/sumSpec*1e2)
plt.plot(eels_dataset.energy_loss, ssd_low_loss)
plt.plot(eels_dataset.energy_loss, eels_dataset)
#plt.xlim(-4,40)
plt.ylim(-.1,.1);
eels_dataset.metadata['resolution_function'] = zero_loss
4.3.6. Volume Plasmon Peak#
Most of the inelastically scattered electron arise from interaction with outer shell electrons. These interactions, therefore, have a high intensity and are easy to obtain. The quantification of this region (
The valence electrons in a solid can be considered as coupled oscillators which interact with each others and with the transmitted electrons. In a first approximation the valence electrons behave like a free electron gas (Fermi sea, jellium). The behavior of the electron gas is described in terms of the dielectric function
The energy-loss function
The maximum of the energy-loss function is the plasmon–peak, which is given by:
$
4.3.6.1. Dielectric Theory#
We investigate the plasmon excitation in the so called jellium model. This model is enough to explain the essence of this excitation, but is not as complicated as the real solid state.
The displacement of a {\it quasifree} electron (with an effective mass
The usage of an effective mass approximates the interaction between the valence electrons and the ion–cores. For the same reason, we introduce
For an oscillatory field
The displacement gives raise to a polarization
A sudden impulse such as a transmitted electron will contain all angular frequencies (Fourier components). It will also excite the resonance frequency of the jellium. Such an oscillation with frequency pseudoparticle
with (plasmon) energy pseudoparticle
a plasmon.
4.3.6.2. Energy-Loss Function#
The energy-loss function (elf) is given as shown in the beginning by:
\begin{equation} \Large
E_{el}= \left[\frac{1}{\varepsilon(\omega)}\right] = \frac{\varepsilon_2}{\varepsilon_1^2+\varepsilon_2^2}=\frac{\omega\Gamma\omega_p^2}{(\omega^2-\omega_p^2)^2 +(\omega\Gamma)^2}
\end{equation}
The energy-loss is represented by
The relaxation time
The relaxation time
4.3.6.3. Plasmon Energies#
The calculated plasmon energies of the Jellium model with equation \ref{equ:plasmon_frequency} are already quite good as can be seen in table \ref{tbl:plasmon_frequencies}.
Only the number of valence electrons per unit area
Material |
||
---|---|---|
Li |
7.1 eV |
8.0 eV |
Diamond |
34 eV |
31 eV |
Si |
16.5 eV |
16.6 eV |
Ge |
16.0 eV |
15.6 eV |
InSb |
12.9 eV |
12.7 eV |
GaAs |
15.8 eV |
15.7 eV |
NaCl |
15.5 eV |
15.7 eV |
A more sophisticated way of comparing the valence loss spectra to theory is to calculate the dielectric function. {\it Ab initio} density functional theory can be used to do these calculations. To obtain the dielectric function the valence band has to be convoluted with the conduction band. A comparison between experiment and theory is shown in the figure below.

Plasmon–Loss peak of Li (black circles), Gibbson et al Phys.~Rev.~B {\bf 13}:2451 (1979) and calculated energy-loss function by S.~Ramachandran et al. (unpublished)}
The plasmon–loss enables us to determine the plasmon energy, a materials parameter. The width plasmon peak is also a characteristic of the material and is needed to determine the plasmon energy.

Plasmon–Loss peak of SrTiO
The spectrum here is quite complicated due to the surface plasmon–peak which shows up to the left of the volume plasmon–peak. We measure the energy of the maximum of the plasmon–peak (here
Using equation above, we find that the plasmon energy is 30.5 eV for SrTiO
This spectrum shows the high dynamic range of an EELS spectrum. The valence loss part of the spectrum is noisy, but the zero-loss peak is not saturated. The surface plasmon peak is strong, which indicates a rather thin area. May be a little too thin. Without loss of information we can get spectra from thicker areas.
Not only the plasmon energy (or the plasmon maximum) can be used for an identification of materials, but also the shape, especially the width of the plasmon peak.
As seen above, it is rather difficult to determine the FWHM of a plasmon peak. However, it is much easier after subtraction of the zero-loss peak, as can be seen in figure below.

Plasmon–Loss peak of Ni (black) after subtraction of the zero-loss peak and with highlighted FWHM. The original spectrum and the zero-loss peak are displayed in the background.
A comparison of the plasmon peak width of Ni (above) and Si (figure below) makes it apparent how different the shape of plasmon peaks can be. The Si plasmon peak is sharp (FWHM: 7.3 eV) and has a well defined maximum, while the Ni plasmon peak is very broad (FWHM: 40 eV).

The Si plasmon peak is obtained from a rather thin area, which also makes it easier to determine the width, because the right hand tail is not broadened by the thicker sample (please see section above about single scattering deconvolution).
4.3.7. Drude Function#
The dielectric function in the Drude theory is given by two input parameters the position of the plasmon energy
Here
# ----------- Input -------------
E_p = plasmon_energy = 17. # in eV
E_w = plasmon_gamma = .7 # in eV
# -------------------------------
energy_scale = eels_dataset.energy_loss+1e-18 #= np.linspace(0,50,1024)+1e-18
def Drude(E,E_p,E_w):
eps = 1 - E_p**2/(E**2+E_w**2) +1j* E_w* E_p**2/E/(E**2+E_w**2)
elf = (-1/eps).imag
return eps,elf
eps,elf = Drude(np.array(energy_scale), plasmon_energy, plasmon_gamma)
plt.figure()
plt.plot(energy_scale, eps.real, label='Re($\epsilon_{Drude}$)')
plt.plot(energy_scale, eps.imag, label='Im($\epsilon_{Drude}$)')
plt.plot(energy_scale, elf, label='loss function$_{Drude}$')
plt.plot([0,energy_scale[-1]],[0,0],c='black')
plt.legend()
plt.gca().set_ylim(-2,max(elf)*1.05);
plt.xlabel('energy loss (eV)')
Text(0.5, 0, 'energy loss (eV)')
4.3.8. Fitting a Drude Function to Plasmon#
The position and the width are important materials parameters and we can derive them by fitting the Drude function to the volume plasmon region.
from scipy.optimize import leastsq
def Drude(E,Ep,Ew):
eps = 1 - Ep**2/(E**2+Ew**2) +1j* Ew* Ep**2/E/(E**2+Ew**2)
elf = (-1/eps).imag
return eps,elf
def errfDrude(p, y, x):
eps,elf = Drude(x,p[0],p[1])
err = y - p[2]*elf
#print (p,sum(np.abs(err)))
return np.abs(err)#/np.sqrt(y)
pin2 = np.array([15,1,.7])
E = np.array(energy_scale)
startFit =np.argmin(abs(energy_scale.values-13))
endFit = np.argmin(abs(energy_scale.values-18))
print(startFit)
p2, lsq = leastsq(errfDrude, pin2, args=(ssd_low_loss[startFit:endFit], np.array(energy_scale)[startFit:endFit]), maxfev=2000)
eps, elf =Drude(np.array(energy_scale),p2[0],p2[1])
drudePSD = p2[2]* elf
plt.figure()
plt.plot(energy_scale,eels_dataset)
plt.plot(energy_scale,drudePSD)
plt.plot(energy_scale,eels_dataset-drudePSD)
plt.axhline(0, color='black')
plt.gca().set_xlim(0,40)
plt.gca().set_ylim(-0.01,0.2)
print(f"Drude Theory with Plamson Energy: {p2[0]:2f} eV and plasmon Width {p2[1]:.2f} eV")
print(f"Max of Plasmon at {energy_scale[drudePSD.argmax(0)]:.2f} eV")
print(f"Amplitude of {p2[2]:.2f} was deteremined by fit ")
819
Drude Theory with Plamson Energy: 15.049794 eV and plasmon Width 0.72 eV
Max of Plasmon at 15.04 eV
Amplitude of 0.01 was deteremined by fit
plt.figure()
plt.title ('Drude Fit: Dielectric Function - Permittivity')
plt.plot(energy_scale,eps.real,label = 'Re($\epsilon)$')
plt.plot(energy_scale,eps.imag,label = 'Im($\epsilon)$')
plt.plot(energy_scale,drudePSD,label = 'loss-function$_{Drude}$')
plt.plot(energy_scale,eels_dataset,label = 'loss-function$_{exp}$')
plt.axhline(0, color='black')
plt.gca().set_xlim(0,40)
plt.gca().set_ylim(-2.5,5.3)
plt.legend();
4.3.8.1. Plasmon Frequency and Phase Identification#
Plasmon peaks occurring in EELS is directly related to valence electron density and can thereby be used as a means for materials characterization and phase identification. Free-electron metals have very sharp plasmon peaks as compared to semiconductors and insulators with broader peaks, where the valence electrons are no longer free (covalent or ionic bonding). While many materials properties are a function of valence electron density, knowing the plasmon energy can prove to be a useful tool in identifying micro structures.
Microstructural phases are observed by shifts in the plasmon energy. Examples of phase identification are observed easily in alloys and also precipitate structures. A common textbook example is EELS low loss comparison of diamond and graphite. The example given in Figure is a line scan showing the variation of plasmon energies with position. The plasmon energies range from 21 to 23 eV, corresponding to SiC (20.8 eV) and SiN3 (22.5 eV) respectively. Figure \ref{plasmon-ls2} is a reconstructed map of the plasmon energies. Blue regions correspond to SiC, while the red regions correspond to SiN3.
Appendix C in Egerton’s Electron Energy Loss Spectroscopy in the Electron Microscope lists plasmon energies of some elements and compounds [Egerton-1999].
4.3.9. Surface Plasmon#
Spectra from thin specimen show the excitations of the surface plasmons on each side of the specimen. For any normal specimen these surface plasmons do interact, but this is not true for extremely thick specimen (
$
The symmetric mode, where like charges face one another, corresponds to the higher angular frequency
The differential probability for surface excitation at both surfaces of a sample with thickness
\frac{\varepsilon_a \cos^2(tE/2\hbar\mu)}{\varepsilon_b + \varepsilon_a} \coth (q_s t/2) $
\varepsilon_a \varepsilon_b$ are the permitivities of the two surfaces.
A secondary effect of the surface excitation is the reduced intensity of the bulk plasmon peak. The effect is usually smaller than 1%, but can be larger for spectra with small collection angle, because the preferred scattering of surfuce losses into small angles. The correction for surface plasmon will be discussed in the Kramers–Kronig Analysis.
4.3.10. Summary#
The beauty of Low--Loss spectroscopy
is its derivation of the dielectric function to high energies without prior knowledge of the composition. The signal is strong and the acquisition time is mostly restricted by the dynamic range of the spectrum.
Think of low-loss spectroscopy as Electrodynamics
The advantages of EELS is the derivation of these values spatially resolved.
And from a linescan across an Si/SiO
We obtain more or less easily:
relative thickness
absolute thickness
inelastic mean free path
plasmon frequency
plasmon width
band gap
dielectric function
reflectivity
absorption
effective number of electrons per atoms
The analysis of the optical data requires the exact knowledge of the zero-loss peak. Because of the weighting in the Fourier Analysis, the low energy part contributes heavily to the dielectric function. Therefore, energy resolution is critical for an exact determination of all the optical values from EELS. The new monochromated TEMs are now able to achieve an energy resolution of 10 meV (one is at the oak Ridge National Laboratory), which allows for a sharper zero-loss peak. Such a sharp zero-loss peak will enable us to extract this low energy data more accurately. The dielectric function and the parameters derived from it, can be more precisely determined from such EELS spectra.