The SLD profile of a sample with embedded particles

Plotting the Scattering Length Density (SLD) profile of a sample which contains embedded particles, will produce a figure similar to the one below. To embedd particles on a sample, a 2D square lattice particle layout needs to be created.

This figure shows the SLD profile of the sample built, i.e. the SLD value ($y$ axis) as a function of $z$, the depth of the sample ($x$ axis). $z = 0$ represents the surface of the sample, while the substrate is located at $x = −40$[nm] in this example. Notice the stairlike structure that forms for positive $z$ values, $0 < z < 10$, due to the presence o the embedded cone particles.

In the figure above, the embeded cone particles in the top layer create a stairlike SLD profile in the region $0 < z < 10$. Each step of the stairlike profile is a weighted average between the SLD of the particle material and that of the solvent (air in this case).

To refine the number of steps obtained in the plot above (and for the calculations carried on in an eventual simulation), the number of slices needs to be set (In the present example, it is set to 20: ambient_layer.setNumberOfSlices(20)).

 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
"""
Example for producing a profile of SLD of a multilayer with particles
and slicing.
"""

import bornagain as ba
from bornagain import deg, angstrom, nm
import numpy as np
import matplotlib.pyplot as plt


def get_sample():
    """
    Defines sample and returns it
    """

    # creating materials
    m_ambient = ba.MaterialBySLD("Ambient", 0.0, 0.0)
    m_ti = ba.MaterialBySLD("Ti", -1.9493e-06, 0.0)
    m_ni = ba.MaterialBySLD("Ni", 9.4245e-06, 0.0)
    m_particle = ba.MaterialBySLD("Particle", 5e-6, 0.0)
    m_substrate = ba.MaterialBySLD("SiSubstrate", 2.0704e-06, 0.0)

    # creating layers
    ambient_layer = ba.Layer(m_ambient)
    ti_layer = ba.Layer(m_ti, 30 * angstrom)
    ni_layer = ba.Layer(m_ni, 70 * angstrom)
    substrate_layer = ba.Layer(m_substrate)

    # create roughness
    roughness = ba.LayerRoughness(5 * angstrom, 0.5, 10 * angstrom)

    # create particle layout
    ff = ba.FormFactorCone(5 * nm, 10 * nm, 75 * deg)
    particle = ba.Particle(m_particle, ff)
    layout = ba.ParticleLayout()
    layout.addParticle(particle)
    iff = ba.InterferenceFunction2DLattice.createSquare(10 * nm)
    layout.setInterferenceFunction(iff)
    ambient_layer.addLayout(layout)
    ambient_layer.setNumberOfSlices(20)

    # creating multilayer
    multi_layer = ba.MultiLayer()
    multi_layer.addLayer(ambient_layer)
    for i in range(2):
        multi_layer.addLayerWithTopRoughness(ti_layer, roughness)
        multi_layer.addLayerWithTopRoughness(ni_layer, roughness)
    multi_layer.addLayer(substrate_layer)

    return multi_layer


if __name__ == '__main__':
    sample = get_sample()
    zpoints, slds = ba.MaterialProfile(sample)

    plt.figure()
    plt.plot(zpoints, np.real(slds))
    plt.show()
MaterialProfileWithParticles.py