Depth probe simulation

Depth probe simulation is an auxiliary simulation type, which helps to visualize the total intensity in dependence on the beam incidence angle and the position in the sample.

To set up and run a simulation, use

import bornagain as ba
scan = ...
sample = ...
z_axis = ba.FixedBinAxis("z", nz, z_min, z_max)
simulation = ba.DepthprobeSimulation(scan, sample, z_axis)
# ... set options
result = simulation.simulate()

For the constructor arguments, see sections scan, sample.

For optional settings, see simulation options.

For the return type of function simulate(), see SimulationResult.

Example

We consider a neutron resonator, composed of one Ti/Pt bilayer.

The beam comes from the Si side. By convention the beam always comes ‘‘from above’’. Accordingly, we consider Si the ‘‘ambient’’ material, placed ‘‘on top’’ of the sample.

As a result, we obtain the neutron intensity as function of depth and incident angle $\alpha_i$.

 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
87
88
89
90
91
#!/usr/bin/env python3
"""
Basic example of depth-probe simulation with BornAgain.

Sample layers are Si | Ti | Pt | Ti | TiO2 | D2O.
Beam comes from Si side.
Therefore we model the stack with Si on top.
The z axis points from D2O to Si; z=0 is at the Si/Ti interface.
"""
import bornagain as ba
from bornagain import angstrom, ba_plot as bp, deg, nm

# layer thicknesses in angstroms
t_Ti = 130*angstrom
t_Pt = 320*angstrom
t_Ti_top = 100*angstrom
t_TiO2 = 30*angstrom

#  beam data
ai_min = 0  # minimum incident angle
ai_max = 1*deg  # maximum incident angle
wl = 10*angstrom  # wavelength in angstroms

# convolution parameters
d_ang = 0.01*ba.deg  # spread width for incident angle

#  depth position span
z_min = -100*nm
z_max = 100*nm


def get_sample():
    """
    Constructs a sample with one resonating Ti/Pt layer
    """

    # Define materials
    material_D2O = ba.RefractiveMaterial("D2O", 0.00010116, 1.809e-12)
    material_Pt = ba.RefractiveMaterial("Pt", 0.00010117, 3.01822e-08)
    material_Si = ba.RefractiveMaterial("Si", 3.3009e-05, 0)
    material_Ti = ba.RefractiveMaterial("Ti", -3.0637e-05, 1.5278e-08)
    material_TiO2 = ba.RefractiveMaterial("TiO2", 4.1921e-05, 8.1293e-09)

    # Define layers
    layer_1 = ba.Layer(material_Si)
    layer_2 = ba.Layer(material_Ti, 13*nm)
    layer_3 = ba.Layer(material_Pt, 32*nm)
    layer_4 = ba.Layer(material_Ti, 10*nm)
    layer_5 = ba.Layer(material_TiO2, 3*nm)
    layer_6 = ba.Layer(material_D2O)

    # Define sample
    sample = ba.MultiLayer()
    sample.addLayer(layer_1)
    sample.addLayer(layer_2)
    sample.addLayer(layer_3)
    sample.addLayer(layer_4)
    sample.addLayer(layer_5)
    sample.addLayer(layer_6)

    return sample


def get_simulation(sample):
    """
    Returns a depth-probe simulation.
    """
    nz = bp.simargs['n']
    na = 10*nz

    scan = ba.AlphaScan(na, ai_min, ai_max)
    scan.setWavelength(wl)
    footprint = ba.FootprintSquare(0.01)
    scan.setFootprint(footprint)

    z_axis = ba.FixedBinAxis("z", nz, z_min, z_max)
    simulation = ba.DepthprobeSimulation(scan, sample, z_axis)

    alpha_distr = ba.DistributionGaussian(0, d_ang, 25, 3.)
    simulation.addParameterDistribution(
        ba.ParameterDistribution.BeamInclinationAngle, alpha_distr)

    return simulation


if __name__ == '__main__':
    bp.parse_args(sim_n=500, aspect='auto')
    sample = get_sample()
    simulation = get_simulation(sample)
    result = simulation.simulate()
    bp.plot_simulation_result(result)
Examples/varia/DepthProbe.py