From 302b6c55d11a524ad3b08a414cb9bb6ac106f9ff Mon Sep 17 00:00:00 2001
From: Walter Van Herck <w.van.herck@fz-juelich.de>
Date: Wed, 10 Jul 2019 11:23:26 +0200
Subject: [PATCH] Add two Python examples for the generation of material
 profiles

---
 .../ex06_Reflectometry/MaterialProfile.py     | 60 ++++++++++++++++
 .../MaterialProfileWithParticles.py           | 72 +++++++++++++++++++
 2 files changed, 132 insertions(+)
 create mode 100644 Examples/python/simulation/ex06_Reflectometry/MaterialProfile.py
 create mode 100644 Examples/python/simulation/ex06_Reflectometry/MaterialProfileWithParticles.py

diff --git a/Examples/python/simulation/ex06_Reflectometry/MaterialProfile.py b/Examples/python/simulation/ex06_Reflectometry/MaterialProfile.py
new file mode 100644
index 00000000000..0042cb0c8d6
--- /dev/null
+++ b/Examples/python/simulation/ex06_Reflectometry/MaterialProfile.py
@@ -0,0 +1,60 @@
+"""
+Basic example for producing a profile of SLD of a multilayer.
+"""
+
+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_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)
+
+    # creating multilayer
+    multi_layer = ba.MultiLayer()
+    multi_layer.addLayer(ambient_layer)
+    for i in range(4):
+        multi_layer.addLayerWithTopRoughness(ti_layer, roughness)
+        multi_layer.addLayerWithTopRoughness(ni_layer, roughness)
+    multi_layer.addLayer(substrate_layer)
+
+    return multi_layer
+
+
+def generate_profile():
+    """
+    Runs simulation and returns its result.
+    """
+    sample = get_sample()
+    zmin, zmax = -420 * angstrom, 120 * angstrom
+    npoints = 400
+
+    zpoints = np.linspace(zmin, zmax, npoints)
+    slds = ba.MaterialProfile(sample, npoints, zmin, zmax)
+
+    return zpoints, slds
+
+
+if __name__ == '__main__':
+    zpoints, slds = generate_profile()
+    plt.figure()
+    plt.plot(zpoints, np.real(slds))
+    plt.show()
diff --git a/Examples/python/simulation/ex06_Reflectometry/MaterialProfileWithParticles.py b/Examples/python/simulation/ex06_Reflectometry/MaterialProfileWithParticles.py
new file mode 100644
index 00000000000..9a7587db8c6
--- /dev/null
+++ b/Examples/python/simulation/ex06_Reflectometry/MaterialProfileWithParticles.py
@@ -0,0 +1,72 @@
+"""
+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
+
+
+def generate_profile():
+    """
+    Runs simulation and returns its result.
+    """
+    sample = get_sample()
+    zmin, zmax = -220 * angstrom, 120 * angstrom
+    npoints = 400
+
+    zpoints = np.linspace(zmin, zmax, npoints)
+    slds = ba.MaterialProfile(sample, npoints, zmin, zmax)
+
+    return zpoints, slds
+
+
+if __name__ == '__main__':
+    zpoints, slds = generate_profile()
+    plt.figure()
+    plt.plot(zpoints, np.real(slds))
+    plt.show()
-- 
GitLab