GISAS simulation example

In the following introductory example, we take a standard sample model from module bornagain.std_samples, a dilute random assembly of monodisperse cylindrical disks on a substrate.

Real-space model

Intensity image

 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
#!/usr/bin/env python3
"""
Basic example of a DWBA simulation of a GISAS experiment.
"""
import bornagain as ba
from bornagain import ba_plot as bp, deg, nm
import matplotlib.pyplot as plt


def get_sample():
    """
    Standard sample model: dilute random assembly of cylinders on a substrate.
    """
    from bornagain import std_samples
    return std_samples.cylinders()


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()
    simulation = get_simulation(sample)
    result = simulation.simulate()
    bp.plot_simulation_result(result)
    plt.show()
auto/Examples/scatter2d/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 stance in the script is the main program.

The function parse_args digests command-line arguments; in particular, a command-line argument like sim_n=100 can be used to overwrite the default pixel size (which is retrieved by bp.simargs['n'] in function get_simulation.

The function call simulation.simulate() runs the simulation and returns a Datafield object.

Further reading