예제 #1
0
    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
예제 #2
0
    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
예제 #3
0
    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
예제 #4
0
    def testexport_vertical_layers(self):
        # Create
        mat1 = PenelopeMaterial({79: 0.5, 47: 0.5}, 'mat1')
        mat2 = PenelopeMaterial({29: 0.5, 30: 0.5}, 'mat2')
        mat3 = PenelopeMaterial({13: 0.5, 14: 0.5}, 'mat3')

        ops = Options()
        ops.beam.energy_eV = 1234
        ops.beam.diameter_m = 25e-9
        ops.beam.origin_m = (100e-9, 0, 1)

        ops.geometry = VerticalLayers(mat1, mat2)
        ops.geometry.add_layer(mat3, 5e-3)

        ops.limits.add(TimeLimit(100))

        self.c._convert_geometry(ops)
        self.e.export_geometry(ops.geometry, self.tmpdir)

        # Test
        geofilepath = os.path.join(self.tmpdir, 'verticallayers.geo')
        repfilepath = os.path.join(self.tmpdir, 'geometry.rep')
        nmat, nbody = pengeom.init(geofilepath, repfilepath)

        self.assertEqual(3, nmat)
        self.assertEqual(4, nbody)

        matfilepath = os.path.join(self.tmpdir, 'mat1.mat')
        self.assertTrue(os.path.exists(matfilepath))

        matfilepath = os.path.join(self.tmpdir, 'mat2.mat')
        self.assertTrue(os.path.exists(matfilepath))

        matfilepath = os.path.join(self.tmpdir, 'mat3.mat')
        self.assertTrue(os.path.exists(matfilepath))
예제 #5
0
    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()
예제 #6
0
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)))
예제 #7
0
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'))))