GISAS simulation example

The following introductory example simulates a dilute random assembly of monodisperse cylindrical disks on a substrate.

Real-space model

Scattering intensity

 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
#!/usr/bin/env python3
# /// script
# requires-python = ">=3.10"
# dependencies = ["bornagain>=25,<26"]
# ///
"""
Basic example of a DWBA simulation of a GISAS experiment.
"""
import bornagain as ba
ba.require_versions("bornagain>=25,<26")
from bornagain import deg, nm


def get_sample():
    """
    A dilute random assembly of cylinders on a substrate.
    """
    substrate_color = (0.28, 0.57, 0.82)
    substrate_mat = ba.RefractiveMaterial("Substrate", substrate_color, 6e-6, 2e-8)
    particle_color = (0.86, 0.24, 0.18)
    particle_mat = ba.RefractiveMaterial("Particle", particle_color, 6e-4, 2e-8)
    particle = ba.Particle(particle_mat, ba.Cylinder(5*nm, 5*nm))

    particle_layer = ba.Layer(ba.Vacuum())
    particle_layer.deposit2D(ba.Dilute2D(0.001, particle))
    substrate_layer = ba.Layer(substrate_mat)

    sample = ba.Sample()
    sample.addLayer(particle_layer)
    sample.addLayer(substrate_layer)
    return sample


def get_simulation(sample):
    # Beam
    wavelength = 0.1*nm
    alpha_i = 0.2*deg
    beam = ba.Beam(1e9, wavelength, alpha_i)

    # Detector
    n = 200
    detector = ba.SphericalDetector(n, -2*deg, 2*deg, n, 0., 3*deg)

    return ba.ScatteringSimulation(beam, sample, detector)


if __name__ == '__main__':
    sample = get_sample()
    ba.showSample3D(sample, sample_size=120*nm, seed=0)
    simulation = get_simulation(sample)
    result = simulation.simulate()
    ba.plot_datafield(result, unit_aspect=1)
    ba.plt.show()
auto/Examples/gisas/setup/Cylinders.py

Explanation

Function get_simulation

The simulation of type ScatteringSimulation is defined by beam, sample, and detector.

The incoming beam is defined by the constructor Beam with arguments intensity, wavelength, and glancing angle.

To define the wavelength, we use the unit multiplier nm. As it happens, the internal unit for microscopic lengths in BornAgain is one nanometer; therefore the constant nm is just 1, and *nm could be omitted from the code, but we recommend to leave it for the benefit of human readers.

The spherical detector has nPix=200 bins for both coordinate axis. The azimuthal angle $\varphi_\text{f}$ extends from $-2^\circ$ to $+2^\circ$; the glancing angle $\alpha_\text{f}$ from $0^\circ$ to $3^\circ$.

Main program

The last stanza in the script is the main program. It constructs the sample and simulation, then calls simulation.simulate() to obtain a Datafield object and plots it with ba.plot_datafield.

Further reading