def test_create(self, mask_prop): roi_info = ROIInfo(np.zeros((10, 10), dtype=np.uint8)) elem = HistoryElement.create(roi_info, None, {}, mask_prop) assert elem.mask_property == mask_prop assert elem.roi_extraction_parameters == {} param = {"a": 1, "b": 2} elem2 = HistoryElement.create(roi_info, None, param, mask_prop) assert elem2.roi_extraction_parameters == param roi_info2, mask = elem2.get_roi_info_and_mask() assert np.all(roi_info2.roi == 0) assert mask is None
def calculate_pipeline(image: Image, mask: typing.Optional[np.ndarray], pipeline: SegmentationPipeline, report_fun): history = [] report_fun("max", 2 * len(pipeline.mask_history) + 1) for i, el in enumerate(pipeline.mask_history): result, _ = calculate_segmentation_step(el.segmentation, image, mask) roi_info = result.roi_info.fit_to_image(image) report_fun("step", 2 * i + 1) new_mask = calculate_mask( mask_description=el.mask_property, roi=roi_info.roi, old_mask=mask, spacing=image.spacing, time_axis=image.time_pos, ) segmentation_parameters = { "algorithm_name": el.segmentation.name, "values": el.segmentation.values } history.append( HistoryElement.create(roi_info, mask, segmentation_parameters, el.mask_property)) report_fun("step", 2 * i + 2) mask = image.fit_array_to_image(new_mask) result, text = calculate_segmentation_step(pipeline.segmentation, image, mask) report_fun("step", 2 * len(pipeline.mask_history) + 1) return PipelineResult(result.roi_info, result.additional_layers, mask, history, text)
def create_history_element_from_project(project_info: ProjectTuple, mask_property: MaskProperty): return HistoryElement.create( roi_info=project_info.roi_info, mask=project_info.mask, roi_extraction_parameters=project_info.algorithm_parameters, mask_property=mask_property, )
def create_history_element_from_segmentation_tuple(project_info: MaskProjectTuple, mask_property: MaskProperty): return HistoryElement.create( roi_info=project_info.roi_info, mask=project_info.mask, roi_extraction_parameters={ "selected": project_info.selected_components, "parameters": project_info.roi_extraction_parameters, }, mask_property=mask_property, )
def test_mask(self, mask_prop): mask = np.zeros((10, 10), dtype=np.uint8) mask[1:-1, 1:-1] = 2 mask2 = np.copy(mask) mask2[2:-2, 2:-2] = 4 roi_info = ROIInfo(mask2) elem = HistoryElement.create(roi_info, mask, {}, mask_prop) roi_info2, mask2 = elem.get_roi_info_and_mask() assert np.all(mask == mask2) assert np.all(roi_info.roi == roi_info2.roi)
def test_base_settings_history(self, tmp_path, qtbot, monkeypatch): settings = base_settings.BaseSettings(tmp_path) assert settings.history_size() == 0 assert settings.history_redo_size() == 0 hist_elem = HistoryElement({"a": 1}, None, MaskProperty.simple_mask(), BytesIO()) hist_elem2 = HistoryElement({"a": 2}, None, MaskProperty.simple_mask(), BytesIO()) hist_elem3 = HistoryElement({"a": 3}, None, MaskProperty.simple_mask(), BytesIO()) settings.add_history_element(hist_elem) assert settings.history_size() == 1 assert settings.history_redo_size() == 0 settings.add_history_element(hist_elem2) assert settings.history_size() == 2 assert settings.history_redo_size() == 0 assert settings.history_pop().roi_extraction_parameters["a"] == 2 assert settings.history_current_element( ).roi_extraction_parameters["a"] == 1 assert settings.history_next_element( ).roi_extraction_parameters["a"] == 2 assert settings.history_redo_size() == 1 assert settings.history_size() == 1 assert len(settings.get_history()) == 1 assert settings.get_history()[-1].roi_extraction_parameters["a"] == 1 settings.add_history_element(hist_elem3) settings.history_pop() settings.history_redo_clean() assert settings.history_redo_size() == 0 settings.history_pop() assert settings.history_pop() is None assert settings.history_size() == 0 assert settings.history_redo_size() == 1 settings.set_history([hist_elem, hist_elem2]) assert settings.get_history()[-1].roi_extraction_parameters["a"] == 2 assert settings.history_size() == 2 assert settings.history_redo_size() == 0 settings.history_pop() monkeypatch.setattr(settings, "cmp_history_element", lambda x, y: True) settings.add_history_element(hist_elem3)
def test_annotations(self, mask_prop): data = np.zeros((10, 10), dtype=np.uint8) data[1:5, 1:5] = 1 data[5:-1, 1:5] = 2 data[1:5, 5:-1] = 3 data[5:-1, 5:-1] = 4 annotations = {1: "a", 2: "b", 3: "c", 4: "d"} roi_info = ROIInfo(data, annotations=annotations) elem = HistoryElement.create(roi_info, None, {}, mask_prop) roi_info2, mask2 = elem.get_roi_info_and_mask() assert mask2 is None assert np.all(roi_info2.roi == roi_info.roi)
def test_additional(self, mask_prop): data = np.zeros((10, 10), dtype=np.uint8) data[1:-1, 1:-1] = 2 alternative = {} for i in range(4): alternative_array = np.copy(data) alternative_array[alternative_array > 0] = i + 2 alternative[f"add{i}"] = alternative_array roi_info = ROIInfo(data, alternative=alternative) elem = HistoryElement.create(roi_info, None, {}, mask_prop) roi_info2, mask2 = elem.get_roi_info_and_mask() assert np.all(roi_info2.roi == roi_info.roi) assert mask2 is None assert len(roi_info.alternative) == 4 assert set(roi_info.alternative) == {f"add{i}" for i in range(4)} for i in range(4): arr = roi_info.alternative[f"add{i}"] assert np.all(arr[arr > 0] == i + 2)
def perform_roi_info_history_test( self, project, save_path, mask_property, save_method: Type[SaveBase], load_method: Type[LoadBase] ): alt1 = np.copy(project.roi_info.roi) alt1[alt1 > 0] += 3 roi_info = ROIInfo( roi=project.roi_info.roi, annotations={i: f"a{i}" for i in range(1, 5)}, alternative={"test": alt1} ) history = [] for i in range(3): alt2 = np.copy(alt1) alt2[alt2 > 0] = i + 5 roi_info2 = ROIInfo( roi=project.roi_info.roi, annotations={i: f"a{i}_{j}" for j in range(1, 5)}, alternative={f"test{i}": alt2}, ) history.append( HistoryElement.create( roi_info2, alt1, {"algorithm_name": f"task_{i}", "values": {"a": 1}}, mask_property ) ) proj = dataclasses.replace(project, roi_info=roi_info, history=history) save_method.save(save_path / "data.tgz", proj, SaveROI.get_default_values()) proj2: ProjectInfoBase = load_method.load([save_path / "data.tgz"]) assert np.all(proj2.roi_info.roi == project.roi_info.roi) assert set(proj2.roi_info.annotations) == {1, 2, 3, 4} assert proj2.roi_info.annotations == {i: f"a{i}" for i in range(1, 5)} assert "test" in proj2.roi_info.alternative assert np.all(proj2.roi_info.alternative["test"] == alt1) assert len(proj2.history) == 3 for i in range(3): roi_info3, mask2 = proj2.history[i].get_roi_info_and_mask() assert np.all(mask2 == alt1) assert set(roi_info3.alternative) == {f"test{i}"} assert np.all(roi_info3.alternative[f"test{i}"][alt1 > 0] == i + 5) assert np.all(roi_info3.alternative[f"test{i}"][alt1 == 0] == 0) assert roi_info3.annotations == {i: f"a{i}_{j}" for j in range(1, 5)} assert proj2.history[i].roi_extraction_parameters == {"algorithm_name": f"task_{i}", "values": {"a": 1}}