Lattice orientation distribution

This example performs an incoherent average over square lattices with different in-plane orientations. Samples from an orientation distribution are converted into weighted Crystal2D layouts and added to the same layer.

Result

Lattice orientation distribution result

Sample

Lattice orientation distribution 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
#!/usr/bin/env python3
# /// script
# requires-python = ">=3.10"
# dependencies = ["bornagain>=25,<26"]
# ///
"""
GISAS by a a distribution of dlayouterently oriented
square lattices of cylinders on a substrate.
"""
import bornagain as ba
ba.require_versions("bornagain>=25,<26")
from bornagain import deg, nm, R3


def get_sample():
    vacuum = ba.Vacuum()
    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)

    toplayer = ba.Layer(vacuum)
    substrate = ba.Layer(substrate_mat)

    ff = ba.Cylinder(3*nm, 4*nm)
    particle = ba.Particle(particle_mat, ff)

    distr = ba.DistributionGate(0*deg, 90*deg)
    distr.setNSamples(21)
    for parsample in distr.distributionSamples():
        layout = ba.Crystal2D(particle, ba.SquareLattice2D(25*nm, parsample.value))
        layout.setDecayFunction(ba.Profile2DCauchy(100*nm, 100*nm, 0))
        toplayer.addDeposit2D(parsample.weight, layout)

    sample = ba.Sample()
    sample.addLayer(toplayer)
    sample.addLayer(substrate)
    return sample


def get_simulation(sample):
    beam = ba.Beam(1e9, 0.1*nm, 0.2*deg)
    n = 100
    detector = ba.SphericalDetector(n, -1*deg, 1*deg, n, 0, 2*deg)
    simulation = ba.ScatteringSimulation(beam, sample, detector)
    return simulation


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