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.
@@ -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(image, is_3D_stack, is_time_stack, multichannel)
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, is_3D_stack, is_time_stack, multichannel) :
81
- shape = image.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 = map.setdefault('x',0)
129
- y = map.setdefault('y',0)
130
- z = map.setdefault('z',0)
131
- c = map.setdefault('c',0)
132
- t = map.setdefault('t',0)
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, map = prompt_with_help(layout,help= 'mapping')
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(map.values()), dtype= int)
147
- total_channels = len(map)
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 map
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 = ['time_step', 'alpha', 'beta', 'gamma', 'threshold penalty']
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(values: dict, do_dense_region_deconvolution, multichannel,segmentation_done, map, shape):
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
- if segmentation_done :
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(user_parameters, do_dense_region_deconvolution, is_multichannel, segmentation_done, map, shape)
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' : voxel_size,
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')
@@ -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
- #TODO
78
- pass
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.4
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,,
@@ -1,4 +0,0 @@
1
- import PySimpleGUI as sg
2
- import small_fish.gui.prompts as p
3
-
4
- p.hub_prompt([{},{},{"cell_number" : 100, "spot_number" : 1000},{},{},{'cell_number' : 10},{}])
@@ -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,,