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 })
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)
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)
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()})
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)
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})
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)
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})
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)
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)
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)
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)
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})