diff --git a/Examples/python/simulation/ex06_Reflectometry/BeamFullDivergence_copy.py b/Examples/python/simulation/ex06_Reflectometry/BeamFullDivergence_copy.py new file mode 100644 index 0000000000000000000000000000000000000000..af8e98d6f6e6f593ef9418819e07bfb8a087a9c0 --- /dev/null +++ b/Examples/python/simulation/ex06_Reflectometry/BeamFullDivergence_copy.py @@ -0,0 +1,84 @@ +""" +An example of taking into account beam angular and wavelength +divergence in reflectometry calculations with BornAgain. + +""" +import bornagain as ba + +# input parameters +wavelength = 1.54 * ba.angstrom +alpha_i_min = 0.0 * ba.deg # min incident angle, deg +alpha_i_max = 2.0 * ba.deg # max incident angle, rad + +# convolution parameters +d_wl = 0.01 * wavelength # spread width for wavelength +d_ang = 0.01 * ba.deg # spread width for incident angle +n_sig = 3 # number of sigmas to convolve over +n_points = 25 # number of points to convolve over + +# substrate (Si) +si_sld_real = 2.0704e-06 # \AA^{-2} +# layer parameters +n_repetitions = 10 +# Ni +ni_sld_real = 9.4245e-06 # \AA^{-2} +d_ni = 70 * ba.angstrom # ni layer thickness (nm) +# Ti +ti_sld_real = -1.9493e-06 # \AA^{-2} +d_ti = 30 * ba.angstrom # ti layer thickness (nm) + + +def get_sample(): + # defining materials + # this example implies beam divergence in the wavelength, + # thus MaterialBySLD must be used to provide correct result + m_air = ba.MaterialBySLD("Air", 0.0, 0.0) + m_ni = ba.MaterialBySLD("Ni", ni_sld_real, 0.0) + m_ti = ba.MaterialBySLD("Ti", ti_sld_real, 0.0) + m_substrate = ba.MaterialBySLD("SiSubstrate", si_sld_real, 0.0) + + air_layer = ba.Layer(m_air) + ni_layer = ba.Layer(m_ni, d_ni) + ti_layer = ba.Layer(m_ti, d_ti) + substrate_layer = ba.Layer(m_substrate) + multi_layer = ba.MultiLayer() + multi_layer.addLayer(air_layer) + for i in range(n_repetitions): + multi_layer.addLayer(ti_layer) + multi_layer.addLayer(ni_layer) + multi_layer.addLayer(substrate_layer) + return multi_layer + + +def get_simulation(scan_size=500): + """ + Returns a specular simulation with beam and detector defined. + """ + + alpha_distr = ba.RangedDistributionGaussian(n_points, n_sig) + wavelength_distr = ba.RangedDistributionGaussian(n_points, n_sig) + + scan = ba.AngularSpecScan(wavelength, scan_size, alpha_i_min, alpha_i_max) + scan.setAbsoluteAngularResolution(alpha_distr, d_ang) + scan.setAbsoluteWavelengthResolution(wavelength_distr, d_wl) + + simulation = ba.SpecularSimulation() + simulation.setScan(scan) + + return simulation + + +def run_simulation(): + """ + Runs simulation and returns it. + """ + sample = get_sample() + simulation = get_simulation() + simulation.setSample(sample) + simulation.runSimulation() + return simulation.result() + + +if __name__ == '__main__': + results = run_simulation() + ba.plot_simulation_result(results) diff --git a/Tests/Functional/Python/PyPersistence/CMakeLists.txt b/Tests/Functional/Python/PyPersistence/CMakeLists.txt index ffc415036fab704b7acbb793115a31ed77d6aaf0..22a82782c845a93f4981b9dd95b172b9fbb45a7f 100644 --- a/Tests/Functional/Python/PyPersistence/CMakeLists.txt +++ b/Tests/Functional/Python/PyPersistence/CMakeLists.txt @@ -60,6 +60,7 @@ test_example("simulation/ex06_Reflectometry/BasicSpecularSimulation" 2e-10) test_example("simulation/ex06_Reflectometry/BeamAngularDivergence" 2e-10) test_example("simulation/ex06_Reflectometry/BeamAngularDivergence_copy" 2e-10) test_example("simulation/ex06_Reflectometry/BeamFullDivergence" 2e-10) +test_example("simulation/ex06_Reflectometry/BeamFullDivergence_copy" 2e-10) test_example("simulation/ex06_Reflectometry/TimeOfFlightReflectometry" 2e-10) test_example("simulation/ex07_Miscellaneous/CylindersInAverageLayer" 2e-10) diff --git a/Tests/ReferenceData/Python/BeamFullDivergence_copy.int.gz b/Tests/ReferenceData/Python/BeamFullDivergence_copy.int.gz new file mode 100644 index 0000000000000000000000000000000000000000..a74c173951d56d27c2338eb83650bbf843050dd7 Binary files /dev/null and b/Tests/ReferenceData/Python/BeamFullDivergence_copy.int.gz differ