def setUp(self): TestCase.setUp(self) self.geo = PenelopeGeometry('Test Geometry') surface1 = zplane(1e-10) surface2 = zplane(-1e-3) surface3 = cylinder(1e-2) surface4 = xplane(0.0) mat1 = PenelopeMaterial.pure(29) self.module1 = Module(self.geo, mat1) self.module1.add_surface(surface1, SIDEPOINTER_NEGATIVE) self.module1.add_surface(surface2, SIDEPOINTER_POSITIVE) self.module1.add_surface(surface3, SIDEPOINTER_NEGATIVE) self.module1.add_surface(surface4, SIDEPOINTER_POSITIVE) self.geo.modules.add(self.module1) mat2 = PenelopeMaterial.pure(30) self.module2 = Module(self.geo, mat2) self.module2.add_surface(surface1, SIDEPOINTER_NEGATIVE) self.module2.add_surface(surface2, SIDEPOINTER_POSITIVE) self.module2.add_surface(surface3, SIDEPOINTER_NEGATIVE) self.module2.add_module(self.module1) self.geo.modules.add(self.module2) self.geo.tilt_rad = radians(45)
def setUp(self): TestCase.setUp(self) intforce = InteractionForcing(ELECTRON, HARD_BREMSSTRAHLUNG_EMISSION, -4) mat1 = PenelopeMaterial.pure(29, interaction_forcings=[intforce], maximum_step_length_m=1e4) mat1._index = 1 mat2 = VACUUM mat2._index = 0 surface1 = SurfaceImplicit() surface1._index = 0 surface2 = SurfaceImplicit() surface2._index = 1 self.module2 = Module(None, mat2) self.module2._index = 1 self.module1 = Module(None, mat1, 'Test') self.module1.add_surface(surface1, -1) self.module1.add_surface(surface2, 1) self.module1.add_module(self.module2) self.module1.rotation.phi_rad = radians(180) self.module1.shift.z_m = -1e3 self.module1._index = 0 self.materials_lookup = {0: mat2, 1: mat1} self.surfaces_lookup = {0: surface1, 1: surface2} self.modules_lookup = {0: self.module1, 1: self.module2}
def _export_geometry_sphere(self, geometry, pengeom): radius_m = geometry.body.diameter_m / 2.0 surface_sphere = sphere(radius_m) module = Module(pengeom, geometry.body.material, 'Sphere') module.add_surface(surface_sphere, -1) module.shift.z_m = -radius_m pengeom.modules.add(module)
def _export_geometry_substrate(self, geometry, pengeom): surface_cylinder = cylinder(0.1) # 10 cm radius surface_top = zplane(0.0) # z = 0 surface_bottom = zplane(-0.1) # z = -10 cm module = Module(pengeom, geometry.body.material, 'Substrate') module.add_surface(surface_cylinder, -1) module.add_surface(surface_top, -1) module.add_surface(surface_bottom, 1) pengeom.modules.add(module)
class TestPenelopeGeometry(TestCase): GEOFILE = ['XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX', ' Test Geometry', '0000000000000000000000000000000000000000000000000000000000000000', 'SURFACE ( 1) Plane Z=0.00 m', 'INDICES=( 0, 0, 0, 1, 0)', 'X-SCALE=(+1.000000000000000E+00, 0) (DEFAULT=1.0)', 'Y-SCALE=(+1.000000000000000E+00, 0) (DEFAULT=1.0)', 'Z-SCALE=(+1.000000000000000E+00, 0) (DEFAULT=1.0)', ' OMEGA=(+0.000000000000000E+00, 0) DEG (DEFAULT=0.0)', ' THETA=(+0.000000000000000E+00, 0) DEG (DEFAULT=0.0)', ' PHI=(+0.000000000000000E+00, 0) DEG (DEFAULT=0.0)', 'X-SHIFT=(+0.000000000000000E+00, 0) (DEFAULT=0.0)', 'Y-SHIFT=(+0.000000000000000E+00, 0) (DEFAULT=0.0)', 'Z-SHIFT=(+1.000000000000000E-08, 0) (DEFAULT=0.0)', '0000000000000000000000000000000000000000000000000000000000000000', 'SURFACE ( 2) Cylinder of radius 0.01 m along z-axis', 'INDICES=( 1, 1, 0, 0,-1)', 'X-SCALE=(+1.000000000000000E-02, 0) (DEFAULT=1.0)', 'Y-SCALE=(+1.000000000000000E-02, 0) (DEFAULT=1.0)', 'Z-SCALE=(+1.000000000000000E+00, 0) (DEFAULT=1.0)', ' OMEGA=(+0.000000000000000E+00, 0) DEG (DEFAULT=0.0)', ' THETA=(+0.000000000000000E+00, 0) DEG (DEFAULT=0.0)', ' PHI=(+0.000000000000000E+00, 0) DEG (DEFAULT=0.0)', 'X-SHIFT=(+0.000000000000000E+00, 0) (DEFAULT=0.0)', 'Y-SHIFT=(+0.000000000000000E+00, 0) (DEFAULT=0.0)', 'Z-SHIFT=(+0.000000000000000E+00, 0) (DEFAULT=0.0)', '0000000000000000000000000000000000000000000000000000000000000000', 'SURFACE ( 3) Plane Z=-0.00 m', 'INDICES=( 0, 0, 0, 1, 0)', 'X-SCALE=(+1.000000000000000E+00, 0) (DEFAULT=1.0)', 'Y-SCALE=(+1.000000000000000E+00, 0) (DEFAULT=1.0)', 'Z-SCALE=(+1.000000000000000E+00, 0) (DEFAULT=1.0)', ' OMEGA=(+0.000000000000000E+00, 0) DEG (DEFAULT=0.0)', ' THETA=(+0.000000000000000E+00, 0) DEG (DEFAULT=0.0)', ' PHI=(+0.000000000000000E+00, 0) DEG (DEFAULT=0.0)', 'X-SHIFT=(+0.000000000000000E+00, 0) (DEFAULT=0.0)', 'Y-SHIFT=(+0.000000000000000E+00, 0) (DEFAULT=0.0)', 'Z-SHIFT=(-1.000000000000000E-01, 0) (DEFAULT=0.0)', '0000000000000000000000000000000000000000000000000000000000000000', 'SURFACE ( 4) Plane X=0.00 m', 'INDICES=( 0, 0, 0, 1, 0)', 'X-SCALE=(+1.000000000000000E+00, 0) (DEFAULT=1.0)', 'Y-SCALE=(+1.000000000000000E+00, 0) (DEFAULT=1.0)', 'Z-SCALE=(+1.000000000000000E+00, 0) (DEFAULT=1.0)', ' OMEGA=(+0.000000000000000E+00, 0) DEG (DEFAULT=0.0)', ' THETA=(+9.000000000000000E+01, 0) DEG (DEFAULT=0.0)', ' PHI=(+0.000000000000000E+00, 0) DEG (DEFAULT=0.0)', 'X-SHIFT=(+0.000000000000000E+00, 0) (DEFAULT=0.0)', 'Y-SHIFT=(+0.000000000000000E+00, 0) (DEFAULT=0.0)', 'Z-SHIFT=(+0.000000000000000E+00, 0) (DEFAULT=0.0)', '0000000000000000000000000000000000000000000000000000000000000000', 'MODULE ( 1) ', 'MATERIAL( 1)', 'SURFACE ( 1), SIDE POINTER=(-1)', 'SURFACE ( 2), SIDE POINTER=(-1)', 'SURFACE ( 3), SIDE POINTER=( 1)', 'SURFACE ( 4), SIDE POINTER=( 1)', '1111111111111111111111111111111111111111111111111111111111111111', ' OMEGA=(+0.000000000000000E+00, 0) DEG (DEFAULT=0.0)', ' THETA=(+0.000000000000000E+00, 0) DEG (DEFAULT=0.0)', ' PHI=(+0.000000000000000E+00, 0) DEG (DEFAULT=0.0)', 'X-SHIFT=(+0.000000000000000E+00, 0) (DEFAULT=0.0)', 'Y-SHIFT=(+0.000000000000000E+00, 0) (DEFAULT=0.0)', 'Z-SHIFT=(+0.000000000000000E+00, 0) (DEFAULT=0.0)', '0000000000000000000000000000000000000000000000000000000000000000', 'MODULE ( 2) ', 'MATERIAL( 2)', 'SURFACE ( 1), SIDE POINTER=(-1)', 'SURFACE ( 2), SIDE POINTER=(-1)', 'SURFACE ( 3), SIDE POINTER=( 1)', 'MODULE ( 1)', '1111111111111111111111111111111111111111111111111111111111111111', ' OMEGA=(+0.000000000000000E+00, 0) DEG (DEFAULT=0.0)', ' THETA=(+0.000000000000000E+00, 0) DEG (DEFAULT=0.0)', ' PHI=(+0.000000000000000E+00, 0) DEG (DEFAULT=0.0)', 'X-SHIFT=(+0.000000000000000E+00, 0) (DEFAULT=0.0)', 'Y-SHIFT=(+0.000000000000000E+00, 0) (DEFAULT=0.0)', 'Z-SHIFT=(+0.000000000000000E+00, 0) (DEFAULT=0.0)', '0000000000000000000000000000000000000000000000000000000000000000', 'MODULE ( 3) Extra module for rotation and tilt', 'MATERIAL( 0)', 'MODULE ( 2)', '1111111111111111111111111111111111111111111111111111111111111111', ' OMEGA=(+2.700000000000000E+02, 0) DEG (DEFAULT=0.0)', ' THETA=(+4.500000000000000E+01, 0) DEG (DEFAULT=0.0)', ' PHI=(+9.000000000000000E+01, 0) DEG (DEFAULT=0.0)', 'X-SHIFT=(+0.000000000000000E+00, 0) (DEFAULT=0.0)', 'Y-SHIFT=(+0.000000000000000E+00, 0) (DEFAULT=0.0)', 'Z-SHIFT=(+0.000000000000000E+00, 0) (DEFAULT=0.0)', '0000000000000000000000000000000000000000000000000000000000000000', 'END 0000000000000000000000000000000000000000000000000000000'] def setUp(self): TestCase.setUp(self) self.geo = PenelopeGeometry('Test Geometry') surface1 = zplane(1e-10) surface2 = zplane(-1e-3) surface3 = cylinder(1e-2) surface4 = xplane(0.0) mat1 = PenelopeMaterial.pure(29) self.module1 = Module(self.geo, mat1) self.module1.add_surface(surface1, SIDEPOINTER_NEGATIVE) self.module1.add_surface(surface2, SIDEPOINTER_POSITIVE) self.module1.add_surface(surface3, SIDEPOINTER_NEGATIVE) self.module1.add_surface(surface4, SIDEPOINTER_POSITIVE) self.geo.modules.add(self.module1) mat2 = PenelopeMaterial.pure(30) self.module2 = Module(self.geo, mat2) self.module2.add_surface(surface1, SIDEPOINTER_NEGATIVE) self.module2.add_surface(surface2, SIDEPOINTER_POSITIVE) self.module2.add_surface(surface3, SIDEPOINTER_NEGATIVE) self.module2.add_module(self.module1) self.geo.modules.add(self.module2) self.geo.tilt_rad = radians(45) def tearDown(self): TestCase.tearDown(self) def testskeleton(self): self.assertEqual('Test Geometry', self.geo.title) self.assertAlmostEqual(radians(45), self.geo.tilt_rad, 4) self.assertAlmostEqual(0.0, self.geo.rotation_rad, 4) self.assertEqual(2, len(self.geo.get_bodies())) self.assertEqual(2, len(self.geo.modules)) self.assertEqual(4, len(self.geo.get_surfaces())) self.assertEqual(2, len(self.geo.get_materials())) def testto_geo(self): lines = self.geo.to_geo() self.assertEqual(self.GEOFILE[:3], lines[:3]) self.assertEqual(self.GEOFILE[14], lines[14]) self.assertEqual(self.GEOFILE[26], lines[26]) self.assertEqual(self.GEOFILE[38], lines[38]) self.assertEqual(self.GEOFILE[50], lines[50]) self.assertEqual(self.GEOFILE[51], lines[51]) self.assertEqual(self.GEOFILE[57:65], lines[57:65]) self.assertEqual(self.GEOFILE[65], lines[65]) self.assertEqual(self.GEOFILE[71:], lines[71:])
class TestModule(TestCase): GEO1 = ['MODULE ( 1) Test', 'MATERIAL( 1)', 'SURFACE ( 1), SIDE POINTER=(-1)', 'SURFACE ( 2), SIDE POINTER=( 1)', 'MODULE ( 2)', '1111111111111111111111111111111111111111111111111111111111111111', ' OMEGA=(+0.000000000000000E+00, 0) DEG (DEFAULT=0.0)', ' THETA=(+0.000000000000000E+00, 0) DEG (DEFAULT=0.0)', ' PHI=(+1.800000000000000E+02, 0) DEG (DEFAULT=0.0)', 'X-SHIFT=(+0.000000000000000E+00, 0) (DEFAULT=0.0)', 'Y-SHIFT=(+0.000000000000000E+00, 0) (DEFAULT=0.0)', 'Z-SHIFT=(-1.000000000000000E+05, 0) (DEFAULT=0.0)'] GEO2 = ['MODULE ( 2) ', 'MATERIAL( 0)', '1111111111111111111111111111111111111111111111111111111111111111', ' OMEGA=(+0.000000000000000E+00, 0) DEG (DEFAULT=0.0)', ' THETA=(+0.000000000000000E+00, 0) DEG (DEFAULT=0.0)', ' PHI=(+0.000000000000000E+00, 0) DEG (DEFAULT=0.0)', 'X-SHIFT=(+0.000000000000000E+00, 0) (DEFAULT=0.0)', 'Y-SHIFT=(+0.000000000000000E+00, 0) (DEFAULT=0.0)', 'Z-SHIFT=(+0.000000000000000E+00, 0) (DEFAULT=0.0)'] def setUp(self): TestCase.setUp(self) intforce = InteractionForcing(ELECTRON, HARD_BREMSSTRAHLUNG_EMISSION, -4) mat1 = PenelopeMaterial.pure(29, interaction_forcings=[intforce], maximum_step_length_m=1e4) mat1._index = 1 mat2 = VACUUM mat2._index = 0 surface1 = SurfaceImplicit() surface1._index = 0 surface2 = SurfaceImplicit() surface2._index = 1 self.module2 = Module(None, mat2) self.module2._index = 1 self.module1 = Module(None, mat1, 'Test') self.module1.add_surface(surface1, -1) self.module1.add_surface(surface2, 1) self.module1.add_module(self.module2) self.module1.rotation.phi_rad = radians(180) self.module1.shift.z_m = -1e3 self.module1._index = 0 self.materials_lookup = {0: mat2, 1: mat1} self.surfaces_lookup = {0: surface1, 1: surface2} self.modules_lookup = {0: self.module1, 1: self.module2} def tearDown(self): TestCase.tearDown(self) def testskeleton(self): # Module 1 self.assertEqual('Copper', str(self.module1.material)) self.assertAlmostEqual(1e4, self.module1.material.maximum_step_length_m, 4) self.assertEqual(1, len(self.module1.material.interaction_forcings)) self.assertEqual('Test', self.module1.description) self.assertAlmostEqual(radians(180), self.module1.rotation.phi_rad, 4) self.assertAlmostEqual(-1e3, self.module1.shift.z_m, 4) self.assertEqual(2, len(self.module1.get_surfaces())) self.assertEqual(1, len(self.module1.get_modules())) # Module 2 self.assertEqual(str(VACUUM), str(self.module2.material)) self.assertEqual(0, len(self.module2.get_surfaces())) self.assertEqual(0, len(self.module2.get_modules())) def testto_geo(self): # Module 1 lines = self.module1.to_geo() self.assertEqual(12, len(lines)) self.assertEqual(self.GEO1, lines) # Module 2 lines = self.module2.to_geo() self.assertEqual(9, len(lines)) self.assertEqual(self.GEO2, lines)
def _export_geometry_cuboids2d(self, geometry, pengeom): # Surfaces surface_top = zplane(0.0) # z = 0 surface_bottom = zplane(-0.1) # z = -10 cm ## Vertical planes nx = geometry.nx ny = geometry.ny xsurfaces = {} for x in range(-(nx / 2), nx / 2 + 1): xsurfaces[x] = xplane(geometry.body[x, 0].xmin_m) xsurfaces[x + 1] = xplane(geometry.body[x, 0].xmax_m) ysurfaces = {} for y in range(-(ny / 2), ny / 2 + 1): ysurfaces[y] = yplane(geometry.body[0, y].ymin_m) ysurfaces[y + 1] = yplane(geometry.body[0, y].ymax_m) # Modules for position, body in geometry.get_bodies.items(): x, y = position module = Module(pengeom, body.material, description='Position (%i, %i)' % position) module.add_surface(surface_bottom, 1) # zmin module.add_surface(surface_top, -1) # zmax module.add_surface(xsurfaces[x], 1) # xmin module.add_surface(xsurfaces[x + 1], -1) # xmax module.add_surface(ysurfaces[y], 1) # ymin module.add_surface(ysurfaces[y + 1], -1) # ymax pengeom.modules.add(module)
def _export_geometry_vertical_layers(self, geometry, pengeom): layers = np.array(geometry.layers, ndmin=1) # Surfaces surface_top = zplane(0.0) # z = 0 surface_bottom = zplane(-0.1) # z = -10 cm surface_layers = [] for layer in layers: surface_layers.append(xplane(layer.xmin_m)) surface_layers.append(xplane(layer.xmax_m)) diameter_m = sum(map(attrgetter('thickness_m'), layers)) surface_cylinder = cylinder(0.1 + 3.0 * diameter_m) # 10 cm radius # Modules ## Left substrate module = Module(pengeom, geometry.left_substrate.material, 'Left substrate') module.add_surface(surface_cylinder, -1) module.add_surface(surface_top, -1) module.add_surface(surface_bottom, 1) module.add_surface(surface_layers[0], -1) pengeom.modules.add(module) ## Layers for i, surfaces in enumerate(_pairwise(surface_layers)): surface_left, surface_right = surfaces module = Module(pengeom, layers[i].material, 'Layer %i' % (i + 1, )) module.add_surface(surface_cylinder, -1) module.add_surface(surface_top, -1) module.add_surface(surface_bottom, 1) module.add_surface(surface_left, 1) module.add_surface(surface_right, -1) pengeom.modules.add(module) ## Right substrate module = Module(pengeom, geometry.right_substrate.material, 'Right substrate') module.add_surface(surface_cylinder, -1) module.add_surface(surface_top, -1) module.add_surface(surface_bottom, 1) module.add_surface(surface_layers[-1], 1) pengeom.modules.add(module)
def _export_geometry_horizontal_layers(self, geometry, pengeom): layers = np.array(geometry.layers, ndmin=1) # Surfaces surface_cylinder = cylinder(0.1) # 10 cm radius surface_layers = [zplane(0.0)] for layer in layers: surface_layers.append(zplane(layer.zmin_m)) # Modules tmpgrouping = [] for i, surfaces in enumerate(_pairwise(surface_layers)): surface_top, surface_bottom = surfaces module = Module(pengeom, layers[i].material, 'Layer %i' % (i + 1, )) module.add_surface(surface_cylinder, -1) module.add_surface(surface_top, -1) module.add_surface(surface_bottom, 1) pengeom.modules.add(module) tmpgrouping.append((module, surface_bottom)) if geometry.has_substrate(): surface_top = surface_layers[-1] surface_bottom = zplane(surface_top.shift.z_m - 0.1) # 10 cm below last layer module = Module(pengeom, geometry.substrate.material, 'Substrate') module.add_surface(surface_cylinder, -1) module.add_surface(surface_top, -1) module.add_surface(surface_bottom, 1) pengeom.modules.add(module) tmpgrouping.append((module, surface_bottom)) # Grouping # G0: s0, s2, m0, m1 # G1: s0, s3, m2, g0 # G2: s0, s4, m3, g1 # etc. if len(tmpgrouping) <= 2: # no grouping required if only 2 modules return module, surface_bottom = tmpgrouping[1] group = Module(pengeom, VACUUM, 'grouping') group.add_surface(surface_cylinder, -1) group.add_surface(surface_layers[0], -1) # top z = 0.0 group.add_surface(surface_bottom, 1) group.add_module(tmpgrouping[0][0]) # m0 group.add_module(module) #m1 pengeom.modules.add(group) for module, surface_bottom in tmpgrouping[2:]: oldgroup = group group = Module(pengeom, VACUUM, 'grouping') group.add_surface(surface_cylinder, -1) group.add_surface(surface_layers[0], -1) # top z = 0.0 group.add_surface(surface_bottom, 1) group.add_module(module) group.add_module(oldgroup) pengeom.modules.add(group)
def _export_geometry_inclusion(self, geometry, pengeom): surface_cylinder = cylinder(0.1) # 10 cm radius surface_top = zplane(0.0) # z = 0 surface_bottom = zplane(-0.1) # z = -10 cm surface_sphere = sphere(geometry.inclusion.diameter_m / 2.0) module_inclusion = Module(pengeom, geometry.inclusion.material, 'Inclusion') module_inclusion.add_surface(surface_top, -1) module_inclusion.add_surface(surface_sphere, -1) module_substrate = Module(pengeom, geometry.substrate.material, 'Substrate') module_substrate.add_surface(surface_cylinder, -1) module_substrate.add_surface(surface_top, -1) module_substrate.add_surface(surface_bottom, 1) module_substrate.add_module(module_inclusion) pengeom.modules.add(module_substrate) pengeom.modules.add(module_inclusion)
class TestPenelopeGeometry(TestCase): GEOFILE = [ 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX', ' Test Geometry', '0000000000000000000000000000000000000000000000000000000000000000', 'SURFACE ( 1) Plane Z=0.00 m', 'INDICES=( 0, 0, 0, 1, 0)', 'X-SCALE=(+1.000000000000000E+00, 0) (DEFAULT=1.0)', 'Y-SCALE=(+1.000000000000000E+00, 0) (DEFAULT=1.0)', 'Z-SCALE=(+1.000000000000000E+00, 0) (DEFAULT=1.0)', ' OMEGA=(+0.000000000000000E+00, 0) DEG (DEFAULT=0.0)', ' THETA=(+0.000000000000000E+00, 0) DEG (DEFAULT=0.0)', ' PHI=(+0.000000000000000E+00, 0) DEG (DEFAULT=0.0)', 'X-SHIFT=(+0.000000000000000E+00, 0) (DEFAULT=0.0)', 'Y-SHIFT=(+0.000000000000000E+00, 0) (DEFAULT=0.0)', 'Z-SHIFT=(+1.000000000000000E-08, 0) (DEFAULT=0.0)', '0000000000000000000000000000000000000000000000000000000000000000', 'SURFACE ( 2) Cylinder of radius 0.01 m along z-axis', 'INDICES=( 1, 1, 0, 0,-1)', 'X-SCALE=(+1.000000000000000E-02, 0) (DEFAULT=1.0)', 'Y-SCALE=(+1.000000000000000E-02, 0) (DEFAULT=1.0)', 'Z-SCALE=(+1.000000000000000E+00, 0) (DEFAULT=1.0)', ' OMEGA=(+0.000000000000000E+00, 0) DEG (DEFAULT=0.0)', ' THETA=(+0.000000000000000E+00, 0) DEG (DEFAULT=0.0)', ' PHI=(+0.000000000000000E+00, 0) DEG (DEFAULT=0.0)', 'X-SHIFT=(+0.000000000000000E+00, 0) (DEFAULT=0.0)', 'Y-SHIFT=(+0.000000000000000E+00, 0) (DEFAULT=0.0)', 'Z-SHIFT=(+0.000000000000000E+00, 0) (DEFAULT=0.0)', '0000000000000000000000000000000000000000000000000000000000000000', 'SURFACE ( 3) Plane Z=-0.00 m', 'INDICES=( 0, 0, 0, 1, 0)', 'X-SCALE=(+1.000000000000000E+00, 0) (DEFAULT=1.0)', 'Y-SCALE=(+1.000000000000000E+00, 0) (DEFAULT=1.0)', 'Z-SCALE=(+1.000000000000000E+00, 0) (DEFAULT=1.0)', ' OMEGA=(+0.000000000000000E+00, 0) DEG (DEFAULT=0.0)', ' THETA=(+0.000000000000000E+00, 0) DEG (DEFAULT=0.0)', ' PHI=(+0.000000000000000E+00, 0) DEG (DEFAULT=0.0)', 'X-SHIFT=(+0.000000000000000E+00, 0) (DEFAULT=0.0)', 'Y-SHIFT=(+0.000000000000000E+00, 0) (DEFAULT=0.0)', 'Z-SHIFT=(-1.000000000000000E-01, 0) (DEFAULT=0.0)', '0000000000000000000000000000000000000000000000000000000000000000', 'SURFACE ( 4) Plane X=0.00 m', 'INDICES=( 0, 0, 0, 1, 0)', 'X-SCALE=(+1.000000000000000E+00, 0) (DEFAULT=1.0)', 'Y-SCALE=(+1.000000000000000E+00, 0) (DEFAULT=1.0)', 'Z-SCALE=(+1.000000000000000E+00, 0) (DEFAULT=1.0)', ' OMEGA=(+0.000000000000000E+00, 0) DEG (DEFAULT=0.0)', ' THETA=(+9.000000000000000E+01, 0) DEG (DEFAULT=0.0)', ' PHI=(+0.000000000000000E+00, 0) DEG (DEFAULT=0.0)', 'X-SHIFT=(+0.000000000000000E+00, 0) (DEFAULT=0.0)', 'Y-SHIFT=(+0.000000000000000E+00, 0) (DEFAULT=0.0)', 'Z-SHIFT=(+0.000000000000000E+00, 0) (DEFAULT=0.0)', '0000000000000000000000000000000000000000000000000000000000000000', 'MODULE ( 1) ', 'MATERIAL( 1)', 'SURFACE ( 1), SIDE POINTER=(-1)', 'SURFACE ( 2), SIDE POINTER=(-1)', 'SURFACE ( 3), SIDE POINTER=( 1)', 'SURFACE ( 4), SIDE POINTER=( 1)', '1111111111111111111111111111111111111111111111111111111111111111', ' OMEGA=(+0.000000000000000E+00, 0) DEG (DEFAULT=0.0)', ' THETA=(+0.000000000000000E+00, 0) DEG (DEFAULT=0.0)', ' PHI=(+0.000000000000000E+00, 0) DEG (DEFAULT=0.0)', 'X-SHIFT=(+0.000000000000000E+00, 0) (DEFAULT=0.0)', 'Y-SHIFT=(+0.000000000000000E+00, 0) (DEFAULT=0.0)', 'Z-SHIFT=(+0.000000000000000E+00, 0) (DEFAULT=0.0)', '0000000000000000000000000000000000000000000000000000000000000000', 'MODULE ( 2) ', 'MATERIAL( 2)', 'SURFACE ( 1), SIDE POINTER=(-1)', 'SURFACE ( 2), SIDE POINTER=(-1)', 'SURFACE ( 3), SIDE POINTER=( 1)', 'MODULE ( 1)', '1111111111111111111111111111111111111111111111111111111111111111', ' OMEGA=(+0.000000000000000E+00, 0) DEG (DEFAULT=0.0)', ' THETA=(+0.000000000000000E+00, 0) DEG (DEFAULT=0.0)', ' PHI=(+0.000000000000000E+00, 0) DEG (DEFAULT=0.0)', 'X-SHIFT=(+0.000000000000000E+00, 0) (DEFAULT=0.0)', 'Y-SHIFT=(+0.000000000000000E+00, 0) (DEFAULT=0.0)', 'Z-SHIFT=(+0.000000000000000E+00, 0) (DEFAULT=0.0)', '0000000000000000000000000000000000000000000000000000000000000000', 'MODULE ( 3) Extra module for rotation and tilt', 'MATERIAL( 0)', 'MODULE ( 2)', '1111111111111111111111111111111111111111111111111111111111111111', ' OMEGA=(+2.700000000000000E+02, 0) DEG (DEFAULT=0.0)', ' THETA=(+4.500000000000000E+01, 0) DEG (DEFAULT=0.0)', ' PHI=(+9.000000000000000E+01, 0) DEG (DEFAULT=0.0)', 'X-SHIFT=(+0.000000000000000E+00, 0) (DEFAULT=0.0)', 'Y-SHIFT=(+0.000000000000000E+00, 0) (DEFAULT=0.0)', 'Z-SHIFT=(+0.000000000000000E+00, 0) (DEFAULT=0.0)', '0000000000000000000000000000000000000000000000000000000000000000', 'END 0000000000000000000000000000000000000000000000000000000' ] def setUp(self): TestCase.setUp(self) self.geo = PenelopeGeometry('Test Geometry') surface1 = zplane(1e-10) surface2 = zplane(-1e-3) surface3 = cylinder(1e-2) surface4 = xplane(0.0) mat1 = PenelopeMaterial.pure(29) self.module1 = Module(self.geo, mat1) self.module1.add_surface(surface1, SIDEPOINTER_NEGATIVE) self.module1.add_surface(surface2, SIDEPOINTER_POSITIVE) self.module1.add_surface(surface3, SIDEPOINTER_NEGATIVE) self.module1.add_surface(surface4, SIDEPOINTER_POSITIVE) self.geo.modules.add(self.module1) mat2 = PenelopeMaterial.pure(30) self.module2 = Module(self.geo, mat2) self.module2.add_surface(surface1, SIDEPOINTER_NEGATIVE) self.module2.add_surface(surface2, SIDEPOINTER_POSITIVE) self.module2.add_surface(surface3, SIDEPOINTER_NEGATIVE) self.module2.add_module(self.module1) self.geo.modules.add(self.module2) self.geo.tilt_rad = radians(45) def tearDown(self): TestCase.tearDown(self) def testskeleton(self): self.assertEqual('Test Geometry', self.geo.title) self.assertAlmostEqual(radians(45), self.geo.tilt_rad, 4) self.assertAlmostEqual(0.0, self.geo.rotation_rad, 4) self.assertEqual(2, len(self.geo.get_bodies())) self.assertEqual(2, len(self.geo.modules)) self.assertEqual(4, len(self.geo.get_surfaces())) self.assertEqual(2, len(self.geo.get_materials())) def testto_geo(self): lines = self.geo.to_geo() self.assertEqual(self.GEOFILE[:3], lines[:3]) self.assertEqual(self.GEOFILE[14], lines[14]) self.assertEqual(self.GEOFILE[26], lines[26]) self.assertEqual(self.GEOFILE[38], lines[38]) self.assertEqual(self.GEOFILE[50], lines[50]) self.assertEqual(self.GEOFILE[51], lines[51]) self.assertEqual(self.GEOFILE[57:65], lines[57:65]) self.assertEqual(self.GEOFILE[65], lines[65]) self.assertEqual(self.GEOFILE[71:], lines[71:])
class TestModule(TestCase): GEO1 = [ 'MODULE ( 1) Test', 'MATERIAL( 1)', 'SURFACE ( 1), SIDE POINTER=(-1)', 'SURFACE ( 2), SIDE POINTER=( 1)', 'MODULE ( 2)', '1111111111111111111111111111111111111111111111111111111111111111', ' OMEGA=(+0.000000000000000E+00, 0) DEG (DEFAULT=0.0)', ' THETA=(+0.000000000000000E+00, 0) DEG (DEFAULT=0.0)', ' PHI=(+1.800000000000000E+02, 0) DEG (DEFAULT=0.0)', 'X-SHIFT=(+0.000000000000000E+00, 0) (DEFAULT=0.0)', 'Y-SHIFT=(+0.000000000000000E+00, 0) (DEFAULT=0.0)', 'Z-SHIFT=(-1.000000000000000E+05, 0) (DEFAULT=0.0)' ] GEO2 = [ 'MODULE ( 2) ', 'MATERIAL( 0)', '1111111111111111111111111111111111111111111111111111111111111111', ' OMEGA=(+0.000000000000000E+00, 0) DEG (DEFAULT=0.0)', ' THETA=(+0.000000000000000E+00, 0) DEG (DEFAULT=0.0)', ' PHI=(+0.000000000000000E+00, 0) DEG (DEFAULT=0.0)', 'X-SHIFT=(+0.000000000000000E+00, 0) (DEFAULT=0.0)', 'Y-SHIFT=(+0.000000000000000E+00, 0) (DEFAULT=0.0)', 'Z-SHIFT=(+0.000000000000000E+00, 0) (DEFAULT=0.0)' ] def setUp(self): TestCase.setUp(self) intforce = InteractionForcing(ELECTRON, HARD_BREMSSTRAHLUNG_EMISSION, -4) mat1 = PenelopeMaterial.pure(29, interaction_forcings=[intforce], maximum_step_length_m=1e4) mat1._index = 1 mat2 = VACUUM mat2._index = 0 surface1 = SurfaceImplicit() surface1._index = 0 surface2 = SurfaceImplicit() surface2._index = 1 self.module2 = Module(None, mat2) self.module2._index = 1 self.module1 = Module(None, mat1, 'Test') self.module1.add_surface(surface1, -1) self.module1.add_surface(surface2, 1) self.module1.add_module(self.module2) self.module1.rotation.phi_rad = radians(180) self.module1.shift.z_m = -1e3 self.module1._index = 0 self.materials_lookup = {0: mat2, 1: mat1} self.surfaces_lookup = {0: surface1, 1: surface2} self.modules_lookup = {0: self.module1, 1: self.module2} def tearDown(self): TestCase.tearDown(self) def testskeleton(self): # Module 1 self.assertEqual('Copper', str(self.module1.material)) self.assertAlmostEqual(1e4, self.module1.material.maximum_step_length_m, 4) self.assertEqual(1, len(self.module1.material.interaction_forcings)) self.assertEqual('Test', self.module1.description) self.assertAlmostEqual(radians(180), self.module1.rotation.phi_rad, 4) self.assertAlmostEqual(-1e3, self.module1.shift.z_m, 4) self.assertEqual(2, len(self.module1.get_surfaces())) self.assertEqual(1, len(self.module1.get_modules())) # Module 2 self.assertEqual(str(VACUUM), str(self.module2.material)) self.assertEqual(0, len(self.module2.get_surfaces())) self.assertEqual(0, len(self.module2.get_modules())) def testto_geo(self): # Module 1 lines = self.module1.to_geo() self.assertEqual(12, len(lines)) self.assertEqual(self.GEO1, lines) # Module 2 lines = self.module2.to_geo() self.assertEqual(9, len(lines)) self.assertEqual(self.GEO2, lines)