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
#!/usr/bin/env python3
"""
Basic example of specular reflectometry simulation.
The sample consists of 20 alternating Ti and Ni layers.
"""
import bornagain as ba
from bornagain import ba_plot as bp, deg, angstrom


def get_sample():
    # Materials
    vacuum = ba.MaterialBySLD("Vacuum", 0, 0)
    material_Ti = ba.MaterialBySLD("Ti", -1.9493e-06, 0)
    material_Ni = ba.MaterialBySLD("Ni", 9.4245e-06, 0)
    material_Si = ba.MaterialBySLD("Si", 2.0704e-06, 0)

    # Layers
    top_layer = ba.Layer(vacuum)
    ti_layer = ba.Layer(material_Ti, 30*angstrom)
    ni_layer = ba.Layer(material_Ni, 70*angstrom)
    substrate = ba.Layer(material_Si)

    # Sample
    sample = ba.MultiLayer()
    sample.addLayer(top_layer)
    for _ in range(10):
        sample.addLayer(ti_layer)
        sample.addLayer(ni_layer)
    sample.addLayer(substrate)

    return sample


def get_simulation(sample):
    n = 500
    scan = ba.AlphaScan(n, 2*deg/n, 2*deg)
    scan.setWavelength(1.54*angstrom)
    return ba.SpecularSimulation(scan, sample)


if __name__ == '__main__':
    sample = get_sample()
    simulation = get_simulation(sample)
    result = simulation.simulate()
    bp.plot_simulation_result(result)
auto/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. It is ignored otherwise, as is all text from the comment start character # to the end of the line.

Lines between triple quotes

"""
Text, text, text
"""

are also comments.

The function

def get_sample():
    ...

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

The function

def get_simulation(sample):
    ...

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 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 Datafield instance.

The line

bp.plot_simulation_result(result)

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