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