Skip to content

Fit single layer ellipsometry 2 (with BlackBoxOptim)

Leandro Acquaroli edited this page Nov 28, 2019 · 4 revisions

In this example, we will fit the ellipsometry spectra of a hafnium oxide thin film coating atop a fused silica UV graded glass substrate, using the BlackBoxOptim option. The light hits the air medium, then the oxide film and finally passes through the substrate.

We will use the Tauc-Lorentz parametrization of the dielectric function in this case.

The complete code can be found here.

Load modules

using Plots
pyplot()
using ThinFilmsTools

Set the light source

# Wavelength range [nm]
λ = 200:2100
# Angle of incidence [degrees]
θ = [60.]
# Polarisation (1.0 = p, 0.0 = s, between 0.0 and 1.0 = average)
pol = 0.5
beam = PlaneWave(λ, θ; p=pol)

Define the layers

# Refractive indices of incident (0) and substrate (2)
incident = RIdb.air(beam.λ)
emergent = RIdb.fused_silica_uv(beam.λ)

# Define the RI model to use
layers = [
    LayerTMMO(incident),
    ModelFit(:tauclorentz),
    LayerTMMO(emergent),
]

Experimental spectrum from the SpectraDB

Ψexp, Δexp = SpectraDB.hafnia_ellips(beam.λ)
# Spectrum type: ellipsometry with the input experimental spectra
spectype = Ellipsometry([Ψexp Δexp])

Optimisation

One oscillator

seed = [vcat(100.0, # thickness
             [3.0, 5.5,
              545, 6.2, 13.2], # osc 1
        ),
]
# Boundaries
lb = 0.01.*seed
ub = 2.0.*seed
# Thickness bounds
lb[1][1] = 80
ub[1][1] = 200
# Egap bounds
lb[1][3] = 4.0
ub[1][3] = 6.0

solOptim = fit_tmm_optics(
    spectype, seed, beam, layers;
    alg=:BBO,
    SearchRange=Utils.unfold_bnd(lb,ub),
)

plot(FitSpectrumEllip(),
    solOptim.beam.λ, solOptim.spectrumExp, solOptim.spectrumFit,
    xaxis=("Wavelength [nm]"),
)
gui()

Fit Single Layer TL 1 osc

Clone this wiki locally