small-fish-gui 1.3.4__py3-none-any.whl → 1.4.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- small_fish_gui/__init__.py +1 -1
- small_fish_gui/batch/__init__.py +5 -0
- small_fish_gui/batch/input.py +62 -0
- small_fish_gui/batch/integrity.py +158 -0
- small_fish_gui/batch/output.py +0 -0
- small_fish_gui/batch/pipeline.py +218 -0
- small_fish_gui/batch/prompt.py +426 -0
- small_fish_gui/batch/test.py +10 -0
- small_fish_gui/batch/update.py +132 -0
- small_fish_gui/batch/utils.py +66 -0
- small_fish_gui/batch/values.py +3 -0
- small_fish_gui/batch/values.txt +65 -0
- small_fish_gui/gui/__init__.py +1 -2
- small_fish_gui/gui/animation.py +24 -15
- small_fish_gui/gui/layout.py +147 -21
- small_fish_gui/gui/prompts.py +24 -26
- small_fish_gui/interface/output.py +8 -4
- small_fish_gui/pipeline/__init__.py +21 -0
- small_fish_gui/pipeline/_preprocess.py +72 -19
- small_fish_gui/pipeline/_segmentation.py +37 -1
- small_fish_gui/pipeline/detection.py +72 -8
- small_fish_gui/pipeline/main.py +7 -3
- small_fish_gui/utils.py +6 -1
- {small_fish_gui-1.3.4.dist-info → small_fish_gui-1.4.0.dist-info}/METADATA +1 -1
- small_fish_gui-1.4.0.dist-info/RECORD +49 -0
- small_fish_gui/gui/test.py +0 -4
- small_fish_gui-1.3.4.dist-info/RECORD +0 -38
- {small_fish_gui-1.3.4.dist-info → small_fish_gui-1.4.0.dist-info}/WHEEL +0 -0
- {small_fish_gui-1.3.4.dist-info → small_fish_gui-1.4.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -67,7 +67,7 @@ def map_channels(user_parameters) :
|
|
|
67
67
|
multichannel = user_parameters['multichannel']
|
|
68
68
|
|
|
69
69
|
try :
|
|
70
|
-
map = _auto_map_channels(
|
|
70
|
+
map = _auto_map_channels(is_3D_stack, is_time_stack, multichannel, image=image)
|
|
71
71
|
except MappingError as e :
|
|
72
72
|
sg.popup("Automatic dimension mapping went wrong. Please indicate manually dimensions positions in the array.")
|
|
73
73
|
map = _ask_channel_map(image.shape, is_3D_stack, is_time_stack, multichannel, preset_map= e.get_map())
|
|
@@ -77,8 +77,9 @@ def map_channels(user_parameters) :
|
|
|
77
77
|
|
|
78
78
|
return map
|
|
79
79
|
|
|
80
|
-
def _auto_map_channels(image: np.ndarray,
|
|
81
|
-
shape
|
|
80
|
+
def _auto_map_channels(is_3D_stack, is_time_stack, multichannel, image: np.ndarray=None, shape=None) :
|
|
81
|
+
if type(shape) == type(None) :
|
|
82
|
+
shape = image.shape
|
|
82
83
|
reducing_list = list(shape)
|
|
83
84
|
|
|
84
85
|
#Set the biggest dimension to y
|
|
@@ -122,14 +123,13 @@ def _auto_map_channels(image: np.ndarray, is_3D_stack, is_time_stack, multichann
|
|
|
122
123
|
return map
|
|
123
124
|
|
|
124
125
|
def _ask_channel_map(shape, is_3D_stack, is_time_stack, multichannel, preset_map: dict= {}) :
|
|
125
|
-
map = preset_map
|
|
126
126
|
while True :
|
|
127
127
|
relaunch = False
|
|
128
|
-
x =
|
|
129
|
-
y =
|
|
130
|
-
z =
|
|
131
|
-
c =
|
|
132
|
-
t =
|
|
128
|
+
x = preset_map.setdefault('x',0)
|
|
129
|
+
y = preset_map.setdefault('y',0)
|
|
130
|
+
z = preset_map.setdefault('z',0)
|
|
131
|
+
c = preset_map.setdefault('c',0)
|
|
132
|
+
t = preset_map.setdefault('t',0)
|
|
133
133
|
|
|
134
134
|
layout = [
|
|
135
135
|
add_header("Dimensions mapping", [sg.Text("Image shape : {0}".format(shape))])
|
|
@@ -139,12 +139,12 @@ def _ask_channel_map(shape, is_3D_stack, is_time_stack, multichannel, preset_map
|
|
|
139
139
|
if multichannel : layout += [parameters_layout(['c'], default_values=[c])]
|
|
140
140
|
if is_time_stack : layout += [parameters_layout(['t'], default_values=[t])]
|
|
141
141
|
|
|
142
|
-
event,
|
|
142
|
+
event, preset_map = prompt_with_help(layout,help= 'mapping', add_scrollbar=False)
|
|
143
143
|
if event == 'Cancel' : quit()
|
|
144
144
|
|
|
145
145
|
#Check integrity
|
|
146
|
-
channels_values = np.array(list(
|
|
147
|
-
total_channels = len(
|
|
146
|
+
channels_values = np.array(list(preset_map.values()), dtype= int)
|
|
147
|
+
total_channels = len(preset_map)
|
|
148
148
|
unique_channel = len(np.unique(channels_values))
|
|
149
149
|
if total_channels != unique_channel :
|
|
150
150
|
sg.popup("{0} channel(s) are not uniquely mapped.".format(total_channels - unique_channel))
|
|
@@ -154,7 +154,7 @@ def _ask_channel_map(shape, is_3D_stack, is_time_stack, multichannel, preset_map
|
|
|
154
154
|
relaunch= True
|
|
155
155
|
if not relaunch : break
|
|
156
156
|
|
|
157
|
-
return
|
|
157
|
+
return preset_map
|
|
158
158
|
|
|
159
159
|
def _show_mapping(shape, map, is_3D_stack, is_time_stack, multichannel) :
|
|
160
160
|
layout = [
|
|
@@ -166,7 +166,7 @@ def _show_mapping(shape, map, is_3D_stack, is_time_stack, multichannel) :
|
|
|
166
166
|
[sg.Button('Change mapping')]
|
|
167
167
|
]
|
|
168
168
|
|
|
169
|
-
event, values = prompt_with_help(layout, help='mapping')
|
|
169
|
+
event, values = prompt_with_help(layout, help='mapping', add_scrollbar=False)
|
|
170
170
|
|
|
171
171
|
if event == 'Ok' :
|
|
172
172
|
return map
|
|
@@ -195,8 +195,8 @@ def convert_parameters_types(values:dict) :
|
|
|
195
195
|
else : values[tuple_parameter] = tuple_values
|
|
196
196
|
|
|
197
197
|
#Parameters
|
|
198
|
-
int_list = ['threshold', 'channel_to_compute', 'min number of spots', 'cluster size','nucleus channel signal']
|
|
199
|
-
float_list = ['
|
|
198
|
+
int_list = ['threshold', 'channel_to_compute', 'channel to compute', 'min number of spots', 'cluster size','nucleus channel signal']
|
|
199
|
+
float_list = ['alpha', 'beta', 'gamma', 'threshold penalty']
|
|
200
200
|
|
|
201
201
|
for parameter in int_list :
|
|
202
202
|
try :
|
|
@@ -214,7 +214,15 @@ def convert_parameters_types(values:dict) :
|
|
|
214
214
|
|
|
215
215
|
return values
|
|
216
216
|
|
|
217
|
-
def check_integrity(
|
|
217
|
+
def check_integrity(
|
|
218
|
+
values: dict,
|
|
219
|
+
do_dense_region_deconvolution,
|
|
220
|
+
do_clustering,
|
|
221
|
+
multichannel,
|
|
222
|
+
segmentation_done,
|
|
223
|
+
map,
|
|
224
|
+
shape
|
|
225
|
+
):
|
|
218
226
|
"""
|
|
219
227
|
Checks that parameters given in input by user are fit to be used for bigfish detection.
|
|
220
228
|
"""
|
|
@@ -234,10 +242,22 @@ def check_integrity(values: dict, do_dense_region_deconvolution, multichannel,se
|
|
|
234
242
|
_warning_popup('No gamma found; image will not be denoised before deconvolution.')
|
|
235
243
|
values['gamma'] = 0
|
|
236
244
|
|
|
245
|
+
if values['alpha'] > 1 or values['alpha'] < 0 :
|
|
246
|
+
raise ParameterInputError("alpha must be set between 0 and 1.")
|
|
247
|
+
|
|
248
|
+
if do_clustering :
|
|
249
|
+
if not isinstance(values['min number of spots'], (int)) :
|
|
250
|
+
raise ParameterInputError("Incorrect min spot number parameter.")
|
|
251
|
+
if not isinstance(values['cluster size'], (int)) :
|
|
252
|
+
raise ParameterInputError("Incorrect cluster size parameter.")
|
|
253
|
+
|
|
237
254
|
#channel
|
|
238
255
|
if multichannel :
|
|
239
256
|
ch_len = shape[int(map['c'])]
|
|
240
|
-
|
|
257
|
+
|
|
258
|
+
if type(segmentation_done) == type(None) :
|
|
259
|
+
pass
|
|
260
|
+
elif segmentation_done :
|
|
241
261
|
try : nuc_signal_ch = int(values['nucleus channel signal'])
|
|
242
262
|
except Exception :
|
|
243
263
|
raise ParameterInputError("Incorrect channel for nucleus signal measure.")
|
|
@@ -260,7 +280,6 @@ def check_integrity(values: dict, do_dense_region_deconvolution, multichannel,se
|
|
|
260
280
|
|
|
261
281
|
return values
|
|
262
282
|
|
|
263
|
-
|
|
264
283
|
def reorder_shape(shape, map) :
|
|
265
284
|
x = [int(map['x']),]
|
|
266
285
|
y = [int(map['y']),]
|
|
@@ -276,6 +295,40 @@ def reorder_shape(shape, map) :
|
|
|
276
295
|
|
|
277
296
|
return new_shape
|
|
278
297
|
|
|
298
|
+
def _check_segmentation_parameters(
|
|
299
|
+
user_parameters,
|
|
300
|
+
shape,
|
|
301
|
+
is_multichannel,
|
|
302
|
+
) :
|
|
303
|
+
|
|
304
|
+
available_channels = list(range(len(shape)))
|
|
305
|
+
do_only_nuc = user_parameters['Segment only nuclei']
|
|
306
|
+
cyto_model_name = user_parameters['cyto_model_name']
|
|
307
|
+
cyto_size = user_parameters['cytoplasm diameter']
|
|
308
|
+
cytoplasm_channel = user_parameters['cytoplasm channel']
|
|
309
|
+
nucleus_model_name = user_parameters['nucleus_model_name']
|
|
310
|
+
nucleus_size = user_parameters['nucleus diameter']
|
|
311
|
+
nucleus_channel = user_parameters['nucleus channel']
|
|
312
|
+
|
|
313
|
+
|
|
314
|
+
if type(cyto_model_name) != str and not do_only_nuc:
|
|
315
|
+
raise ParameterInputError('Invalid cytoplasm model name.')
|
|
316
|
+
if cytoplasm_channel not in available_channels and not do_only_nuc and is_multichannel:
|
|
317
|
+
raise ParameterInputError('For given input image please select channel in {0}\ncytoplasm channel : {1}'.format(available_channels, cytoplasm_channel))
|
|
318
|
+
|
|
319
|
+
if type(cyto_size) not in [int, float] and not do_only_nuc:
|
|
320
|
+
raise ParameterInputError("Incorrect cytoplasm size.")
|
|
321
|
+
|
|
322
|
+
if type(nucleus_model_name) != str :
|
|
323
|
+
raise ParameterInputError('Invalid nucleus model name.')
|
|
324
|
+
|
|
325
|
+
if nucleus_channel not in available_channels and is_multichannel:
|
|
326
|
+
raise ParameterInputError('For given input image please select channel in {0}\nnucleus channel : {1}'.format(available_channels, nucleus_channel))
|
|
327
|
+
|
|
328
|
+
if type(nucleus_size) not in [int, float] :
|
|
329
|
+
raise ParameterInputError("Incorrect nucleus size.")
|
|
330
|
+
|
|
331
|
+
|
|
279
332
|
def clean_unused_parameters_cache(user_parameters: dict) :
|
|
280
333
|
"""
|
|
281
334
|
Clean unused parameters that were set to None in previous run.
|
|
@@ -170,7 +170,7 @@ def launch_segmentation(image: np.ndarray, user_parameters: dict) :
|
|
|
170
170
|
[sg.Button("Yes"), sg.Button("No")]
|
|
171
171
|
]
|
|
172
172
|
|
|
173
|
-
event, values = prompt(layout=layout, add_ok_cancel=False)
|
|
173
|
+
event, values = prompt(layout=layout, add_ok_cancel=False, add_scrollbar=False)
|
|
174
174
|
if event == "No" :
|
|
175
175
|
continue
|
|
176
176
|
|
|
@@ -351,3 +351,39 @@ def remove_disjoint(image):
|
|
|
351
351
|
image_cleaned = image_cleaned.astype(bool)
|
|
352
352
|
|
|
353
353
|
return image_cleaned
|
|
354
|
+
|
|
355
|
+
def plot_segmentation(
|
|
356
|
+
cyto_image : np.ndarray,
|
|
357
|
+
cyto_label : np.ndarray,
|
|
358
|
+
nuc_image : np.ndarray,
|
|
359
|
+
nuc_label : np.ndarray,
|
|
360
|
+
path :str,
|
|
361
|
+
do_only_nuc=False
|
|
362
|
+
) :
|
|
363
|
+
|
|
364
|
+
if nuc_image.ndim == 3 :
|
|
365
|
+
nuc_image = np.max(nuc_image,axis=0)
|
|
366
|
+
|
|
367
|
+
plot.plot_segmentation_boundary(
|
|
368
|
+
image=nuc_image,
|
|
369
|
+
nuc_label= nuc_label,
|
|
370
|
+
boundary_size= 3,
|
|
371
|
+
contrast=True,
|
|
372
|
+
path_output=path + "_nuclei_segmentation.png",
|
|
373
|
+
show=False,
|
|
374
|
+
)
|
|
375
|
+
|
|
376
|
+
|
|
377
|
+
if not do_only_nuc :
|
|
378
|
+
if cyto_image.ndim == 3 :
|
|
379
|
+
cyto_image = np.max(cyto_image,axis=0)
|
|
380
|
+
|
|
381
|
+
plot.plot_segmentation_boundary(
|
|
382
|
+
image=cyto_image,
|
|
383
|
+
cell_label= cyto_label,
|
|
384
|
+
nuc_label= nuc_label,
|
|
385
|
+
boundary_size= 3,
|
|
386
|
+
contrast=True,
|
|
387
|
+
path_output=path + "_cytoplasm_segmentation.png",
|
|
388
|
+
show=False,
|
|
389
|
+
)
|
|
@@ -8,6 +8,7 @@ from ._signaltonoise import compute_snr_spots
|
|
|
8
8
|
from ._napari_wrapper import correct_spots, _update_clusters, threshold_selection
|
|
9
9
|
from ..gui import add_default_loading
|
|
10
10
|
from ..gui import detection_parameters_promt, input_image_prompt
|
|
11
|
+
from ..utils import compute_anisotropy_coef
|
|
11
12
|
from .spots import compute_Spots
|
|
12
13
|
from magicgui import magicgui
|
|
13
14
|
from napari.layers import Image, Points
|
|
@@ -25,6 +26,7 @@ import bigfish.classification as classification
|
|
|
25
26
|
from bigfish.detection.spot_detection import get_object_radius_pixel
|
|
26
27
|
from types import GeneratorType
|
|
27
28
|
from skimage.measure import regionprops
|
|
29
|
+
from scipy.ndimage import binary_dilation
|
|
28
30
|
|
|
29
31
|
|
|
30
32
|
def ask_input_parameters(ask_for_segmentation=True) :
|
|
@@ -281,7 +283,15 @@ def initiate_detection(user_parameters, segmentation_done, map, shape) :
|
|
|
281
283
|
if type(user_parameters) == type(None) : return user_parameters
|
|
282
284
|
try :
|
|
283
285
|
user_parameters = convert_parameters_types(user_parameters)
|
|
284
|
-
user_parameters = check_integrity(
|
|
286
|
+
user_parameters = check_integrity(
|
|
287
|
+
user_parameters,
|
|
288
|
+
do_dense_region_deconvolution,
|
|
289
|
+
do_clustering,
|
|
290
|
+
is_multichannel,
|
|
291
|
+
segmentation_done,
|
|
292
|
+
map,
|
|
293
|
+
shape
|
|
294
|
+
)
|
|
285
295
|
except ParameterInputError as error:
|
|
286
296
|
sg.popup(error)
|
|
287
297
|
else :
|
|
@@ -591,7 +601,8 @@ def launch_detection(
|
|
|
591
601
|
other_image,
|
|
592
602
|
user_parameters,
|
|
593
603
|
cell_label= None,
|
|
594
|
-
nucleus_label = None
|
|
604
|
+
nucleus_label = None,
|
|
605
|
+
hide_loading=False,
|
|
595
606
|
) :
|
|
596
607
|
"""
|
|
597
608
|
Main call for features computation :
|
|
@@ -617,18 +628,18 @@ def launch_detection(
|
|
|
617
628
|
do_dense_region_deconvolution = user_parameters['Dense regions deconvolution']
|
|
618
629
|
do_clustering = user_parameters['Cluster computation']
|
|
619
630
|
|
|
620
|
-
spots, threshold = _launch_detection(image, user_parameters)
|
|
631
|
+
spots, threshold = _launch_detection(image, user_parameters, hide_loading = hide_loading)
|
|
621
632
|
|
|
622
633
|
if do_dense_region_deconvolution :
|
|
623
|
-
spots = launch_dense_region_deconvolution(image, spots, user_parameters)
|
|
634
|
+
spots = launch_dense_region_deconvolution(image, spots, user_parameters, hide_loading = hide_loading)
|
|
624
635
|
|
|
625
636
|
if do_clustering :
|
|
626
|
-
clusters = launch_clustering(spots, user_parameters) #012 are coordinates #3 is number of spots per cluster, #4 is cluster index
|
|
637
|
+
clusters = launch_clustering(spots, user_parameters, hide_loading = hide_loading) #012 are coordinates #3 is number of spots per cluster, #4 is cluster index
|
|
627
638
|
clusters = _update_clusters(clusters, spots, voxel_size=user_parameters['voxel_size'], cluster_size=user_parameters['cluster size'], min_spot_number= user_parameters['min number of spots'], shape=image.shape)
|
|
628
639
|
|
|
629
640
|
else : clusters = None
|
|
630
641
|
|
|
631
|
-
spots, post_detection_dict = launch_post_detection(image, spots, user_parameters)
|
|
642
|
+
spots, post_detection_dict = launch_post_detection(image, spots, user_parameters, hide_loading = hide_loading)
|
|
632
643
|
user_parameters['threshold'] = threshold
|
|
633
644
|
|
|
634
645
|
if user_parameters['Napari correction'] :
|
|
@@ -766,9 +777,11 @@ def _create_threshold_slider(
|
|
|
766
777
|
threshold=threshold
|
|
767
778
|
)[0]
|
|
768
779
|
|
|
780
|
+
scale = compute_anisotropy_coef(voxel_size)
|
|
781
|
+
|
|
769
782
|
layer_args = {
|
|
770
783
|
'size': 5,
|
|
771
|
-
'scale' :
|
|
784
|
+
'scale' : scale,
|
|
772
785
|
'face_color' : 'transparent',
|
|
773
786
|
'edge_color' : 'blue',
|
|
774
787
|
'symbol' : 'ring',
|
|
@@ -822,4 +835,55 @@ def _local_maxima_mask(
|
|
|
822
835
|
ndim=ndim)
|
|
823
836
|
mask_local_max = detection.local_maximum_detection(image_filtered, minimum_distance)
|
|
824
837
|
|
|
825
|
-
return mask_local_max.astype(bool)
|
|
838
|
+
return mask_local_max.astype(bool)
|
|
839
|
+
|
|
840
|
+
def output_spot_tiffvisual(channel,spots_list, path_output, dot_size = 3, rescale = True):
|
|
841
|
+
|
|
842
|
+
"""
|
|
843
|
+
Outputs a tiff image with one channel being {channel} and the other a mask containing dots where sports are located.
|
|
844
|
+
|
|
845
|
+
Parameters
|
|
846
|
+
----------
|
|
847
|
+
channel : np.ndarray
|
|
848
|
+
3D monochannel image
|
|
849
|
+
spots : list[np.ndarray] or np.ndarray
|
|
850
|
+
Spots arrays are ndarray where each element corresponds is a tuple(z,y,x) corresponding to 3D coordinate of a spot
|
|
851
|
+
To plot different spots on different channels a list of spots ndarray can be passed.
|
|
852
|
+
path_output : str
|
|
853
|
+
dot_size : int
|
|
854
|
+
in pixels
|
|
855
|
+
"""
|
|
856
|
+
|
|
857
|
+
stack.check_parameter(channel = (np.ndarray), spots_list= (list, np.ndarray), path_output = (str), dot_size = (int))
|
|
858
|
+
stack.check_array(channel, ndim= [2,3])
|
|
859
|
+
if isinstance(spots_list, np.ndarray) : spots_list = [spots_list]
|
|
860
|
+
|
|
861
|
+
if channel.ndim == 3 :
|
|
862
|
+
channel = stack.maximum_projection(channel)
|
|
863
|
+
|
|
864
|
+
im = np.zeros([1 + len(spots_list)] + list(channel.shape))
|
|
865
|
+
im[0,:,:] = channel
|
|
866
|
+
|
|
867
|
+
for level in range(len(spots_list)) :
|
|
868
|
+
if len(spots_list[level]) == 0 : continue
|
|
869
|
+
else :
|
|
870
|
+
spots_mask = np.zeros_like(channel)
|
|
871
|
+
|
|
872
|
+
#Unpacking spots
|
|
873
|
+
if len(spots_list[level][0]) == 2 :
|
|
874
|
+
Y,X = zip(*spots_list[level])
|
|
875
|
+
elif len(spots_list[level][0]) == 3 :
|
|
876
|
+
Z,Y,X = zip(*spots_list[level])
|
|
877
|
+
del Z
|
|
878
|
+
else :
|
|
879
|
+
Z,Y,X,*_ = zip(*spots_list[level])
|
|
880
|
+
del Z,_
|
|
881
|
+
|
|
882
|
+
#Reconstructing signal
|
|
883
|
+
spots_mask[Y,X] = 1
|
|
884
|
+
if dot_size > 1 : spots_mask = binary_dilation(spots_mask, iterations= dot_size-1)
|
|
885
|
+
spots_mask = stack.rescale(np.array(spots_mask, dtype = channel.dtype))
|
|
886
|
+
im[level + 1] = spots_mask
|
|
887
|
+
|
|
888
|
+
if rescale : channel = stack.rescale(channel, channel_to_stretch= 0)
|
|
889
|
+
stack.save_image(im, path_output, extension= 'tif')
|
small_fish_gui/pipeline/main.py
CHANGED
|
@@ -4,6 +4,7 @@ import PySimpleGUI as sg
|
|
|
4
4
|
from ..gui import hub_prompt
|
|
5
5
|
from .actions import add_detection, save_results, compute_colocalisation, delete_acquisitions
|
|
6
6
|
from ._preprocess import clean_unused_parameters_cache
|
|
7
|
+
from ..batch import batch_promp
|
|
7
8
|
|
|
8
9
|
#'Global' parameters
|
|
9
10
|
user_parameters = dict() # Very important object containg all choice from user that will influence the behavior of the main loop.
|
|
@@ -24,7 +25,6 @@ while True : #Break this loop to close small_fish
|
|
|
24
25
|
|
|
25
26
|
if event == 'Add detection' :
|
|
26
27
|
user_parameters = clean_unused_parameters_cache(user_parameters)
|
|
27
|
-
|
|
28
28
|
|
|
29
29
|
new_result_df, new_cell_result_df, acquisition_id, user_parameters, segmentation_done, cytoplasm_label, nucleus_label = add_detection(
|
|
30
30
|
user_parameters=user_parameters,
|
|
@@ -74,8 +74,12 @@ while True : #Break this loop to close small_fish
|
|
|
74
74
|
result_df, cell_result_df, coloc_df = delete_acquisitions(selected_acquisitions, result_df, cell_result_df, coloc_df)
|
|
75
75
|
|
|
76
76
|
elif event == "Batch detection" :
|
|
77
|
-
|
|
78
|
-
|
|
77
|
+
result_df, cell_result_df, acquisition_id, user_parameters, segmentation_done, cytoplasm_label,nucleus_label = batch_promp(
|
|
78
|
+
result_df,
|
|
79
|
+
cell_result_df,
|
|
80
|
+
acquisition_id=acquisition_id,
|
|
81
|
+
preset=user_parameters,
|
|
82
|
+
)
|
|
79
83
|
|
|
80
84
|
else :
|
|
81
85
|
break
|
small_fish_gui/utils.py
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import inspect
|
|
2
|
+
import datetime as dt
|
|
2
3
|
|
|
3
4
|
def check_parameter(**kwargs):
|
|
4
5
|
"""Check dtype of the function's parameters.
|
|
@@ -52,4 +53,8 @@ def compute_anisotropy_coef(voxel_size) :
|
|
|
52
53
|
return (z_anisotropy, xy_anisotropy, 1)
|
|
53
54
|
|
|
54
55
|
else :
|
|
55
|
-
return (voxel_size[0] / voxel_size[1], 1)
|
|
56
|
+
return (voxel_size[0] / voxel_size[1], 1)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def get_datetime():
|
|
60
|
+
return dt.datetime.now().strftime("%Y%m%d %H-%M-%S")
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: small_fish_gui
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.4.0
|
|
4
4
|
Summary: Small Fish is a python application for the analysis of smFish images. It provides a ready to use graphical interface to combine famous python packages for cell analysis without any need for coding.
|
|
5
5
|
Project-URL: Homepage, https://github.com/2Echoes/small_fish
|
|
6
6
|
Project-URL: Issues, https://github.com/2Echoes/small_fish/issues
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
small_fish_gui/LICENSE,sha256=-iFy8VGBYs5VsHglKpk4D-hxqQ2jMJaqmfq_ulIzDks,1303
|
|
2
|
+
small_fish_gui/README.md,sha256=2c_homYDJXX6VsBiEs5obhBh3HpcTSMdyjLo-35WzE4,4062
|
|
3
|
+
small_fish_gui/Segmentation example.jpg,sha256=opfiSbjmfF6z8kBs08sg_FNR2Om0AcMPU5sSwSLHdoQ,215038
|
|
4
|
+
small_fish_gui/__init__.py,sha256=bAy5AbCcDOo7LXgavAnPpRWrr5bCcI8KVqQZX1nb1L0,1941
|
|
5
|
+
small_fish_gui/__main__.py,sha256=EzSCoJ7jpSdK-QbzUwQLGZeQWjybNeq8VnCBucA8MZw,1372
|
|
6
|
+
small_fish_gui/napari_detection_example.png,sha256=l5EZlrbXemLiGqb5inSVsD6Kko1Opz528-go-fBfrw8,977350
|
|
7
|
+
small_fish_gui/requirements.txt,sha256=9OMfUAnLdHevq6w_fVoDmVmkSMJeFofkOK_86_fu9C0,321
|
|
8
|
+
small_fish_gui/utils.py,sha256=LM6QW2ono_LIRv7JXIIq7ZxxbDXqBtZ5uR9gjKJfwM8,1903
|
|
9
|
+
small_fish_gui/.github/workflows/python-publish.yml,sha256=5Ltnuhw9TevhzndlBmdUgYMnS73xEAxSyd1u8DHdn5s,1084
|
|
10
|
+
small_fish_gui/batch/__init__.py,sha256=ku2_Yate-UG89Q0BmE2B9kFV4kOz-u9Lf2lj6VsdFXs,127
|
|
11
|
+
small_fish_gui/batch/input.py,sha256=mqnP8LBhyNbtlcqjVlUiVeuHw4YxOX3GgzJbq03isKE,1477
|
|
12
|
+
small_fish_gui/batch/integrity.py,sha256=yzVWBwm4Mxftd1sDziQwKc7d3ALdgWOhkqQrU5-p430,4849
|
|
13
|
+
small_fish_gui/batch/output.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
14
|
+
small_fish_gui/batch/pipeline.py,sha256=uZCwkoiSnTHWAf7C4XPNXg4ldIjbpRiULpzZWq7R1i0,8798
|
|
15
|
+
small_fish_gui/batch/prompt.py,sha256=K3Vb1ebcNe6JieXPDL1btrZR-4ASjs_HIklXx5B9lYU,18608
|
|
16
|
+
small_fish_gui/batch/test.py,sha256=q04a1YstnDsxy2Bi5563BfcOU-O3VPE9c5WSJjvFjMg,211
|
|
17
|
+
small_fish_gui/batch/update.py,sha256=hR4kZ7tP2tvn1tmDa4oJb2e7-SUqN1Lf8JR6OCIOMS8,5037
|
|
18
|
+
small_fish_gui/batch/utils.py,sha256=HgfPwfhqWXOGtCny_nTdGs8csWB1BQp7-hYgrNVLB70,1774
|
|
19
|
+
small_fish_gui/batch/values.py,sha256=C1hRlCpTIDsg89DMKIIW5NUxeK876ODRUuJ2D-mJv6o,1519
|
|
20
|
+
small_fish_gui/batch/values.txt,sha256=PVxzIaaF6DGFRx_CMaStXZI6OrbjNub1-jR3pklXVjc,991
|
|
21
|
+
small_fish_gui/gui/__init__.py,sha256=xQ_BfYcnQmKZtx_0leO4OmbkLNLv49ZPqEu_UXMgmDc,867
|
|
22
|
+
small_fish_gui/gui/animation.py,sha256=rnNP5FPp06Hu-R33c4AVTCknALBbxT2YlsKFCXHAp9k,981
|
|
23
|
+
small_fish_gui/gui/general_help_screenshot.png,sha256=X4E6Td5f04K-pBUPDaBJRAE3D5b8fuEdiAUKhkIDr-0,54210
|
|
24
|
+
small_fish_gui/gui/help_module.py,sha256=PmgkkDs7bZ2-po83A_PK9uldQcHjehYmqre21nYb6DQ,9600
|
|
25
|
+
small_fish_gui/gui/layout.py,sha256=k_ATlpkzqzo7UotXwq6WkuqnevKT6UgFjfDH0UzHAOM,13563
|
|
26
|
+
small_fish_gui/gui/mapping_help_screenshot.png,sha256=HcuRh5TYciUogUasza5vZ_QSshaiHsskQK23mh9vQS8,34735
|
|
27
|
+
small_fish_gui/gui/prompts.py,sha256=WFxXLx-M3TM685iiQcNNNVX4Tpttn5JXPm6yM9eBRV4,13358
|
|
28
|
+
small_fish_gui/gui/segmentation_help_screenshot.png,sha256=rbSgIydT0gZtfMh1qk4mdMbEIyCaakvHmxa2eOrLwO0,118944
|
|
29
|
+
small_fish_gui/interface/__init__.py,sha256=PB86R4Y9kV80aGZ-vP0ZW2KeaCwGbBbCtFCmbN2yl28,275
|
|
30
|
+
small_fish_gui/interface/image.py,sha256=X1L7S5svxUwdoDcI3QM1PbN-c4Nz5w30hixq3IgqSn8,1130
|
|
31
|
+
small_fish_gui/interface/output.py,sha256=5jC37tobgXgsiVJYx3RWaES09I-YFmbXKk65lHflTHc,1867
|
|
32
|
+
small_fish_gui/interface/parameters.py,sha256=lUugD-4W2TZyJF3TH1q70TlktEYhhPtcPCrvxm5Dk50,36
|
|
33
|
+
small_fish_gui/interface/testing.py,sha256=MY5-GcPOUHagcrwR8A7QOjAmjZIDVC8Wz3NibLe3KQw,321
|
|
34
|
+
small_fish_gui/pipeline/__init__.py,sha256=_Ey20GG8fJtqZvixbXNNYX6wTWMnCUArmARPqsNEhuQ,743
|
|
35
|
+
small_fish_gui/pipeline/_colocalisation.py,sha256=peBw2Qz5m6wSejDkDz240UgvWl8ohNelrnmEgznbEsw,9635
|
|
36
|
+
small_fish_gui/pipeline/_custom_errors.py,sha256=tQ-AUhgzIFpK30AZiQQrtHCHyGVRDdAoIjzL0Fk-1pA,43
|
|
37
|
+
small_fish_gui/pipeline/_napari_wrapper.py,sha256=_FkkY7IBKn1QgNvyea-x6XPjw_AwsLEVzdRKzg65oCE,9290
|
|
38
|
+
small_fish_gui/pipeline/_preprocess.py,sha256=9Ns0el109qeRD1I7HmKpuljyKZfYLwPapvrKYl9ebdc,12943
|
|
39
|
+
small_fish_gui/pipeline/_segmentation.py,sha256=jcNf_GxNov_O16Xt6XyDIfYC7JsdiAxGeqLMJCwEy5I,13925
|
|
40
|
+
small_fish_gui/pipeline/_signaltonoise.py,sha256=7A9t7xu7zghI6cr201Ldm-LjJ5NOuP56VSeJ8KIzcUo,8497
|
|
41
|
+
small_fish_gui/pipeline/actions.py,sha256=EIGIOlwJ_DADX1NcLWwrTP_AidDX-4f4ggZV0gkIb58,7988
|
|
42
|
+
small_fish_gui/pipeline/detection.py,sha256=La8hCO2WvZgHjvgUIjwQbqKYhDHI5ZtLhYrxFc62qbs,34429
|
|
43
|
+
small_fish_gui/pipeline/main.py,sha256=QamUbM4pfLLWGAC8AkJ-vTcUNHpWeu9bBB1g5pBBoNY,3433
|
|
44
|
+
small_fish_gui/pipeline/spots.py,sha256=yHvqf1eD25UltELpzcouYXhLkxiXI_mOL1ANSzXK5pw,1907
|
|
45
|
+
small_fish_gui/pipeline/test.py,sha256=w4ZMGDmUDXxVgWTlZ2TKw19W8q5gcE9gLMKe0SWnRrw,2827
|
|
46
|
+
small_fish_gui-1.4.0.dist-info/METADATA,sha256=ga-XNAKMcj2t0XMTxUoj3aIMuIRE9DuiBPKQbmuadMk,2567
|
|
47
|
+
small_fish_gui-1.4.0.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
|
|
48
|
+
small_fish_gui-1.4.0.dist-info/licenses/LICENSE,sha256=-iFy8VGBYs5VsHglKpk4D-hxqQ2jMJaqmfq_ulIzDks,1303
|
|
49
|
+
small_fish_gui-1.4.0.dist-info/RECORD,,
|
small_fish_gui/gui/test.py
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
small_fish_gui/LICENSE,sha256=-iFy8VGBYs5VsHglKpk4D-hxqQ2jMJaqmfq_ulIzDks,1303
|
|
2
|
-
small_fish_gui/README.md,sha256=2c_homYDJXX6VsBiEs5obhBh3HpcTSMdyjLo-35WzE4,4062
|
|
3
|
-
small_fish_gui/Segmentation example.jpg,sha256=opfiSbjmfF6z8kBs08sg_FNR2Om0AcMPU5sSwSLHdoQ,215038
|
|
4
|
-
small_fish_gui/__init__.py,sha256=KVhqTYGlC9toeQXTEcEWF5cevZ7sRbIEDHZ8ZM98XOk,1941
|
|
5
|
-
small_fish_gui/__main__.py,sha256=EzSCoJ7jpSdK-QbzUwQLGZeQWjybNeq8VnCBucA8MZw,1372
|
|
6
|
-
small_fish_gui/napari_detection_example.png,sha256=l5EZlrbXemLiGqb5inSVsD6Kko1Opz528-go-fBfrw8,977350
|
|
7
|
-
small_fish_gui/requirements.txt,sha256=9OMfUAnLdHevq6w_fVoDmVmkSMJeFofkOK_86_fu9C0,321
|
|
8
|
-
small_fish_gui/utils.py,sha256=tSoMb8N69WdKTtMItPb1DYZiIAz1mjI26BCKJAi6vuc,1798
|
|
9
|
-
small_fish_gui/.github/workflows/python-publish.yml,sha256=5Ltnuhw9TevhzndlBmdUgYMnS73xEAxSyd1u8DHdn5s,1084
|
|
10
|
-
small_fish_gui/gui/__init__.py,sha256=178HC3t2z4EnP0iBnMcaP_pyh5xHwOkEE6p3WJwBQeU,911
|
|
11
|
-
small_fish_gui/gui/animation.py,sha256=6_Y15_NzJ_TYBYseu3sSKaVkYRp2UCsVClAWOk3dESY,714
|
|
12
|
-
small_fish_gui/gui/general_help_screenshot.png,sha256=X4E6Td5f04K-pBUPDaBJRAE3D5b8fuEdiAUKhkIDr-0,54210
|
|
13
|
-
small_fish_gui/gui/help_module.py,sha256=PmgkkDs7bZ2-po83A_PK9uldQcHjehYmqre21nYb6DQ,9600
|
|
14
|
-
small_fish_gui/gui/layout.py,sha256=_ErOS2IUejeUuPLkDmPB3FzLkoHOWR-Iaxz-aUeETks,7695
|
|
15
|
-
small_fish_gui/gui/mapping_help_screenshot.png,sha256=HcuRh5TYciUogUasza5vZ_QSshaiHsskQK23mh9vQS8,34735
|
|
16
|
-
small_fish_gui/gui/prompts.py,sha256=NAR7qjKwybiZZ2caO_lB8_CEttG8i4lHdt9lxjh6ESM,13160
|
|
17
|
-
small_fish_gui/gui/segmentation_help_screenshot.png,sha256=rbSgIydT0gZtfMh1qk4mdMbEIyCaakvHmxa2eOrLwO0,118944
|
|
18
|
-
small_fish_gui/gui/test.py,sha256=Pf-GW9AgW-0VL1mFbYtqRvPAaa8DgwCThv2dDUHCcmU,156
|
|
19
|
-
small_fish_gui/interface/__init__.py,sha256=PB86R4Y9kV80aGZ-vP0ZW2KeaCwGbBbCtFCmbN2yl28,275
|
|
20
|
-
small_fish_gui/interface/image.py,sha256=X1L7S5svxUwdoDcI3QM1PbN-c4Nz5w30hixq3IgqSn8,1130
|
|
21
|
-
small_fish_gui/interface/output.py,sha256=dyhpO1YrRCIbQYpqU_52E1DTNPf0wdktd--CB15iT3k,1712
|
|
22
|
-
small_fish_gui/interface/parameters.py,sha256=lUugD-4W2TZyJF3TH1q70TlktEYhhPtcPCrvxm5Dk50,36
|
|
23
|
-
small_fish_gui/interface/testing.py,sha256=MY5-GcPOUHagcrwR8A7QOjAmjZIDVC8Wz3NibLe3KQw,321
|
|
24
|
-
small_fish_gui/pipeline/_colocalisation.py,sha256=peBw2Qz5m6wSejDkDz240UgvWl8ohNelrnmEgznbEsw,9635
|
|
25
|
-
small_fish_gui/pipeline/_custom_errors.py,sha256=tQ-AUhgzIFpK30AZiQQrtHCHyGVRDdAoIjzL0Fk-1pA,43
|
|
26
|
-
small_fish_gui/pipeline/_napari_wrapper.py,sha256=_FkkY7IBKn1QgNvyea-x6XPjw_AwsLEVzdRKzg65oCE,9290
|
|
27
|
-
small_fish_gui/pipeline/_preprocess.py,sha256=szNoav19Xo3USmiUTjcFgkMn9QK53ZOydbLV5aMFLws,10676
|
|
28
|
-
small_fish_gui/pipeline/_segmentation.py,sha256=M2bQzgzw7Zt_DBeM3qvI0V4Pn0HFLwj0l8yV8M5aToo,12977
|
|
29
|
-
small_fish_gui/pipeline/_signaltonoise.py,sha256=7A9t7xu7zghI6cr201Ldm-LjJ5NOuP56VSeJ8KIzcUo,8497
|
|
30
|
-
small_fish_gui/pipeline/actions.py,sha256=EIGIOlwJ_DADX1NcLWwrTP_AidDX-4f4ggZV0gkIb58,7988
|
|
31
|
-
small_fish_gui/pipeline/detection.py,sha256=MLc8Z1xniuAghn3D0LPmH64jVRobhLj05HW0nI7BDmw,31983
|
|
32
|
-
small_fish_gui/pipeline/main.py,sha256=AAW-zK3b7Ece9cdHn9y6QG8lTa1HXG-8JtnvJ3m0HwA,3149
|
|
33
|
-
small_fish_gui/pipeline/spots.py,sha256=yHvqf1eD25UltELpzcouYXhLkxiXI_mOL1ANSzXK5pw,1907
|
|
34
|
-
small_fish_gui/pipeline/test.py,sha256=w4ZMGDmUDXxVgWTlZ2TKw19W8q5gcE9gLMKe0SWnRrw,2827
|
|
35
|
-
small_fish_gui-1.3.4.dist-info/METADATA,sha256=j18MEZEpw6WbHgnNUfWlsBLuTTlh6fUwCZ43ztNH2eE,2567
|
|
36
|
-
small_fish_gui-1.3.4.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
|
|
37
|
-
small_fish_gui-1.3.4.dist-info/licenses/LICENSE,sha256=-iFy8VGBYs5VsHglKpk4D-hxqQ2jMJaqmfq_ulIzDks,1303
|
|
38
|
-
small_fish_gui-1.3.4.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|