def parse(self, element): geo = _GeometryXMLHandler.parse(self, element) materials_lookup = self._parse_materials(element) subelement = element.find('leftSubstrate') if subelement is None: raise ValueError("Element 'leftSubstrate' not found") indexes = self._parse_numerical_parameter(subelement, 'material') left_material = list(map(materials_lookup.get, indexes)) subelement = element.find('rightSubstrate') if subelement is None: raise ValueError("Element 'rightSubstrate' not found") indexes = self._parse_numerical_parameter(subelement, 'material') right_material = list(map(materials_lookup.get, indexes)) depth_m = self._parse_numerical_parameter(element, 'depth') obj = VerticalLayers(left_material, right_material, None, depth_m, geo.tilt_rad, geo.rotation_rad) subelement = element.find('layers') if subelement is None: raise ValueError("Element 'layers' not found") for subsubelement in subelement: indexes = self._parse_numerical_parameter(subsubelement, 'material') material = list(map(materials_lookup.get, indexes)) thickness_m = self._parse_numerical_parameter(subsubelement, 'thickness') obj.add_layer(material, thickness_m) return obj
def value(self): geometry = VerticalLayers(left_material=self._lst_left.values(), right_material=self._lst_right.values(), depth_m=self._txt_depth.values(), tilt_rad=self._txt_tilt.values(), rotation_rad=self._txt_rotation.values()) for layer in self._lst_layer.values(): geometry.add_layer(layer.material, layer.thickness_m) return geometry
class TestVerticalLayers(TestCase): def setUp(self): TestCase.setUp(self) self.g1 = VerticalLayers(Material.pure(29), Material.pure(30)) self.g1.add_layer(Material.pure(31), 500.0) self.g2 = VerticalLayers(Material.pure(29), Material.pure(30)) self.g2.add_layer(Material.pure(29), 100.0) self.g2.add_layer(Material.pure(32), 200.0) self.g3 = VerticalLayers(Material.pure(29), Material.pure(30)) self.g3.add_layer(Material.pure(31), 500.0) self.g3.depth_m = 400.0 def tearDown(self): TestCase.tearDown(self) def testskeleton(self): # Vertical layers 1 self.assertEqual('Copper', str(self.g1.left_substrate.material)) self.assertEqual('Zinc', str(self.g1.right_substrate.material)) self.assertEqual('Gallium', str(self.g1.layers[0].material)) self.assertAlmostEqual(500.0, self.g1.layers[0].thickness_m, 4) # Vertical layers 2 self.assertEqual('Copper', str(self.g2.left_substrate.material)) self.assertEqual('Zinc', str(self.g2.right_substrate.material)) self.assertEqual(2, len(self.g2.layers)) self.assertEqual('Copper', str(self.g2.layers[0].material)) self.assertAlmostEqual(100.0, self.g2.layers[0].thickness_m, 4) self.assertAlmostEqual(200.0, self.g2.layers[1].thickness_m, 4) self.assertEqual('Germanium', str(self.g2.layers[1].material)) # Vertical layers 3 self.assertEqual('Copper', str(self.g3.left_substrate.material)) self.assertEqual('Zinc', str(self.g3.right_substrate.material)) self.assertEqual('Gallium', str(self.g3.layers[0].material)) self.assertAlmostEqual(500.0, self.g3.layers[0].thickness_m, 4) def testget_bodies(self): self.assertEqual(3, len(self.g1.get_bodies())) self.assertEqual(4, len(self.g2.get_bodies())) self.assertEqual(3, len(self.g3.get_bodies())) def testleft_substrate(self): # Vertical layers 1 self.assertEqual(float('-inf'), self.g1.left_substrate.xmin_m) self.assertAlmostEqual(-250.0, self.g1.left_substrate.xmax_m, 4) self.assertEqual(float('-inf'), self.g1.left_substrate.ymin_m) self.assertEqual(float('inf'), self.g1.left_substrate.ymax_m) self.assertEqual(float('-inf'), self.g1.left_substrate.zmin_m) self.assertAlmostEqual(0.0, self.g1.left_substrate.zmax_m, 4) # Vertical layers 2 self.assertEqual(float('-inf'), self.g2.left_substrate.xmin_m) self.assertAlmostEqual(-150.0, self.g2.left_substrate.xmax_m, 4) self.assertEqual(float('-inf'), self.g2.left_substrate.ymin_m) self.assertEqual(float('inf'), self.g2.left_substrate.ymax_m) self.assertEqual(float('-inf'), self.g2.left_substrate.zmin_m) self.assertAlmostEqual(0.0, self.g2.left_substrate.zmax_m, 4) # Vertical layers 3 self.assertEqual(float('-inf'), self.g3.left_substrate.xmin_m) self.assertAlmostEqual(-250.0, self.g3.left_substrate.xmax_m, 4) self.assertEqual(float('-inf'), self.g3.left_substrate.ymin_m) self.assertEqual(float('inf'), self.g3.left_substrate.ymax_m) self.assertAlmostEqual(-400.0, self.g3.left_substrate.zmin_m, 4) self.assertAlmostEqual(0.0, self.g3.left_substrate.zmax_m, 4) def testright_substrate(self): # Vertical layers 1 self.assertAlmostEqual(250.0, self.g1.right_substrate.xmin_m, 4) self.assertEqual(float('inf'), self.g1.right_substrate.xmax_m) self.assertEqual(float('-inf'), self.g1.right_substrate.ymin_m) self.assertEqual(float('inf'), self.g1.right_substrate.ymax_m) self.assertEqual(float('-inf'), self.g1.right_substrate.zmin_m) self.assertAlmostEqual(0.0, self.g1.right_substrate.zmax_m, 4) # Vertical layers 2 self.assertAlmostEqual(150.0, self.g2.right_substrate.xmin_m, 4) self.assertEqual(float('inf'), self.g2.right_substrate.xmax_m) self.assertEqual(float('-inf'), self.g2.right_substrate.ymin_m) self.assertEqual(float('inf'), self.g2.right_substrate.ymax_m) self.assertEqual(float('-inf'), self.g2.right_substrate.zmin_m) self.assertAlmostEqual(0.0, self.g2.right_substrate.zmax_m, 4) # Vertical layers 3 self.assertAlmostEqual(250.0, self.g3.right_substrate.xmin_m, 4) self.assertEqual(float('inf'), self.g3.right_substrate.xmax_m) self.assertEqual(float('-inf'), self.g3.right_substrate.ymin_m) self.assertEqual(float('inf'), self.g3.right_substrate.ymax_m) self.assertAlmostEqual(-400.0, self.g3.right_substrate.zmin_m, 4) self.assertAlmostEqual(0.0, self.g3.right_substrate.zmax_m, 4) def testlayers(self): # Vertical layers 1 self.assertAlmostEqual(-250.0, self.g1.layers[0].xmin_m, 4) self.assertAlmostEqual(250.0, self.g1.layers[0].xmax_m, 4) self.assertEqual(float('-inf'), self.g1.layers[0].ymin_m) self.assertEqual(float('inf'), self.g1.layers[0].ymax_m) self.assertEqual(float('-inf'), self.g1.layers[0].zmin_m) self.assertAlmostEqual(0.0, self.g1.layers[0].zmax_m, 4) # Vertical layers 2 self.assertAlmostEqual(-150.0, self.g2.layers[0].xmin_m, 4) self.assertAlmostEqual(-50.0, self.g2.layers[0].xmax_m, 4) self.assertEqual(float('-inf'), self.g2.layers[0].ymin_m) self.assertEqual(float('inf'), self.g2.layers[0].ymax_m) self.assertEqual(float('-inf'), self.g2.layers[0].zmin_m) self.assertAlmostEqual(0.0, self.g2.layers[0].zmax_m, 4) self.assertAlmostEqual(-50.0, self.g2.layers[1].xmin_m, 4) self.assertAlmostEqual(150.0, self.g2.layers[1].xmax_m, 4) self.assertEqual(float('-inf'), self.g2.layers[1].ymin_m) self.assertEqual(float('inf'), self.g2.layers[1].ymax_m) self.assertEqual(float('-inf'), self.g2.layers[1].zmin_m) self.assertAlmostEqual(0.0, self.g2.layers[1].zmax_m, 4) # Vertical layers 3 self.assertAlmostEqual(-250.0, self.g3.layers[0].xmin_m, 4) self.assertAlmostEqual(250.0, self.g3.layers[0].xmax_m, 4) self.assertEqual(float('-inf'), self.g3.layers[0].ymin_m) self.assertEqual(float('inf'), self.g3.layers[0].ymax_m) self.assertAlmostEqual(-400.0, self.g3.layers[0].zmin_m, 4) self.assertAlmostEqual(0.0, self.g3.layers[0].zmax_m, 4) def testexpand(self): self.assertEqual(1, len(expand(self.g1))) self.g1.add_layer(Material.pure(79), [1.0, 2.0]) self.assertEqual(2, len(expand(self.g1)))
class TestVerticalLayersXMLHandler(unittest.TestCase): def setUp(self): unittest.TestCase.setUp(self) self.h = VerticalLayersXMLHandler() self.obj1 = VerticalLayers(Material.pure(29), Material.pure(30), None, tilt_rad=1.1, rotation_rad=2.2) self.obj1.add_layer(Material.pure(31), 500.0) self.obj2 = VerticalLayers(Material.pure(29), Material.pure(30)) self.obj2.add_layer(Material.pure(31), 500.0) self.obj2.depth_m = 400.0 etree.register_namespace('mc', 'http://pymontecarlo.sf.net') source = BytesIO(b'<mc:verticalLayers xmlns:mc="http://pymontecarlo.sf.net" depth="inf" rotation="2.2" tilt="1.1"><materials><mc:material _index="1" density="5910.0" name="Gallium"><composition><element weightFraction="1.0" z="31" /></composition></mc:material><mc:material _index="2" density="8960.0" name="Copper"><composition><element weightFraction="1.0" z="29" /></composition></mc:material><mc:material _index="3" density="7140.0" name="Zinc"><composition><element weightFraction="1.0" z="30" /></composition></mc:material></materials><leftSubstrate material="2" /><rightSubstrate material="3" /><layers><layer material="1" thickness="500.0" /></layers></mc:verticalLayers>') self.element1 = etree.parse(source).getroot() etree.register_namespace('mc', 'http://pymontecarlo.sf.net') source = BytesIO(b'<mc:verticalLayers xmlns:mc="http://pymontecarlo.sf.net" depth="400.0" rotation="0.0" tilt="0.0"><materials><mc:material _index="1" density="8960.0" name="Copper"><composition><element weightFraction="1.0" z="29" /></composition></mc:material><mc:material _index="2" density="5910.0" name="Gallium"><composition><element weightFraction="1.0" z="31" /></composition></mc:material><mc:material _index="3" density="7140.0" name="Zinc"><composition><element weightFraction="1.0" z="30" /></composition></mc:material></materials><leftSubstrate material="1" /><rightSubstrate material="3" /><layers><layer material="2" thickness="500.0" /></layers></mc:verticalLayers>') self.element2 = etree.parse(source).getroot() def tearDown(self): unittest.TestCase.tearDown(self) def testcan_parse(self): self.assertTrue(self.h.can_parse(self.element1)) self.assertTrue(self.h.can_parse(self.element2)) def testparse(self): # Vertical layers 1 obj = self.h.parse(self.element1) self.assertEqual('Copper', str(obj.left_substrate.material)) self.assertEqual('Zinc', str(obj.right_substrate.material)) self.assertEqual('Gallium', str(obj.layers[0].material)) self.assertAlmostEqual(500.0, obj.layers[0].thickness_m, 4) self.assertAlmostEqual(1.1, obj.tilt_rad, 4) self.assertAlmostEqual(2.2, obj.rotation_rad, 4) # Vertical layers 2 obj = self.h.parse(self.element2) self.assertAlmostEqual(400.0, obj.depth_m, 4) self.assertEqual('Copper', str(obj.left_substrate.material)) self.assertEqual('Zinc', str(obj.right_substrate.material)) self.assertEqual('Gallium', str(obj.layers[0].material)) self.assertAlmostEqual(500.0, obj.layers[0].thickness_m, 4) self.assertAlmostEqual(0.0, obj.tilt_rad, 4) self.assertAlmostEqual(0.0, obj.rotation_rad, 4) def testcan_convert(self): self.assertTrue(self.h.can_convert(self.obj1)) self.assertTrue(self.h.can_convert(self.obj2)) def testconvert(self): # Vertical layers 1 element = self.h.convert(self.obj1) self.assertAlmostEqual(1.1, float(element.get('tilt')), 4) self.assertAlmostEqual(2.2, float(element.get('rotation')), 4) self.assertEqual(3, len(list(element.find('materials')))) self.assertEqual(1, len(list(element.find('layers')))) # Vertical layers 2 element = self.h.convert(self.obj2) self.assertAlmostEqual(0.0, float(element.get('tilt')), 4) self.assertAlmostEqual(0.0, float(element.get('rotation')), 4) self.assertEqual(3, len(list(element.find('materials')))) self.assertEqual(1, len(list(element.find('layers'))))