Python syntax used in BornAgain scripts

We shall employ the same reflectometry script as on the preceding page to explain some Python syntax used in BornAgain scripts.

For easy reference, here again the full 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
47
48
49
50
#!/usr/bin/env python3
"""
Basic example of specular reflectometry 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):
    n = bp.simargs['n']
    scan = ba.AlphaScan(n, 2*deg/n, 2*deg)
    scan.setWavelength(1.54*angstrom)
    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

We shall now explain the code.

The shebang line

#!/usr/bin/env python3

makes the script executable under Unix-like operating systems, see the chapter on how to run scripts from the command line.

Lines between triple quotes

"""
Text, text, text
"""

are comments.

The function

def get_sample():
    ...

constructs and returns a sample model. For more information, see the sample section.

The function

def get_simulation(sample, scan_size=500):
    ...

constructs and returns a simulation model. For more information, see the simulation section, and specifically the reflectometry reference.

The clause

if __name__ == '__main__':

ensures that the following statements are only executed if the script is called directly, as a “main” program. This precaution is required by the GUI, where scripts can be imported without being immediately executed.

The line

bp.parse_args(sim_n=500)

digests some command-line arguments that are mostly needed by the developers for automatized testing.

The lines

sample = get_sample()
    simulation = get_simulation(sample)
    result = simulation.simulate()

construct a sample and instrument model and run a simulation. The function simulate() returns a SimulationResult instance.

The line

bp.plot_simulation_result(/py/result)

plots the simulated reflectivity as function of the incident glancing angle, using MatPlotLib.