Background

This example compares two built-in background models on the same GISAS sample: an additive constant and Poisson counting noise. A constant random seed would reproduce one noise realization; the script chooses a new seed for each interactive run and uses the deterministic case for regression testing.

See the background reference for the common simulation API.

Result

Background result

Sample

Background sample

Python 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
51
52
53
54
55
56
57
58
59
60
61
#!/usr/bin/env python3
# /// script
# requires-python = ">=3.10"
# dependencies = ["bornagain>=25,<26"]
# ///
"""
Cylinder form factor in DWBA with background/noise
"""
import random
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, background):
    beam = ba.Beam(1e8, 0.1*nm, 0.2*deg)
    n = 100
    detector = ba.SphericalDetector(n, 0., 2*deg, n, 0., 2*deg)
    simulation = ba.ScatteringSimulation(beam, sample, detector)
    simulation.setBackground(background)
    return simulation


def simulate(background, title):
    sample = get_sample()
    simulation = get_simulation(sample, background)
    result = simulation.simulate()
    result.setTitle(title)
    return result


if __name__ == '__main__':    
    # New seed each run; constant seed reproduces the same noise realization.
    poisson_seed = random.randrange(2**32)
    results = [
        simulate(ba.ConstantBackground(1e0), "Constant background"),
        simulate(ba.PoissonBackground(seed=poisson_seed), "Poisson noise"),
    ]
    ba.showSample3D(get_sample(), sample_size=120*nm, seed=0)
    ba.plot2d_to_row(results, log_range=5, unit_aspect=1)
    ba.plt.show()
auto/Examples/gisas/setup/Background.py