Source code for roentgen.tests.test_stack
import numpy as np
import pytest
import astropy.units as u
import roentgen
from roentgen.absorption.material import Material, Stack
# elements beyond z = 93 have no mass absorption data
all_materials = list(roentgen.elements["symbol"])[:-6] + list(roentgen.compounds["symbol"])
energy_array = u.Quantity(np.arange(1, 100, 1), "keV")
[docs]
@pytest.fixture(params=all_materials)
def material(request):
return Material(request.param, 500 * u.micron)
[docs]
def test_twomaterials_to_stack(material):
# check that adding two materials returns a compound
assert isinstance(material + Material("Si", 500 * u.micron), Stack)
[docs]
def test_threematerials_to_stack(material):
# check that adding three materials returns a compound
assert isinstance(
material + Material("Ge", 500 * u.micron) + Material("cdte", 100 * u.micron),
Stack,
)
[docs]
def test_add_material_to_stack():
stack1 = Material("Ge", 500 * u.micron) + Material("Ge", 100 * u.micron)
assert isinstance(stack1 + Material("Ge", 500 * u.micron), Stack)
[docs]
def test_add_two_stacks():
material_str = ["Ge", "cdte", "Si", "Al"]
stack1 = Material(material_str[0], 500 * u.micron) + Material(material_str[1], 100 * u.micron)
stack2 = Material(material_str[2], 500 * u.micron) + Material(material_str[2], 500 * u.micron)
total_stack = stack1 + stack2
all_materials = [this_mat.symbol for this_mat in total_stack.materials]
assert isinstance(total_stack, Stack)
# check that the stack has all the same number of materials
assert len(material_str) == len(total_stack.materials)
# check that the stack has all the same material names
assert all_materials.sort() == material_str.sort()
[docs]
def test_stack_calculations(material):
comp = Material("Ge", 500 * u.micron) + Material("cdte", 100 * u.micron)
# test that it returns the same number of elements as energy array
assert len(comp.absorption(energy_array)) == len(energy_array)
assert len(comp.transmission(energy_array)) == len(energy_array)
[docs]
def test_bad_add_to_stack():
with pytest.raises(TypeError):
Material("Ge", 500 * u.micron) + Material("Si", 100 * u.micron) + ["foo", "bar"]
[docs]
def test_mat_add_stack():
stack1 = Material("Ge", 500 * u.micron) + Material("Si", 100 * u.micron)
assert isinstance(Material("Ge", 500 * u.micron) + stack1, Stack)
[docs]
def test_repr_str():
stack = Material("Ge", 500 * u.micron) + Material("Si", 100 * u.micron)
assert isinstance(stack.__repr__(), str)
assert isinstance(stack.__str__(), str)