Пример #1
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)
Пример #2
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))
Пример #3
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)