def testhorizontallayers5(self): sample = HorizontalLayerSample(Material.pure(39)) sample.add_layer(Material.pure(40), 20e-9) sample.add_layer(Material.pure(41), 20e-9) sample.add_layer(Material.pure(42), 20e-9) sample.add_layer(Material.pure(44), 20e-9) self._run_and_test(sample)
def test_convert_geometry(self): self.ops.geometry = [Substrate(Material.pure(29)), Inclusion(Material.pure(29), Material.pure(30), 10e-6)] opss = self.converter.convert(self.ops) self.assertEqual(1, len(opss))
def setUp(self): unittest.TestCase.setUp(self) self.h = SubstrateXMLHandler() self.obj = Substrate([Material.pure(29), Material.pure(30)], 1.1, 2.2) etree.register_namespace('mc', 'http://pymontecarlo.sf.net') source = BytesIO(b'<mc:substrate xmlns:mc="http://pymontecarlo.sf.net" rotation="2.2" tilt="1.1"><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="7140.0" name="Zinc"><composition><element weightFraction="1.0" z="30" /></composition></mc:material></materials><body material="1,2" /></mc:substrate>') self.element = etree.parse(source).getroot()
def testbuild(self): b = LayeredSampleBuilderMock() b.add_layer(Material.pure(29), 10) b.add_layer(Material.pure(30), 20) samples = b.build() self.assertEqual(1, len(samples)) sample = samples[0] self.assertEqual(2, len(sample.layers))
def testset_color_set(self): Material.set_color_set(['#00FF00', '#0000FF']) m = Material.pure(13) self.assertEqual('#00FF00', m.color) m = Material.pure(14) self.assertEqual('#0000FF', m.color) m = Material.pure(15) self.assertEqual('#00FF00', m.color)
def test_layeredsamplebuilderbase(layeredbuilder): layeredbuilder = LayeredSampleBuilderMock() layeredbuilder.add_layer(Material.pure(29), 10) layeredbuilder.add_layer(Material.pure(30), 20) samples = layeredbuilder.build() assert len(layeredbuilder) == 1 assert len(samples) == 1 sample = samples[0] assert len(sample.layers) == 2
def testbuild2(self): b = LayeredSampleBuilderMock() bl = b.add_layer(Material.pure(29), 10) bl.add_material(Material.pure(30)) samples = b.build() self.assertEqual(2, len(samples)) sample = samples[0] self.assertEqual(1, len(sample.layers)) self.assertAlmostEqual(10, sample.layers[0].thickness_m, 4)
def testverticallayers10(self): sample = VerticalLayerSample(Material.pure(39), Material.pure(40)) sample.add_layer(Material.pure(41), 20e-9) sample.add_layer(Material.pure(42), 20e-9) sample.add_layer(Material.pure(44), 20e-9) sample.add_layer(Material.pure(45), 20e-9) sample.add_layer(Material.pure(46), 20e-9) sample.add_layer(Material.pure(47), 20e-9) sample.add_layer(Material.pure(48), 20e-9) sample.add_layer(Material.pure(49), 20e-9) self._run_and_test(sample)
def test_layeredsamplebuilderbase_twomaterials(layeredbuilder): layerbuilder = layeredbuilder.add_layer(Material.pure(29), 10) layerbuilder.add_material(Material.pure(30)) samples = layeredbuilder.build() assert len(layeredbuilder) == 2 assert len(samples) == 2 sample = samples[0] assert len(sample.layers) == 1 assert sample.layers[0].thickness_m == pytest.approx(10.0, abs=1e-4)
def test_material_pure_widget(qtbot, material_pure_widget): button = material_pure_widget.wdg_periodic_table._group.button(13) qtbot.mouseClick(button, QtCore.Qt.LeftButton) button = material_pure_widget.wdg_periodic_table._group.button(29) qtbot.mouseClick(button, QtCore.Qt.LeftButton) materials = material_pure_widget.materials() assert len(materials) == 2 assert Material.pure(13) in materials assert Material.pure(29) in materials
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 test_lazylowestenergyxrayline(options, z, beam_energy_eV, minimum_energy_eV, expected): options.beam.energy_eV = beam_energy_eV options.sample.material = Material.pure(z) assert LazyLowestEnergyXrayLine(minimum_energy_eV).apply( None, options) == expected
def pure(cls, z, absorption_energy_eV=None, elastic_scattering=(0.0, 0.0), cutoff_energy_inelastic_eV=50.0, cutoff_energy_bremsstrahlung_eV=50.0, interaction_forcings=None, maximum_step_length_m=1e20): mat = _Material.pure(z, absorption_energy_eV) return cls(mat.composition, mat.name, mat.density_kg_m3, mat.absorption_energy_eV, elastic_scattering, cutoff_energy_inelastic_eV, cutoff_energy_bremsstrahlung_eV, interaction_forcings, maximum_step_length_m)
def estimated_builder(builder): program_mock_added = False if not builder.programs: builder.add_program(ProgramMock()) program_mock_added = True beam_mock_added = False if not builder.beams: builder.add_beam(PencilBeam(10e3)) beam_mock_added = True sample_mock_added = False if not builder.samples: builder.add_sample(SubstrateSample(Material.pure(26))) sample_mock_added = True try: yield builder finally: if program_mock_added: builder.programs.clear() if beam_mock_added: builder.beams.clear() if sample_mock_added: builder.samples.clear()
def simulation(): program = ProgramMock() beam = GaussianBeam(15e3, 10e-9) sample = SubstrateSample(Material.pure(29)) detector = PhotonDetector("xray", math.radians(40.0)) analyses = [PhotonIntensityAnalysis(detector)] tags = ["basic", "test"] options = Options(program, beam, sample, analyses, tags) results = [] analysis = PhotonIntensityAnalysis(detector) builder = EmittedPhotonIntensityResultBuilder(analysis) builder.add_intensity((29, "Ka1"), 1.0, 0.1) builder.add_intensity((29, "Ka2"), 2.0, 0.2) builder.add_intensity((29, "Kb1"), 4.0, 0.5) builder.add_intensity((29, "Kb3"), 5.0, 0.7) builder.add_intensity((29, "Kb5I"), 1.0, 0.1) builder.add_intensity((29, "Kb5II"), 0.5, 0.1) builder.add_intensity((29, "Ll"), 3.0, 0.1) results.append(builder.build()) analysis = KRatioAnalysis(detector) builder = KRatioResultBuilder(analysis) builder.add_kratio((29, "Ka1"), 1.0, 1.0) builder.add_kratio((29, "Ka2"), 2.0, 1.0) builder.add_kratio((29, "Kb1"), 0.5, 1.0) builder.add_kratio((29, "Kb3"), 1.5, 1.0) builder.add_kratio((29, "Kb5I"), 1.0, 1.0) builder.add_kratio((29, "Kb5II"), 0.5, 1.0) builder.add_kratio((29, "Ll"), 2.0, 1.0) results.append(builder.build()) return Simulation(options, results)
def testvalidate_analysis_kratio(self): detector = PhotonDetector('det', 1.1, 2.2) analysis = KRatioAnalysis(detector) analysis.add_standard_material(13, Material.pure(13)) analysis2 = self.v.validate_analysis(analysis, self.options) self.assertEqual(analysis2, analysis) self.assertIsNot(analysis2, analysis)
def __init__(self, tilt, rotation): _Geometry.__init__(self, tilt, rotation) mat = Material.pure(29) self.bodies = [_Body(self, mat), _Body(self, VACUUM), _Body(self, mat)]
def options(): program = Casino2Program(number_trajectories=50) beam = GaussianBeam(15e3, 10e-9) sample = SubstrateSample(Material.pure(29)) detector = PhotonDetector("xray", math.radians(40.0)) analyses = [PhotonIntensityAnalysis(detector)] tags = ["basic", "test"] return Options(program, beam, sample, analyses, tags)
def get_standard_material(self, z): if z in self.standard_materials: return self.standard_materials[z] if z in self.DEFAULT_NONPURE_STANDARD_MATERIALS: return self.DEFAULT_NONPURE_STANDARD_MATERIALS[z] return Material.pure(z)
def options(): program = PenepmaProgram(number_trajectories=100) program.exporter.dump_interval_s = 2 beam = CylindricalBeam(15e3, 10e-9) sample = SubstrateSample(Material.pure(29)) detector = PhotonDetector("xray", math.radians(40.0)) analyses = [PhotonIntensityAnalysis(detector)] tags = ["basic", "test"] return Options(program, beam, sample, analyses, tags)
def testphoton_range(self): material = Material.pure(29) xrayline = XrayLine(29, 'Ka1') actual = photon_range(20e3, material, xrayline, reference='perkins1991') self.assertAlmostEqual(8.42816e-7, actual, 10)
def testvalidate_analysis_kratio_exception(self): detector = PhotonDetector('', 2.0, -1.0) analysis = KRatioAnalysis(detector) analysis.add_standard_material(14, Material.pure(13)) self.assertRaises(ValidationError, self.v.validate_analysis, analysis, self.options) errors = set() self.v._validate_analysis(analysis, self.options, errors) self.assertEqual(4, len(errors))
def testpure(self): m = Material.pure(29) self.assertEqual('Copper', str(m)) self.assertIn(29, m.composition) self.assertAlmostEqual(1.0, m.composition[29], 4) self.assertAlmostEqual(8.96, m.density_kg_per_m3 / 1000.0, 4) self.assertAlmostEqual(8.96, m.density_g_per_cm3, 4)
def test_material_formula_widget_auto_density(qtbot, material_formula_widget): widget = material_formula_widget.field_formula.widget() qtbot.keyClicks(widget, "Al") materials = material_formula_widget.materials() assert len(materials) == 1 assert materials[0].density_kg_per_m3 == pytest.approx( Material.pure(13).density_kg_per_m3, abs=1e-4 )
def setUp(self): unittest.TestCase.setUp(self) self.h = SphereXMLHandler() self.obj = Sphere(Material.pure(29), 123.456, 1.1, 2.2) etree.register_namespace('mc', 'http://pymontecarlo.sf.net') source = BytesIO(b'<mc:sphere xmlns:mc="http://pymontecarlo.sf.net" rotation="2.2" tilt="1.1"><materials><mc:material _index="1" density="8960.0" name="Copper"><composition><element weightFraction="1.0" z="29" /></composition></mc:material></materials><body diameter="123.456" material="1" /></mc:sphere>') self.element = etree.parse(source).getroot()
def _create_samples(number_layers=2): yield SubstrateSample(Material.pure(39)) yield InclusionSample(Material.pure(39), Material.pure(40), 20e-9) sample = HorizontalLayerSample(Material.pure(39)) for i in range(number_layers): sample.add_layer(Material.pure(50 + i), 20e-9) yield sample sample = VerticalLayerSample(Material.pure(39), Material.pure(40)) for i in range(number_layers): sample.add_layer(Material.pure(40 + i), 20e-9) yield sample yield SphereSample(Material.pure(39), 20e-9)
def run3(): # pragma: no cover import sys app = QtWidgets.QApplication(sys.argv) material = Material.pure(14) widget = MaterialListWidget() widget.addMaterial(material) widget.addMaterial(Material.pure(14)) widget.addMaterial(Material.pure(13)) widget.addMaterial(Material.pure(10)) widget.setAllowVacuum(True) widget.setSelectedMaterials([material]) mainwindow = QtWidgets.QMainWindow() mainwindow.setCentralWidget(widget) mainwindow.show() app.exec_()
def options(): """ Creates basic options using the mock program. """ program = ProgramMock() beam = GaussianBeam(15e3, 10e-9) sample = SubstrateSample(Material.pure(29)) detector = PhotonDetector("xray", math.radians(40.0)) analyses = [PhotonIntensityAnalysis(detector)] tags = ["basic", "test"] return Options(program, beam, sample, analyses, tags)
def test_material_pure(): material = Material.pure(29) assert str(material) == "Copper" assert material.name == "Copper" assert 29 in material.composition assert material.composition[29] == pytest.approx(1.0, abs=1e-9) assert material.density_kg_per_m3 == pytest.approx(8960.0, abs=1e-4) assert material.density_g_per_cm3 == pytest.approx(8.960, abs=1e-4)
def test_material_list_widget_selectedMaterials_add(qtbot, material_list_widget): material = material_list_widget.material(0) material_list_widget.setSelectedMaterials([material]) newmaterial = Material.pure(28) material_list_widget.addMaterial(newmaterial) assert newmaterial in material_list_widget.materials() selected_materials = material_list_widget.selectedMaterials() assert len(selected_materials) == 1 assert material in selected_materials
def run2(): # pragma: no cover import sys app = QtWidgets.QApplication(sys.argv) material = Material.pure(14) widget = MaterialComboBox() widget.addMaterial(material) widget.addMaterial(Material.pure(14)) widget.addMaterial(Material.pure(13)) widget.addMaterial(Material.pure(10)) widget.setAllowVacuum(False) widget.setCurrentMaterial(material) mainwindow = QtWidgets.QMainWindow() mainwindow.setCentralWidget(widget) mainwindow.show() app.exec_()
def setUp(self): unittest.TestCase.setUp(self) self.h = HorizontalLayersXMLHandler() self.obj1 = HorizontalLayers(Material.pure(29), None, 1.1, 2.2) self.obj1.add_layer(Material.pure(30), 123.456) self.obj1.add_layer(Material.pure(31), 456.789) self.obj2 = HorizontalLayers() self.obj2.add_layer(Material.pure(30), 123.456) self.obj2.add_layer(VACUUM, 50.0) self.obj2.add_layer(Material.pure(31), 456.789) etree.register_namespace('mc', 'http://pymontecarlo.sf.net') source = BytesIO(b'<mc:horizontalLayers xmlns:mc="http://pymontecarlo.sf.net" rotation="2.2" tilt="1.1"><materials><mc:material _index="1" density="7140.0" name="Zinc"><composition><element weightFraction="1.0" z="30" /></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="8960.0" name="Copper"><composition><element weightFraction="1.0" z="29" /></composition></mc:material></materials><substrate material="3" /><layers><layer material="1" thickness="123.456" /><layer material="2" thickness="456.789" /></layers></mc:horizontalLayers>') self.element1 = etree.parse(source).getroot() etree.register_namespace('mc', 'http://pymontecarlo.sf.net') source = BytesIO(b'<mc:horizontalLayers xmlns:mc="http://pymontecarlo.sf.net" rotation="0.0" tilt="0.0"><materials><mc:material _index="1" density="7140.0" name="Zinc"><composition><element weightFraction="1.0" z="30" /></composition></mc:material><mc:material _index="2" density="5910.0" name="Gallium"><composition><element weightFraction="1.0" z="31" /></composition></mc:material></materials><layers><layer material="1" thickness="123.456" /><layer material="0" thickness="50.0" /><layer material="2" thickness="456.789" /></layers></mc:horizontalLayers>') self.element2 = etree.parse(source).getroot()
def setUp(self): unittest.TestCase.setUp(self) self.ops = Options() self.ops.beam = PencilBeam(15e3) self.ops.geometry = Substrate(Material.pure(29)) self.ops.detectors['det1'] = TimeDetector() self.ops.limits.add(ShowersLimit(5678)) self.ops.models.add(ELASTIC_CROSS_SECTION.rutherford) self.ops.models.add(MASS_ABSORPTION_COEFFICIENT.henke1993) self.converter = MockConverter()
def setUp(self): TestCase.setUp(self) self.outputdir = tempfile.mkdtemp() self.workdir = tempfile.mkdtemp() ops = Options('test') ops.geometry.body.material = Material.pure(79) ops.detectors['time'] = TimeDetector() ops.limits.add(ShowersLimit(1)) self.ops = Converter().convert(ops)[0] self.worker = Worker(program)
def run(): # pragma: no cover import sys from pymontecarlo.options.beam import GaussianBeam from pymontecarlo.options.sample import HorizontalLayerSample from pymontecarlo.options.material import Material app = QtWidgets.QApplication(sys.argv) widget = SampleFigureWidget() sample = HorizontalLayerSample(Material.pure(29)) sample.add_layer(Material.pure(30), 10e-9) widget.setSample(sample) beam = GaussianBeam(15e3, 5e-9) widget.addBeam(beam) mainwindow = QtWidgets.QMainWindow() mainwindow.setCentralWidget(widget) mainwindow.show() app.exec_()
def setUp(self): TestCase.setUp(self) self.g1 = HorizontalLayers(Material.pure(29)) self.g2 = HorizontalLayers(None) # No substrate self.g3 = HorizontalLayers(Material.pure(29)) # Empty layer self.g1.add_layer(Material.pure(30), 123.456) self.g1.add_layer(Material.pure(31), 456.789) self.g2.add_layer(Material.pure(30), 123.456) self.g2.add_layer(Material.pure(31), 456.789) self.g3.add_layer(Material.pure(30), 123.456) self.g3.add_layer(Material.pure(31), 456.789) self.g3.add_layer(VACUUM, 456.123)
def setUp(self): TestCase.setUp(self) self.outputdir = tempfile.mkdtemp() self.workdir = tempfile.mkdtemp() ops = Options('test') ops.beam.energy_keV = 10 ops.geometry.body.material = Material.pure(29) ops.detectors['fraction'] = ElectronFractionDetector() ops.limits.add(ShowersLimit(1)) self.ops = Converter().convert(ops)[0] self.worker = Worker(program)
def testapply(self): list_options = self.a.apply(self.options) self.assertEqual(1, len(list_options)) options = list_options[0] self.assertAlmostEqual(self.options.beam.energy_eV, options.beam.energy_eV, 4) self.assertAlmostEqual(self.options.beam.particle, options.beam.particle, 4) self.assertIsInstance(options.sample, SubstrateSample) self.assertEqual(Material.pure(29), options.sample.material) self.assertSequenceEqual(self.options.detectors, options.detectors) self.assertSequenceEqual(self.options.limits, options.limits) self.assertSequenceEqual(self.options.models, options.models) self.assertEqual(1, len(options.analyses)) self.assertIsInstance(options.analyses[0], PhotonIntensityAnalysis)
def testpure(self): m = Material.pure(29) self.assertEqual('Copper', str(m)) self.assertIn(29, m.composition) self.assertAlmostEqual(1.0, m.composition[29], 4) self.assertIn(29, self.m.composition_atomic) self.assertAlmostEqual(1.0, self.m.composition_atomic[29], 4) self.assertAlmostEqual(8.96, m.density_kg_m3 / 1000.0, 4) self.assertAlmostEqual(8.96, m.density_g_cm3, 4) self.assertAlmostEqual(50, m.absorption_energy_eV[ELECTRON], 4) self.assertAlmostEqual(50, m.absorption_energy_eV[PHOTON], 4)
def run_layerswidget(): # pragma: no cover import sys app = QtWidgets.QApplication(sys.argv) from pymontecarlo.options.material import Material materials = [] for z in range(14, 79, 5): materials.append(Material.pure(z)) widget = LayerBuilderWidget() widget.setAvailableMaterials(materials) mainwindow = QtWidgets.QMainWindow() mainwindow.setCentralWidget(widget) mainwindow.show() app.exec_()
def test_convert_geometry_substrate(self): # Base options ops = Options(name="Test") mat = Material.pure(29, absorption_energy_eV={POSITRON: 63.4}) ops.geometry = Substrate(mat) ops.limits.add(TimeLimit(100)) # Convert self.converter._convert_geometry(ops) # Test self.assertEqual('Copper', str(ops.geometry.body.material)) for material in ops.geometry.get_materials(): self.assertAlmostEqual(0.1, material.elastic_scattering[0], 4) self.assertAlmostEqual(0.2, material.elastic_scattering[1], 4) self.assertAlmostEqual(51.2, material.cutoff_energy_inelastic_eV, 4) self.assertAlmostEqual(53.4, material.cutoff_energy_bremsstrahlung_eV, 4) self.assertAlmostEqual(63.4, material.absorption_energy_eV[POSITRON], 4) self.assertAlmostEqual(1e20, material.maximum_step_length_m, 4)
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 setUp(self): TestCase.setUp(self) self.g = Inclusion(Material.pure(29), Material.pure(30), 123.456)
def testmaterial(self): self.g.body.material = [Material.pure(14), Material.pure(15)] self.assertEqual(2, len(self.g.body.material))
def setUp(self): TestCase.setUp(self) self.g = Substrate(Material.pure(29))
def setUp(self): TestCase.setUp(self) self.g = Sphere(Material.pure(29), 123.456)
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)))
def testphoton_range(self): material = Material.pure(29) transition = Transition(29, siegbahn='Ka1') self.assertAlmostEqual(8.4064e-7, photon_range(20e3, material, transition), 10)