Specular reflectometry simulation

As introductory example, we simulate specular reflectometry by a sample that consists of 10 Ti/Ni double layers on a Si substrate.

The same script has been used in preceding pages to explain usage and syntax of BornAgain Python code.

Example script

To generate this image

run this script:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#!/usr/bin/env python3
"""
Basic example of specular reflectometry simulation with BornAgain.
The sample consists of 20 alternating Ti and Ni layers.
"""
import bornagain as ba
from bornagain import deg, angstrom


def get_sample():
    # Define materials
    m_ambient = ba.MaterialBySLD("Vacuum", 0, 0)
    m_ti = ba.MaterialBySLD("Ti", -1.9493e-06, 0)
    m_ni = ba.MaterialBySLD("Ni", 9.4245e-06, 0)
    m_substrate = ba.MaterialBySLD("SiSubstrate", 2.0704e-06, 0)

    # Define layers
    ambient_layer = ba.Layer(m_ambient)
    ti_layer = ba.Layer(m_ti, 30*angstrom)
    ni_layer = ba.Layer(m_ni, 70*angstrom)
    substrate_layer = ba.Layer(m_substrate)

    # Define sample
    sample = ba.MultiLayer()
    sample.addLayer(ambient_layer)
    for i in range(10):
        sample.addLayer(ti_layer)
        sample.addLayer(ni_layer)
    sample.addLayer(substrate_layer)

    return sample


def get_simulation(sample, scan_size=500):
    simulation = ba.SpecularSimulation()
    scan = ba.AngularSpecScan(1.54*angstrom, scan_size, 0, 2*deg)
    simulation.setScan(scan)
    simulation.setSample(sample)
    return simulation


if __name__ == '__main__':
    import ba_plot
    sample = get_sample()
    simulation = get_simulation(sample)
    ba_plot.run_and_plot(simulation)
AlternatingLayers.py

Explanation

The Define materials stance defines four materials in terms of their scattering length density (SLD). The arguments of the constructor-like global function MaterialBySLD are name, real_sld, imag_sld. Both real_sld and imag_sld are in units of inverse square angstroms.

SLD values for a wide variety of materials can be found on https://sld-calculator.appspot.com and https://www.ncnr.nist.gov/resources/activation. By convention, imag_sld is treated as negative, which corresponds to attenuation of the signal. In this example, all imaginary parts are zero.

The Define layers stance defines four types of layers. The arguments of the constructor Layer are material and thickness in nanometer. If no thickness is provided, then the layer is semi-infinite.

The Define sample stance constructs a sample by pilig up the above defined layers from top (vacuum) to bottom (substrate). Samples are always of type MultiLayer.

The function get_simulation constructs a SpecularSimulation. The constructor AngularSpecScan defines a scan as function of inclination angles. The arguments are wavelength, number of points, initial angle, final angle.

The Main program has been explained in the Syntax page. For alternative ways of running simulations and plotting or exporting results, see section Plot and export.

Further reading