예제 #1
0
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)
예제 #2
0
def create_homogeneous_sample(data, density_start = None, density_end = None):
    '''
    Function to create a list of substrate samples for Xray signal reference
    input: dataframe of atomic fractions at various positions
    output: list[Substrate]
    '''
    elements_data = get_elements_data(data)
    
    colors = generate_colors(steps = len(data) - 1)
    densities = generate_densities(elements_data, density_start, density_end)

    # 1. Creating materials at both ends
    material_start, material_end = generate_end_materials(elements_data, colors, density_start, density_end)
    materials = [material_start, material_end]
    
     # 2. Iterate through all regions, create the material representations
    for i in range(1, len(data) - 1):
        density = densities[i]
        color = colors[i]
        material = Material(
                            name = f'region_{i}',
                            composition = to_weight_fraction(dict(elements_data.iloc[i])),
                            density_kg_per_m3 = density,
                            color = color)
        materials.append(material)
        
    # 3. Creating substrate sample from the materials
    substrate_list = [SubstrateSample(mat) for mat in materials]

    return substrate_list
예제 #3
0
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()
예제 #4
0
    def _create_standard_options(self, options):
        builder = OptionsBuilder()

        builder.add_program(options.program)

        beam = GaussianBeam(energy_eV=options.beam.energy_eV,
                            diameter_m=0.0,
                            particle=options.beam.particle)
        builder.add_beam(beam)

        for material in options.sample.materials:
            for z in material.composition:
                standard = self.get_standard_material(z)
                builder.add_sample(SubstrateSample(standard))

        for limit in options.limits:
            builder.add_limit(options.program, limit)

        for model in options.models:
            builder.add_model(options.program, model)

        analysis = PhotonIntensityAnalysis(self.photon_detector)
        builder.add_analysis(analysis)

        return builder.build()
예제 #5
0
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)
예제 #6
0
def test_validate_sample_substrate_invalid(exporter, options):
    sample = SubstrateSample(VACUUM, float("inf"), float("nan"))

    erracc = ErrorAccumulator()
    exporter._validate_sample_substrate(sample, options, erracc)

    assert len(erracc.exceptions) == 3
    assert len(erracc.warnings) == 0
예제 #7
0
    def testvalidate_sample_substrate_exception(self):
        sample = SubstrateSample(VACUUM, float('inf'), float('nan'))
        self.assertRaises(ValidationError, self.v.validate_sample, sample,
                          self.options)

        errors = set()
        self.v._validate_sample(sample, self.options, errors)
        self.assertEqual(3, len(errors))
예제 #8
0
    def _validate_sample_substrate(self, sample, options, errors):
        material = \
            self._validate_sample_substrate_material(sample.material, options, errors)
        tilt_rad = \
            self._validate_sample_base_tilt_rad(sample.tilt_rad, options, errors)
        azimuth_rad = \
            self._validate_sample_base_azimuth_rad(sample.azimuth_rad, options, errors)

        return SubstrateSample(material, tilt_rad, azimuth_rad)
예제 #9
0
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)
예제 #10
0
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)
예제 #11
0
def _create_samples():
    yield SubstrateSample(Material.pure(39))

    for number_layers in range(1, 10 + 1):
        sample = HorizontalLayerSample(Material.pure(39))
        for i in range(number_layers):
            sample.add_layer(Material.pure(40 + i), 20e-9)
        yield sample

    for number_layers in range(0, 9 + 1):
        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
예제 #12
0
    def testcalculate(self):
        # Create options
        beam = GaussianBeam(20e3, 10.e-9)
        sample = SubstrateSample(Material.from_formula('CaSiO4'))
        limit = ShowersLimit(100)
        unkoptions = Options(self.program, beam, sample, [self.a], [limit])

        list_standard_options = self.a.apply(unkoptions)
        self.assertEqual(3, len(list_standard_options))

        # Create simulations
        def create_simulation(options):
            builder = EmittedPhotonIntensityResultBuilder(self.a)
            for z, wf in options.sample.material.composition.items():
                builder.add_intensity((z, 'Ka'), wf * 1e3, math.sqrt(wf * 1e3))
            result = builder.build()
            return Simulation(options, [result])

        unksim = create_simulation(unkoptions)
        stdsims = [
            create_simulation(options) for options in list_standard_options
        ]
        sims = stdsims + [unksim]

        # Calculate
        newresult = self.a.calculate(unksim, sims)
        self.assertTrue(newresult)

        newresult = self.a.calculate(unksim, sims)
        self.assertFalse(newresult)

        # Test
        results = unksim.find_result(KRatioResult)
        self.assertEqual(1, len(results))

        result = results[0]
        self.assertEqual(3, len(result))

        q = result[('Ca', 'Ka')]
        self.assertAlmostEqual(0.303262, q.n, 4)
        self.assertAlmostEqual(0.019880, q.s, 4)

        q = result[('Si', 'Ka')]
        self.assertAlmostEqual(0.212506, q.n, 4)
        self.assertAlmostEqual(0.016052, q.s, 4)

        q = result[('O', 'Ka')]
        self.assertAlmostEqual(0.484232 / 0.470749, q.n, 4)
        self.assertAlmostEqual(0.066579, q.s, 4)
예제 #13
0
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)
예제 #14
0
    def _create_standard_options(self, options):
        builder = OptionsBuilder(tags=[TAG_STANDARD])

        program = copy.copy(options.program)
        builder.add_program(program)

        beam = PencilBeam(energy_eV=options.beam.energy_eV,
                          particle=options.beam.particle)
        builder.add_beam(beam)

        for material in options.sample.materials:
            for z in material.composition:
                standard = self.get_standard_material(z)
                builder.add_sample(SubstrateSample(standard))

        analysis = PhotonIntensityAnalysis(self.photon_detector)
        builder.add_analysis(analysis)

        return builder.build()
예제 #15
0
    Layer(MATERIAL_DS, 0.1),
    Layer(MATERIAL_RG, 0.15),
    Layer(MATERIAL_AU, 0.2),
    Layer(MATERIAL_DS, 0.05),
]


def test_samplefigure_draw_nothing(samplefigure, ax):
    samplefigure.draw(ax)
    assert len(ax.collections) == 0


@pytest.mark.parametrize(
    "sample,perspective,expected_path_count",
    [
        (SubstrateSample(MATERIAL_DS), Perspective.XY, 1),
        (SubstrateSample(MATERIAL_DS), Perspective.XZ, 1),
        (SubstrateSample(MATERIAL_DS), Perspective.YZ, 1),
        (InclusionSample(MATERIAL_DS, MATERIAL_RG, 0.5), Perspective.XY, 2),
        (InclusionSample(MATERIAL_DS, MATERIAL_RG, 0.5), Perspective.XZ, 2),
        (InclusionSample(MATERIAL_DS, MATERIAL_RG, 0.5), Perspective.YZ, 2),
        (HorizontalLayerSample(MATERIAL_DS, LAYERS), Perspective.XY, 1),
        (HorizontalLayerSample(MATERIAL_DS, LAYERS), Perspective.XZ, 5),
        (HorizontalLayerSample(MATERIAL_DS, LAYERS), Perspective.YZ, 5),
        (VerticalLayerSample(MATERIAL_DS, MATERIAL_AU,
                             LAYERS), Perspective.XY, 6),
        (VerticalLayerSample(MATERIAL_DS, MATERIAL_AU,
                             LAYERS), Perspective.XZ, 6),
        (VerticalLayerSample(MATERIAL_DS, MATERIAL_AU,
                             LAYERS), Perspective.YZ, 1),
        (SphereSample(MATERIAL_DS, 0.5), Perspective.XY, 1),
예제 #16
0
 def create_basic_sample(self):
     return SubstrateSample(Material.pure(29))
예제 #17
0
    def plot(self):
        tilt_rad = math.radians(self._slider_tilt_deg.value())
        rotation_rad = math.radians(self._slider_rotation_deg.value())

        layer = [
            Layer(RE, 10e-9),
            Layer(OS, 15e-9),
            Layer(IR, 20e-9),
            Layer(PT, 5e-9)
        ]

        sample_cls = self._combo_sample.currentData()

        if sample_cls == SubstrateSample:
            sample = SubstrateSample(DS,
                                     tilt_rad=tilt_rad,
                                     rotation_rad=rotation_rad)
        elif sample_cls == InclusionSample:
            sample = InclusionSample(DS,
                                     AU,
                                     0.5e-6,
                                     tilt_rad=tilt_rad,
                                     rotation_rad=rotation_rad)
        elif sample_cls == HorizontalLayerSample:
            sample = HorizontalLayerSample(DS,
                                           layer,
                                           tilt_rad=tilt_rad,
                                           rotation_rad=rotation_rad)
        elif sample_cls == VerticalLayerSample:
            sample = VerticalLayerSample(DS,
                                         RG,
                                         layer,
                                         tilt_rad=tilt_rad,
                                         rotation_rad=rotation_rad)
        elif sample_cls == SphereSample:
            sample = SphereSample(AU,
                                  0.5e-6,
                                  tilt_rad=tilt_rad,
                                  rotation_rad=rotation_rad)
        else:
            sample = None

        beam_cls = self._combo_beam.currentData()

        if beam_cls == GaussianBeam:
            beams = [GaussianBeam(42.0, 5e-9)]
        else:
            beams = []

        # trajectory_cls = self._combo_trajectory.currentData()

        # TODO handle trajectories
        trajectories = []

        sf = SampleFigure(sample, beams, trajectories)

        if self.radio_yz.isChecked():
            sf.perspective = Perspective.YZ
        elif self.radio_xy.isChecked():
            sf.perspective = Perspective.XY
        else:
            sf.perspective = Perspective.XZ

        self._figure.clf()

        ax = self._figure.add_subplot(111)

        ax.xaxis.set_visible(False)
        ax.yaxis.set_visible(False)

        sf.draw(ax)

        scalebar = ScaleBar(1.0, location="lower left")
        ax.add_artist(scalebar)

        self._canvas.draw_idle()
예제 #18
0
 def test_compose_sample_substrate(self):
     sample = SubstrateSample(self.mat_ds)
     self._compose_sample(sample, (1, 1, 1))
예제 #19
0
    def test_draw_sample(self):
        sample = SubstrateSample(self.mat_ds)
        sf = SampleFigure(sample)

        sf._draw_sample(self.ax, sample, Perspective.XZ, 2.0)
        self.assertEqual(len(self.ax.collections), 1)
예제 #20
0
 def testsubstrate(self):
     sample = SubstrateSample(Material.pure(39))
     self._run_and_test(sample)
예제 #21
0
 def testvalidate_sample_substrate(self):
     sample = SubstrateSample(COPPER)
     sample2 = self.v.validate_sample(sample, self.options)
     self.assertEqual(sample2, sample)
     self.assertIsNot(sample2, sample)
예제 #22
0
from pymontecarlo.options.material import Material
from pymontecarlo.options.sample import HorizontalLayerSample, SubstrateSample, VerticalLayerSample
from pymontecarlo.options.detector import PhotonDetector
from pymontecarlo.options.analysis import KRatioAnalysis
from pymontecarlo.options.limit import ShowersLimit
from pymontecarlo.options.options import Options

program = pymontecarlo.settings.get_program('casino2')

beam = GaussianBeam(15e3, 10e-9)

mat1 = Material.pure(29)
mat2 = Material.from_formula('SiO2')
mat3 = Material('Stuff', {27: 0.5, 25: 0.2, 8: 0.3}, 4500.0)

sample = SubstrateSample(mat2)

#sample = HorizontalLayerSample(mat3)
#sample.add_layer(mat2, 10e-9)
#sample.add_layer(mat3, 25e-9)

#sample = VerticalLayerSample(mat1, mat2)
#sample.add_layer(mat3, 10e-9)

photon_detector = PhotonDetector('xray', math.radians(35.0))
analysis = KRatioAnalysis(photon_detector)

limit = ShowersLimit(1000)

options = Options(program, beam, sample, [analysis], [limit])