class RegionSeg(QGroupBox): """ Region segmentation method panel """ def __init__( self, parent, calculate_volumes_default=CALCULATE_VOLUMES_DEFAULT, summarise_volumes_default=SUMMARIZE_VOLUMES_DEFAULT, brush_size=BRUSH_SIZE, image_file_extension=IMAGE_FILE_EXT, num_colors=NUM_COLORS, ): super(RegionSeg, self).__init__() self.parent = parent self.calculate_volumes_default = calculate_volumes_default self.summarise_volumes_default = summarise_volumes_default # Brushes / ... self.brush_size_default = BRUSH_SIZE # Keep track of default self.brush_size = brush_size # Initialise self.num_colors = num_colors # File formats self.image_file_extension = image_file_extension def add_region_panel(self, row): self.region_panel = QGroupBox("Region analysis") region_layout = QGridLayout() add_button( "Add region", region_layout, self.add_region, 2, 0, ) add_button( "Analyse regions", region_layout, self.run_region_analysis, 2, 1, ) self.calculate_volumes_checkbox = add_checkbox( region_layout, self.calculate_volumes_default, "Calculate volumes", 0, ) self.summarise_volumes_checkbox = add_checkbox( region_layout, self.summarise_volumes_default, "Summarise volumes", 1, ) region_layout.setColumnMinimumWidth(1, COLUMN_WIDTH) self.region_panel.setLayout(region_layout) self.parent.layout.addWidget(self.region_panel, row, 0, 1, 2) self.region_panel.setVisible(False) def toggle_region_panel(self): # TODO: Change color scheme directly when theme is switched # TODO: "text-align" property should follow constant SEGM_METHODS_PANEL_ALIGN if self.region_panel.isVisible(): self.region_panel.setVisible(False) if self.parent.viewer.theme == "dark": self.parent.show_regionseg_button.setStyleSheet( f"QPushButton {{ background-color: #414851; text-align:{SEGM_METHODS_PANEL_ALIGN};}}" f"QPushButton:pressed {{ background-color: #414851; text-align:{SEGM_METHODS_PANEL_ALIGN};}}" ) else: self.parent.show_regionseg_button.setStyleSheet( f"QPushButton {{ background-color: #d6d0ce; text-align:{SEGM_METHODS_PANEL_ALIGN};}}" f"QPushButton:pressed {{ background-color: #d6d0ce; text-align:{SEGM_METHODS_PANEL_ALIGN};}}" ) else: self.region_panel.setVisible(True) if self.parent.viewer.theme == "dark": self.parent.show_regionseg_button.setStyleSheet( f"QPushButton {{ background-color: #7e868f; text-align:{SEGM_METHODS_PANEL_ALIGN};}}" f"QPushButton:pressed {{ background-color: #7e868f; text-align:{SEGM_METHODS_PANEL_ALIGN};}}" ) else: self.parent.show_regionseg_button.setStyleSheet( f"QPushButton {{ background-color: #fdf194; text-align:{SEGM_METHODS_PANEL_ALIGN};}}" f"QPushButton:pressed {{ background-color: #fdf194; text-align:{SEGM_METHODS_PANEL_ALIGN};}}" ) def check_saved_region(self): add_existing_region_segmentation( self.parent.paths.regions_directory, self.parent.viewer, self.parent.label_layers, self.image_file_extension, ) def add_region(self): print("Adding a new region\n") self.region_panel.setVisible(True) # Should be visible by default! add_new_region_layer( self.parent.viewer, self.parent.label_layers, self.parent.base_layer.data, self.brush_size, self.num_colors, ) def run_region_analysis(self): if self.parent.label_layers: print("Running region analysis") worker = region_analysis( self.parent.label_layers, self.parent.atlas_layer.data, self.parent.atlas, self.parent.paths.regions_directory, output_csv_file=self.parent.paths.region_summary_csv, volumes=self.calculate_volumes_checkbox.isChecked(), summarise=self.summarise_volumes_checkbox.isChecked(), ) worker.start() else: print("No regions found")
class TrackSeg(QGroupBox): """ Track segmentation method panel """ def __init__( self, parent, point_size=POINT_SIZE, spline_size=SPLINE_SIZE, track_file_extension=TRACK_FILE_EXT, spline_points_default=SPLINE_POINTS_DEFAULT, spline_smoothing_default=SPLINE_SMOOTHING_DEFAULT, fit_degree_default=FIT_DEGREE_DEFAULT, summarise_track_default=SUMMARISE_TRACK_DEFAULT, ): super(TrackSeg, self).__init__() self.parent = parent self.tree = None self.summarise_track_default = summarise_track_default # Point / Spline fitting settings self.point_size_default = POINT_SIZE # Keep track of default self.point_size = point_size # Initialise self.spline_points_default = spline_points_default self.spline_size_default = SPLINE_SIZE # Keep track of default self.spline_size = spline_size # Initialise self.spline_smoothing_default = spline_smoothing_default self.fit_degree_default = fit_degree_default # File formats self.track_file_extension = track_file_extension # Initialise spline and spline names self.splines = None self.spline_names = None def add_track_panel(self, row): self.track_panel = QGroupBox("Track tracing") track_layout = QGridLayout() add_button( "Add surface points", track_layout, self.add_surface_points, 5, 1, ) add_button( "Add track", track_layout, self.add_track, 6, 0, ) add_button( "Trace tracks", track_layout, self.run_track_analysis, 6, 1, ) self.summarise_track_checkbox = add_checkbox( track_layout, self.summarise_track_default, "Summarise", 0, ) self.fit_degree = add_int_box( track_layout, self.fit_degree_default, 1, 5, "Fit degree", 1, ) self.spline_smoothing = add_float_box( track_layout, self.spline_smoothing_default, 0, 1, "Spline smoothing", 0.1, 2, ) self.spline_points = add_int_box( track_layout, self.spline_points_default, 1, 10000, "Spline points", 3, ) track_layout.setColumnMinimumWidth(1, COLUMN_WIDTH) self.track_panel.setLayout(track_layout) self.parent.layout.addWidget(self.track_panel, row, 0, 1, 2) self.track_panel.setVisible(False) def toggle_track_panel(self): # TODO: Change color scheme directly when theme is switched # TODO: "text-align" property should follow constant SEGM_METHODS_PANEL_ALIGN if self.track_panel.isVisible(): self.track_panel.setVisible(False) if self.parent.viewer.theme == "dark": self.parent.show_trackseg_button.setStyleSheet( f"QPushButton {{ background-color: #414851; text-align:{SEGM_METHODS_PANEL_ALIGN};}}" f"QPushButton:pressed {{ background-color: #414851; text-align:{SEGM_METHODS_PANEL_ALIGN};}}" ) else: self.parent.show_trackseg_button.setStyleSheet( f"QPushButton {{ background-color: #d6d0ce; text-align:{SEGM_METHODS_PANEL_ALIGN};}}" f"QPushButton:pressed {{ background-color: #d6d0ce; text-align:{SEGM_METHODS_PANEL_ALIGN};}}" ) else: self.track_panel.setVisible(True) if self.parent.viewer.theme == "dark": self.parent.show_trackseg_button.setStyleSheet( f"QPushButton {{ background-color: #7e868f; text-align:{SEGM_METHODS_PANEL_ALIGN};}}" f"QPushButton:pressed {{ background-color: #7e868f; text-align:{SEGM_METHODS_PANEL_ALIGN};}}" ) else: self.parent.show_trackseg_button.setStyleSheet( f"QPushButton {{ background-color: #fdf194; text-align:{SEGM_METHODS_PANEL_ALIGN};}}" f"QPushButton:pressed {{ background-color: #fdf194; text-align:{SEGM_METHODS_PANEL_ALIGN};}}" ) def check_saved_track(self): track_files = glob( str(self.parent.paths.tracks_directory) + "/*" + self.track_file_extension) if self.parent.paths.tracks_directory.exists() and track_files != []: for track_file in track_files: self.parent.track_layers.append( add_existing_track_layers( self.parent.viewer, track_file, self.point_size, )) def add_track(self): print("Adding a new track\n") self.splines = None self.spline_names = None self.track_panel.setVisible(True) # Should be visible by default! add_new_track_layer( self.parent.viewer, self.parent.track_layers, self.point_size, ) def add_surface_points(self): if self.parent.track_layers: print("Adding surface points (this may take a while)") if self.tree is None: self.create_brain_surface_tree() for track_layer in self.parent.track_layers: try: _, index = self.tree.query(track_layer.data[0]) except IndexError: print( f"{track_layer.name} does not appear to hold any data") continue surface_point = self.tree.data[index] track_layer.data = np.vstack((surface_point, track_layer.data)) print("Finished!\n") else: print("No tracks found.") def create_brain_surface_tree(self): self.tree = create_KDTree_from_image(self.parent.atlas_layer.data) def run_track_analysis(self, override=False): if self.parent.track_layers: if not override: choice = display_warning( self.parent, "About to analyse tracks", "Existing files will be will be deleted. Proceed?", ) else: choice = True # for debugging if choice: print("Running track analysis") self.splines, self.spline_names = track_analysis( self.parent.viewer, self.parent.atlas, self.parent.paths.tracks_directory, self.parent.track_layers, self.spline_size, spline_points=self.spline_points.value(), fit_degree=self.fit_degree.value(), spline_smoothing=self.spline_smoothing.value(), summarise_track=self.summarise_track_checkbox.isChecked(), ) print("Finished!\n") else: print("Preventing analysis as user chose 'Cancel'") else: print("No tracks found.")