celldetective 1.3.7.post2__tar.gz → 1.3.8__tar.gz
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-1.3.7.post2 → celldetective-1.3.8}/PKG-INFO +1 -1
- celldetective-1.3.8/celldetective/_version.py +1 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/btrack_options.py +8 -8
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/classifier_widget.py +8 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/configure_new_exp.py +1 -1
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/json_readers.py +2 -4
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/plot_signals_ui.py +38 -29
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/process_block.py +1 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/processes/segment_cells.py +50 -23
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/seg_model_loader.py +71 -25
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/signal_annotator2.py +10 -7
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/signal_annotator_options.py +1 -1
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/tableUI.py +252 -20
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/viewers.py +1 -1
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/io.py +28 -20
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/segmentation.py +48 -1
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/signals.py +43 -13
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/tracking.py +7 -2
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/utils.py +1 -1
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective.egg-info/PKG-INFO +1 -1
- celldetective-1.3.7.post2/celldetective/_version.py +0 -1
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/LICENSE +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/README.md +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/__init__.py +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/__main__.py +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/datasets/segmentation_annotations/blank +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/datasets/signal_annotations/blank +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/events.py +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/extra_properties.py +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/filters.py +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/InitWindow.py +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/__init__.py +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/about.py +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/analyze_block.py +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/control_panel.py +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/generic_signal_plot.py +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/gui_utils.py +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/help/DL-segmentation-strategy.json +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/help/Threshold-vs-DL.json +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/help/cell-populations.json +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/help/exp-structure.json +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/help/feature-btrack.json +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/help/neighborhood.json +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/help/prefilter-for-segmentation.json +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/help/preprocessing.json +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/help/propagate-classification.json +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/help/track-postprocessing.json +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/help/tracking.json +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/layouts.py +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/measurement_options.py +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/neighborhood_options.py +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/plot_measurements.py +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/processes/downloader.py +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/processes/measure_cells.py +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/processes/track_cells.py +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/processes/train_segmentation_model.py +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/processes/train_signal_model.py +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/retrain_segmentation_model_options.py +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/retrain_signal_model_options.py +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/signal_annotator.py +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/styles.py +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/survival_ui.py +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/thresholds_gui.py +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/workers.py +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/icons/logo-large.png +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/icons/logo.png +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/icons/signals_icon.png +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/icons/splash-test.png +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/icons/splash.png +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/icons/splash0.png +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/icons/survival2.png +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/icons/vignette_signals2.png +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/icons/vignette_signals2.svg +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/links/zenodo.json +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/measure.py +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/models/pair_signal_detection/blank +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/models/segmentation_effectors/blank +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/models/segmentation_effectors/ricm_bf_all_last/config_input.json +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/models/segmentation_effectors/ricm_bf_all_last/ricm_bf_all_last +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/models/segmentation_effectors/ricm_bf_all_last/training_instructions.json +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/models/segmentation_effectors/test-transfer/config_input.json +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/models/segmentation_effectors/test-transfer/test-transfer +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/models/segmentation_generic/blank +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/models/segmentation_targets/blank +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/models/signal_detection/blank +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/models/tracking_configs/biased_motion.json +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/models/tracking_configs/mcf7.json +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/models/tracking_configs/no_z_motion.json +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/models/tracking_configs/ricm.json +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/models/tracking_configs/ricm2.json +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/neighborhood.py +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/preprocessing.py +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/relative_measurements.py +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/scripts/analyze_signals.py +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/scripts/measure_cells.py +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/scripts/measure_relative.py +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/scripts/segment_cells.py +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/scripts/segment_cells_thresholds.py +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/scripts/track_cells.py +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/scripts/train_segmentation_model.py +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/scripts/train_signal_model.py +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective.egg-info/SOURCES.txt +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective.egg-info/dependency_links.txt +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective.egg-info/entry_points.txt +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective.egg-info/not-zip-safe +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective.egg-info/requires.txt +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective.egg-info/top_level.txt +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/setup.cfg +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/setup.py +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/tests/__init__.py +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/tests/test_events.py +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/tests/test_filters.py +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/tests/test_io.py +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/tests/test_measure.py +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/tests/test_neighborhood.py +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/tests/test_preprocessing.py +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/tests/test_qt.py +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/tests/test_segmentation.py +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/tests/test_signals.py +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/tests/test_tracking.py +0 -0
- {celldetective-1.3.7.post2 → celldetective-1.3.8}/tests/test_utils.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "1.3.8"
|
|
@@ -379,15 +379,15 @@ class ConfigTracking(QMainWindow, Styles):
|
|
|
379
379
|
clean_traj_sublayout.addWidget(self.extrapolate_post_checkbox)
|
|
380
380
|
clean_traj_sublayout.addWidget(self.extrapolate_pre_checkbox)
|
|
381
381
|
|
|
382
|
-
self.interpolate_na_features_checkbox = QCheckBox('Interpolate features of missed detections')
|
|
383
|
-
self.interpolate_na_features_checkbox.setIcon(icon(MDI6.format_color_fill,color="k"))
|
|
382
|
+
# self.interpolate_na_features_checkbox = QCheckBox('Interpolate features of missed detections')
|
|
383
|
+
# self.interpolate_na_features_checkbox.setIcon(icon(MDI6.format_color_fill,color="k"))
|
|
384
384
|
|
|
385
|
-
clean_traj_sublayout.addWidget(self.interpolate_na_features_checkbox)
|
|
385
|
+
# clean_traj_sublayout.addWidget(self.interpolate_na_features_checkbox)
|
|
386
386
|
clean_traj_sublayout.addStretch()
|
|
387
387
|
|
|
388
388
|
self.post_proc_options_to_disable = [self.post_proc_lbl, self.min_tracklength_slider, self.remove_not_in_first_checkbox,
|
|
389
389
|
self.remove_not_in_last_checkbox, self.interpolate_gaps_checkbox, self.extrapolate_post_checkbox,
|
|
390
|
-
self.extrapolate_pre_checkbox
|
|
390
|
+
self.extrapolate_pre_checkbox] #, self.interpolate_na_features_checkbox
|
|
391
391
|
|
|
392
392
|
layout.addLayout(clean_traj_sublayout)
|
|
393
393
|
|
|
@@ -898,7 +898,7 @@ class ConfigTracking(QMainWindow, Styles):
|
|
|
898
898
|
"interpolate_position_gaps": self.interpolate_gaps_checkbox.isChecked(),
|
|
899
899
|
"extrapolate_tracks_pre": self.extrapolate_pre_checkbox.isChecked(),
|
|
900
900
|
"extrapolate_tracks_post": self.extrapolate_post_checkbox.isChecked(),
|
|
901
|
-
'interpolate_na': self.interpolate_na_features_checkbox.isChecked()
|
|
901
|
+
'interpolate_na': False, #self.interpolate_na_features_checkbox.isChecked()
|
|
902
902
|
}
|
|
903
903
|
else:
|
|
904
904
|
|
|
@@ -1044,7 +1044,7 @@ class ConfigTracking(QMainWindow, Styles):
|
|
|
1044
1044
|
self.uncheck_post_proc()
|
|
1045
1045
|
self.ContentsPostProc.hide()
|
|
1046
1046
|
for element in [self.remove_not_in_last_checkbox, self.remove_not_in_first_checkbox, self.interpolate_gaps_checkbox,
|
|
1047
|
-
self.extrapolate_post_checkbox, self.extrapolate_pre_checkbox
|
|
1047
|
+
self.extrapolate_post_checkbox, self.extrapolate_pre_checkbox]: #self.interpolate_na_features_checkbox
|
|
1048
1048
|
element.setChecked(False)
|
|
1049
1049
|
self.min_tracklength_slider.setValue(0)
|
|
1050
1050
|
|
|
@@ -1063,8 +1063,8 @@ class ConfigTracking(QMainWindow, Styles):
|
|
|
1063
1063
|
self.extrapolate_pre_checkbox.setChecked(post_processing_options["extrapolate_tracks_pre"])
|
|
1064
1064
|
if "extrapolate_tracks_post" in post_processing_options:
|
|
1065
1065
|
self.extrapolate_post_checkbox.setChecked(post_processing_options["extrapolate_tracks_post"])
|
|
1066
|
-
if "interpolate_na" in post_processing_options:
|
|
1067
|
-
|
|
1066
|
+
# if "interpolate_na" in post_processing_options:
|
|
1067
|
+
# self.interpolate_na_features_checkbox.setChecked(post_processing_options["interpolate_na"])
|
|
1068
1068
|
|
|
1069
1069
|
def locate_image(self):
|
|
1070
1070
|
|
|
@@ -212,6 +212,8 @@ class ClassifierWidget(QWidget, Styles):
|
|
|
212
212
|
self.frame_slider.valueChanged.connect(self.set_frame)
|
|
213
213
|
self.alpha_slider.valueChanged.connect(self.set_transparency)
|
|
214
214
|
|
|
215
|
+
self.setAttribute(Qt.WA_DeleteOnClose)
|
|
216
|
+
|
|
215
217
|
def activate_prereq_cb(self):
|
|
216
218
|
if self.prereq_event_check.isChecked():
|
|
217
219
|
self.prereq_event_cb.setEnabled(True)
|
|
@@ -276,6 +278,12 @@ class ClassifierWidget(QWidget, Styles):
|
|
|
276
278
|
self.propscanvas.canvas.draw_idle()
|
|
277
279
|
self.propscanvas.canvas.setMinimumHeight(self.screen_height//5)
|
|
278
280
|
|
|
281
|
+
def closeEvent(self, event):
|
|
282
|
+
self.ax_props.cla()
|
|
283
|
+
self.fig_props.clf()
|
|
284
|
+
plt.close(self.fig_props)
|
|
285
|
+
super().closeEvent(event)
|
|
286
|
+
|
|
279
287
|
def update_props_scatter(self, feature_changed=True):
|
|
280
288
|
|
|
281
289
|
try:
|
|
@@ -429,7 +429,7 @@ class ConfigNewExperiment(QMainWindow, Styles):
|
|
|
429
429
|
Write all user input parameters to a configuration file associated to an experiment.
|
|
430
430
|
"""
|
|
431
431
|
|
|
432
|
-
config = ConfigParser()
|
|
432
|
+
config = ConfigParser(interpolation=None)
|
|
433
433
|
|
|
434
434
|
# add a new section and some values
|
|
435
435
|
config.add_section('MovieSettings')
|
|
@@ -49,7 +49,7 @@ class ConfigEditor(QWidget, Styles):
|
|
|
49
49
|
file_name = self.config_path
|
|
50
50
|
#self.file_edit.setText(file_name)
|
|
51
51
|
|
|
52
|
-
config = configparser.ConfigParser()
|
|
52
|
+
config = configparser.ConfigParser(interpolation=None)
|
|
53
53
|
config.read(file_name)
|
|
54
54
|
|
|
55
55
|
# Create a layout for each section of the config file
|
|
@@ -93,12 +93,10 @@ class ConfigEditor(QWidget, Styles):
|
|
|
93
93
|
# Save the configuration to the file
|
|
94
94
|
file_name = self.config_path
|
|
95
95
|
|
|
96
|
-
config = configparser.ConfigParser()
|
|
96
|
+
config = configparser.ConfigParser(interpolation=None)
|
|
97
97
|
|
|
98
98
|
# Update the values in the config object
|
|
99
99
|
|
|
100
|
-
|
|
101
|
-
|
|
102
100
|
for key, (section, edit_box) in self.sections.items():
|
|
103
101
|
if not config.has_section(section):
|
|
104
102
|
config.add_section(section)
|
|
@@ -117,7 +117,10 @@ class ConfigSignalPlot(QWidget, Styles):
|
|
|
117
117
|
all_cms = list(colormaps)
|
|
118
118
|
for cm in all_cms:
|
|
119
119
|
if hasattr(matplotlib.cm, str(cm).lower()):
|
|
120
|
-
|
|
120
|
+
try:
|
|
121
|
+
self.cbs[-1].addColormap(cm.lower())
|
|
122
|
+
except:
|
|
123
|
+
pass
|
|
121
124
|
|
|
122
125
|
self.cbs[0].setCurrentIndex(1)
|
|
123
126
|
self.cbs[0].setCurrentIndex(0)
|
|
@@ -138,13 +141,14 @@ class ConfigSignalPlot(QWidget, Styles):
|
|
|
138
141
|
self.abs_time_checkbox.stateChanged.connect(self.switch_ref_time_mode)
|
|
139
142
|
|
|
140
143
|
select_layout = QHBoxLayout()
|
|
144
|
+
select_layout.setContentsMargins(20,3,20,3)
|
|
141
145
|
select_layout.addWidget(QLabel('select cells\nwith query: '), 33)
|
|
142
146
|
self.query_le = QLineEdit()
|
|
143
147
|
select_layout.addWidget(self.query_le, 66)
|
|
144
148
|
main_layout.addLayout(select_layout)
|
|
145
149
|
|
|
146
150
|
time_calib_layout = QHBoxLayout()
|
|
147
|
-
time_calib_layout.setContentsMargins(20,
|
|
151
|
+
time_calib_layout.setContentsMargins(20,3,20,3)
|
|
148
152
|
time_calib_layout.addWidget(QLabel('time calibration\n(frame to min)'), 33)
|
|
149
153
|
self.time_calibration_le = QLineEdit(str(self.FrameToMin).replace('.',','))
|
|
150
154
|
self.time_calibration_le.setValidator(self.float_validator)
|
|
@@ -152,6 +156,14 @@ class ConfigSignalPlot(QWidget, Styles):
|
|
|
152
156
|
#time_calib_layout.addWidget(QLabel(' min'))
|
|
153
157
|
main_layout.addLayout(time_calib_layout)
|
|
154
158
|
|
|
159
|
+
pool_layout = QHBoxLayout()
|
|
160
|
+
pool_layout.setContentsMargins(20,3,20,3)
|
|
161
|
+
self.pool_option_cb = QComboBox()
|
|
162
|
+
self.pool_option_cb.addItems(['mean','median'])
|
|
163
|
+
pool_layout.addWidget(QLabel('pool\nprojection:'), 33)
|
|
164
|
+
pool_layout.addWidget(self.pool_option_cb, 66)
|
|
165
|
+
main_layout.addLayout(pool_layout)
|
|
166
|
+
|
|
155
167
|
self.submit_btn = QPushButton('Submit')
|
|
156
168
|
self.submit_btn.setStyleSheet(self.button_style_sheet)
|
|
157
169
|
self.submit_btn.clicked.connect(self.process_signal)
|
|
@@ -271,9 +283,10 @@ class ConfigSignalPlot(QWidget, Styles):
|
|
|
271
283
|
self.feature_selected = self.feature_cb.currentText()
|
|
272
284
|
self.feature_choice_widget.close()
|
|
273
285
|
self.compute_signal_functions()
|
|
274
|
-
self.
|
|
275
|
-
|
|
276
|
-
|
|
286
|
+
if self.open_widget:
|
|
287
|
+
self.interpret_pos_location()
|
|
288
|
+
self.plot_window = GenericSignalPlotWidget(parent_window=self, df=self.df, df_pos_info = self.df_pos_info, df_well_info = self.df_well_info, feature_selected=self.feature_selected, title='plot signals')
|
|
289
|
+
self.plot_window.show()
|
|
277
290
|
|
|
278
291
|
def process_signal(self):
|
|
279
292
|
|
|
@@ -335,7 +348,19 @@ class ConfigSignalPlot(QWidget, Styles):
|
|
|
335
348
|
|
|
336
349
|
def compute_signal_functions(self):
|
|
337
350
|
|
|
338
|
-
#
|
|
351
|
+
# Check to move at the beginning
|
|
352
|
+
self.open_widget = True
|
|
353
|
+
if len(self.time_columns)==0:
|
|
354
|
+
msgBox = QMessageBox()
|
|
355
|
+
msgBox.setIcon(QMessageBox.Warning)
|
|
356
|
+
msgBox.setText("No synchronizing time is available...")
|
|
357
|
+
msgBox.setWindowTitle("Warning")
|
|
358
|
+
msgBox.setStandardButtons(QMessageBox.Ok)
|
|
359
|
+
returnValue = msgBox.exec()
|
|
360
|
+
if returnValue == QMessageBox.Ok:
|
|
361
|
+
pass
|
|
362
|
+
self.open_widget = False
|
|
363
|
+
return None
|
|
339
364
|
|
|
340
365
|
# Per position signal
|
|
341
366
|
max_time = int(self.df.FRAME.max()) + 1
|
|
@@ -346,9 +371,9 @@ class ConfigSignalPlot(QWidget, Styles):
|
|
|
346
371
|
|
|
347
372
|
for block,movie_group in self.df.groupby(['well','position']):
|
|
348
373
|
|
|
349
|
-
well_signal_mean, well_std_mean, timeline_all, matrix_all = mean_signal(movie_group, self.feature_selected, class_col, time_col=time_col, class_value=None, return_matrix=True, forced_max_duration=max_time)
|
|
350
|
-
well_signal_event, well_std_event, timeline_event, matrix_event = mean_signal(movie_group, self.feature_selected, class_col, time_col=time_col, class_value=[0], return_matrix=True, forced_max_duration=max_time)
|
|
351
|
-
well_signal_no_event, well_std_no_event, timeline_no_event, matrix_no_event = mean_signal(movie_group, self.feature_selected, class_col, time_col=time_col, class_value=[1], return_matrix=True, forced_max_duration=max_time)
|
|
374
|
+
well_signal_mean, well_std_mean, timeline_all, matrix_all = mean_signal(movie_group, self.feature_selected, class_col, time_col=time_col, class_value=None, return_matrix=True, forced_max_duration=max_time, projection=self.pool_option_cb.currentText())
|
|
375
|
+
well_signal_event, well_std_event, timeline_event, matrix_event = mean_signal(movie_group, self.feature_selected, class_col, time_col=time_col, class_value=[0], return_matrix=True, forced_max_duration=max_time, projection=self.pool_option_cb.currentText())
|
|
376
|
+
well_signal_no_event, well_std_no_event, timeline_no_event, matrix_no_event = mean_signal(movie_group, self.feature_selected, class_col, time_col=time_col, class_value=[1], return_matrix=True, forced_max_duration=max_time, projection=self.pool_option_cb.currentText())
|
|
352
377
|
self.mean_plots_timeline = timeline_all
|
|
353
378
|
|
|
354
379
|
self.df_pos_info.loc[self.df_pos_info['pos_path'] == block[1], 'signal'] = [
|
|
@@ -361,9 +386,9 @@ class ConfigSignalPlot(QWidget, Styles):
|
|
|
361
386
|
# Per well
|
|
362
387
|
for well,well_group in self.df.groupby('well'):
|
|
363
388
|
|
|
364
|
-
well_signal_mean, well_std_mean, timeline_all, matrix_all = mean_signal(well_group, self.feature_selected, class_col, time_col=time_col, class_value=None, return_matrix=True, forced_max_duration=max_time)
|
|
365
|
-
well_signal_event, well_std_event, timeline_event, matrix_event = mean_signal(well_group, self.feature_selected, class_col, time_col=time_col, class_value=[0], return_matrix=True, forced_max_duration=max_time)
|
|
366
|
-
well_signal_no_event, well_std_no_event, timeline_no_event, matrix_no_event = mean_signal(well_group, self.feature_selected, class_col, time_col=time_col, class_value=[1], return_matrix=True, forced_max_duration=max_time)
|
|
389
|
+
well_signal_mean, well_std_mean, timeline_all, matrix_all = mean_signal(well_group, self.feature_selected, class_col, time_col=time_col, class_value=None, return_matrix=True, forced_max_duration=max_time, projection=self.pool_option_cb.currentText())
|
|
390
|
+
well_signal_event, well_std_event, timeline_event, matrix_event = mean_signal(well_group, self.feature_selected, class_col, time_col=time_col, class_value=[0], return_matrix=True, forced_max_duration=max_time, projection=self.pool_option_cb.currentText())
|
|
391
|
+
well_signal_no_event, well_std_no_event, timeline_no_event, matrix_no_event = mean_signal(well_group, self.feature_selected, class_col, time_col=time_col, class_value=[1], return_matrix=True, forced_max_duration=max_time, projection=self.pool_option_cb.currentText())
|
|
367
392
|
|
|
368
393
|
self.df_well_info.loc[self.df_well_info['well_path']==well,'signal'] = [{'mean_all': well_signal_mean, 'std_all': well_std_mean,'matrix_all': matrix_all,'mean_event': well_signal_event, 'std_event': well_std_event,
|
|
369
394
|
'matrix_event': matrix_event,'mean_no_event': well_signal_no_event, 'std_no_event': well_std_no_event, 'matrix_no_event': matrix_no_event, 'timeline': self.mean_plots_timeline}]
|
|
@@ -418,23 +443,7 @@ class ConfigSignalPlot(QWidget, Styles):
|
|
|
418
443
|
cid+=1
|
|
419
444
|
except:
|
|
420
445
|
pass
|
|
421
|
-
return matrix
|
|
422
|
-
|
|
423
|
-
def col_mean(self, matrix):
|
|
424
|
-
|
|
425
|
-
mean_line = np.zeros(matrix.shape[1])
|
|
426
|
-
mean_line[:] = np.nan
|
|
427
|
-
std_line = np.copy(mean_line)
|
|
428
|
-
|
|
429
|
-
for k in range(matrix.shape[1]):
|
|
430
|
-
values = matrix[:,k]
|
|
431
|
-
#values = values[values!=0]
|
|
432
|
-
if len(values[values==values])>2:
|
|
433
|
-
mean_line[k] = np.nanmean(values)
|
|
434
|
-
std_line[k] = np.nanstd(values)
|
|
435
|
-
|
|
436
|
-
return mean_line, std_line
|
|
437
|
-
|
|
446
|
+
return matrix
|
|
438
447
|
|
|
439
448
|
def switch_ref_time_mode(self):
|
|
440
449
|
if self.abs_time_checkbox.isChecked():
|
|
@@ -1362,6 +1362,7 @@ class NeighPanel(QFrame, Styles):
|
|
|
1362
1362
|
self.pair_signal_models_list.addItems(signal_models)
|
|
1363
1363
|
|
|
1364
1364
|
def open_signal_annotator_configuration_ui(self):
|
|
1365
|
+
self.mode = 'pairs'
|
|
1365
1366
|
self.ConfigSignalAnnotator = ConfigSignalAnnotator(self)
|
|
1366
1367
|
self.ConfigSignalAnnotator.show()
|
|
1367
1368
|
|
{celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/processes/segment_cells.py
RENAMED
|
@@ -3,15 +3,17 @@ import time
|
|
|
3
3
|
import datetime
|
|
4
4
|
import os
|
|
5
5
|
import json
|
|
6
|
+
import numpy as np
|
|
6
7
|
from celldetective.io import extract_position_name, locate_segmentation_model, auto_load_number_of_frames, load_frames, _check_label_dims, _load_frames_to_segment
|
|
7
8
|
from celldetective.utils import _rescale_labels, _segment_image_with_stardist_model, _segment_image_with_cellpose_model, _prep_stardist_model, _prep_cellpose_model, _get_normalize_kwargs_from_config, extract_experiment_channels, _estimate_scale_factor, _extract_channel_indices_from_config, ConfigSectionMap, _extract_nbr_channels_from_config, _get_img_num_per_channel
|
|
9
|
+
|
|
8
10
|
from pathlib import Path, PurePath
|
|
9
11
|
from glob import glob
|
|
10
12
|
from shutil import rmtree
|
|
11
13
|
from tqdm import tqdm
|
|
12
14
|
import numpy as np
|
|
13
15
|
from csbdeep.io import save_tiff_imagej_compatible
|
|
14
|
-
from celldetective.segmentation import segment_frame_from_thresholds
|
|
16
|
+
from celldetective.segmentation import segment_frame_from_thresholds, merge_instance_segmentation
|
|
15
17
|
import gc
|
|
16
18
|
from art import tprint
|
|
17
19
|
|
|
@@ -232,6 +234,7 @@ class SegmentCellThresholdProcess(BaseSegmentProcess):
|
|
|
232
234
|
self.equalize = False
|
|
233
235
|
|
|
234
236
|
# Model
|
|
237
|
+
|
|
235
238
|
self.load_threshold_config()
|
|
236
239
|
self.extract_threshold_parameters()
|
|
237
240
|
self.detect_channels()
|
|
@@ -244,28 +247,41 @@ class SegmentCellThresholdProcess(BaseSegmentProcess):
|
|
|
244
247
|
|
|
245
248
|
def prepare_equalize(self):
|
|
246
249
|
|
|
247
|
-
|
|
248
|
-
f_reference = load_frames(self.img_num_channels[:,self.equalize_time], self.file, scale=None, normalize_input=False)
|
|
249
|
-
f_reference = f_reference[:,:,self.threshold_instructions['target_channel']]
|
|
250
|
-
else:
|
|
251
|
-
f_reference = None
|
|
250
|
+
for i in range(len(self.instructions)):
|
|
252
251
|
|
|
253
|
-
|
|
252
|
+
if self.equalize[i]:
|
|
253
|
+
f_reference = load_frames(self.img_num_channels[:,self.equalize_time[i]], self.file, scale=None, normalize_input=False)
|
|
254
|
+
f_reference = f_reference[:,:,self.instructions[i]['target_channel']]
|
|
255
|
+
else:
|
|
256
|
+
f_reference = None
|
|
257
|
+
|
|
258
|
+
self.instructions[i].update({'equalize_reference': f_reference})
|
|
254
259
|
|
|
255
260
|
def load_threshold_config(self):
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
261
|
+
|
|
262
|
+
self.instructions = []
|
|
263
|
+
for inst in self.threshold_instructions:
|
|
264
|
+
if os.path.exists(inst):
|
|
265
|
+
with open(inst, 'r') as f:
|
|
266
|
+
self.instructions.append(json.load(f))
|
|
267
|
+
else:
|
|
268
|
+
print('The configuration path is not valid. Abort.')
|
|
269
|
+
self.abort_process()
|
|
263
270
|
|
|
264
271
|
def extract_threshold_parameters(self):
|
|
265
272
|
|
|
266
|
-
self.required_channels = [
|
|
267
|
-
|
|
268
|
-
|
|
273
|
+
self.required_channels = []
|
|
274
|
+
self.equalize = []
|
|
275
|
+
self.equalize_time = []
|
|
276
|
+
|
|
277
|
+
for i in range(len(self.instructions)):
|
|
278
|
+
ch = [self.instructions[i]['target_channel']]
|
|
279
|
+
self.required_channels.append(ch)
|
|
280
|
+
|
|
281
|
+
if 'equalize_reference' in self.instructions[i]:
|
|
282
|
+
equalize, equalize_time = self.instructions[i]['equalize_reference']
|
|
283
|
+
self.equalize.append(equalize)
|
|
284
|
+
self.equalize_time.append(equalize_time)
|
|
269
285
|
|
|
270
286
|
def write_log(self):
|
|
271
287
|
|
|
@@ -276,12 +292,14 @@ class SegmentCellThresholdProcess(BaseSegmentProcess):
|
|
|
276
292
|
|
|
277
293
|
def detect_channels(self):
|
|
278
294
|
|
|
279
|
-
|
|
280
|
-
|
|
295
|
+
for i in range(len(self.instructions)):
|
|
296
|
+
|
|
297
|
+
self.channel_indices = _extract_channel_indices_from_config(self.config, self.required_channels[i])
|
|
298
|
+
print(f'Required channels: {self.required_channels[i]} located at channel indices {self.channel_indices}.')
|
|
299
|
+
self.instructions[i].update({'target_channel': self.channel_indices[0]})
|
|
300
|
+
self.instructions[i].update({'channel_names': self.channel_names})
|
|
281
301
|
|
|
282
302
|
self.img_num_channels = _get_img_num_per_channel(np.arange(self.nbr_channels), self.len_movie, self.nbr_channels)
|
|
283
|
-
self.threshold_instructions.update({'target_channel': self.channel_indices[0]})
|
|
284
|
-
self.threshold_instructions.update({'channel_names': self.channel_names})
|
|
285
303
|
|
|
286
304
|
def parallel_job(self, indices):
|
|
287
305
|
|
|
@@ -290,8 +308,16 @@ class SegmentCellThresholdProcess(BaseSegmentProcess):
|
|
|
290
308
|
for t in tqdm(indices,desc="frame"): #for t in tqdm(range(self.len_movie),desc="frame"):
|
|
291
309
|
|
|
292
310
|
# Load channels at time t
|
|
293
|
-
|
|
294
|
-
|
|
311
|
+
masks = []
|
|
312
|
+
for i in range(len(self.instructions)):
|
|
313
|
+
f = load_frames(self.img_num_channels[:,t], self.file, scale=None, normalize_input=False)
|
|
314
|
+
mask = segment_frame_from_thresholds(f, **self.instructions[i])
|
|
315
|
+
#print(f'Frame {t}; segment with {self.instructions[i]=}...')
|
|
316
|
+
masks.append(mask)
|
|
317
|
+
|
|
318
|
+
if len(self.instructions)>1:
|
|
319
|
+
mask = merge_instance_segmentation(masks, mode='OR')
|
|
320
|
+
|
|
295
321
|
save_tiff_imagej_compatible(os.sep.join([self.pos, self.label_folder, f"{str(t).zfill(4)}.tif"]), mask.astype(np.uint16), axes='YX')
|
|
296
322
|
|
|
297
323
|
del f;
|
|
@@ -308,6 +334,7 @@ class SegmentCellThresholdProcess(BaseSegmentProcess):
|
|
|
308
334
|
print(e)
|
|
309
335
|
|
|
310
336
|
return
|
|
337
|
+
|
|
311
338
|
|
|
312
339
|
def run(self):
|
|
313
340
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from PyQt5.QtWidgets import QWidget, QGridLayout, QVBoxLayout, QLabel, QLineEdit, QHBoxLayout, QRadioButton, QFileDialog, QPushButton, QMessageBox
|
|
1
|
+
from PyQt5.QtWidgets import QWidget, QGridLayout, QComboBox, QVBoxLayout, QLabel, QLineEdit, QHBoxLayout, QRadioButton, QFileDialog, QPushButton, QMessageBox
|
|
2
2
|
from PyQt5.QtCore import Qt, QSize
|
|
3
3
|
from celldetective.gui.gui_utils import center_window
|
|
4
4
|
from celldetective.gui.layouts import ChannelNormGenerator
|
|
@@ -79,13 +79,24 @@ class SegmentationModelLoader(QWidget, Styles):
|
|
|
79
79
|
self.layout.addWidget(self.open_dialog_button, 9, 0, 1, 1)
|
|
80
80
|
self.layout.addWidget(self.file_label, 9, 1, 1, 1)
|
|
81
81
|
|
|
82
|
+
|
|
83
|
+
self.merge_lbl = QLabel('Merging option: ')
|
|
84
|
+
self.merge_cb = QComboBox()
|
|
85
|
+
self.merge_cb.addItems(['OR'])
|
|
86
|
+
merge_hbox = QHBoxLayout()
|
|
87
|
+
merge_hbox.addWidget(self.merge_lbl, 33)
|
|
88
|
+
merge_hbox.addWidget(self.merge_cb, 66)
|
|
89
|
+
self.layout.addLayout(merge_hbox, 10, 0, 1, 2)
|
|
90
|
+
self.merge_lbl.hide()
|
|
91
|
+
self.merge_cb.hide()
|
|
92
|
+
|
|
82
93
|
self.upload_button = QPushButton("Upload")
|
|
83
94
|
self.upload_button.clicked.connect(self.upload_model)
|
|
84
95
|
self.upload_button.setIcon(icon(MDI6.upload,color="white"))
|
|
85
96
|
self.upload_button.setIconSize(QSize(25, 25))
|
|
86
97
|
self.upload_button.setStyleSheet(self.button_style_sheet)
|
|
87
98
|
self.upload_button.setEnabled(False)
|
|
88
|
-
self.layout.addWidget(self.upload_button,
|
|
99
|
+
self.layout.addWidget(self.upload_button, 11, 0, 1, 1)
|
|
89
100
|
|
|
90
101
|
self.base_block_options = [self.calibration_label, self.spatial_calib_le,*self.channel_layout.channel_cbs,*self.channel_layout.channel_labels,*self.channel_layout.normalization_mode_btns, *self.channel_layout.normalization_clip_btns, *self.channel_layout.normalization_min_value_lbl,
|
|
91
102
|
*self.channel_layout.normalization_min_value_le, *self.channel_layout.normalization_max_value_lbl,*self.channel_layout.normalization_max_value_le,
|
|
@@ -207,41 +218,73 @@ class SegmentationModelLoader(QWidget, Styles):
|
|
|
207
218
|
self.file_dialog.setFileMode(QFileDialog.ExistingFile)
|
|
208
219
|
|
|
209
220
|
# If accepted check validity of data
|
|
210
|
-
if self.
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
221
|
+
if self.seg_mode!='threshold':
|
|
222
|
+
if self.file_dialog.exec_() == QFileDialog.Accepted:
|
|
223
|
+
self.filename = self.file_dialog.selectedFiles()[0]
|
|
224
|
+
if self.seg_mode=="stardist":
|
|
225
|
+
subfiles = glob(self.filename+"/*")
|
|
226
|
+
subfiles = [s.replace('\\','/') for s in subfiles]
|
|
227
|
+
if self.filename+"/thresholds.json" in subfiles:
|
|
228
|
+
self.file_label.setText(self.filename.split("/")[-1])
|
|
229
|
+
self.modelname = self.filename.split("/")[-1]
|
|
230
|
+
self.destination = os.path.split(os.path.dirname(os.path.realpath(__file__)))[0]+f"/models/{self.target_folder}/"+self.modelname
|
|
231
|
+
self.folder_dest = self.destination
|
|
232
|
+
else:
|
|
233
|
+
msgBox = QMessageBox()
|
|
234
|
+
msgBox.setIcon(QMessageBox.Warning)
|
|
235
|
+
msgBox.setText("StarDist model not recognized... Please ensure that it contains a thresholds.json file or that it is a valid StarDist model...")
|
|
236
|
+
msgBox.setWindowTitle("Warning")
|
|
237
|
+
msgBox.setStandardButtons(QMessageBox.Ok)
|
|
238
|
+
returnValue = msgBox.exec()
|
|
239
|
+
if returnValue == QMessageBox.Ok:
|
|
240
|
+
return None
|
|
241
|
+
|
|
242
|
+
if self.seg_mode=="cellpose":
|
|
216
243
|
self.file_label.setText(self.filename.split("/")[-1])
|
|
217
244
|
self.modelname = self.filename.split("/")[-1]
|
|
218
|
-
|
|
219
|
-
self.folder_dest = self.
|
|
245
|
+
print(f"Transferring Cellpose model {self.filename}...")
|
|
246
|
+
self.folder_dest = os.path.split(os.path.dirname(os.path.realpath(__file__)))[0]+f"/models/{self.target_folder}/"+self.modelname
|
|
247
|
+
self.destination = self.folder_dest+f"/{self.modelname}"
|
|
248
|
+
|
|
249
|
+
else:
|
|
250
|
+
self.filename, _ = QFileDialog.getOpenFileNames(
|
|
251
|
+
None,
|
|
252
|
+
"Load threshold configuration(s)...",
|
|
253
|
+
"",
|
|
254
|
+
"Json Configs (*.json)",
|
|
255
|
+
)
|
|
256
|
+
if self.filename:
|
|
257
|
+
n_files = len(self.filename)
|
|
258
|
+
print(f'You loaded {n_files} threshold configuration files...')
|
|
259
|
+
for i,filename in enumerate(self.filename):
|
|
260
|
+
print(f"Config {i}: ",filename,"...")
|
|
261
|
+
|
|
262
|
+
if n_files==1:
|
|
263
|
+
self.merge_cb.hide()
|
|
264
|
+
self.merge_lbl.hide()
|
|
265
|
+
self.file_label.setText(self.filename[0].split("/")[-1])
|
|
220
266
|
else:
|
|
221
267
|
msgBox = QMessageBox()
|
|
222
268
|
msgBox.setIcon(QMessageBox.Warning)
|
|
223
|
-
msgBox.setText("
|
|
269
|
+
msgBox.setText("You selected more than one pipeline. Please set a merging procedure for the resulting masks...")
|
|
224
270
|
msgBox.setWindowTitle("Warning")
|
|
225
271
|
msgBox.setStandardButtons(QMessageBox.Ok)
|
|
226
272
|
returnValue = msgBox.exec()
|
|
227
273
|
if returnValue == QMessageBox.Ok:
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
if self.seg_mode=="cellpose":
|
|
231
|
-
self.file_label.setText(self.filename.split("/")[-1])
|
|
232
|
-
self.modelname = self.filename.split("/")[-1]
|
|
233
|
-
print(f"Transferring Cellpose model {self.filename}...")
|
|
234
|
-
self.folder_dest = os.path.split(os.path.dirname(os.path.realpath(__file__)))[0]+f"/models/{self.target_folder}/"+self.modelname
|
|
235
|
-
self.destination = self.folder_dest+f"/{self.modelname}"
|
|
274
|
+
pass
|
|
236
275
|
|
|
237
|
-
|
|
238
|
-
|
|
276
|
+
self.merge_cb.show()
|
|
277
|
+
self.merge_lbl.show()
|
|
278
|
+
self.file_label.setText(f"{n_files} configs loaded...")
|
|
239
279
|
|
|
240
280
|
def show_seg_options(self):
|
|
241
281
|
|
|
242
282
|
"""
|
|
243
283
|
Show the relevant widgets, mask the others.
|
|
244
284
|
"""
|
|
285
|
+
|
|
286
|
+
self.filename = None
|
|
287
|
+
self.file_label.setText('No file chosen')
|
|
245
288
|
self.base_block_options = [self.calibration_label, self.spatial_calib_le,*self.channel_layout.channel_cbs,*self.channel_layout.channel_labels,*self.channel_layout.normalization_mode_btns, *self.channel_layout.normalization_clip_btns, *self.channel_layout.normalization_min_value_lbl,
|
|
246
289
|
*self.channel_layout.normalization_min_value_le, *self.channel_layout.normalization_max_value_lbl,*self.channel_layout.normalization_max_value_le,
|
|
247
290
|
self.channel_layout.add_col_btn]
|
|
@@ -250,7 +293,7 @@ class SegmentationModelLoader(QWidget, Styles):
|
|
|
250
293
|
self.spatial_calib_le.setToolTip('Cellpose rescales the images such that the cells are 30.0 pixels. You can compute the scale from the training data as\n(pixel calibration [µm] in training images)*(cell diameter [px] in training images)/(30 [px]).\nIf you pass images with a different calibration to the model, they will be rescaled automatically.\nThe rescaling is ignored if you pass a diameter different from 30 px below.')
|
|
251
294
|
self.channel_layout.channel_labels[0].setText('cyto: ')
|
|
252
295
|
self.channel_layout.channel_labels[1].setText('nuclei: ')
|
|
253
|
-
for c in [self.threshold_config_button]:
|
|
296
|
+
for c in [self.threshold_config_button, self.merge_lbl, self.merge_cb]:
|
|
254
297
|
c.hide()
|
|
255
298
|
for c in self.cellpose_options+self.base_block_options:
|
|
256
299
|
c.show()
|
|
@@ -261,7 +304,7 @@ class SegmentationModelLoader(QWidget, Styles):
|
|
|
261
304
|
self.channel_layout.channel_labels[1].setText('channel 2: ')
|
|
262
305
|
for c in self.base_block_options:
|
|
263
306
|
c.show()
|
|
264
|
-
for c in self.cellpose_options+[self.threshold_config_button]:
|
|
307
|
+
for c in self.cellpose_options+[self.threshold_config_button, self.merge_lbl, self.merge_cb]:
|
|
265
308
|
c.hide()
|
|
266
309
|
self.unlock_upload()
|
|
267
310
|
else:
|
|
@@ -346,7 +389,10 @@ class SegmentationModelLoader(QWidget, Styles):
|
|
|
346
389
|
self.parent_window.init_seg_model_list()
|
|
347
390
|
self.close()
|
|
348
391
|
else:
|
|
349
|
-
if self.
|
|
392
|
+
if not isinstance(self.filename, list):
|
|
393
|
+
if not self.filename is None:
|
|
394
|
+
self.filename = [self.filename]
|
|
395
|
+
if self.mode=="targets":
|
|
350
396
|
self.parent_window.threshold_config_targets = self.filename
|
|
351
397
|
self.parent_window.seg_model_list.setCurrentText('Threshold')
|
|
352
398
|
print('Path to the traditional segmentation pipeline successfully set in celldetective...')
|
|
@@ -355,7 +401,7 @@ class SegmentationModelLoader(QWidget, Styles):
|
|
|
355
401
|
self.parent_window.threshold_config_effectors = self.filename
|
|
356
402
|
self.parent_window.seg_model_list.setCurrentText('Threshold')
|
|
357
403
|
print('Path to the traditional segmentation pipeline successfully set in celldetective...')
|
|
358
|
-
self.close()
|
|
404
|
+
self.close()
|
|
359
405
|
|
|
360
406
|
def generate_input_config(self):
|
|
361
407
|
|
|
@@ -1577,13 +1577,16 @@ class SignalAnnotator2(QMainWindow,Styles):
|
|
|
1577
1577
|
self.cell_ax.set_ylim(self.value_magnitude, self.non_log_ymax)
|
|
1578
1578
|
|
|
1579
1579
|
if self.reference_track_of_interest is not None and self.neighbor_track_of_interest is not None:
|
|
1580
|
-
t0 = self.df_relative.loc[(self.df_relative['REFERENCE_ID'] == self.reference_track_of_interest)&(self.df_relative['NEIGHBOR_ID'] == self.neighbor_track_of_interest)&(self.df_relative['reference_population'] == self.reference_population)&(self.df_relative['neighbor_population'] == self.neighbor_population), self.pair_time_name].dropna().
|
|
1581
|
-
|
|
1582
|
-
t0
|
|
1583
|
-
|
|
1584
|
-
|
|
1585
|
-
|
|
1586
|
-
|
|
1580
|
+
t0 = self.df_relative.loc[(self.df_relative['REFERENCE_ID'] == self.reference_track_of_interest)&(self.df_relative['NEIGHBOR_ID'] == self.neighbor_track_of_interest)&(self.df_relative['reference_population'] == self.reference_population)&(self.df_relative['neighbor_population'] == self.neighbor_population), self.pair_time_name].dropna().values
|
|
1581
|
+
try:
|
|
1582
|
+
if t0!=[]:
|
|
1583
|
+
t0=t0[0]
|
|
1584
|
+
ymin,ymax = self.cell_ax.get_ylim()
|
|
1585
|
+
self.line_dt.set_xdata([t0, t0])
|
|
1586
|
+
self.line_dt.set_ydata([ymin,ymax])
|
|
1587
|
+
except Exception as e:
|
|
1588
|
+
print(e)
|
|
1589
|
+
|
|
1587
1590
|
self.cell_ax.legend()
|
|
1588
1591
|
self.cell_fcanvas.canvas.draw()
|
|
1589
1592
|
|
{celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/signal_annotator_options.py
RENAMED
|
@@ -34,7 +34,7 @@ class ConfigSignalAnnotator(QMainWindow, Styles):
|
|
|
34
34
|
self.instructions_path = self.parent_window.exp_dir + "configs/signal_annotator_config_targets.json"
|
|
35
35
|
elif self.mode=="effectors":
|
|
36
36
|
self.instructions_path = self.parent_window.exp_dir + "configs/signal_annotator_config_effectors.json"
|
|
37
|
-
elif self.mode == "
|
|
37
|
+
elif self.mode == "pairs":
|
|
38
38
|
self.instructions_path = self.parent_window.exp_dir + "configs/signal_annotator_config_neighborhood.json"
|
|
39
39
|
|
|
40
40
|
exp_config = self.exp_dir +"config.ini"
|