Imaging of Si-Ge Crystal Sctructures using a Scanning Electron Microscope (SEM)

Santiago.R

In [75]:
import numpy as np
import scipy.constants as cs
import matplotlib.pyplot as plt
import pandas
from PIL import Image
data_path="/home/santi/Documents/Arbeits-Dokumente/Experimental Data/"

De-Broglie Wavelength $\lambda _e$ for Electrons with different Acceleration Voltages $V_0$

The DeBroglie wavelength capable of describing the wave nature properties of mass-carrying particles is given by $\lambda _e = \frac{hc}{\sqrt{eV_0(2m_0c^2+eV_0)}}$
This relation can be evaluated repeatedly according to input voltage or electron wavelength by defining the following functions;

Functions

In [76]:
#Constants
h = cs.Planck
m_0 = cs.electron_mass
c = cs.speed_of_light
e = cs.elementary_charge
#Function returning the Electron wavelenght in pm at a given accelerating Voltage in kV
def electron_wavelength(V_0):
    V_0 = V_0*1000 #Conversion to volt
    debroglie_wavelength = h*c/(np.sqrt(e*V_0*(2*m_0*c**2+e*V_0)))
    debroglie_wavelength = debroglie_wavelength*10**12 #Conversion to picometers
    return debroglie_wavelength
In [77]:
#Electron wavelength curve as a function of the accelerating Voltage between 1kV and 100kV
V_e = np.linspace(1,20,10000)
plt.plot(V_e,electron_wavelength(V_e))
plt.vlines(5, np.zeros(1),40, label='5kV', color='lightblue', linestyle='dashed')      #Plot characteristic X-Ray energies for Ge
plt.vlines(15, np.zeros(1),40, label='15kV', color='darkblue', linestyle='dashed')        #Plot characteristic X-Ray energies for Si
plt.xlabel('Accelerating voltage in kV')
plt.ylabel('DeBroglie wavelength in pm')
plt.legend()
startx, endx = 0, 20
starty, endy = 0, 40
plt.axis([startx, endx, starty, endy])
plt.show()
print('The wavelength becomes shorter for increased accelerating voltages, but converges towards zero at higher values with higher voltages reducing the wavelength less and less')
#Compute the electron wavelength for the 5kV and 15kV beam energies
V_sem = np.array([5,15])
print('The DeBroglie wavelength of the electrons accelerated in the SEM at energies of', V_sem , 'keV is' ,electron_wavelength(V_sem), 'pm respectively')
The wavelength becomes shorter for increased accelerating voltages, but converges towards zero at higher values with higher voltages reducing the wavelength less and less
The DeBroglie wavelength of the electrons accelerated in the SEM at energies of [ 5 15] keV is [17.30201     9.94103884] pm respectively

Accelerating Voltage Function

The energy of a mass-carrying particle at a given DeBroglie wavelength thus becomes: $E = \sqrt{(\frac{hc}{\lambda})^2+m_0^2c^4}$

In [78]:
#Function returning the neccessary accelerating Voltage for a given Electron Wavelength
def accelerating_voltage(debroglie_wavelength):
    d = debroglie_wavelength
    V_0 = (np.sqrt((h*c/d)**2+m_0**2*c**4)-m_0*c**2)/e
    return V_0
In [79]:
electron_wavelength(1000) #Test for 1kV
Out[79]:
0.8719186929043307
In [80]:
accelerating_voltage(3.8764034152582323e-11) #Test for 38.7pm wavelength
Out[80]:
1000.0000000000866

For the experiment, accelerating voltages of 5kV and 15kV were used, which corresponds to

In [81]:
sem_voltages = np.array([15000,5000])
electron_wavelength(sem_voltages)
Out[81]:
array([0.0799765 , 0.22594932])

Photon energies $E_{ph}$ at similar wavelengths $\lambda$

In [82]:
#Function for the energy E of a photon of wavelength lambda in pm given in keV
def photon_energy(wavelength_pm):
    w = wavelength_pm*10**(-12)
    E = h*c/w
    E = E/(e*1000) #conversion to keV
    return E
In [83]:
photon_energy(electron_wavelength(V_sem))
Out[83]:
array([ 71.65884105, 124.71955941])

Uncertainties

Assuming only an uncertainty for the accelerating voltage $V_0$, the gau├čian error proprogation becomes $u_{\lambda _e}= u_{V_0} \cdot \frac{hce(m_0c^2+eV_0)}{\sqrt{eV_0(2m_0c^2+eV_0)}}$
Which may then be automatically computed alongside the electron wavelength with

In [84]:
def electron_wavelength_err(V_0,u_V):
    debroglie_wavelength = h*c/(np.sqrt(e*V_0*(2*m_0*c**2+e*V_0)))
    err = u_V*h*c*e*(m_0*c**2+e*V_0)/(np.sqrt(e*V_0*(2*m_0*c**2+e*V_0)))
    return debroglie_wavelength, err
In [85]:
electron_wavelength_err(20000,100) #Test for 20kV and 100V uncertainty
Out[85]:
(8.58851184477148e-12, 1.170664284336823e-41)

This uncertainty is comparatively low when compared to the computed value for the electrons wavelength

Scanning Electron Microscope Data Processing

Image Evaluation

The data from the SEM is saved as TIFF files. These files can be read using PIL as follows;

In [86]:
#Open TIFF with PIL.Image
im = Image.open('SEM/15kV_InLens_3mm.tif')
im.show()
In [87]:
#Convert TIFF to Numpy Array
imarray = np.array(im)
print(imarray)
[[125  24   0 ...  12   0  49]
 [  8  18  31 ...  54  24   0]
 [ 62   8  97 ...  17   0  22]
 ...
 [ 46 255 255 ... 255 255 247]
 [  0 255 255 ... 255 255 121]
 [ 59  26   0 ... 212 195 196]]
In [88]:
#Save Numpy Array as TIFF again
Image.fromarray(imarray)
Out[88]: