diff --git a/src/easyreflectometry/calculators/__init__.py b/src/easyreflectometry/calculators/__init__.py index 9f7bde45..10ac315d 100644 --- a/src/easyreflectometry/calculators/__init__.py +++ b/src/easyreflectometry/calculators/__init__.py @@ -16,13 +16,6 @@ traceback.print_exc() print('Warning: refnx is not installed') -# try: -# from .bornagain.calculator import BornAgain -# imported_calculators.append(BornAgain) -# except Exception: -# traceback.print_exc() -# print('Warning: BornAgain python is not installed') - try: from .refl1d.calculator import Refl1d # noqa: F401 diff --git a/src/easyreflectometry/calculators/bornagain/calculator.py b/src/easyreflectometry/calculators/bornagain/calculator.py deleted file mode 100644 index 2ebb2c08..00000000 --- a/src/easyreflectometry/calculators/bornagain/calculator.py +++ /dev/null @@ -1,193 +0,0 @@ -# SPDX-FileCopyrightText: 2026 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause - - -from easyscience.fitting.calculators.interface_factory import ItemContainer - -from easyreflectometry.model import Model -from easyreflectometry.sample import Layer -from easyreflectometry.sample import Material -from easyreflectometry.sample import MaterialMixture -from easyreflectometry.sample import Multilayer - -from ..calculator_base import CalculatorBase -from .wrapper import BornAgainWrapper - -""" -THIS CODE IS NOT FUNCTIONAL -PLEASE CONSULT ONE OF THE OTHER CALCULATORS FOR A FUNCTIONAL EXAMPLE -""" - - -class BornAgain(CalculatorBase): - """Calculator for BornAgain.""" - - name = 'BornAgain' - - _material_link = { - 'sld': 'real', - 'isld': 'imag', - } - - _layer_link = { - 'thickness': 'thickness', - 'roughness': 'sigma', - } - - _item_link = { - 'repetitions': 'repeats', - } - - _model_link = { - 'scale': 'scale', - 'background': 'background', - 'resolution': 'resolution', - } - - def __init__(self): - """Init function.""" - super().__init__() - self._wrapper = BornAgainWrapper() - - def reset_storage(self) -> None: - """Reset the storage area of the calculator.""" - self._wrapper.reset_storage() - - def create(self, model: Material | Layer | Multilayer | Model) -> list[ItemContainer]: - """Creation function. - - Parameters - ---------- - model : Material | Layer | Multilayer | Model - Object to be created. - - Returns - ------- - List[ItemContainer] - Item containers of the objects. - """ - r_list = [] - t_ = type(model) - if issubclass(t_, Material): - key = model.unique_name - if key not in self._wrapper.storage['material'].keys(): - self._wrapper.create_material(key) - r_list.append( - ItemContainer( - key, - self._material_link, - self._wrapper.get_material_value, - self._wrapper.update_material, - ) - ) - elif issubclass(t_, MaterialMixture): - key = model.unique_name - if key not in self._wrapper.storage['material'].keys(): - self._wrapper.create_material(key) - r_list.append( - ItemContainer( - key, - self._material_link, - self._wrapper.get_material_value, - self._wrapper.update_material, - ) - ) - elif issubclass(t_, Layer): - key = model.unique_name - if key not in self._wrapper.storage['layer'].keys(): - self._wrapper.create_layer(key) - r_list.append( - ItemContainer( - key, - self._layer_link, - self._wrapper.get_layer_value, - self._wrapper.update_layer, - ) - ) - self.assign_material_to_layer(model.material.unique_name, key) - elif issubclass(t_, Multilayer): - key = model.unique_name - self._wrapper.create_item(key) - r_list.append( - ItemContainer( - key, - self._item_link, - self._wrapper.get_item_value, - self._wrapper.update_item, - ) - ) - for i in model.layers: - self.add_layer_to_item(i.unique_name, model.unique_name) - elif issubclass(t_, Model): - self._wrapper.create_model() - r_list.append( - ItemContainer( - 'model', - self._model_link, - self._wrapper.get_model_value, - self._wrapper.update_model, - ) - ) - for i in model.structure: - self.add_item_to_model(i.unique_name) - return r_list - - def assign_material_to_layer(self, material_id: int, layer_id: int) -> None: - """Assign a material to a layer. - - Parameters - ---------- - layer_id : int - material_id : int - material_name : str - The material name. - layer_name : str - The layer name. - """ - self._wrapper.assign_material_to_layer(material_id, layer_id) - - def add_layer_to_item(self, layer_id: int, item_id: int) -> None: - """Add a layer to the item stack. - - Parameters - ---------- - item_id : int - The item id. - layer_id : int - The layer id. - """ - self._wrapper.add_layer_to_item(layer_id, item_id) - - def remove_layer_from_item(self, layer_id: int, item_id: int) -> None: - """Remove a layer from an item stack. - - Parameters - ---------- - item_id : int - The item id. - layer_id : int - The layer id. - """ - self._wrapper.remove_layer_from_item(layer_id, item_id) - - def add_item_to_model(self, item_id: int) -> None: - """Add a layer to the item stack. - - Parameters - ---------- - item_id : int - The item id. - """ - self._wrapper.add_item(item_id) - - def remove_item_from_model(self, item_id: int) -> None: - """Remove a layer from the item stack. - - Parameters - ---------- - item_id : int - The item id. - layer_id : int - The layer id. - """ - self._wrapper.remove_item(item_id) diff --git a/src/easyreflectometry/calculators/bornagain/wrapper.py b/src/easyreflectometry/calculators/bornagain/wrapper.py deleted file mode 100644 index b0baf9a9..00000000 --- a/src/easyreflectometry/calculators/bornagain/wrapper.py +++ /dev/null @@ -1,391 +0,0 @@ -# SPDX-FileCopyrightText: 2026 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause - - -import bornagain as ba -import numpy as np -from scipy.stats import norm - -from ..wrapper_base import WrapperBase - -""" -THIS CODE IS NOT FUNCTIONAL -PLEASE CONSULT ONE OF THE OTHER WRAPPES FOR A FUNCTIONAL EXAMPLE -""" - - -class BornAgainWrapper(WrapperBase): - def __init__(self): - """Init function.""" - super().__init__() - self.storage = { - 'layer_material': {}, - 'roughness': {}, - 'item_repeats': {}, - 'model_items': [], - 'model_parameters': {}, - } - - def reset_storage(self): - """Reset the storage area to blank.""" - super().reset_storage() - self.storage = { - 'layer_material': {}, - 'roughness': {}, - 'item_repeats': {}, - 'model_items': [], - 'model_parameters': {}, - } - - def create_material(self, name): - """Create a material using SLD. - - Parameters - ---------- - name : str - The name of the material. - """ - self.storage['material'][name] = ba.MaterialBySLD(str(name), 0.0, 0.0) - - def update_material(self, name, **kwargs): - """Update a material. - - Parameters - ---------- - **kwargs : - name : str - The name of the material. - """ - current_value = self.storage['material'][name].materialData() - real = current_value.real - imag = current_value.imag - if 'real' in kwargs.keys(): - real = kwargs['real'] * 1e-6 - if 'imag' in kwargs.keys(): - if kwargs['imag'] < 0: - raise ValueError('The BornAgain interface does not support negative imaginary scattering length densities') - imag = kwargs['imag'] * 1e-6 - self.storage['material'][name] = ba.MaterialBySLD(str(name), real, imag) - - def get_material_value(self, name, key): - """A function to get a given material value. - - Parameters - ---------- - name : str - The material name. - key : str - The given value keys. - - Returns - ------- - float - The desired value. - """ - current_value = self.storage['material'][name].materialData() - return getattr(current_value, key) / 1e-6 - - def create_layer(self, name): - """Create a layer using Slab. - - Parameters - ---------- - name : str - The name of the layer. - """ - self.storage['layer'][name] = ba.Layer(ba.MaterialBySLD('A', 0, 0)) - self.storage['roughness'][name] = ba.LayerRoughness() - - def update_layer(self, name, **kwargs): - """Update a layer in a given item. - - Parameters - ---------- - **kwargs : - name : str - The layer name. - """ - if 'thickness' in kwargs.keys(): - thickness = kwargs['thickness'] - self.storage['layer'][name] = ba.Layer( - self.storage['material'][self.storage['layer_material'][name]], - thickness * ba.angstrom, - ) - if 'sigma' in kwargs.keys(): - sigma = kwargs['sigma'] - self.storage['roughness'][name] = ba.LayerRoughness() - self.storage['roughness'][name].setSigma(sigma * ba.angstrom) - - def get_layer_value(self, name, key): - """A function to get a given layer value. - - Parameters - ---------- - name : str - The layer name. - key : str - The given value keys. - - Returns - ------- - float - The desired value. - """ - layer = self.storage['layer'][name] - roughness = self.storage['roughness'][name] - if key == 'thickness': - return layer.thickness() / ba.angstrom - if key == 'sigma': - return roughness.getSigma() / ba.angstrom - - def create_item(self, name): - """Create an item. - - Parameters - ---------- - name : str - The name of the item. - """ - self.storage['item'][name] = [] - self.storage['item_repeats'][name] = 1 - - def update_item(self, name, **kwargs): - """Update a layer. - - Parameters - ---------- - **kwargs : - name : str - The item name. - """ - if 'repeats' in kwargs.keys(): - self.storage['item_repeats'][name] = kwargs['repeats'] - - def get_item_value(self, name, key): - """A function to get a given item value. - - Parameters - ---------- - name : str - The item name. - key : str - The given value keys. - - Returns - ------- - float - The desired value. - """ - if key == 'repeats': - return self.storage['item_repeats'][name] - - def create_model(self): - """Create a model for analysis.""" - self.storage['model'] = ba.Multilayer() - self.storage['model'].setRoughnessModel(ba.RoughnessModel.NEVOT_CROCE) - self.storage['model_items'] = [] - self.storage['model_parameters']['scale'] = 1 - self.storage['model_parameters']['background'] = 0 - self.storage['model_parameters']['resolution'] = 0 - - def update_model(self, name, **kwargs): - """Update the non-structural parameters of the model.""" - model = self.storage[name + '_parameters'] - for key in kwargs.keys(): - model[key] = kwargs[key] - - def get_model_value(self, name, key): - """A function to get a given model value. - - Parameters - ---------- - name : - key : str - The given value keys. - - Returns - ------- - float - The desired value. - """ - model = self.storage[name + '_parameters'] - return model[key] - - def assign_material_to_layer(self, material_name, layer_name): - """Assign a material to a layer. - - Parameters - ---------- - material_name : str - The material name. - layer_name : str - The layer name. - """ - self.storage['layer_material'][layer_name] = material_name - - def add_layer_to_item(self, layer_name, item_name): - """Create a layer from the material of the same name, in a given item. - - Parameters - ---------- - layer_name : int - The layer name. - item_name : int - The item name. - """ - item = self.storage['item'][item_name] - item.append(layer_name) - - def add_item(self, item_name): - """Add an item to the model. - - Parameters - ---------- - item_name : str - Items to add to model. - """ - self.storage['model_items'].append(item_name) - - def remove_layer_from_item(self, layer_name, item_name): - """Remove a layer in a given item. - - Parameters - ---------- - layer_name : int - The layer name. - item_name : int - The item name. - """ - layers_idx = self.storage['item'][item_name].index(layer_name) - del self.storage['layer'][layer_name] - del self.storage['item'][item_name][layers_idx] - del self.storage['layer_material'][layer_name] - - def remove_item(self, item_name): - """Remove a given item. - - Parameters - ---------- - item_name : int - The item name. - """ - item_idx = self.storage['model_items'].index(item_name) - del self.storage['model_items'][item_idx] - del self.storage['item_repeats'][item_name] - del self.storage['item'][item_name] - - # To conform the base class the signature should be - # def calculate(self, q_array: np.ndarray, model_name: str) -> np.ndarray: - def calculate(self, q_array: np.ndarray) -> np.ndarray: - """For a given q array calculate the corresponding reflectivity. - - Parameters - ---------- - q_array : np.ndarray - Array of data points to be calculated. - model_name : - The model name. - - Returns - ------- - np.ndarray - Reflectivity calculated at q. - """ - # 3.5 sigma to sync with refnx - n_sig = 3.5 - n_samples = 21 - distr = ba.RangedDistributionGaussian(n_samples, n_sig) - - scan = ba.QSpecScan(q_array / ba.angstrom) - scan.setAbsoluteQResolution( - distr, - q_array / ba.angstrom * (self.storage['model_parameters']['resolution'] * 0.5 / 100), - ) - - simulation = ba.SpecularSimulation() - simulation.setScan(scan) - - total_model = ba.Multilayer() - for i in self.storage['model_items']: - for k in range(int(self.storage['item_repeats'][i])): - for j in self.storage['item'][i]: - layer = ba.Layer( - self.storage['material'][self.storage['layer_material'][j]], - self.storage['layer'][j].thickness(), - ) - total_model.addLayerWithTopRoughness(layer, self.storage['roughness'][j]) - - simulation.setSample(total_model) - simulation.runSimulation() - - return ( - self.storage['model_parameters']['scale'] * simulation.result().array() - + self.storage['model_parameters']['background'] - ) - - def sld_profile(self) -> np.ndarray: - """Return the scattering length density profile. - - This is borrowed from the refnx implementation of the scattering length density. - - Returns - ------- - tuple[np.ndarray, np.ndarray] - Z and sld(z). - """ - number_of_layers = 0 - for i in self.storage['model_items']: - number_of_layers += len(self.storage['item'][i]) * self.storage['item_repeats'][i] - layers = np.zeros((int(number_of_layers), 4)) - - count = 0 - for i in self.storage['model_items']: - for k in range(int(self.storage['item_repeats'][i])): - for j in self.storage['item'][i]: - layers[count, 0] = self.storage['layer'][j].thickness() - layers[count, 1] = self.storage['material'][self.storage['layer_material'][j]].materialData().real - layers[count, 2] = self.storage['material'][self.storage['layer_material'][j]].materialData().imag - layers[count, 3] = self.storage['roughness'][j].getSigma() - count += 1 - - layers2 = np.copy(layers) - layers[:, 0] = np.fabs(layers2[:, 0]) - layers[:, 3] = np.fabs(layers2[:, 3]) - # bounding layers should have zero thickness - layers[0, 0] = layers[-1, 0] = 0 - - # distance of each interface from the fronting interface - dist = np.cumsum(layers[:-1, 0]) - zstart = -5 - 4 * np.fabs(layers2[1, 3]) - zend = 5 + dist[-1] + 4 * layers[-1, 3] - - npnts = 500 - zed = np.linspace(zstart, zend, num=npnts) - - # the output array - sld = np.ones_like(zed, dtype=float) * layers[0, 1] - - # work out the step in SLD at an interface - delta_rho = layers[1:, 1] - layers[:-1, 1] - - # use erf for roughness function, but step if the roughness is zero - def step(z, scale=1, loc=0): - """Step function.""" - new_z = z - loc - f = np.ones_like(new_z) * 0.5 - f[new_z <= -scale] = 0 - f[new_z >= scale] = 1 - return f - - step_f = step - erf_f = norm.cdf - sigma = layers[1:, 3] - - # accumulate the SLD of each step. - for i in range(int(number_of_layers) - 1): - f = erf_f - if sigma[i] == 0: - f = step_f - sld += delta_rho[i] * f(zed, scale=sigma[i], loc=dist[i]) - - return zed / ba.angstrom, sld * 1e6 diff --git a/src/easyreflectometry/summary/summary.py b/src/easyreflectometry/summary/summary.py index f40f23ad..14ba3723 100644 --- a/src/easyreflectometry/summary/summary.py +++ b/src/easyreflectometry/summary/summary.py @@ -55,7 +55,6 @@ def _silence_pdf_converter(): _ENGINE_URLS: dict[str, str] = { 'refnx': 'https://refnx.readthedocs.io', 'refl1d': 'https://refl1d.readthedocs.io', - 'bornagain': 'https://www.bornagainproject.org', 'lm': 'https://lmfit.github.io/lmfit-py/', 'bumps': 'https://bumps.readthedocs.io', 'dfo': 'https://github.com/fitbenchmarking/dfo-ls', diff --git a/tests/calculators/bornagain/test_bornagain_calculator.py b/tests/calculators/bornagain/test_bornagain_calculator.py deleted file mode 100644 index 6a7c1aa9..00000000 --- a/tests/calculators/bornagain/test_bornagain_calculator.py +++ /dev/null @@ -1,121 +0,0 @@ -# SPDX-FileCopyrightText: 2026 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause - -""" -Tests for BornAgain calculator. -""" - - -# import os -# import unittest -# import numpy as np -# from numpy.testing import assert_almost_equal, assert_equal, assert_allclose -# from easyreflectometry.interfaces.bornagain import BornAgain -# from easyreflectometry.sample.material import Material - -# class TestBornAgain(unittest.TestCase): -# def test_init(self): -# p = BornAgain() -# assert_equal(list(p.calculator.storage.keys()), -# ['material', 'layer', 'layer_material', 'roughness', 'item', -# 'item_repeats', 'model', 'model_items', 'model_parameters']) -# assert_equal(p._material_link['sld'], 'real') -# assert_equal(p._material_link['isld'], 'imag') -# assert_equal(p._layer_link['thickness'], 'thickness') -# assert_equal(p._layer_link['roughness'], 'sigma') -# assert_equal(p._item_link['repetitions'], 'repeats') -# assert_equal(p._model_link['scale'], 'scale') -# assert_equal(p._model_link['background'], 'background') -# assert_equal(p._model_link['resolution'], 'resolution') -# assert_equal(p.name, 'BornAgain') - -# def test_fit_func(self): -# p = BornAgain() -# p.calculator.create_material('Material1') -# p.calculator.update_material('Material1', real=0.000, imag=0.000) -# p.calculator.create_material('Material2') -# p.calculator.update_material('Material2', real=2.000, imag=0.000) -# p.calculator.create_material('Material3') -# p.calculator.update_material('Material3', real=4.000, imag=0.000) -# p.calculator.create_model() -# p.calculator.create_layer('Layer1') -# p.calculator.assign_material_to_layer('Material1', 'Layer1') -# p.calculator.create_layer('Layer2') -# p.calculator.assign_material_to_layer('Material2', 'Layer2') -# p.calculator.update_layer('Layer2', thickness=10, sigma=1.0) -# p.calculator.create_layer('Layer3') -# p.calculator.assign_material_to_layer('Material3', 'Layer3') -# p.calculator.update_layer('Layer3', sigma=1.0) -# p.calculator.create_item('Item') -# p.calculator.add_layer_to_item('Layer1', 'Item') -# p.calculator.add_layer_to_item('Layer2', 'Item') -# p.calculator.add_layer_to_item('Layer3', 'Item') -# p.calculator.add_item('Item') -# p.calculator.update_model('model', background=1e-7, resolution=5) -# q = np.linspace(0.001, 0.3, 10) -# expected = [ -# 9.99956517e-01, 2.16286891e-03, 1.14086254e-04, 1.93031759e-05, -# 4.94188894e-06, 1.54191953e-06, 5.45592112e-07, 2.26619392e-07, -# 1.26726993e-07, 1.01842852e-07 -# ] -# assert_allclose(p.fit_func(q), expected, rtol=0.04) - -# def test_calculate2(self): -# p = BornAgain() -# p.calculator.create_material('Material1') -# p.calculator.update_material('Material1', real=0.000, imag=0.000) -# p.calculator.create_material('Material2') -# p.calculator.update_material('Material2', real=2.000, imag=0.000) -# p.calculator.create_material('Material3') -# p.calculator.update_material('Material3', real=4.000, imag=0.000) -# p.calculator.create_model() -# p.calculator.create_layer('Layer1') -# p.calculator.assign_material_to_layer('Material1', 'Layer1') -# p.calculator.create_layer('Layer2') -# p.calculator.assign_material_to_layer('Material2', 'Layer2') -# p.calculator.update_layer('Layer2', thickness=10, sigma=1.0) -# p.calculator.create_layer('Layer3') -# p.calculator.assign_material_to_layer('Material3', 'Layer3') -# p.calculator.update_layer('Layer3', sigma=1.0) -# p.calculator.create_item('Item1') -# p.calculator.add_layer_to_item('Layer1', 'Item1') -# p.calculator.create_item('Item2') -# p.calculator.add_layer_to_item('Layer2', 'Item2') -# p.calculator.add_layer_to_item('Layer1', 'Item2') -# p.calculator.create_item('Item3') -# p.calculator.add_layer_to_item('Layer3', 'Item3') -# p.calculator.add_item('Item1') -# p.calculator.add_item('Item2') -# p.calculator.add_item('Item3') -# p.calculator.update_item('Item2', repeats=10) -# p.calculator.update_model('model', background=1e-7, resolution=5) -# q = np.linspace(0.001, 0.3, 10) -# expected = [1.000000e+00, 1.814452e-05, 1.225890e-04, 2.454331e-06, -# 6.676318e-06, 8.362728e-07, 1.141096e-06, 4.090968e-07, -# 3.489857e-07, 2.470789e-07] -# assert_allclose(p.fit_func(q), expected, rtol=0.01) - -# def test_sld_profile(self): -# p = BornAgain() -# p.calculator.create_material('Material1') -# p.calculator.update_material('Material1', real=0.000, imag=0.000) -# p.calculator.create_material('Material2') -# p.calculator.update_material('Material2', real=2.000, imag=0.000) -# p.calculator.create_material('Material3') -# p.calculator.update_material('Material3', real=4.000, imag=0.000) -# p.calculator.create_model() -# p.calculator.create_layer('Layer1') -# p.calculator.assign_material_to_layer('Material1', 'Layer1') -# p.calculator.create_layer('Layer2') -# p.calculator.assign_material_to_layer('Material2', 'Layer2') -# p.calculator.update_layer('Layer2', thickness=10, sigma=1.0) -# p.calculator.create_layer('Layer3') -# p.calculator.assign_material_to_layer('Material3', 'Layer3') -# p.calculator.update_layer('Layer3', sigma=1.0) -# p.calculator.create_item('Item') -# p.calculator.add_layer_to_item('Layer1', 'Item') -# p.calculator.add_layer_to_item('Layer2', 'Item') -# p.calculator.add_layer_to_item('Layer3', 'Item') -# p.calculator.add_item('Item') -# assert_almost_equal(p.sld_profile()[1][0], 0) -# assert_almost_equal(p.sld_profile()[1][-1], 4) diff --git a/tests/calculators/bornagain/test_bornagain_wrapper.py b/tests/calculators/bornagain/test_bornagain_wrapper.py deleted file mode 100644 index c52c084c..00000000 --- a/tests/calculators/bornagain/test_bornagain_wrapper.py +++ /dev/null @@ -1,248 +0,0 @@ -# SPDX-FileCopyrightText: 2026 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause - -""" -Tests for the BornAgain wrapper. -""" - - -# import unittest -# import numpy as np -# from numpy.testing import assert_equal, assert_almost_equal, assert_allclose -# from easyreflectometry.calculators.bornagain import BornAgain -# import bornagain as ba - -# class TestBornAgain(unittest.TestCase): -# def test_init(self): -# p = BornAgain() -# assert_equal(list(p.storage.keys()), ['material', 'layer', 'layer_material', 'roughness', 'item', 'item_repeats', -# 'model', 'model_items', 'model_parameters']) -# assert_equal(issubclass(p.storage['material'].__class__, dict), True) - -# def test_create_material(self): -# p = BornAgain() -# p.create_material('Si') -# assert_equal(list(p.storage['material'].keys()), ['Si']) -# assert_almost_equal(p.storage['material']['Si'].materialData().real, 0.0) -# assert_almost_equal(p.storage['material']['Si'].materialData().imag, 0.0) -# assert_equal(p.storage['material']['Si'].getName(), 'Si') - -# def test_update_material(self): -# p = BornAgain() -# p.create_material('B') -# p.update_material('B', real=6.908, imag=0.278) -# assert_equal(list(p.storage['material'].keys()), ['B']) -# assert_almost_equal(p.storage['material'] -# ['B'].materialData().real, 6.908e-6) -# assert_almost_equal(p.storage['material'] -# ['B'].materialData().imag, 0.278e-6) - -# def test_update_material_neg_imag(self): -# p = BornAgain() -# p.create_material('B') -# with self.assertRaises(ValueError): -# p.update_material('B', real=6.908, imag=-0.278) - -# def test_get_material_value(self): -# p = BornAgain() -# p.create_material('B') -# p.update_material('B', real=6.908, imag=0.278) -# assert_equal(list(p.storage['material'].keys()), ['B']) -# assert_almost_equal(p.get_material_value('B', 'real'), 6.908) -# assert_almost_equal(p.get_material_value('B', 'imag'), 0.278) - -# def test_create_layer(self): -# p = BornAgain() -# p.create_layer('Si') -# assert_equal(list(p.storage['layer'].keys()), ['Si']) -# assert_almost_equal(p.storage['layer']['Si'].thickness(), 0) -# assert_almost_equal(p.storage['roughness']['Si'].getSigma(), 0) - -# def test_update_layer(self): -# p = BornAgain() -# p.create_material('Si') -# p.create_layer('Si') -# p.assign_material_to_layer('Si', 'Si') -# p.update_layer('Si', thickness=10, sigma=5) -# assert_almost_equal(p.storage['layer']['Si'].thickness(), 1) -# assert_almost_equal(p.storage['roughness']['Si'].getSigma(), 0.5) - -# def test_get_layer_value(self): -# p = BornAgain() -# p.create_material('Si') -# p.create_layer('Si') -# p.assign_material_to_layer('Si', 'Si') -# p.update_layer('Si', thickness=10, sigma=5) -# assert_almost_equal(p.get_layer_value('Si', 'thickness'), 10) -# assert_almost_equal(p.get_layer_value('Si', 'sigma'), 5) - -# def test_create_item(self): -# p = BornAgain() -# p.create_item('SiNi') -# assert_equal(list(p.storage['item'].keys()), ['SiNi']) -# assert_equal(p.storage['item']['SiNi'], []) -# assert_equal(p.storage['item_repeats']['SiNi'], 1) - -# def test_update_item(self): -# p = BornAgain() -# p.create_item('SiNi') -# p.update_item('SiNi', repeats=10) -# assert_almost_equal(p.storage['item_repeats']['SiNi'], 10) - -# def test_get_item_value(self): -# p = BornAgain() -# p.create_item('SiNi') -# p.update_item('SiNi', repeats=10) -# assert_almost_equal(p.get_item_value('SiNi', 'repeats'), 10) - -# def test_create_model(self): -# p = BornAgain() -# p.create_model() -# assert_equal(isinstance(p.storage['model'], ba.Multilayer), True) -# assert_equal(p.storage['model'].roughnessModel(), 2) -# assert_equal(list(p.storage['model_parameters'].keys()), ['scale', 'background', 'resolution']) - -# def test_update_model(self): -# p = BornAgain() -# p.create_model() -# p.update_model('model', scale=2, background=1e-3, resolution=2.0) -# assert_almost_equal(p.storage['model_parameters']['scale'], 2) -# assert_almost_equal(p.storage['model_parameters']['background'], 1e-3) -# assert_almost_equal(p.storage['model_parameters']['resolution'], 2.0) - -# def test_get_model_value(self): -# p = BornAgain() -# p.create_model() -# p.update_model('model', scale=2, background=1e-3, resolution=2.0) -# assert_almost_equal(p.get_model_value('model', 'scale'), 2) -# assert_almost_equal(p.get_model_value('model', 'background'), 1e-3) -# assert_almost_equal(p.get_model_value('model', 'resolution'), 2.0) - -# def test_assign_material_to_layer(self): -# p = BornAgain() -# p.create_material('B') -# p.update_material('B', real=6.908, imag=0.278) -# p.create_layer('B_layer') -# p.assign_material_to_layer('B', 'B_layer') -# assert_almost_equal( -# p.storage['material'][p.storage['layer_material']['B_layer']].materialData().real, 6.908e-6) -# assert_almost_equal( -# p.storage['material'][p.storage['layer_material']['B_layer']].materialData().imag, 0.278e-6) - -# def test_add_layer_to_item(self): -# p = BornAgain() -# p.create_material('B') -# p.update_material('B', real=6.908, imag=0.278) -# p.create_layer('B_layer') -# p.update_layer('B_layer', sigma=10) -# p.assign_material_to_layer('B', 'B_layer') -# p.create_item('B_item') -# assert_equal(len(p.storage['item']['B_item']), 0) -# p.add_layer_to_item('B_layer', 'B_item') -# assert_equal(len(p.storage['item']['B_item']), 1) - -# def test_add_item(self): -# p = BornAgain() -# p.create_material('B') -# p.update_material('B', real=6.908, imag=0.278) -# p.create_layer('B_layer') -# p.assign_material_to_layer('B', 'B_layer') -# p.create_item('B_item') -# p.add_layer_to_item('B_layer', 'B_item') -# p.create_model() -# assert_equal(len(p.storage['model_items']), 0) -# p.add_item('B_item') -# assert_equal(len(p.storage['model_items']), 1) - -# def test_remove_layer_from_item(self): -# p = BornAgain() -# p.create_material('B') -# p.update_material('B', real=6.908, imag=0.278) -# p.create_layer('B_layer') -# p.assign_material_to_layer('B', 'B_layer') -# p.create_item('B_item') -# p.add_layer_to_item('B_layer', 'B_item') -# assert_equal(len(p.storage['item']['B_item']), 1) -# p.remove_layer_from_item('B_layer', 'B_item') -# assert_equal(len(p.storage['item']['B_item']), 0) - -# def test_remove_item(self): -# p = BornAgain() -# p.create_material('B') -# p.update_material('B', real=6.908, imag=0.278) -# p.create_layer('B_layer') -# p.assign_material_to_layer('B', 'B_layer') -# p.create_item('B_item') -# p.add_layer_to_item('B_layer', 'B_item') -# p.create_model() -# p.add_item('B_item') -# assert_equal(len(p.storage['model_items']), 1) -# p.remove_item('B_item') -# assert_equal(len(p.storage['model_items']), 0) - -# def test_calculate(self): -# p = BornAgain() -# p.create_material('Material1') -# p.update_material('Material1', real=0.000, imag=0.000) -# p.create_material('Material2') -# p.update_material('Material2', real=2.000, imag=0.000) -# p.create_material('Material3') -# p.update_material('Material3', real=4.000, imag=0.000) -# p.create_model() -# p.create_layer('Layer1') -# p.assign_material_to_layer('Material1', 'Layer1') -# p.create_layer('Layer2') -# p.assign_material_to_layer('Material2', 'Layer2') -# p.update_layer('Layer2', thickness=10, sigma=1.0) -# p.create_layer('Layer3') -# p.assign_material_to_layer('Material3', 'Layer3') -# p.update_layer('Layer3', sigma=1.0) -# p.create_item('Item') -# p.add_layer_to_item('Layer1', 'Item') -# p.add_layer_to_item('Layer2', 'Item') -# p.add_layer_to_item('Layer3', 'Item') -# p.add_item('Item') -# p.update_model('model', background=1e-7, resolution=5) -# q = np.linspace(0.001, 0.3, 10) -# expected = [ -# 9.99956517e-01, 2.16286891e-03, 1.14086254e-04, 1.93031759e-05, -# 4.94188894e-06, 1.54191953e-06, 5.45592112e-07, 2.26619392e-07, -# 1.26726993e-07, 1.01842852e-07 -# ] -# assert_allclose(p.calculate(q), expected, rtol=0.04) - -# def test_calculate2(self): -# p = BornAgain() -# p.create_material('Material1') -# p.update_material('Material1', real=0.000, imag=0.000) -# p.create_material('Material2') -# p.update_material('Material2', real=2.000, imag=0.000) -# p.create_material('Material3') -# p.update_material('Material3', real=4.000, imag=0.000) -# p.create_layer('Layer1') -# p.assign_material_to_layer('Material1', 'Layer1') -# p.create_layer('Layer2') -# p.assign_material_to_layer('Material2', 'Layer2') -# p.update_layer('Layer2', thickness=10, sigma=1.0) -# p.create_layer('Layer3') -# p.assign_material_to_layer('Material3', 'Layer3') -# p.update_layer('Layer3', sigma=1.0) -# p.create_item('Item1') -# p.add_layer_to_item('Layer1', 'Item1') -# p.create_item('Item2') -# p.add_layer_to_item('Layer2', 'Item2') -# p.add_layer_to_item('Layer1', 'Item2') -# p.create_item('Item3') -# p.add_layer_to_item('Layer3', 'Item3') -# p.create_model() -# p.add_item('Item1') -# p.add_item('Item2') -# p.add_item('Item3') -# p.update_item('Item2', repeats=10) -# p.update_model('model', background=1e-7, resolution=5) -# q = np.linspace(0.001, 0.3, 10) -# expected = [1.000000e+00, 1.814452e-05, 1.225890e-04, 2.454331e-06, -# 6.676318e-06, 8.362728e-07, 1.141096e-06, 4.090968e-07, -# 3.489857e-07, 2.470789e-07] -# assert_allclose(p.calculate(q), expected, rtol=0.01) -# assert_allclose(p.calculate(q), expected, rtol=0.01) diff --git a/tests/model/test_model.py b/tests/model/test_model.py index a2dd46ea..e0476552 100644 --- a/tests/model/test_model.py +++ b/tests/model/test_model.py @@ -157,25 +157,6 @@ def test_add_assemblies_with_interface_refl1d(self): assert_equal(len(mod.interface()._wrapper.storage['item']), 2) assert_equal(len(mod.interface()._wrapper.storage['layer']), 2) - # def test_add_assemblies_with_interface_bornagain(self): - # interface = CalculatorFactory() - # interface.switch('BornAgain') - # m1 = Material.from_pars(6.908, 0.278, 'Boron') - # m2 = Material.from_pars(0.487, 0.000, 'Potassium') - # l1 = Layer.from_pars(m1, 5.0, 2.0, 'thinBoron') - # l2 = Layer.from_pars(m2, 50.0, 1.0, 'thickPotassium') - # ls1 = Layers.from_pars(l1, l2, name='twoLayer1') - # ls2 = Layers.from_pars(l2, l1, name='twoLayer2') - # o1 = RepeatingMultilayer.from_pars(ls1, 2.0, 'twoLayerItem1') - # o2 = RepeatingMultilayer.from_pars(ls2, 1.0, 'oneLayerItem2') - # d = Sample.from_pars(o1, name='myModel') - # mod = Model(d, 2, 1e-5, 2.0, 'newModel', interface=interface) - # assert_equal(len(mod.interface()._wrapper.storage['item']), 1) - # assert_equal(len(mod.interface()._wrapper.storage['layer']), 2) - # mod.add_assemblies(o2) - # assert_equal(len(mod.interface()._wrapper.storage['item']), 2) - # assert_equal(len(mod.interface()._wrapper.storage['layer']), 2) - def test_duplicate_assembly(self): m1 = Material(6.908, -0.278, 'Boron') m2 = Material(0.487, 0.000, 'Potassium') @@ -235,25 +216,6 @@ def test_duplicate_assembly_with_interface_refl1d(self): mod.duplicate_assembly(1) assert_equal(len(mod.interface()._wrapper.storage['item']), 3) - # def test_duplicate_item_with_interface_bornagain(self): - # interface = CalculatorFactory() - # interface.switch('BornAgain') - # m1 = Material.from_pars(6.908, 0.278, 'Boron') - # m2 = Material.from_pars(0.487, 0.000, 'Potassium') - # l1 = Layer.from_pars(m1, 5.0, 2.0, 'thinBoron') - # l2 = Layer.from_pars(m2, 50.0, 1.0, 'thickPotassium') - # ls1 = Layers.from_pars(l1, l2, name='twoLayer1') - # ls2 = Layers.from_pars(l2, l1, name='twoLayer2') - # o1 = RepeatingMultilayer.from_pars(ls1, 2.0, 'twoLayerItem1') - # o2 = RepeatingMultilayer.from_pars(ls2, 1.0, 'oneLayerItem2') - # d = Sample.from_pars(o1, name='myModel') - # mod = Model(d, 2, 1e-5, 2.0, 'newModel', interface=interface) - # assert_equal(len(mod.interface()._wrapper.storage['assembly']), 1) - # mod.add_assemblies(o2) - # assert_equal(len(mod.interface()._wrapper.storage['item']), 2) - # mod.duplicate_assembly(1) - # assert_equal(len(mod.interface()._wrapper.storage['item']), 3) - def test_remove_assembly(self): m1 = Material(6.908, -0.278, 'Boron') m2 = Material(0.487, 0.000, 'Potassium') @@ -317,28 +279,6 @@ def test_remove_assembly_with_interface_refl1d(self): assert_equal(len(mod.interface()._wrapper.storage['item']), 1) assert_equal(len(mod.interface()._wrapper.storage['layer']), 2) - # def test_remove_assembly_with_interface_bornagain(self): - # interface = CalculatorFactory() - # interface.switch('BornAgain') - # m1 = Material.from_pars(6.908, 0.278, 'Boron') - # m2 = Material.from_pars(0.487, 0.000, 'Potassium') - # l1 = Layer.from_pars(m1, 5.0, 2.0, 'thinBoron') - # l2 = Layer.from_pars(m2, 50.0, 1.0, 'thickPotassium') - # ls1 = Layers.from_pars(l1, l2, name='twoLayer1') - # ls2 = Layers.from_pars(l2, l1, name='twoLayer2') - # o1 = RepeatingMultilayer.from_pars(ls1, 2.0, 'twoLayerItem1') - # o2 = RepeatingMultilayer.from_pars(ls2, 1.0, 'oneLayerItem2') - # d = Sample.from_pars(o1, name='myModel') - # mod = Model(d, 2, 1e-5, 2.0, 'newModel', interface=interface) - # assert_equal(len(mod.interface()._wrapper.storage['item']), 1) - # assert_equal(len(mod.interface()._wrapper.storage['layer']), 2) - # mod.add_assemblies(o2) - # assert_equal(len(mod.interface()._wrapper.storage['item']), 2) - # assert_equal(len(mod.interface()._wrapper.storage['layer']), 2) - # mod.remove_assembly(0) - # assert_equal(len(mod.interface()._wrapper.storage['item']), 1) - # assert_equal(len(mod.interface()._wrapper.storage['layer']), 2) - def test_remove_all_assemblies(self): # when mod = Model()