RP Photonics

Software … powerful tools for your research & development!


RP Coating – Advanced Software for
Designing Optical Multilayer Structures

Demo File: Fitting Layer Details to a Measured Reflection Spectrum

When a thin-film structure is grown, there are often uncertainties both concerning the layer thickness values and their refractive index. The latter is influenced by the packing density of the material, which depends on the detailed growth conditions. A measured reflectivity spectrum can be used to retrieve information on the layer details and thus to calibrate the coating machine.

In this example, we assume that as a test structure, a simple Bragg mirror with 6 layer pairs of HfO2 / SiO2 has been grown on a BK7 substrate, nominally with λ/4 layers at 800 nm:

d_units: nm
l_units: nm
N := 6  { number of layer pairs }
; Initial (nominal) layer parameters:
d_HfO2 := 800 / 4 / n_HfO2_Jerman(800 nm,7)
x_HfO2 := 7
d_SiO2 := 800 / 4 / n_SiO2_Jerman(800 nm,1.8)
x_SiO2 := 1.6
beam from superstrate
substrate: BK7
for j := 1 to N do
* HfO2_Jerman, x = x_HfO2, d = d_HfO2
* SiO2_Jerman, x = x_SiO2, d = d_SiO2
superstrate: air

We use refractive index data from M. Jerman et al., Appl. Opt. 44 (15), 3006 (2005), which depend on the packing density in units of g/cm3. (These index data are provided with the software.) The precise thickness values and packing densities made with the coating machine are not yet known and should be retrieved from the measured reflectivity data.

The reflection spectrum has been measured and stored in a text file named “Reflectivity.dat”, containing a wavelength and the corresponding reflectivity (in percent) in each line. We read that file, such that its x/y data points are stored (by default as row 1):

include "Reflectivity.dat"

Now we can do the fit. As the fitting variables, we use the thickness values and packing densities, assuming that these parameters are identical for all layer pairs.

We first need to define a function which sets the coating structure according to these fit parameters. Then we can call the fit command and subsequently display the obtained fit parameters:

set_layer_params(d_HfO2, x_HfO2, d_SiO2, x_SiO2) := 
  for j := 1 to N do
    set_d(2 * j - 1, d_HfO2);
    set_d(2 * j    , d_SiO2);
    set_x(2 * j - 1, x_HfO2);
    set_x(2 * j    , x_SiO2);
fit 100 * R(x) to row 1
  with (d_HfO2, x_HfO2, d_SiO2, x_SiO2),
  init set_layer_params(d_HfO2, x_HfO2, d_SiO2, x_SiO2)
show "d_HfO2:  ", d_HfO2:f1:"nm"
show "d_SiO2:  ", d_SiO2:f1:"nm"
show "x_HfO2:  ", x_HfO2:f2:"g / cm^3"
show "x_SiO2:  ", x_SiO2:f2:"g / cm^3"

Finally, we display the reflectivity profile:

diagram 1:
"Reflectivity Profile"
x: 400, 1200
"wavelength (nm)", @x
y: 0, 100
"reflectivity (%)", @y
m: points("r")  { show the data points as rectangles }
f: 100 * R(x), color = red, width = 3
["d_HfO2:  ", d_HfO2:f1:"nm"], 120, 150
["d_SiO2:  ", d_SiO2:f1:"nm"], 120, 200
["x_HfO2:  ", x_HfO2:f2:"g / cm^3"], 120, 250
["x_SiO2:  ", x_SiO2:f2:"g / cm^3"], 120, 300
fitted reflectivity profile of the test structure

For comparison, see the spectrum without fitting:

reflectivity profile of the test structure without fitting

This example shows that RP Coating makes it quite easy to retrieve layer data from measured spectra. Its high flexibility would allow various further degrees of sophistication:

  • If the spectrometer delivers the data not as comma-separated values, but in some other (possibly even binary) format, one could also read such files with a little script programming.
  • One could export obtained fitting data in any format, e.g. for direct control of coating machine or for documentation purposes.
  • If in-situ reflectivity measurements are made on the heated substrate, one could automatically apply temperature corrections.
  • One could do such measurements and fitting on a partly grown structure and then start a numerical optimization for the remaining layers to be grown. Such growth error control can be implemented with a high degree of automation.