2D lattice with position variance

A position variance parameter describes fluctuations of particle position around lattice points. It gives rise to an attenuation factor of Debye-Waller type.

It can be set using the method setPositionVariance(variance) of class InterferenceFunction2DLattice. The argument variance is in nm$^2$.

By default the variance is zero.

Example: square lattice without and with variance

A square lattice of hemispheres on a substrate, for different lattice orientation angles xi.

 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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#!/usr/bin/env python3
"""
"""
import bornagain as ba
from bornagain import deg, nm, kvector_t
from matplotlib import pyplot as plt


def get_sample(hasVariance, xi):
    # Define materials
    m_air = ba.HomogeneousMaterial("Air", 0, 0)
    m_particle = ba.HomogeneousMaterial("Particle", 0.0006, 2e-08)
    m_substrate = ba.HomogeneousMaterial("Substrate", 6e-06, 2e-08)

    # Define particles
    R = 2.5*nm
    ff = ba.FormFactorFullSpheroid(R, R)
    particle = ba.Particle(m_particle, ff)

    # Define interference function
    lattice = ba.SquareLattice2D(10*nm, xi)
    interference = ba.InterferenceFunction2DLattice(lattice)
    interference_pdf = ba.FTDecayFunction2DCauchy(500*nm, 500*nm, 0)
    interference.setDecayFunction(interference_pdf)
    if hasVariance:
        interference.setPositionVariance(0.3*nm)

    # Define particle layout
    layout = ba.ParticleLayout()
    layout.addParticle(particle)
    layout.setInterferenceFunction(interference)

    # Define layers
    l_air = ba.Layer(m_air)
    l_air.addLayout(layout)
    l_substrate = ba.Layer(m_substrate)

    # Define sample
    multilayer = ba.MultiLayer()
    multilayer.addLayer(l_air)
    multilayer.addLayer(l_substrate)
    return multilayer


def get_simulation(sample):
    beam = ba.Beam(1e8, 0.1*nm, ba.Direction(0.2*deg, 0))

    det = ba.SphericalDetector(400, -2*deg, 2*deg, 400, 0, 3*deg)

    simulation = ba.GISASSimulation(beam, sample, det)
    return simulation


def run_one(hasVariance, xi, nPlot, title):
    sample = get_sample(hasVariance, xi)
    simulation = get_simulation(sample)
    simulation.runSimulation()
    result = simulation.result()

    plt.subplot(3, 2, nPlot)

    return ba_plot.plot_colormap(result,
                          title=title,
                          intensity_max=3e7,
                          intensity_min=3e0,
                          zlabel=None,
                          aspect='equal',
                          with_cb=False)


if __name__ == '__main__':
    import ba_plot
    fig, axs = plt.subplots(3, 2, figsize=(10, 13))

    xi1 =  5*deg
    xi2 = 15*deg
    im = run_one(False, 0*deg, 1, "xi=0 deg, fixed positions")
    run_one(True, 0*deg, 2, "position variance 0.3 nm")
    run_one(False, xi1, 3, "xi=5 deg, fixed positions")
    run_one(True, xi1, 4, "position variance 0.3 nm")
    run_one(False, xi2, 5, "xi=15 deg, fixed positions")
    run_one(True, xi2, 6, "position variance 0.3 nm")

    plt.subplots_adjust(bottom=0.05, left=0.1)
    plt.colorbar(im, cax=plt.axes([0.93, 0.36, 0.03, 0.21]))
    plt.show()
PositionVariance.py