epicure.start_epicuring
Start EpiCure plugin
Open the interface to select the movie and associated segmentation to process
1""" 2 **Start EpiCure plugin** 3 4 Open the interface to select the movie and associated segmentation to process 5""" 6 7from napari import current_viewer 8from magicgui import magicgui 9from napari.utils.history import get_save_history, update_save_history 10from napari.utils import progress 11import pathlib, os 12import epicure.Utils as ut 13from epicure.epicuring import EpiCure 14import multiprocessing 15import logging 16 17 18def start_from_layers(): 19 """ Start EpiCure from already opened image and segmentation layers """ 20 from typing import Union 21 hist = get_save_history() 22 cdir = hist[0] 23 24 def show_doc(): 25 """ Open the online documentation """ 26 ut.show_documentation_page( "Start-epicure#start-from-opened-layers" ) 27 28 @magicgui(call_button="Use selected layers", 29 __ = {"widget_type": "Label"}, 30 go_help = {"widget_type": "PushButton", "label": "Help"}, 31 ) 32 def select_layer(movie: Union["napari.layers.Image", None], movie_path: pathlib.Path, 33 segmentation: Union["napari.layers.Layer", None], 34 __ ="", 35 go_help=False): 36 """ GUI to choose the layers to use """ 37 if movie == "None": 38 movie = None 39 segmented = segmentation 40 if segmentation == "None": 41 segmented = None 42 ut.remove_all_widgets(viewer) 43 #ut.remove_widget(viewer, "Start from opened layers") 44 start_epi, epicure_instance = gui_files( raw_movie=movie, raw_movie_path=movie_path, segmented=segmented) 45 viewer.window.add_dock_widget(start_epi) 46 return start_epi 47 48 viewer = current_viewer() 49 wid = viewer.window.add_dock_widget(select_layer) 50 select_layer.go_help.clicked.connect( show_doc ) 51 return wid 52 53 54 55def start_epicure(): 56 """ Start EpiCure from scratch """ 57 #gui, epicure = gui_files(movie=None, movie_path ="", segmented=None) 58 #return gui 59 return choose_movie() 60 61def choose_movie(): 62 """ First choose the raw movie to process """ 63 hist = get_save_history() 64 cdir = hist[0] 65 viewer = current_viewer() 66 67 def selected_movie(): 68 """ When movie has been selected, check that its valid and go to next step """ 69 raw_movie = get_movie.raw_movie.value 70 if not os.path.exists( raw_movie ) or not os.path.isfile( raw_movie ): 71 ut.show_warning( "Select a valid file of the raw movie, or open it in Napari and choose option 'start from opened layers'" ) 72 return 73 widget, epic = gui_files( raw_movie = None, raw_movie_path = raw_movie ) 74 update_save_history( raw_movie ) 75 ut.remove_all_widgets(viewer) 76 viewer.window.add_dock_widget( widget, name="StartEpiCure" ) 77 78 @magicgui( 79 call_button="Go", 80 _ = {"widget_type": "Label"}, 81 ) 82 def get_movie( 83 _ = "Choose raw movie to cure", 84 raw_movie = pathlib.Path(cdir) ): 85 selected_movie() 86 87 wid = viewer.window.add_dock_widget( get_movie, name="ChooseMovie" ) 88 get_movie.raw_movie.changed.connect(selected_movie) 89 return wid 90 91 92def gui_files( raw_movie=None, raw_movie_path="", segmented=None ): 93 """ GUI to choose files and parameters """ 94 hist = get_save_history() 95 cdir = hist[0] 96 viewer = current_viewer() 97 ut.remove_widget( viewer, "ChooseMovie" ) 98 Epic = EpiCure(viewer) 99 caxis = None 100 cval = 0 101 ncpus = int(multiprocessing.cpu_count()*0.5) 102 103 def set_visibility(): 104 """ Visibility of the parameters in the GUI """ 105 if segmented is not None: 106 get_files.segmentation_file.visible = False 107 get_files.segment_with_epyseg.visible = False 108 advanced_visibility() 109 110 def advanced_visibility(): 111 """ Handle the visibility of the advanced parameters """ 112 get_files.output_dirname.visible = get_files.advanced_parameters.value 113 get_files.show_other_chanels.visible = get_files.advanced_parameters.value 114 get_files.process_frames_parallel.visible = get_files.advanced_parameters.value 115 get_files.nbparallel_threads.visible = get_files.advanced_parameters.value 116 get_files.junction_half_thickness.visible = get_files.advanced_parameters.value 117 get_files.verbose_level.visible = get_files.advanced_parameters.value 118 get_files.allow_gaps.visible = get_files.advanced_parameters.value 119 get_files.show_scale_bar.visible = get_files.advanced_parameters.value 120 get_files.epithelial_cells.visible = get_files.advanced_parameters.value 121 122 def load_movie_from_layers(movie, movie_path, segmented): 123 """ Load and display the selected layers """ 124 start_time = ut.start_time() 125 nonlocal caxis, cval 126 caxis, cval = Epic.movie_from_layer(movie, movie_path) 127 imgdir = ut.get_directory(movie_path) 128 #print(imgdir) 129 130 if segmented is None: 131 get_files.segmentation_file.visible = True 132 get_files.segmentation_file.value = pathlib.Path(imgdir) 133 get_files.segment_with_epyseg.visible = True 134 else: 135 get_files.segmentation_file.visible = False 136 get_files.trackmate_file.visible = False 137 get_files.geff_file.visible = False 138 get_files.segment_with_epyseg.visible = False 139 140 labname = Epic.suggest_segfile( get_files.output_dirname.value ) 141 Epic.set_names( get_files.output_dirname.value ) 142 if labname is not None: 143 get_files.segmentation_file.value = pathlib.Path(labname) 144 Epic.read_epicure_metadata() 145 if caxis is not None: 146 get_files.junction_chanel.max = cval-1 147 get_files.junction_chanel.visible = True 148 set_chanel() 149 show_metatdata(show=True) 150 get_files.allow_gaps.value = bool(Epic.epi_metadata["Allow gaps"]) 151 get_files.verbose_level.value = int(Epic.epi_metadata["Verbose"]) 152 get_files.call_button.enabled = True 153 if "MainChannel" in Epic.epi_metadata: 154 get_files.junction_chanel.value = int(Epic.epi_metadata["MainChannel"]) 155 156 def show_metatdata(show=True): 157 """ Show or update the metadata parameters """ 158 get_files.scale_xy.value = Epic.epi_metadata["ScaleXY"] 159 get_files.timeframe.value = Epic.epi_metadata["ScaleT"] 160 get_files.unit_xy.value = Epic.epi_metadata["UnitXY"] 161 get_files.unit_t.value = Epic.epi_metadata["UnitT"] 162 get_files.scale_xy.visible = show 163 get_files.unit_xy.visible = show 164 get_files.timeframe.visible = show 165 get_files.unit_t.visible = show 166 167 def load_movie( image_file ): 168 """ Load and display the selected movie """ 169 start_time = ut.start_time() 170 nonlocal caxis, cval 171 #image_file = get_files.image_file.value 172 caxis, cval = Epic.load_movie(image_file) 173 imgdir = ut.get_directory(image_file) 174 get_files.segmentation_file.visible = True 175 get_files.segmentation_file.value = pathlib.Path(imgdir) 176 labname = Epic.suggest_segfile( get_files.output_dirname.value ) 177 Epic.set_names( get_files.output_dirname.value ) 178 if labname is not None: 179 get_files.segmentation_file.value = pathlib.Path(labname) 180 Epic.read_epicure_metadata() 181 if caxis is not None: 182 get_files.junction_chanel.max = cval-1 183 get_files.junction_chanel.visible = True 184 set_chanel() 185 show_metatdata(show=True) 186 get_files.segment_with_epyseg.visible = True 187 get_files.allow_gaps.value = bool(Epic.epi_metadata["Allow gaps"]) 188 get_files.verbose_level.value = int(Epic.epi_metadata["Verbose"]) 189 if "MainChannel" in Epic.epi_metadata: 190 get_files.junction_chanel.value = int(Epic.epi_metadata["MainChannel"]) 191 get_files.call_button.enabled = True 192 ut.show_duration(start_time, header="Movie loaded in ") 193 194 def show_others(): 195 """ Display other chanels from the initial movie """ 196 for ochan in range(cval): 197 ut.remove_layer(viewer, "MovieChannel_"+str(ochan)) 198 if get_files.show_other_chanels.value == True: 199 Epic.add_other_chanels(int(get_files.junction_chanel.value), caxis) 200 201 def set_chanel(): 202 """ Set the correct chanel that contains the junction signal """ 203 start_time = ut.start_time() 204 Epic.set_chanel( int(get_files.junction_chanel.value), caxis ) 205 show_others() 206 ut.show_duration(start_time, header="Movie chanel loaded in ") 207 208 def show_documentation(): 209 """ Open the online documentation """ 210 ut.show_documentation_page( "Start-epicure" ) 211 212 def launch_napari_epyseg(): 213 """ Open napari-epyseg plugin to segment the intensity channel movie """ 214 print("Running EpySeg with default parameters on the movie. To change the settings, use the napari-epyseg plugin outside of EpiCure or EpySeg module directly") 215 parameters = {"tile_width":256, "tile_height":256, "overlap_width":32, "overlap_height":32, "model":"epyseg default(v2)", "norm_min":0, "norm_max":1} 216 ut.show_progress( viewer, True ) 217 progress_bar = progress( len(Epic.img) ) 218 progress_bar.set_description( "Running epyseg on all frames..." ) 219 progress_bar.update(0) 220 try: 221 from epicure.appose_epyseg import go_epyseg 222 class LogHandler(logging.Handler): 223 def emit(self, record): 224 msg = self.format(record) 225 progress_bar.set_description( msg ) 226 227 def setup_logger( name="epyseg_seg" ): 228 logger = logging.getLogger(name) 229 handler = LogHandler() 230 formatter = logging.Formatter('[EpiCure] %(message)s') 231 handler.setFormatter( formatter ) 232 logger.addHandler(handler) 233 logger.setLevel( logging.INFO ) 234 return logger 235 236 logger = setup_logger() 237 segres = go_epyseg( Epic.img, parameters, progress_bar=None, logger=logger ) 238 except Exception as e: 239 ut.show_error( "This option requires the plugin napari-epyseg that is missing.\nInstall it and restart" ) 240 print(e) 241 return 242 ut.show_progress( viewer, False ) 243 segname = str(raw_movie_path)+"_epyseg.tif" 244 ut.writeTif( segres, segname, 1.0, "uint8", what="Epyseg results saved in " ) 245 get_files.segmentation_file.value = segname 246 get_files.segment_with_epyseg.visible = False 247 248 249 @magicgui(call_button="START CURE", 250 junction_chanel={"widget_type": "Slider", "min":0, "max": 0}, 251 _ = {"widget_type": "Label"}, 252 scale_xy = {"widget_type": "LiteralEvalLineEdit"}, 253 timeframe = {"widget_type": "LiteralEvalLineEdit"}, 254 __ = {"widget_type": "Label"}, 255 ___ = {"widget_type": "Label"}, 256 segmentation_file ={"widget_type": "FileEdit", "label": "Segmentation file"}, 257 ____ = {"widget_type": "Label" }, 258 trackmate_file ={"widget_type": "FileEdit", "filter":"*.xml", "label": "TrackMate file"}, 259 _____ = {"widget_type": "Label"}, 260 geff_file ={"widget_type": "FileEdit", "mode": "d", "label": "GEFF folder"}, 261 ______ = {"widget_type": "Label" }, 262 segment_with_epyseg = {"widget_type": "PushButton", "label": "Segment now with EpySeg"}, 263 ________ = {"widget_type": "Label"}, 264 junction_half_thickness={"widget_type": "LiteralEvalLineEdit"}, 265 nbparallel_threads = {"widget_type": "LiteralEvalLineEdit"}, 266 verbose_level={"widget_type": "Slider", "min":0, "max": 3}, 267 go_help = {"widget_type": "PushButton", "label": "Help"}, 268 ) 269 def get_files( 270 junction_chanel = 0, 271 _ = "Image metadata", 272 scale_xy = 1, 273 unit_xy = "um", 274 timeframe = 1, 275 unit_t = "min", 276 __ = "\nSegmentation", 277 ___ = "Load from skeleton or label file", 278 segmentation_file = pathlib.Path(cdir), 279 ____ = "OR\tfrom TrackMate\t", 280 trackmate_file = pathlib.Path(cdir), 281 _____ = "OR\tfrom GEFF \t", 282 geff_file = pathlib.Path(cdir), 283 ______ = "OR \t\t\t", 284 segment_with_epyseg = False, 285 ________ = "\n", 286 advanced_parameters = False, 287 show_other_chanels = True, 288 show_scale_bar = True, 289 allow_gaps = True, 290 epithelial_cells = True, 291 process_frames_parallel = False, 292 nbparallel_threads = ncpus, 293 junction_half_thickness = 1, 294 output_dirname = "epics", 295 verbose_level = 1, 296 go_help = False, 297 ): 298 299 print("Starting") 300 imname, imdir, outdir = ut.extract_names( os.path.abspath(raw_movie_path), output_dirname ) 301 update_save_history(imdir) 302 #ut.remove_widget(viewer, "Start EpiCure (epicure)") 303 ut.remove_all_widgets( viewer ) 304 Epic.process_parallel = process_frames_parallel 305 Epic.set_verbose( verbose_level ) 306 Epic.nparallel = nbparallel_threads 307 #Epic.check_shape() 308 Epic.set_thickness( junction_half_thickness ) 309 Epic.set_scales(scale_xy, timeframe, unit_xy, unit_t) 310 Epic.set_scalebar( show_scale_bar ) 311 Epic.set_gaps_option( allow_gaps ) 312 Epic.set_epithelia( epithelial_cells ) 313 ## to handle segmentation from layer or from file 314 seg_file = segmentation_file 315 ## check if another segmentation import has been loaded (otherwise they are default to a directory) 316 if trackmate_file.exists() and trackmate_file.is_file() and trackmate_file.suffix == ".xml": 317 seg_file = trackmate_file 318 elif geff_file.suffix == ".geff" and geff_file.exists(): 319 seg_file = geff_file 320 segmentation_input = {"File":seg_file} 321 if segmented is not None: 322 segmentation_input["Layer"]=segmented 323 324 Epic.go_epicure(outdir, segmentation_input) 325 326 set_visibility() 327 get_files.call_button.enabled = False 328 get_files.junction_chanel.visible = False 329 ## load movie if there is a path but nothing loaded yet 330 if (raw_movie is None) and (raw_movie_path is not None): 331 load_movie( raw_movie_path ) 332 elif raw_movie is not None: 333 load_movie_from_layers( raw_movie, raw_movie_path, segmented ) 334 show_metatdata(show=True) 335 if segmented is not None: 336 get_files.call_button.enabled = True 337 get_files.advanced_parameters.clicked.connect(set_visibility) 338 get_files.show_other_chanels.clicked.connect(show_others) 339 get_files.junction_chanel.changed.connect(set_chanel) 340 get_files.segment_with_epyseg.clicked.connect( launch_napari_epyseg ) 341 get_files.go_help.clicked.connect( show_documentation ) 342 return get_files, Epic
def
start_from_layers():
19def start_from_layers(): 20 """ Start EpiCure from already opened image and segmentation layers """ 21 from typing import Union 22 hist = get_save_history() 23 cdir = hist[0] 24 25 def show_doc(): 26 """ Open the online documentation """ 27 ut.show_documentation_page( "Start-epicure#start-from-opened-layers" ) 28 29 @magicgui(call_button="Use selected layers", 30 __ = {"widget_type": "Label"}, 31 go_help = {"widget_type": "PushButton", "label": "Help"}, 32 ) 33 def select_layer(movie: Union["napari.layers.Image", None], movie_path: pathlib.Path, 34 segmentation: Union["napari.layers.Layer", None], 35 __ ="", 36 go_help=False): 37 """ GUI to choose the layers to use """ 38 if movie == "None": 39 movie = None 40 segmented = segmentation 41 if segmentation == "None": 42 segmented = None 43 ut.remove_all_widgets(viewer) 44 #ut.remove_widget(viewer, "Start from opened layers") 45 start_epi, epicure_instance = gui_files( raw_movie=movie, raw_movie_path=movie_path, segmented=segmented) 46 viewer.window.add_dock_widget(start_epi) 47 return start_epi 48 49 viewer = current_viewer() 50 wid = viewer.window.add_dock_widget(select_layer) 51 select_layer.go_help.clicked.connect( show_doc ) 52 return wid
Start EpiCure from already opened image and segmentation layers
def
start_epicure():
56def start_epicure(): 57 """ Start EpiCure from scratch """ 58 #gui, epicure = gui_files(movie=None, movie_path ="", segmented=None) 59 #return gui 60 return choose_movie()
Start EpiCure from scratch
def
choose_movie():
62def choose_movie(): 63 """ First choose the raw movie to process """ 64 hist = get_save_history() 65 cdir = hist[0] 66 viewer = current_viewer() 67 68 def selected_movie(): 69 """ When movie has been selected, check that its valid and go to next step """ 70 raw_movie = get_movie.raw_movie.value 71 if not os.path.exists( raw_movie ) or not os.path.isfile( raw_movie ): 72 ut.show_warning( "Select a valid file of the raw movie, or open it in Napari and choose option 'start from opened layers'" ) 73 return 74 widget, epic = gui_files( raw_movie = None, raw_movie_path = raw_movie ) 75 update_save_history( raw_movie ) 76 ut.remove_all_widgets(viewer) 77 viewer.window.add_dock_widget( widget, name="StartEpiCure" ) 78 79 @magicgui( 80 call_button="Go", 81 _ = {"widget_type": "Label"}, 82 ) 83 def get_movie( 84 _ = "Choose raw movie to cure", 85 raw_movie = pathlib.Path(cdir) ): 86 selected_movie() 87 88 wid = viewer.window.add_dock_widget( get_movie, name="ChooseMovie" ) 89 get_movie.raw_movie.changed.connect(selected_movie) 90 return wid
First choose the raw movie to process
def
gui_files(raw_movie=None, raw_movie_path='', segmented=None):
93def gui_files( raw_movie=None, raw_movie_path="", segmented=None ): 94 """ GUI to choose files and parameters """ 95 hist = get_save_history() 96 cdir = hist[0] 97 viewer = current_viewer() 98 ut.remove_widget( viewer, "ChooseMovie" ) 99 Epic = EpiCure(viewer) 100 caxis = None 101 cval = 0 102 ncpus = int(multiprocessing.cpu_count()*0.5) 103 104 def set_visibility(): 105 """ Visibility of the parameters in the GUI """ 106 if segmented is not None: 107 get_files.segmentation_file.visible = False 108 get_files.segment_with_epyseg.visible = False 109 advanced_visibility() 110 111 def advanced_visibility(): 112 """ Handle the visibility of the advanced parameters """ 113 get_files.output_dirname.visible = get_files.advanced_parameters.value 114 get_files.show_other_chanels.visible = get_files.advanced_parameters.value 115 get_files.process_frames_parallel.visible = get_files.advanced_parameters.value 116 get_files.nbparallel_threads.visible = get_files.advanced_parameters.value 117 get_files.junction_half_thickness.visible = get_files.advanced_parameters.value 118 get_files.verbose_level.visible = get_files.advanced_parameters.value 119 get_files.allow_gaps.visible = get_files.advanced_parameters.value 120 get_files.show_scale_bar.visible = get_files.advanced_parameters.value 121 get_files.epithelial_cells.visible = get_files.advanced_parameters.value 122 123 def load_movie_from_layers(movie, movie_path, segmented): 124 """ Load and display the selected layers """ 125 start_time = ut.start_time() 126 nonlocal caxis, cval 127 caxis, cval = Epic.movie_from_layer(movie, movie_path) 128 imgdir = ut.get_directory(movie_path) 129 #print(imgdir) 130 131 if segmented is None: 132 get_files.segmentation_file.visible = True 133 get_files.segmentation_file.value = pathlib.Path(imgdir) 134 get_files.segment_with_epyseg.visible = True 135 else: 136 get_files.segmentation_file.visible = False 137 get_files.trackmate_file.visible = False 138 get_files.geff_file.visible = False 139 get_files.segment_with_epyseg.visible = False 140 141 labname = Epic.suggest_segfile( get_files.output_dirname.value ) 142 Epic.set_names( get_files.output_dirname.value ) 143 if labname is not None: 144 get_files.segmentation_file.value = pathlib.Path(labname) 145 Epic.read_epicure_metadata() 146 if caxis is not None: 147 get_files.junction_chanel.max = cval-1 148 get_files.junction_chanel.visible = True 149 set_chanel() 150 show_metatdata(show=True) 151 get_files.allow_gaps.value = bool(Epic.epi_metadata["Allow gaps"]) 152 get_files.verbose_level.value = int(Epic.epi_metadata["Verbose"]) 153 get_files.call_button.enabled = True 154 if "MainChannel" in Epic.epi_metadata: 155 get_files.junction_chanel.value = int(Epic.epi_metadata["MainChannel"]) 156 157 def show_metatdata(show=True): 158 """ Show or update the metadata parameters """ 159 get_files.scale_xy.value = Epic.epi_metadata["ScaleXY"] 160 get_files.timeframe.value = Epic.epi_metadata["ScaleT"] 161 get_files.unit_xy.value = Epic.epi_metadata["UnitXY"] 162 get_files.unit_t.value = Epic.epi_metadata["UnitT"] 163 get_files.scale_xy.visible = show 164 get_files.unit_xy.visible = show 165 get_files.timeframe.visible = show 166 get_files.unit_t.visible = show 167 168 def load_movie( image_file ): 169 """ Load and display the selected movie """ 170 start_time = ut.start_time() 171 nonlocal caxis, cval 172 #image_file = get_files.image_file.value 173 caxis, cval = Epic.load_movie(image_file) 174 imgdir = ut.get_directory(image_file) 175 get_files.segmentation_file.visible = True 176 get_files.segmentation_file.value = pathlib.Path(imgdir) 177 labname = Epic.suggest_segfile( get_files.output_dirname.value ) 178 Epic.set_names( get_files.output_dirname.value ) 179 if labname is not None: 180 get_files.segmentation_file.value = pathlib.Path(labname) 181 Epic.read_epicure_metadata() 182 if caxis is not None: 183 get_files.junction_chanel.max = cval-1 184 get_files.junction_chanel.visible = True 185 set_chanel() 186 show_metatdata(show=True) 187 get_files.segment_with_epyseg.visible = True 188 get_files.allow_gaps.value = bool(Epic.epi_metadata["Allow gaps"]) 189 get_files.verbose_level.value = int(Epic.epi_metadata["Verbose"]) 190 if "MainChannel" in Epic.epi_metadata: 191 get_files.junction_chanel.value = int(Epic.epi_metadata["MainChannel"]) 192 get_files.call_button.enabled = True 193 ut.show_duration(start_time, header="Movie loaded in ") 194 195 def show_others(): 196 """ Display other chanels from the initial movie """ 197 for ochan in range(cval): 198 ut.remove_layer(viewer, "MovieChannel_"+str(ochan)) 199 if get_files.show_other_chanels.value == True: 200 Epic.add_other_chanels(int(get_files.junction_chanel.value), caxis) 201 202 def set_chanel(): 203 """ Set the correct chanel that contains the junction signal """ 204 start_time = ut.start_time() 205 Epic.set_chanel( int(get_files.junction_chanel.value), caxis ) 206 show_others() 207 ut.show_duration(start_time, header="Movie chanel loaded in ") 208 209 def show_documentation(): 210 """ Open the online documentation """ 211 ut.show_documentation_page( "Start-epicure" ) 212 213 def launch_napari_epyseg(): 214 """ Open napari-epyseg plugin to segment the intensity channel movie """ 215 print("Running EpySeg with default parameters on the movie. To change the settings, use the napari-epyseg plugin outside of EpiCure or EpySeg module directly") 216 parameters = {"tile_width":256, "tile_height":256, "overlap_width":32, "overlap_height":32, "model":"epyseg default(v2)", "norm_min":0, "norm_max":1} 217 ut.show_progress( viewer, True ) 218 progress_bar = progress( len(Epic.img) ) 219 progress_bar.set_description( "Running epyseg on all frames..." ) 220 progress_bar.update(0) 221 try: 222 from epicure.appose_epyseg import go_epyseg 223 class LogHandler(logging.Handler): 224 def emit(self, record): 225 msg = self.format(record) 226 progress_bar.set_description( msg ) 227 228 def setup_logger( name="epyseg_seg" ): 229 logger = logging.getLogger(name) 230 handler = LogHandler() 231 formatter = logging.Formatter('[EpiCure] %(message)s') 232 handler.setFormatter( formatter ) 233 logger.addHandler(handler) 234 logger.setLevel( logging.INFO ) 235 return logger 236 237 logger = setup_logger() 238 segres = go_epyseg( Epic.img, parameters, progress_bar=None, logger=logger ) 239 except Exception as e: 240 ut.show_error( "This option requires the plugin napari-epyseg that is missing.\nInstall it and restart" ) 241 print(e) 242 return 243 ut.show_progress( viewer, False ) 244 segname = str(raw_movie_path)+"_epyseg.tif" 245 ut.writeTif( segres, segname, 1.0, "uint8", what="Epyseg results saved in " ) 246 get_files.segmentation_file.value = segname 247 get_files.segment_with_epyseg.visible = False 248 249 250 @magicgui(call_button="START CURE", 251 junction_chanel={"widget_type": "Slider", "min":0, "max": 0}, 252 _ = {"widget_type": "Label"}, 253 scale_xy = {"widget_type": "LiteralEvalLineEdit"}, 254 timeframe = {"widget_type": "LiteralEvalLineEdit"}, 255 __ = {"widget_type": "Label"}, 256 ___ = {"widget_type": "Label"}, 257 segmentation_file ={"widget_type": "FileEdit", "label": "Segmentation file"}, 258 ____ = {"widget_type": "Label" }, 259 trackmate_file ={"widget_type": "FileEdit", "filter":"*.xml", "label": "TrackMate file"}, 260 _____ = {"widget_type": "Label"}, 261 geff_file ={"widget_type": "FileEdit", "mode": "d", "label": "GEFF folder"}, 262 ______ = {"widget_type": "Label" }, 263 segment_with_epyseg = {"widget_type": "PushButton", "label": "Segment now with EpySeg"}, 264 ________ = {"widget_type": "Label"}, 265 junction_half_thickness={"widget_type": "LiteralEvalLineEdit"}, 266 nbparallel_threads = {"widget_type": "LiteralEvalLineEdit"}, 267 verbose_level={"widget_type": "Slider", "min":0, "max": 3}, 268 go_help = {"widget_type": "PushButton", "label": "Help"}, 269 ) 270 def get_files( 271 junction_chanel = 0, 272 _ = "Image metadata", 273 scale_xy = 1, 274 unit_xy = "um", 275 timeframe = 1, 276 unit_t = "min", 277 __ = "\nSegmentation", 278 ___ = "Load from skeleton or label file", 279 segmentation_file = pathlib.Path(cdir), 280 ____ = "OR\tfrom TrackMate\t", 281 trackmate_file = pathlib.Path(cdir), 282 _____ = "OR\tfrom GEFF \t", 283 geff_file = pathlib.Path(cdir), 284 ______ = "OR \t\t\t", 285 segment_with_epyseg = False, 286 ________ = "\n", 287 advanced_parameters = False, 288 show_other_chanels = True, 289 show_scale_bar = True, 290 allow_gaps = True, 291 epithelial_cells = True, 292 process_frames_parallel = False, 293 nbparallel_threads = ncpus, 294 junction_half_thickness = 1, 295 output_dirname = "epics", 296 verbose_level = 1, 297 go_help = False, 298 ): 299 300 print("Starting") 301 imname, imdir, outdir = ut.extract_names( os.path.abspath(raw_movie_path), output_dirname ) 302 update_save_history(imdir) 303 #ut.remove_widget(viewer, "Start EpiCure (epicure)") 304 ut.remove_all_widgets( viewer ) 305 Epic.process_parallel = process_frames_parallel 306 Epic.set_verbose( verbose_level ) 307 Epic.nparallel = nbparallel_threads 308 #Epic.check_shape() 309 Epic.set_thickness( junction_half_thickness ) 310 Epic.set_scales(scale_xy, timeframe, unit_xy, unit_t) 311 Epic.set_scalebar( show_scale_bar ) 312 Epic.set_gaps_option( allow_gaps ) 313 Epic.set_epithelia( epithelial_cells ) 314 ## to handle segmentation from layer or from file 315 seg_file = segmentation_file 316 ## check if another segmentation import has been loaded (otherwise they are default to a directory) 317 if trackmate_file.exists() and trackmate_file.is_file() and trackmate_file.suffix == ".xml": 318 seg_file = trackmate_file 319 elif geff_file.suffix == ".geff" and geff_file.exists(): 320 seg_file = geff_file 321 segmentation_input = {"File":seg_file} 322 if segmented is not None: 323 segmentation_input["Layer"]=segmented 324 325 Epic.go_epicure(outdir, segmentation_input) 326 327 set_visibility() 328 get_files.call_button.enabled = False 329 get_files.junction_chanel.visible = False 330 ## load movie if there is a path but nothing loaded yet 331 if (raw_movie is None) and (raw_movie_path is not None): 332 load_movie( raw_movie_path ) 333 elif raw_movie is not None: 334 load_movie_from_layers( raw_movie, raw_movie_path, segmented ) 335 show_metatdata(show=True) 336 if segmented is not None: 337 get_files.call_button.enabled = True 338 get_files.advanced_parameters.clicked.connect(set_visibility) 339 get_files.show_other_chanels.clicked.connect(show_others) 340 get_files.junction_chanel.changed.connect(set_chanel) 341 get_files.segment_with_epyseg.clicked.connect( launch_napari_epyseg ) 342 get_files.go_help.clicked.connect( show_documentation ) 343 return get_files, Epic
GUI to choose files and parameters