Esempio n. 1
0
    def setUp(self):
        self.p2_args = 1, 1
        self.p1 = Point(0, 0)
        self.p2 = Point(self.p2_args)
        self.p3 = Point(2, 0)

        points = [
            self.p1, self.p2, self.p3
        ]
        self.rec_elem = RecoilElement(mo.get_element(), points)
Esempio n. 2
0
def get_recoil_element(recoil_widget=None,
                       name="Default",
                       element=None,
                       **kwargs) -> RecoilElement:
    """Returns a RecoilElement object.

    Args:
        recoil_widget: object that gets added to RecoilElement's collection
            of widgets if not 'None'.
        name: name of the recoil
        element: element object.
        **kwargs: if element is not given, these are the keyword arguments
            that get passed down to get_element
    """
    if element is None:
        element = get_element(**kwargs)
    re = RecoilElement(element, [
        Point((1, 1)),
        Point((2, 2)),
    ],
                       "red",
                       name=name)
    if recoil_widget is not None:
        re.widgets.append(recoil_widget)
    return re
Esempio n. 3
0
    def add_new_recoil(self, spectra_changed=None, recoil_name_changed=None):
        """
        Add new recoil to element simulation.
        """
        points = copy.deepcopy(
            self.element_simulation.get_main_recoil().get_points())

        element = copy.copy(self.element_simulation.get_main_recoil().element)
        name = "Default-" + str(self.running_int_recoil)

        color = self.element_simulation.get_main_recoil().color

        if self.element_simulation.simulation_type == "ERD":
            rec_type = "rec"
        else:
            rec_type = "sct"

        recoil_element = RecoilElement(element,
                                       points,
                                       color,
                                       name,
                                       rec_type=rec_type)
        self.running_int_recoil += 1
        recoil_widget = RecoilElementWidget(
            self.parent,
            self.tab,
            self,
            self.element_simulation,
            color,
            recoil_element,
            statusbar=self.statusbar,
            spectra_changed=spectra_changed,
            recoil_name_changed=recoil_name_changed)
        recoil_element.widgets.append(recoil_widget)
        self.element_simulation.recoil_elements.append(recoil_element)

        self.parent.radios.addButton(recoil_widget.radio_button)
        # Add recoil widget under ite element simulation's element widget
        for i in range(self.parent.recoil_vertical_layout.count()):
            if self.parent.recoil_vertical_layout.itemAt(i).widget() == self:
                self.parent.recoil_vertical_layout.insertWidget(
                    i + 1, recoil_widget)
                break
        recoil_widget.radio_button.setChecked(True)

        # Save recoil element
        recoil_element.to_file(self.element_simulation.directory)
Esempio n. 4
0
 def setUp(self):
     self.timestamp = time.time()
     self.rec_type = "rec"
     self.ch_width = 4
     self.rec_elem = RecoilElement(
         mo.get_element(),
         [Point((0, 4)),
          Point((1, 5)),
          Point((2, 10))],
         color="black",
         description="foo",
         name="bar",
         rec_type="rec",
         reference_density=3,
         channel_width=self.ch_width,
         modification_time=self.timestamp
     )
Esempio n. 5
0
    def test_sorting_points(self):
        """Points should always remain sorted.
        """
        n = 10
        iters = 10
        maximum = 20
        minimum = 0
        rand = lambda: random.uniform(minimum, maximum)
        for _ in range(iters):
            points = [
                Point(rand(), rand())
                for _ in range(n)
            ]
            points_sorted = sorted(points)

            rec_elem = RecoilElement(
                mo.get_element(), points)

            self.assertEqual(points_sorted, rec_elem.get_points())

            p_0 = Point(minimum - 1, rand())
            p_n = Point(maximum + 1, rand())
            rec_elem.add_point(p_0)
            rec_elem.add_point(p_n)

            self.assertIs(p_0, rec_elem.get_first_point())
            self.assertIs(p_n, rec_elem.get_last_point())
Esempio n. 6
0
    def test_get_full_name(self):
        self.assertEqual("He-bar", self.rec_elem.get_full_name())

        rec_elem = RecoilElement(Element.from_string("16O"), [], name=None)
        self.assertEqual("16O-Default", rec_elem.get_full_name())

        rec_elem = RecoilElement(Element.from_string("16O"), [], name="")
        self.assertEqual("16O-Default", rec_elem.get_full_name())
Esempio n. 7
0
    def test_sorting(self):
        # Checks that recoil elements are sorted in the same way as elements
        n = 10
        iterations = 10
        for _ in range(iterations):
            elems = [mo.get_element(randomize=True) for _ in range(n)]
            rec_elems = [RecoilElement(elem, []) for elem in elems]
            random.shuffle(elems)
            random.shuffle(rec_elems)

            elems.sort()
            rec_elems.sort()
            for e, r in zip(elems, rec_elems):
                self.assertEqual(e, r.element)
Esempio n. 8
0
    def setUpClass(cls):
        # default recoil element
        cls.elem_4he = RecoilElement(Element.from_string("4He"), [], "red")

        # Valid file names for the recoil element
        cls.valid_erd_files = ["4He-Default.101.erd", "4He-Default.102.erd"]

        # Invalid file names for the recoil element
        cls.invalid_erd_files = [
            "4He-Default.101", ".4He-Default.102.erd", ".4He-Default..erd",
            "4He-Default.101.erf", "4He-Default./.103.erd",
            "4He-Default.\\.104.erd", "3He-Default.102.erd"
        ]

        cls.expected_values = [(Path(f), s + 101)
                               for s, f in enumerate(cls.valid_erd_files)]
Esempio n. 9
0
    def test_get_erd_file_path(self):
        rec_elem = RecoilElement(Element.from_string("He"), [], "red")

        self.assertEqual("He-Default.101.erd",
                         fp.get_erd_file_name(rec_elem, 101))
        self.assertEqual("He-Default.102.erd",
                         fp.get_erd_file_name(rec_elem, 102))

        self.assertEqual(
            "He-opt.101.erd",
            fp.get_erd_file_name(
                rec_elem, 101, optim_mode=OptimizationType.RECOIL))

        self.assertEqual(
            "He-optfl.101.erd",
            fp.get_erd_file_name(
                rec_elem, 101, optim_mode=OptimizationType.FLUENCE))

        self.assertRaises(ValueError,
                          lambda: fp.get_erd_file_name(rec_elem, 101,
                                                       optim_mode="foo"))
Esempio n. 10
0
    def test_serialization(self):
        with tempfile.TemporaryDirectory() as tmp_dir:
            file_path = fp.get_recoil_file_path(self.rec_elem, tmp_dir)
            self.rec_elem.to_file(tmp_dir)

            rec_elem2 = RecoilElement.from_file(file_path,
                                                channel_width=self.ch_width,
                                                rec_type=self.rec_type)

            self.compare_rec_elems(self.rec_elem, rec_elem2)

            # Test with an empty list of points and no rec_type or ch_width
            rec_elem3 = RecoilElement(Element.from_string("O"), [])
            file_path = fp.get_recoil_file_path(rec_elem3, tmp_dir)
            rec_elem3.to_file(tmp_dir)
            rec_elem4 = RecoilElement.from_file(file_path)

            self.compare_rec_elems(rec_elem3, rec_elem4)

        self.assertFalse(os.path.exists(tmp_dir))
Esempio n. 11
0
    def test_element_simulation_settings(self):
        """This tests that ElementSimulation is run with the correct settings
        depending on how 'use_default_settings' and 'use_request_settings'
        have been set.
        """
        with tempfile.TemporaryDirectory() as tmp_dir:
            # File paths
            tmp_dir = Path(tmp_dir).resolve()
            req_dir = tmp_dir / "req"
            sim_dir = req_dir / "Sample_01-foo" / \
                f"{Simulation.DIRECTORY_PREFIX}01-bar"
            simu_file = sim_dir / "bar.simulation"

            # Request
            request = Request(
                req_dir, "test_req", GlobalSettings(config_dir=tmp_dir), {},
                enable_logging=False)

            self.assertEqual(req_dir, request.directory)
            self.assertEqual("test_req", request.request_name)

            # Sample
            sample = request.samples.add_sample(name="foo")
            self.assertIs(sample, request.samples.samples[0])
            self.assertIsInstance(sample, Sample)
            self.assertEqual("foo", sample.name)
            self.assertEqual(request, sample.request)
            self.assertEqual("Sample_01-foo", sample.directory)

            # Simulation
            sim = sample.simulations.add_simulation_file(
                sample, simu_file, 0)
            # Disable logging so the logging file handlers do not cause
            # an exception when the tmp dir is removed
            sim.close_log_files()

            self.assertIs(sim, sample.simulations.get_key_value(0))
            self.assertIsInstance(sim.detector, Detector)
            self.assertIsInstance(sim.run, Run)
            self.assertEqual("bar", sim.name)
            self.assertEqual(request, sim.request)
            self.assertEqual(sample, sim.sample)

            # ElementSimulation
            rec_elem = RecoilElement(
                Element.from_string("Fe"), [Point((1, 1))], name="recoil_name")
            elem_sim = sim.add_element_simulation(rec_elem)
            self.assertIs(elem_sim, sim.element_simulations[0])
            elem_sim.number_of_preions = 2
            elem_sim.number_of_ions = 3
            self.assertEqual(request, elem_sim.request)
            self.assertEqual("Fe-Default", elem_sim.get_full_name())

            # Some pre-simulation checks
            self.assertIsNot(sim.target, request.default_target)
            self.assertIsNot(elem_sim, request.default_element_simulation)
            self.assertIsNot(sim.detector, request.default_detector)
            self.assertIsNot(sim.run, request.default_run)
            self.assertIsNot(sim.run.beam, request.default_run.beam)
            self.assertNotEqual(
                elem_sim.number_of_ions,
                request.default_element_simulation.number_of_ions)

            self.assert_expected_settings(elem_sim, request, sim)
Esempio n. 12
0
class TestRecoilElement(unittest.TestCase):
    def setUp(self):
        self.timestamp = time.time()
        self.rec_type = "rec"
        self.ch_width = 4
        self.rec_elem = RecoilElement(
            mo.get_element(),
            [Point((0, 4)),
             Point((1, 5)),
             Point((2, 10))],
            color="black",
            description="foo",
            name="bar",
            rec_type="rec",
            reference_density=3,
            channel_width=self.ch_width,
            modification_time=self.timestamp
        )

    def test_get_full_name(self):
        self.assertEqual("He-bar", self.rec_elem.get_full_name())

        rec_elem = RecoilElement(Element.from_string("16O"), [], name=None)
        self.assertEqual("16O-Default", rec_elem.get_full_name())

        rec_elem = RecoilElement(Element.from_string("16O"), [], name="")
        self.assertEqual("16O-Default", rec_elem.get_full_name())

    def test_serialization(self):
        with tempfile.TemporaryDirectory() as tmp_dir:
            file_path = fp.get_recoil_file_path(self.rec_elem, tmp_dir)
            self.rec_elem.to_file(tmp_dir)

            rec_elem2 = RecoilElement.from_file(file_path,
                                                channel_width=self.ch_width,
                                                rec_type=self.rec_type)

            self.compare_rec_elems(self.rec_elem, rec_elem2)

            # Test with an empty list of points and no rec_type or ch_width
            rec_elem3 = RecoilElement(Element.from_string("O"), [])
            file_path = fp.get_recoil_file_path(rec_elem3, tmp_dir)
            rec_elem3.to_file(tmp_dir)
            rec_elem4 = RecoilElement.from_file(file_path)

            self.compare_rec_elems(rec_elem3, rec_elem4)

        self.assertFalse(os.path.exists(tmp_dir))

    def compare_rec_elems(self, rec_elem1, rec_elem2):
        fst = dict(vars(rec_elem1))
        snd = dict(vars(rec_elem2))

        self.assertEqual(fst.pop("_points"), snd.pop("_points"))
        self.assertEqual(fst.pop("element"), snd.pop("element"))

        times = fst.pop("modification_time"), snd.pop("modification_time")

        if None not in times:
            self.assertAlmostEqual(times[0], times[1], places=2)

        self.assertEqual(fst, snd)

    def test_calculate_area(self):
        self.assertEqual(12, self.rec_elem.calculate_area())
        self.assertEqual(4.5, self.rec_elem.calculate_area(
            start=0, end=1))

        self.assertEqual(0, self.rec_elem.calculate_area(
            start=0.5, end=0.5))
        self.assertEqual(2.25, self.rec_elem.calculate_area(
            start=0.25, end=0.75))

        self.assertEqual(5.5, self.rec_elem.calculate_area(
            start=0.5, end=1.5))

        # If the interval is outside the point range, 0 is returned
        self.assertEqual(0, self.rec_elem.calculate_area(
            start=2, end=3))
        self.assertEqual(0, self.rec_elem.calculate_area(
            start=-2, end=0))

        # If the length of the interval is non-positive, 0 is returned
        self.assertEqual(0, self.rec_elem.calculate_area(
            start=1, end=1))
        self.assertEqual(0, self.rec_elem.calculate_area(
            start=1, end=0))

    def test_sorting(self):
        # Checks that recoil elements are sorted in the same way as elements
        n = 10
        iterations = 10
        for _ in range(iterations):
            elems = [mo.get_element(randomize=True) for _ in range(n)]
            rec_elems = [RecoilElement(elem, []) for elem in elems]
            random.shuffle(elems)
            random.shuffle(rec_elems)

            elems.sort()
            rec_elems.sort()
            for e, r in zip(elems, rec_elems):
                self.assertEqual(e, r.element)

    def test_identities(self):
        rec_elem1 = mo.get_recoil_element()
        rec_elem2 = mo.get_recoil_element()

        self.assertNotEqual(rec_elem1, rec_elem2)
        self.assertEqual(rec_elem1, rec_elem1)

        self.assertIs(rec_elem2, rec_elem2)
Esempio n. 13
0
class TestPoints(unittest.TestCase):
    def setUp(self):
        self.p2_args = 1, 1
        self.p1 = Point(0, 0)
        self.p2 = Point(self.p2_args)
        self.p3 = Point(2, 0)

        points = [
            self.p1, self.p2, self.p3
        ]
        self.rec_elem = RecoilElement(mo.get_element(), points)

    def test_sorting_points(self):
        """Points should always remain sorted.
        """
        n = 10
        iters = 10
        maximum = 20
        minimum = 0
        rand = lambda: random.uniform(minimum, maximum)
        for _ in range(iters):
            points = [
                Point(rand(), rand())
                for _ in range(n)
            ]
            points_sorted = sorted(points)

            rec_elem = RecoilElement(
                mo.get_element(), points)

            self.assertEqual(points_sorted, rec_elem.get_points())

            p_0 = Point(minimum - 1, rand())
            p_n = Point(maximum + 1, rand())
            rec_elem.add_point(p_0)
            rec_elem.add_point(p_n)

            self.assertIs(p_0, rec_elem.get_first_point())
            self.assertIs(p_n, rec_elem.get_last_point())

    def test_remove_point(self):
        self.rec_elem.remove_point(self.p1)
        self.assertEqual([self.p2, self.p3], self.rec_elem.get_points())

        self.rec_elem.remove_point(self.p3)
        self.assertEqual([self.p2], self.rec_elem.get_points())

        self.rec_elem.remove_point(Point(self.p2_args))
        self.assertEqual([], self.rec_elem.get_points())

        self.assertRaises(
            ValueError, lambda: self.rec_elem.remove_point(self.p1))

    def test_get_neighbours(self):
        ln, rn = self.rec_elem.get_neighbors(self.p1)
        self.assertIsNone(ln)
        self.assertIs(rn, self.p2)

        ln, rn = self.rec_elem.get_neighbors(self.p2)
        self.assertIs(ln, self.p1)
        self.assertIs(rn, self.p3)

        ln, rn = self.rec_elem.get_neighbors(self.p3)
        self.assertIs(ln, self.p2)
        self.assertIsNone(rn)

        ln, rn = self.rec_elem.get_neighbors(Point(1, 1))
        self.assertIs(ln, self.p1)
        self.assertIs(rn, self.p3)

    def test_between_zeros(self):
        self.assertFalse(self.rec_elem.between_zeros(self.p1))
        self.assertTrue(self.rec_elem.between_zeros(self.p2))
        self.assertFalse(self.rec_elem.between_zeros(self.p3))

        self.assertTrue(self.rec_elem.between_zeros(Point(1, 1)))
        self.assertRaises(
            ValueError, lambda: self.rec_elem.between_zeros(Point(0.5, 1)))

    def test_dist_length(self):
        self.assertEqual(2, self.rec_elem.distribution_length())
        self.rec_elem.add_point(Point(10.5, 0))
        self.assertEqual(10.5, self.rec_elem.distribution_length())
        for p in list(self.rec_elem.get_points()):
            self.rec_elem.remove_point(p)

        self.assertRaises(IndexError, self.rec_elem.distribution_length)