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.
- celldetective/_version.py +1 -1
- celldetective/gui/base/list_widget.py +1 -1
- celldetective/gui/generic_signal_plot.py +14 -14
- celldetective/gui/gui_utils.py +27 -6
- celldetective/gui/plot_signals_ui.py +32 -15
- celldetective/gui/settings/_settings_measurements.py +10 -2
- celldetective/gui/survival_ui.py +39 -11
- celldetective/gui/tableUI.py +69 -148
- celldetective/gui/thresholds_gui.py +45 -5
- celldetective/gui/viewers/spot_detection_viewer.py +150 -27
- celldetective/measure.py +11 -11
- celldetective/utils/data_cleaning.py +7 -3
- {celldetective-1.5.0b8.dist-info → celldetective-1.5.0b10.dist-info}/METADATA +1 -1
- {celldetective-1.5.0b8.dist-info → celldetective-1.5.0b10.dist-info}/RECORD +21 -20
- tests/gui/test_spot_detection_viewer.py +394 -0
- tests/test_measure.py +231 -129
- tests/test_signals.py +131 -112
- {celldetective-1.5.0b8.dist-info → celldetective-1.5.0b10.dist-info}/WHEEL +0 -0
- {celldetective-1.5.0b8.dist-info → celldetective-1.5.0b10.dist-info}/entry_points.txt +0 -0
- {celldetective-1.5.0b8.dist-info → celldetective-1.5.0b10.dist-info}/licenses/LICENSE +0 -0
- {celldetective-1.5.0b8.dist-info → celldetective-1.5.0b10.dist-info}/top_level.txt +0 -0
|
@@ -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
|
|
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(
|
|
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(
|
|
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.
|
|
302
|
+
self.settings_layout.addLayout(channel_layout)
|
|
235
303
|
|
|
236
|
-
self.
|
|
237
|
-
self.
|
|
238
|
-
|
|
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(
|
|
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.
|
|
362
|
+
self.settings_layout.addLayout(spot_diam_layout)
|
|
281
363
|
|
|
282
364
|
spot_thresh_layout = QHBoxLayout()
|
|
283
|
-
spot_thresh_layout.setContentsMargins(
|
|
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.
|
|
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.
|
|
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
|
-
|
|
439
|
-
|
|
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
|
-
|
|
462
|
-
|
|
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
|
-
|
|
253
|
-
|
|
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,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=
|
|
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=
|
|
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=
|
|
30
|
-
celldetective/gui/gui_utils.py,sha256=
|
|
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=
|
|
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=
|
|
42
|
-
celldetective/gui/tableUI.py,sha256=
|
|
43
|
-
celldetective/gui/thresholds_gui.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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.
|
|
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=
|
|
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=
|
|
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
|
-
|
|
191
|
-
celldetective-1.5.
|
|
192
|
-
celldetective-1.5.
|
|
193
|
-
celldetective-1.5.
|
|
194
|
-
celldetective-1.5.
|
|
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,,
|