celldetective 1.5.0b8__py3-none-any.whl → 1.5.0b10__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.
@@ -5,18 +5,34 @@ from pathlib import Path
5
5
  import numpy as np
6
6
  from PyQt5.QtCore import QSize
7
7
  from PyQt5.QtGui import QDoubleValidator
8
- from PyQt5.QtWidgets import QMessageBox, QHBoxLayout, QLabel, QComboBox, QLineEdit, QPushButton
8
+ from PyQt5.QtWidgets import (
9
+ QMessageBox,
10
+ QHBoxLayout,
11
+ QLabel,
12
+ QComboBox,
13
+ QLineEdit,
14
+ QPushButton,
15
+ QCheckBox,
16
+ QSizePolicy,
17
+ QWidget,
18
+ )
19
+ from PyQt5.QtCore import Qt
20
+ from celldetective.gui.base.utils import center_window
9
21
  from fonticon_mdi6 import MDI6
10
22
  from natsort import natsorted
11
23
  from superqt.fonticon import icon
12
24
 
13
- from celldetective.gui.gui_utils import PreprocessingLayout2
14
25
  from celldetective.gui.viewers.base_viewer import StackVisualizer
26
+ from celldetective.gui.gui_utils import PreprocessingLayout2
15
27
  from celldetective.utils.image_loaders import load_frames
28
+ from celldetective.measure import extract_blobs_in_image
29
+ from celldetective.filters import filter_image
16
30
  from celldetective import get_logger
31
+ from tifffile import imread
17
32
 
18
33
  logger = get_logger(__name__)
19
34
 
35
+
20
36
  class SpotDetectionVisualizer(StackVisualizer):
21
37
 
22
38
  def __init__(
@@ -27,6 +43,9 @@ class SpotDetectionVisualizer(StackVisualizer):
27
43
  parent_preprocessing_list=None,
28
44
  cell_type="targets",
29
45
  labels=None,
46
+ initial_diameter=None,
47
+ initial_threshold=None,
48
+ initial_preprocessing=None,
30
49
  *args,
31
50
  **kwargs,
32
51
  ):
@@ -37,6 +56,7 @@ class SpotDetectionVisualizer(StackVisualizer):
37
56
  self.labels = labels
38
57
  self.detection_channel = self.target_channel
39
58
  self.switch_from_channel = False
59
+ self.preview_preprocessing = False
40
60
 
41
61
  self.parent_channel_cb = parent_channel_cb
42
62
  self.parent_diameter_le = parent_diameter_le
@@ -47,6 +67,35 @@ class SpotDetectionVisualizer(StackVisualizer):
47
67
  self.floatValidator = QDoubleValidator()
48
68
  self.init_scatter()
49
69
 
70
+ self.setWindowTitle(self.window_title)
71
+ self.resize(1200, 800)
72
+
73
+ # Main Layout (Horizontal split)
74
+ self.main_layout = QHBoxLayout(self)
75
+ self.main_layout.setContentsMargins(10, 10, 10, 10)
76
+
77
+ # Left Panel (Settings) - Scrollable
78
+ from PyQt5.QtWidgets import QScrollArea, QWidget, QVBoxLayout
79
+
80
+ self.scroll_area = QScrollArea()
81
+ self.scroll_area.setWidgetResizable(True)
82
+ self.settings_widget = QWidget()
83
+ self.settings_layout = QVBoxLayout(self.settings_widget)
84
+ self.settings_layout.setContentsMargins(10, 10, 10, 10)
85
+ self.settings_layout.setSpacing(15)
86
+ self.settings_layout.setAlignment(Qt.AlignTop)
87
+ self.scroll_area.setWidget(self.settings_widget)
88
+ self.scroll_area.setFixedWidth(350) # Set a reasonable width for settings
89
+
90
+ # Add Left Panel
91
+ self.main_layout.addWidget(self.scroll_area)
92
+
93
+ # Right Panel (Image Canvas)
94
+ # self.canvas is created by super().__init__
95
+ # We allow it to expand
96
+ self.canvas.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
97
+ self.main_layout.addWidget(self.canvas)
98
+
50
99
  self.generate_detection_channel()
51
100
  self.detection_channel = self.detection_channel_cb.currentIndex()
52
101
 
@@ -57,12 +106,40 @@ class SpotDetectionVisualizer(StackVisualizer):
57
106
 
58
107
  self.ax.callbacks.connect("xlim_changed", self.update_marker_sizes)
59
108
  self.ax.callbacks.connect("ylim_changed", self.update_marker_sizes)
109
+ self._axis_callbacks_connected = True
60
110
 
61
111
  self.apply_diam_btn.clicked.connect(self.detect_and_display_spots)
62
112
  self.apply_thresh_btn.clicked.connect(self.detect_and_display_spots)
63
113
 
64
- self.channel_cb.setCurrentIndex(self.target_channel)
65
- self.detection_channel_cb.setCurrentIndex(self.target_channel)
114
+ self.channel_cb.setCurrentIndex(min(self.target_channel, self.n_channels - 1))
115
+ self.detection_channel_cb.setCurrentIndex(
116
+ min(self.target_channel, self.n_channels - 1)
117
+ )
118
+
119
+ # Initialize from provided values (sync with settings panel)
120
+ if initial_diameter is not None:
121
+ self.spot_diam_le.setText(str(initial_diameter))
122
+ if initial_threshold is not None:
123
+ self.spot_thresh_le.setText(str(initial_threshold))
124
+ if initial_preprocessing is not None and len(initial_preprocessing) > 0:
125
+ items_for_list = [a[0] for a in initial_preprocessing]
126
+ for it in items_for_list:
127
+ self.preprocessing.list.addItemToList(it)
128
+ self.preprocessing.list.items = list(initial_preprocessing)
129
+
130
+ def closeEvent(self, event):
131
+ """Clean up resources on close."""
132
+ # Clear large arrays
133
+ self.target_img = None
134
+ self.init_label = None
135
+ self.spot_sizes = []
136
+
137
+ # Remove scatter
138
+ if hasattr(self, "spot_scat") and self.spot_scat is not None:
139
+ self.spot_scat.remove()
140
+ self.spot_scat = None
141
+
142
+ super().closeEvent(event)
66
143
 
67
144
  def update_marker_sizes(self, event=None):
68
145
 
@@ -105,9 +182,7 @@ class SpotDetectionVisualizer(StackVisualizer):
105
182
  if not self.switch_from_channel:
106
183
  self.reset_detection()
107
184
 
108
- if self.mode == "virtual":
109
- from tifffile import imread
110
-
185
+ if self.mode == "virtual" and hasattr(self, "mask_paths"):
111
186
  self.init_label = imread(self.mask_paths[value])
112
187
  self.target_img = load_frames(
113
188
  self.img_num_per_channel[self.detection_channel, value],
@@ -122,15 +197,11 @@ class SpotDetectionVisualizer(StackVisualizer):
122
197
 
123
198
  self.reset_detection()
124
199
  self.control_valid_parameters() # set current diam and threshold
125
- # self.change_frame(self.frame_slider.value())
126
- # self.set_detection_channel_index(self.detection_channel_cb.currentIndex())
127
200
 
128
201
  image_preprocessing = self.preprocessing.list.items
129
202
  if image_preprocessing == []:
130
203
  image_preprocessing = None
131
204
 
132
- from celldetective.measure import extract_blobs_in_image
133
-
134
205
  blobs_filtered = extract_blobs_in_image(
135
206
  self.target_img,
136
207
  self.init_label,
@@ -157,8 +228,7 @@ class SpotDetectionVisualizer(StackVisualizer):
157
228
  self.canvas.canvas.draw()
158
229
 
159
230
  def reset_detection(self):
160
-
161
- self.ax.scatter([], []).get_offsets()
231
+ """Clear spot detection display."""
162
232
  empty_offset = np.ma.masked_array([0, 0], mask=True)
163
233
  self.spot_scat.set_offsets(empty_offset)
164
234
  self.canvas.canvas.draw()
@@ -205,8 +275,6 @@ class SpotDetectionVisualizer(StackVisualizer):
205
275
  returnValue = msgBox.exec()
206
276
  self.close()
207
277
 
208
- from tifffile import imread
209
-
210
278
  self.init_label = imread(self.mask_paths[self.frame_slider.value()])
211
279
 
212
280
  def generate_detection_channel(self):
@@ -215,7 +283,7 @@ class SpotDetectionVisualizer(StackVisualizer):
215
283
  assert len(self.channel_names) == self.n_channels
216
284
 
217
285
  channel_layout = QHBoxLayout()
218
- channel_layout.setContentsMargins(15, 0, 15, 0)
286
+ channel_layout.setContentsMargins(0, 0, 0, 0)
219
287
  channel_layout.addWidget(QLabel("Detection\nchannel: "), 25)
220
288
 
221
289
  self.detection_channel_cb = QComboBox()
@@ -231,11 +299,22 @@ class SpotDetectionVisualizer(StackVisualizer):
231
299
  # self.invert_check.toggled.connect(self.set_invert)
232
300
  # channel_layout.addWidget(self.invert_check, 10)
233
301
 
234
- self.canvas.layout.addLayout(channel_layout)
302
+ self.settings_layout.addLayout(channel_layout)
235
303
 
236
- self.preprocessing = PreprocessingLayout2(fraction=25, parent_window=self)
237
- self.preprocessing.setContentsMargins(15, 0, 15, 0)
238
- self.canvas.layout.addLayout(self.preprocessing)
304
+ self.preview_cb = QCheckBox("Preview")
305
+ self.preview_cb.toggled.connect(self.toggle_preprocessing_preview)
306
+
307
+ self.preprocessing = PreprocessingLayout2(
308
+ fraction=25, parent_window=self, extra_widget=self.preview_cb
309
+ )
310
+ self.preprocessing.setContentsMargins(0, 10, 0, 10)
311
+ self.preprocessing.list.list_widget.model().rowsInserted.connect(
312
+ self.update_preview_if_active
313
+ )
314
+ self.preprocessing.list.list_widget.model().rowsRemoved.connect(
315
+ self.update_preview_if_active
316
+ )
317
+ self.settings_layout.addLayout(self.preprocessing)
239
318
 
240
319
  # def set_invert(self):
241
320
  # if self.invert_check.isChecked():
@@ -272,19 +351,22 @@ class SpotDetectionVisualizer(StackVisualizer):
272
351
  self.spot_diam_le.textChanged.connect(self.control_valid_parameters)
273
352
  self.spot_thresh_le.textChanged.connect(self.control_valid_parameters)
274
353
 
354
+ self.apply_diam_btn.clicked.connect(self.detect_and_display_spots)
355
+ self.apply_thresh_btn.clicked.connect(self.detect_and_display_spots)
356
+
275
357
  spot_diam_layout = QHBoxLayout()
276
- spot_diam_layout.setContentsMargins(15, 0, 15, 0)
358
+ spot_diam_layout.setContentsMargins(0, 0, 0, 0)
277
359
  spot_diam_layout.addWidget(QLabel("Spot diameter: "), 25)
278
360
  spot_diam_layout.addWidget(self.spot_diam_le, 65)
279
361
  spot_diam_layout.addWidget(self.apply_diam_btn, 10)
280
- self.canvas.layout.addLayout(spot_diam_layout)
362
+ self.settings_layout.addLayout(spot_diam_layout)
281
363
 
282
364
  spot_thresh_layout = QHBoxLayout()
283
- spot_thresh_layout.setContentsMargins(15, 0, 15, 0)
365
+ spot_thresh_layout.setContentsMargins(0, 0, 0, 0)
284
366
  spot_thresh_layout.addWidget(QLabel("Detection\nthreshold: "), 25)
285
367
  spot_thresh_layout.addWidget(self.spot_thresh_le, 65)
286
368
  spot_thresh_layout.addWidget(self.apply_thresh_btn, 10)
287
- self.canvas.layout.addLayout(spot_thresh_layout)
369
+ self.settings_layout.addLayout(spot_thresh_layout)
288
370
 
289
371
  def generate_add_measurement_btn(self):
290
372
 
@@ -297,7 +379,48 @@ class SpotDetectionVisualizer(StackVisualizer):
297
379
  add_hbox.addWidget(QLabel(""), 33)
298
380
  add_hbox.addWidget(self.add_measurement_btn, 33)
299
381
  add_hbox.addWidget(QLabel(""), 33)
300
- self.canvas.layout.addLayout(add_hbox)
382
+ self.settings_layout.addLayout(add_hbox)
383
+
384
+ def show(self):
385
+ QWidget.show(self)
386
+ center_window(self)
387
+
388
+ def update_preview_if_active(self):
389
+ if self.preview_cb.isChecked():
390
+ self.toggle_preprocessing_preview()
391
+
392
+ def toggle_preprocessing_preview(self):
393
+
394
+ image_preprocessing = self.preprocessing.list.items
395
+ if image_preprocessing == []:
396
+ image_preprocessing = None
397
+
398
+ if self.preview_cb.isChecked() and image_preprocessing is not None:
399
+ # Apply preprocessing
400
+ try:
401
+ preprocessed_img = filter_image(
402
+ self.target_img.copy(), filters=image_preprocessing
403
+ )
404
+ self.im.set_data(preprocessed_img)
405
+
406
+ # Update contrast to match new range
407
+ p01 = np.nanpercentile(preprocessed_img, 0.1)
408
+ p99 = np.nanpercentile(preprocessed_img, 99.9)
409
+ self.im.set_clim(vmin=p01, vmax=p99)
410
+ if hasattr(self, "contrast_slider"):
411
+ self.contrast_slider.setValue((p01, p99))
412
+ self.canvas.draw()
413
+ except Exception as e:
414
+ logger.error(f"Preprocessing preview failed: {e}")
415
+ else:
416
+ # Restore original
417
+ self.im.set_data(self.target_img)
418
+ p01 = np.nanpercentile(self.target_img, 0.1)
419
+ p99 = np.nanpercentile(self.target_img, 99.9)
420
+ self.im.set_clim(vmin=p01, vmax=p99)
421
+ if hasattr(self, "contrast_slider"):
422
+ self.contrast_slider.setValue((p01, p99))
423
+ self.canvas.draw()
301
424
 
302
425
  def control_valid_parameters(self):
303
426
 
@@ -305,14 +428,14 @@ class SpotDetectionVisualizer(StackVisualizer):
305
428
  try:
306
429
  self.diameter = float(self.spot_diam_le.text().replace(",", "."))
307
430
  valid_diam = True
308
- except:
431
+ except ValueError:
309
432
  valid_diam = False
310
433
 
311
434
  valid_thresh = False
312
435
  try:
313
436
  self.thresh = float(self.spot_thresh_le.text().replace(",", "."))
314
437
  valid_thresh = True
315
- except:
438
+ except ValueError:
316
439
  valid_thresh = False
317
440
 
318
441
  if valid_diam and valid_thresh:
celldetective/measure.py CHANGED
@@ -23,6 +23,7 @@ from celldetective.utils.maths import step_function
23
23
  from celldetective.utils.image_cleaning import interpolate_nan
24
24
  from celldetective.preprocessing import field_correction
25
25
  from celldetective.log_manager import get_logger
26
+ import pandas as pd
26
27
 
27
28
  logger = get_logger(__name__)
28
29
 
@@ -279,8 +280,6 @@ def measure(
279
280
 
280
281
  timestep_dataframes.append(measurements_at_t)
281
282
 
282
- import pandas as pd
283
-
284
283
  measurements = pd.concat(timestep_dataframes)
285
284
  if trajectories is not None:
286
285
  measurements = measurements.sort_values(
@@ -435,8 +434,11 @@ def measure_features(
435
434
 
436
435
  if spot_detection is not None:
437
436
  detection_channel = spot_detection.get("channel")
438
- if detection_channel in channels:
439
- ind = channels.index(detection_channel)
437
+ channels_list = (
438
+ list(channels) if not isinstance(channels, list) else channels
439
+ )
440
+ if detection_channel in channels_list:
441
+ ind = channels_list.index(detection_channel)
440
442
  if "image_preprocessing" not in spot_detection:
441
443
  spot_detection.update({"image_preprocessing": None})
442
444
 
@@ -458,8 +460,11 @@ def measure_features(
458
460
  if normalisation_list:
459
461
  for norm in normalisation_list:
460
462
  target = norm.get("target_channel")
461
- if target in channels:
462
- ind = channels.index(target)
463
+ channels_list = (
464
+ list(channels) if not isinstance(channels, list) else channels
465
+ )
466
+ if target in channels_list:
467
+ ind = channels_list.index(target)
463
468
 
464
469
  if norm["correction_type"] == "local":
465
470
  normalised_image = normalise_by_cell(
@@ -529,7 +534,6 @@ def measure_features(
529
534
  extra_properties=extra_props_list,
530
535
  channel_names=channels,
531
536
  )
532
- import pandas as pd
533
537
 
534
538
  df_props = pd.DataFrame(props)
535
539
 
@@ -598,7 +602,6 @@ def measure_features(
598
602
  extra_properties=intensity_extra,
599
603
  channel_names=channels,
600
604
  )
601
- import pandas as pd
602
605
 
603
606
  df_props_border_d = pd.DataFrame(props_border)
604
607
 
@@ -821,8 +824,6 @@ def compute_haralick_features(
821
824
  len(np.unique(labels)) - 1
822
825
  ), "Some cells have not been measured..."
823
826
 
824
- import pandas as pd
825
-
826
827
  return pd.DataFrame(haralick_properties)
827
828
 
828
829
 
@@ -1070,7 +1071,6 @@ def measure_at_position(pos, mode, return_measurements=False, threads=1):
1070
1071
 
1071
1072
  table = pos + os.sep.join(["output", "tables", f"trajectories_{mode}.csv"])
1072
1073
  if return_measurements:
1073
- import pandas as pd
1074
1074
 
1075
1075
  df = pd.read_csv(table)
1076
1076
  return df
@@ -249,9 +249,13 @@ def rename_intensity_column(df, channels):
249
249
  if np.any(test_digit):
250
250
  index = int(sections[np.where(test_digit)[0]][-1])
251
251
  else:
252
- print(
253
- f"No valid channel index found for {intensity_cols[k]}... Skipping the renaming for {intensity_cols[k]}..."
254
- )
252
+ # Check if the column already contains a channel name (e.g., spot detection columns)
253
+ # If so, skip silently as no renaming is needed
254
+ already_named = any(ch in intensity_cols[k] for ch in channel_names)
255
+ if not already_named:
256
+ print(
257
+ f"No valid channel index found for {intensity_cols[k]}... Skipping the renaming for {intensity_cols[k]}..."
258
+ )
255
259
  continue
256
260
 
257
261
  channel_name = channel_names[np.where(channel_indices == index)[0]][0]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: celldetective
3
- Version: 1.5.0b8
3
+ Version: 1.5.0b10
4
4
  Summary: description
5
5
  Home-page: http://github.com/remyeltorro/celldetective
6
6
  Author: Rémy Torro
@@ -1,13 +1,13 @@
1
1
  celldetective/__init__.py,sha256=LfnOyfUnYPGDc8xcsF_PfYEL7-CqAb7BMBPBIWGv84o,666
2
2
  celldetective/__main__.py,sha256=Rzzu9ArxZSgfBVjV-lyn-3oanQB2MumQR6itK5ZaRpA,2597
3
- celldetective/_version.py,sha256=_aQC8i0kOHSYGEkfpTecn4OzPtL_z-LVXk1dtkjlJtQ,24
3
+ celldetective/_version.py,sha256=IWzkcjFNinv23e_qW2_WxLXbN_bwUvMfLyYxfg2BHRw,25
4
4
  celldetective/event_detection_models.py,sha256=A7ZJFhJwfdhzfxJ-YZIj6IoI9Gc1hyAodFkKt8kNxDk,93549
5
5
  celldetective/events.py,sha256=n15R53c7QZ2wT8gjb0oeNikQbuRBrVVbyNsRCqXjzXA,8166
6
6
  celldetective/exceptions.py,sha256=f3VmIYOthWTiqMEV5xQCox2rw5c5e7yog88h-CcV4oI,356
7
7
  celldetective/extra_properties.py,sha256=s_2R4_El2p-gQNZ_EpgDxgrN3UnRitN7KDKHhyLuoHc,21681
8
8
  celldetective/filters.py,sha256=QSRSpqvwUfa0YrU5EKoobJWCQFy07fFHwZ2bXxTL3hE,6933
9
9
  celldetective/log_manager.py,sha256=Tv7_mVn0TVOyTs_2VnyEKl9_NMeDUtEkLC5njUq-r-Y,2968
10
- celldetective/measure.py,sha256=V-1J9l5CIkxJWnEWQp0xMQVv1PPCPZJMS0tkIKCLGXM,72048
10
+ celldetective/measure.py,sha256=8f0AMBqMrilcxjW2JKnMhqgJXWwLT-9K5k3dcpOJBcw,72212
11
11
  celldetective/neighborhood.py,sha256=Z5wu2nSMvabrQz91oy6DRf2o90LUY0RMXTEwgW7ORAg,74844
12
12
  celldetective/preprocessing.py,sha256=tjAMLG4ZMfopMSFulGGjMQox7czEcReV2MzEkWlL2eQ,59948
13
13
  celldetective/relative_measurements.py,sha256=j7xIj1FiY3kn5nA_wMqHV3wvjqikjnk99kZ7v9G6I5Q,42928
@@ -26,28 +26,28 @@ celldetective/gui/configure_new_exp.py,sha256=vgT6ozRIGDvT3R0qENlqvDn17BpKnwyJRh
26
26
  celldetective/gui/control_panel.py,sha256=dMNzgivt6GdYROPlYpEY5TTNcANenm9ifUI3W3OcpOo,24337
27
27
  celldetective/gui/dynamic_progress.py,sha256=wjTmDPy62qssY0zdteP3T9umIGGQk0UvebFIdn54CIc,16676
28
28
  celldetective/gui/event_annotator.py,sha256=JVd64Gch_qzXv29VJGAa2Ytk-WhxifZVgMK-hAxnGu4,41262
29
- celldetective/gui/generic_signal_plot.py,sha256=D3b6pG1yrSi8C2PPyYzK2yA6711CBBPRp5_OIrjayqs,49348
30
- celldetective/gui/gui_utils.py,sha256=t6SjEfjcaRH9a0TlbTGEiVRpCgocaCh4lgkIvRgRRwE,33497
29
+ celldetective/gui/generic_signal_plot.py,sha256=47kXIuMcnQXjeNEdzM_G1WbW9TL5eMSjHC9XgWXMly4,49492
30
+ celldetective/gui/gui_utils.py,sha256=l7P6emKVEciCRdmnbfYvJAhl0MnbT3QkL2zpSPuHRoY,34120
31
31
  celldetective/gui/interactions_block.py,sha256=34VaHFrdKsq1hYuXrosmpP15JU26dSfbyx4lyt1jxNg,28440
32
32
  celldetective/gui/interactive_timeseries_viewer.py,sha256=u_amAhLdEHRpYSRwPDtVm5v-JZIz0ANTcG4YGksX1Vo,16079
33
33
  celldetective/gui/json_readers.py,sha256=t5rhtIxACj0pdwLrnPs-QjyhQo3P25UGWGgOCIBhQxs,4572
34
34
  celldetective/gui/measure_annotator.py,sha256=ljNbsKmFXQk0R9zEfBZ6XfBHzFmlL7Gt6QyPHyqh08g,38357
35
35
  celldetective/gui/pair_event_annotator.py,sha256=9PT67-8FJxcL7lSDIAZcZmrW75G_R-fpRellMOsgets,128788
36
36
  celldetective/gui/plot_measurements.py,sha256=a_Mks-5XUTn2QEYih0PlXGp2lX3C34zuhK9ozzE1guM,56593
37
- celldetective/gui/plot_signals_ui.py,sha256=9VmA1yaTcNf1jY7drtK41R1q87dhEk7bXBCq_cQ94fs,28133
37
+ celldetective/gui/plot_signals_ui.py,sha256=fxgkUZ_m7jFTXOwdzfJdl8wt3n8RECny3n4Tpk-GE6w,29016
38
38
  celldetective/gui/preprocessing_block.py,sha256=cgUBv-eQBwfidK48-cTWJi0PS62wlXhsNLnsKhy6MQY,14967
39
39
  celldetective/gui/process_block.py,sha256=KVfXnC55EYGlgKVDXDSMGu_MZbxjbQaQz4Ulyl5iqSE,76881
40
40
  celldetective/gui/seg_model_loader.py,sha256=CqcyT1ZeQ27R54RmOHjAt1pfRwjtvS-Psw29PpFsT5A,23549
41
- celldetective/gui/survival_ui.py,sha256=IwdRm1gRvhkWdMtrQk04OIKKksW3NZSGYtZO_2GptrA,16034
42
- celldetective/gui/tableUI.py,sha256=kZP2lp9NwHtbWEqIyaDwohX42tRkhI0Hlf_8O5w5BD0,61267
43
- celldetective/gui/thresholds_gui.py,sha256=w6ke2TyIEi71LxbuFGz0UrwH8h21N_ESU-o6xq_NNKo,33346
41
+ celldetective/gui/survival_ui.py,sha256=YBtbkjXgJW4KLpRaFysJc_po4OjVcLyCmGSWKtMbjdk,17353
42
+ celldetective/gui/tableUI.py,sha256=8cHVKMgTHMWLf_2yxYo003FQ0TaN7Cf13rBKBZQtefQ,58989
43
+ celldetective/gui/thresholds_gui.py,sha256=KxPmCmoMGGwwHFwPWHCOr1wPTyOPR2d-zucuAvZfSqk,34783
44
44
  celldetective/gui/workers.py,sha256=WAtVxFEvHApBSAZMVyYsya_DHL_bYo8b57dbgUJQHc4,14890
45
45
  celldetective/gui/base/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
46
46
  celldetective/gui/base/channel_norm_generator.py,sha256=HJ57wBMdBIvca92V477T-aPuxvvC2aC5BDMssKSQKCQ,14592
47
47
  celldetective/gui/base/components.py,sha256=jNUsCU_QE7QUFR0_xEvEPFEBYolMJt7YXGUKMjF7uOE,8155
48
48
  celldetective/gui/base/feature_choice.py,sha256=n1T2fPoNLiTDS_6fa_GuGReDhBW11HdUrKy2RywotF8,2800
49
49
  celldetective/gui/base/figure_canvas.py,sha256=mSiIYvEfz7MYMgdPDf6RKSMpKN8FkeZL7lugDNnDpnM,2245
50
- celldetective/gui/base/list_widget.py,sha256=_WU3ZRU7UcJZIxm8qx_5HF7IK7dUu8IU1FY2AaW_qgo,4694
50
+ celldetective/gui/base/list_widget.py,sha256=APt7rCfMRRlFnHUwvwrwZGMTYM6M10zgu6uoHHsmmuA,4694
51
51
  celldetective/gui/base/styles.py,sha256=3Kz1eXw6OLr90wtErhK0KPJyJbyhAlqkniqm0JNGwFc,7407
52
52
  celldetective/gui/base/utils.py,sha256=KojauRKGM9XKNhaWn211p6mJNZWIHLH75yeLpDd7pvA,1103
53
53
  celldetective/gui/help/DL-segmentation-strategy.json,sha256=PZD9xXjrwbX3TiudHJPuvcyZD28o4k-fVgeTd7dBKzI,1583
@@ -74,7 +74,7 @@ celldetective/gui/settings/_event_detection_model_params.py,sha256=f3jkh6f3oE-_5
74
74
  celldetective/gui/settings/_segmentation_model_params.py,sha256=YooEXRlkmOlHCyReiFynagrxBQn2y-dTB0FgowqZno0,6471
75
75
  celldetective/gui/settings/_settings_base.py,sha256=_Yfq6vLkwm4FW5n0-SjVQjdhfL3hR5pUGBc0ttq_YXE,2576
76
76
  celldetective/gui/settings/_settings_event_model_training.py,sha256=hpA5DTCPIMe1aVZDqO_6FudEP3a-IO6SVPfys-gdfXY,30346
77
- celldetective/gui/settings/_settings_measurements.py,sha256=nrVR1dG3B7iyJayRql1yierhKvgXZiu6qVtfkxI1ABA,47947
77
+ celldetective/gui/settings/_settings_measurements.py,sha256=C2jDTeB_M5RgSQT4MhepoHl_s5isxUoJyC3AbEqAmzs,48341
78
78
  celldetective/gui/settings/_settings_neighborhood.py,sha256=ws6H99bKU4NYd2IYyaJj7g9-MScr5W6UB2raP88ytfE,23767
79
79
  celldetective/gui/settings/_settings_segmentation.py,sha256=6DihD1mk-dN4Sstdth1iJ-0HR34rTVlTHP-pXUh_rY0,1901
80
80
  celldetective/gui/settings/_settings_segmentation_model_training.py,sha256=g-y5ZTZDwGaaevm6eI3XK_QU8PbZOY0jBdFyb1kAsqA,30440
@@ -92,7 +92,7 @@ celldetective/gui/viewers/base_viewer.py,sha256=Wn4na79xRL1R6PSXIoE_UabxJNtNQ-Y5
92
92
  celldetective/gui/viewers/channel_offset_viewer.py,sha256=cywBkxyMPyKIuwZTGA03DBSS4a-H1SAohMJYOPISLEE,16289
93
93
  celldetective/gui/viewers/contour_viewer.py,sha256=riHj03LKXLoa-Ys2o2EhCE5nULfcHMohx9LFoXbI6zU,14720
94
94
  celldetective/gui/viewers/size_viewer.py,sha256=uXITjaxg5dhQ09Q6TNUxwLxi-ZglyGFcxEH1RtGIZWw,6020
95
- celldetective/gui/viewers/spot_detection_viewer.py,sha256=JO7kcqATHXR91lLvo8aQ5xVYdtxkMxV-xx36s01VlNQ,12545
95
+ celldetective/gui/viewers/spot_detection_viewer.py,sha256=JSo6tpb7qBxGjUzUXQ-Zi4uts74eVZ2gxUdD67yhQ4A,17195
96
96
  celldetective/gui/viewers/threshold_viewer.py,sha256=F-13JF2wFhyvvKfUvgRcSjWL3leAliOXy5yUergndnE,12000
97
97
  celldetective/icons/logo-large.png,sha256=FXSwV3u6zEKcfpuSn4unnqB0oUnN9cHqQ9BCKWytrpg,36631
98
98
  celldetective/icons/logo.png,sha256=wV2OS8_dU5Td5cgdPbCOU3JpMpTwNuYLnfVcnQX0tJA,2437
@@ -141,7 +141,7 @@ celldetective/scripts/train_segmentation_model.py,sha256=IKZGXf8i74xrc-wQ_oGgdE3
141
141
  celldetective/scripts/train_signal_model.py,sha256=RFSnwdj3yBhqs-4wbF83ezsuZEIIZhdRFrMlUwtVHV0,3726
142
142
  celldetective/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
143
143
  celldetective/utils/color_mappings.py,sha256=yarqOTSrTsnOPPiPrrN_vLoPCbgWqF3wjqFwpbp-KsU,1007
144
- celldetective/utils/data_cleaning.py,sha256=K-2gScxLreX7QkrM0h3dZdP0IsmvCzcxNh2-M9PALZY,22025
144
+ celldetective/utils/data_cleaning.py,sha256=xsRRZhxzJI78K8IOB2tPxdKf0BuA8318lRChtjOerAE,22309
145
145
  celldetective/utils/data_loaders.py,sha256=6Jg99U93qYjjs2xZErc2cz37tcH5e4vEqDH8PJgoEJs,17077
146
146
  celldetective/utils/dataset_helpers.py,sha256=3ezpHO6nytw2Mx0D3maP_4535V2ohOTQn6Qpfk8gnms,6898
147
147
  celldetective/utils/downloaders.py,sha256=o5sogEeYr-LR8mp1D7uNHH1aUJN3V82VVwYZvoSNTkQ,9506
@@ -167,19 +167,19 @@ celldetective/utils/event_detection/__init__.py,sha256=GvsdyQLMTXJj1S_FfRXjrpOxE
167
167
  celldetective/utils/plots/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
168
168
  celldetective/utils/plots/regression.py,sha256=oUCn29-hp7PxMqC-R0yoL60KMw5ZWpZAIoCDh2ErlcY,1764
169
169
  celldetective/utils/stardist_utils/__init__.py,sha256=SY2kxFNXSRjXN4ncs3heDdXT3UNk8M3dELJQySysAf4,4231
170
- celldetective-1.5.0b8.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
170
+ celldetective-1.5.0b10.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
171
171
  tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
172
172
  tests/test_cellpose_fallback.py,sha256=BJZTDFF8sFR1x7rDbvZQ2RQOB1OP6wuFBRfc8zbl5zw,3513
173
173
  tests/test_events.py,sha256=eLFwwEEJfQAdwhews3-fn1HSvzozcNNFN_Qn0gOvQkE,685
174
174
  tests/test_filters.py,sha256=uj4NVyUnKXa18EpTSiWCetGKI1VFopDyNSJSUxX44wA,1689
175
175
  tests/test_io.py,sha256=gk5FmoI7ANEczUtNXYRxc48KzkfYzemwS_eYaLq4_NI,2093
176
- tests/test_measure.py,sha256=FEUAs1rVHylvIvubCb0bJDNGZLVmkgXNgI3NaGQ1dA8,4542
176
+ tests/test_measure.py,sha256=YAvSr9nhLB3svDtqHTn7HDpcnYDfsZ5owYs7f_SHcDw,7459
177
177
  tests/test_neighborhood.py,sha256=gk5FmoI7ANEczUtNXYRxc48KzkfYzemwS_eYaLq4_NI,2093
178
178
  tests/test_notebooks.py,sha256=7HVmYiytsz0QIJ11iRkGGs4_hzNjofXAUs_OZou3Gm0,301
179
179
  tests/test_partial_install.py,sha256=G69-GNcJ9YNgs6K2bVTEZO0Jpb14xMRQWTm8A6VuIco,2841
180
180
  tests/test_preprocessing.py,sha256=c0rKS9d5h37uDcV7fVOTnn5GMVbEB84b8ZTCTdRmvFs,1422
181
181
  tests/test_segmentation.py,sha256=k1b_zIZdlytEdJcHjAUQEO3gTBAHtv5WvrwQN2xD4kc,3470
182
- tests/test_signals.py,sha256=DWDRGpw_k2VE5pWnqJexsa313YEi8c2KzC51DFzykco,3641
182
+ tests/test_signals.py,sha256=upfhDyQMquOOKuYf7a34TglimHK74oYWQ9RyuK7Mg7c,4285
183
183
  tests/test_tracking.py,sha256=_YLjwQ3EChQssoHDfEnUJ7fI1yC5KEcJsFnAVR64L70,18909
184
184
  tests/test_utils.py,sha256=aSB_eMw9fzTsnxxdYoNmdQQRrXkWqBXB7Uv4TGU6kYE,4778
185
185
  tests/gui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -187,8 +187,9 @@ tests/gui/test_enhancements.py,sha256=3x9au_rkQtMZ94DRj3OaEHKPr511RrWqBAUAcNQn1y
187
187
  tests/gui/test_measure_annotator_bugfix.py,sha256=tPfgWNKC0UkvrVssSrUcVDC1qgpzx6l2yCqvKtKYkM4,4544
188
188
  tests/gui/test_new_project.py,sha256=wRjW2vEaZb0LWT-f8G8-Ptk8CW9z8-FDPLpV5uqj6ck,8778
189
189
  tests/gui/test_project.py,sha256=KzAnodIc0Ovta0ARL5Kr5PkOR5euA6qczT_GhEZpyE4,4710
190
- celldetective-1.5.0b8.dist-info/METADATA,sha256=hUsQY-GrHvD70Htr2XKBXkJlHwv3B4dBe5hQ9sFQonw,11523
191
- celldetective-1.5.0b8.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
192
- celldetective-1.5.0b8.dist-info/entry_points.txt,sha256=2NU6_EOByvPxqBbCvjwxlVlvnQreqZ3BKRCVIKEv3dg,62
193
- celldetective-1.5.0b8.dist-info/top_level.txt,sha256=6rsIKKfGMKgud7HPuATcpq6EhdXwcg_yknBVWn9x4C4,20
194
- celldetective-1.5.0b8.dist-info/RECORD,,
190
+ tests/gui/test_spot_detection_viewer.py,sha256=mCEsfTAJb5W5IeLyQmaZXq9Sjr8ehCI552RkiCEQvLw,13355
191
+ celldetective-1.5.0b10.dist-info/METADATA,sha256=U95LVqETyItm4fg_WN8Dtv6djrbxjjrUAZ7siFYHehM,11524
192
+ celldetective-1.5.0b10.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
193
+ celldetective-1.5.0b10.dist-info/entry_points.txt,sha256=2NU6_EOByvPxqBbCvjwxlVlvnQreqZ3BKRCVIKEv3dg,62
194
+ celldetective-1.5.0b10.dist-info/top_level.txt,sha256=6rsIKKfGMKgud7HPuATcpq6EhdXwcg_yknBVWn9x4C4,20
195
+ celldetective-1.5.0b10.dist-info/RECORD,,