Expanded simulation script

As a first step towards writing sample and simulation specifications of your own, let us expand the simulation script AlternatingLayers.py from the preceding pages. Instead of the shorthand calls to modules std_samples and std_simulations, we provide explicit code for the functions get_sample and get_simulation:

 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
47
48
49
50
51
52
53
54
#!/usr/bin/env python3
"""
Basic example of specular reflectometry simulation with BornAgain.
The sample consists of 20 alternating Ti and Ni layers.
Explicit variant without using std_samples and std_simulation.
"""

import bornagain as ba
from bornagain import ba_plot as bp, deg, angstrom


def get_sample():
    """
    Sample consisting of 20 alternating Ti and Ni layers.
    """

    # 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 _ in range(10):
        sample.addLayer(ti_layer)
        sample.addLayer(ni_layer)
    sample.addLayer(substrate_layer)

    return sample


def get_simulation(sample):
    """
    A standard specular simulation setup.
    """
    n = bp.simargs['n']
    scan = ba.AlphaScan(1.54*angstrom, n, 0, 2*deg)
    return ba.SpecularSimulation(scan, sample)


if __name__ == '__main__':
    bp.parse_args(sim_n=500)
    sample = get_sample()
    simulation = get_simulation(sample)
    result = simulation.simulate()
    bp.plot_simulation_result(result)
Examples/specular/AlternatingLayers1.py

Sample

get_sample is a function without arguments. It returns an object of type MultiLayer.

The return statement is preceded by three stances. Each stance starts with a comment line,

    # comment extends from hash character to end of line

BornAgain functions that start with a capital letter, like MaterialBySLD or Layer are constructors or constructor-like global functions. They return new objects. An object is an instance of a class. The function MaterialBySLD instantiates an object of type Material the function Layer an object of type Layer.

Function like addLayer is a member function of class MultiLayer. This can be seen from the two lines

    sample = ba.MultiLayer()
    sample.addLayer(ambient_layer)
where sample is created as a new instance of class MultiLayer.

Simulation

get_simulation(sample, scan_size=500) is a function with one required argument (sample) and one optional keyword argument (scan_size). If the function is called with only one argument, then scan_size is assigned the default value 500.

angstrom and deg are numeric constants. They are used to convert physical quantities to internal units nanometer and radian.

The function returns an object of type SpecularSimulation.