Пример #1
0
    def _auto_find_minimisation_square_sum(self):
        num_cors = self.view.get_number_of_cors()
        if num_cors is None:
            return

        self.do_clear_all_cors()

        selected_row, slice_indices = self.model.get_slice_indices(num_cors)

        if self.model.has_results:
            initial_cor = []
            for slc in slice_indices:
                initial_cor.append(self.model.data_model.get_cor_from_regression(slc))
        else:
            initial_cor = self.view.rotation_centre

        def _completed_finding_cors(task: TaskWorkerThread):
            cors = task.result
            for slice_idx, cor in zip(slice_indices, cors):
                self.view.add_cor_table_row(selected_row, slice_idx, cor)
            self.do_cor_fit()
            self.view.set_correlate_buttons_enabled(True)

        self.view.set_correlate_buttons_enabled(False)
        start_async_task_view(self.view, self.model.auto_find_minimisation_sqsum, _completed_finding_cors, {
            'slices': slice_indices,
            'recon_params': self.view.recon_params(),
            'initial_cor': initial_cor
        })
Пример #2
0
    def _auto_find_correlation(self):
        def completed(task: TaskWorkerThread):
            cor, tilt = task.result
            self._set_precalculated_cor_tilt(cor, tilt)

        start_async_task_view(self.view, self.model.auto_find_correlation,
                              completed)
Пример #3
0
    def _auto_find_correlation(self):
        if not self.model.images.has_proj180deg():
            self.view.show_status_message(
                "Unable to correlate 0 and 180 because the dataset doesn't have a 180 "
                "projection set. Please load a 180 projection manually.")
            return

        self.recon_is_running = True

        def completed(task: TaskWorkerThread):
            if task.result is None and task.error is not None:
                selected_stack = self.view.main_window.get_images_from_stack_uuid(
                    self.view.stackSelector.current())
                self.view.warn_user(
                    "Failure!",
                    f"Finding the COR failed, likely caused by the selected stack's 180 "
                    f"degree projection being a different shape. \n\n "
                    f"Error: {str(task.error)} "
                    f"\n\n Suggestion: Use crop coordinates to resize the 180 degree projection to "
                    f"({selected_stack.height}, {selected_stack.width})")
            else:
                cor, tilt = task.result
                self._set_precalculated_cor_tilt(cor, tilt)
            self.view.set_correlate_buttons_enabled(True)
            self.recon_is_running = False

        self.view.set_correlate_buttons_enabled(False)
        start_async_task_view(self.view,
                              self.model.auto_find_correlation,
                              completed,
                              tracker=self.async_tracker)
Пример #4
0
    def do_reconstruct_volume(self):
        if not self.model.has_results:
            raise ValueError(
                "Fit is not performed on the data, therefore the CoR cannot be found for each slice."
            )

        start_async_task_view(self.view, self.model.run_full_recon,
                              self._on_volume_recon_done,
                              {'recon_params': self.view.recon_params()})
Пример #5
0
 def save(self):
     kwargs = {
         'stack_uuid': self.view.save_dialogue.selected_stack,
         'output_dir': self.view.save_dialogue.save_path(),
         'name_prefix': self.view.save_dialogue.name_prefix(),
         'image_format': self.view.save_dialogue.image_format(),
         'overwrite': self.view.save_dialogue.overwrite()
     }
     start_async_task_view(self.view, self.model.do_saving,
                           self._on_save_done, kwargs)
Пример #6
0
    def load_stack(self, **kwargs):
        if kwargs:
            raise NotImplementedError(
                "Converting from kwargs to LoadParameters not implemented")
        par = self.view.load_dialogue.get_parameters()

        if par.sample.input_path == "":
            raise ValueError("No sample path provided")

        start_async_task_view(self.view, self.model.do_load_stack,
                              self._on_stack_load_done, {'parameters': par})
Пример #7
0
    def do_apply_filter(self, stacks: List['StackVisualiserView'], post_filter: Callable[[Any], None]):
        """
        Applies the selected filter to the selected stack.
        """
        if len(stacks) == 0:
            raise ValueError('No stack selected')

        # Get auto parameters
        # Generate sub-stack and run filter
        apply_func = partial(self.apply_to_stacks, stacks)
        start_async_task_view(self.presenter.view, apply_func, post_filter)
Пример #8
0
    def load_dataset(self, par: Optional[LoadingParameters] = None) -> None:
        if par is None and self.view.load_dialogue is not None:
            par = self.view.load_dialogue.get_parameters()
        if par is None:
            return

        if par.sample.input_path == "":
            raise ValueError("No sample path provided")

        start_async_task_view(self.view, self.model.do_load_dataset,
                              self._on_dataset_load_done, {'parameters': par})
Пример #9
0
 def save(self) -> None:
     assert isinstance(self.view.save_dialogue, MWSaveDialog)
     kwargs = {
         'images_id': self.view.save_dialogue.selected_stack,
         'output_dir': self.view.save_dialogue.save_path(),
         'name_prefix': self.view.save_dialogue.name_prefix(),
         'image_format': self.view.save_dialogue.image_format(),
         'overwrite': self.view.save_dialogue.overwrite(),
         'pixel_depth': self.view.save_dialogue.pixel_depth()
     }
     start_async_task_view(self.view, self.model.do_images_saving,
                           self._on_save_done, kwargs)
Пример #10
0
    def do_apply_filter(self, stack_view, stack_presenter,
                        post_filter: Callable[[Any], None]):
        """
        Applies the selected filter to the selected stack.
        """
        if not stack_presenter:
            raise ValueError('No stack selected')

        # Get auto parameters
        stack_params = get_parameters_from_stack(stack_presenter,
                                                 self.params_needed_from_stack)
        apply_func = partial(self.apply_filter, stack_presenter.images,
                             stack_params)
        start_async_task_view(stack_view, apply_func, post_filter)
Пример #11
0
 def _get_reconstruct_slice(
         self, cor, slice_idx: int, call_back: Callable[[TaskWorkerThread],
                                                        None]) -> None:
     # If no COR is provided and there are regression results then calculate
     # the COR for the selected preview slice
     cor = self.model.get_me_a_cor(cor)
     start_async_task_view(self.view,
                           self.model.run_preview_recon,
                           call_back, {
                               'slice_idx': slice_idx,
                               'cor': cor,
                               'recon_params': self.view.recon_params()
                           },
                           tracker=self.async_tracker)
Пример #12
0
    def _auto_find_correlation(self):
        def completed(task: TaskWorkerThread):
            if task.result is None and task.error is not None:
                selected_stack = self.view.main_window.get_images_from_stack_uuid(self.view.stackSelector.current())
                self.view.warn_user(
                    "Failure!", f"Finding the COR failed, likely caused by the selected stack's 180 "
                    f"degree projection being a different shape. \n\n "
                    f"Error: {str(task.error)} "
                    f"\n\n Suggestion: Use crop coordinates to resize the 180 degree projection to "
                    f"({selected_stack.height}, {selected_stack.width})")
            else:
                cor, tilt = task.result
                self._set_precalculated_cor_tilt(cor, tilt)
            self.view.set_correlate_buttons_enabled(True)

        self.view.set_correlate_buttons_enabled(False)
        start_async_task_view(self.view, self.model.auto_find_correlation, completed)
Пример #13
0
 def load_image_stack(self, file_path: str) -> None:
     start_async_task_view(self.view, self.model.load_images,
                           self._on_stack_load_done,
                           {'file_path': file_path})