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.
Files changed (121) hide show
  1. {celldetective-1.3.7.post2 → celldetective-1.3.8}/PKG-INFO +1 -1
  2. celldetective-1.3.8/celldetective/_version.py +1 -0
  3. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/btrack_options.py +8 -8
  4. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/classifier_widget.py +8 -0
  5. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/configure_new_exp.py +1 -1
  6. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/json_readers.py +2 -4
  7. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/plot_signals_ui.py +38 -29
  8. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/process_block.py +1 -0
  9. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/processes/segment_cells.py +50 -23
  10. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/seg_model_loader.py +71 -25
  11. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/signal_annotator2.py +10 -7
  12. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/signal_annotator_options.py +1 -1
  13. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/tableUI.py +252 -20
  14. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/viewers.py +1 -1
  15. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/io.py +28 -20
  16. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/segmentation.py +48 -1
  17. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/signals.py +43 -13
  18. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/tracking.py +7 -2
  19. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/utils.py +1 -1
  20. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective.egg-info/PKG-INFO +1 -1
  21. celldetective-1.3.7.post2/celldetective/_version.py +0 -1
  22. {celldetective-1.3.7.post2 → celldetective-1.3.8}/LICENSE +0 -0
  23. {celldetective-1.3.7.post2 → celldetective-1.3.8}/README.md +0 -0
  24. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/__init__.py +0 -0
  25. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/__main__.py +0 -0
  26. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/datasets/segmentation_annotations/blank +0 -0
  27. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/datasets/signal_annotations/blank +0 -0
  28. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/events.py +0 -0
  29. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/extra_properties.py +0 -0
  30. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/filters.py +0 -0
  31. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/InitWindow.py +0 -0
  32. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/__init__.py +0 -0
  33. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/about.py +0 -0
  34. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/analyze_block.py +0 -0
  35. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/control_panel.py +0 -0
  36. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/generic_signal_plot.py +0 -0
  37. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/gui_utils.py +0 -0
  38. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/help/DL-segmentation-strategy.json +0 -0
  39. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/help/Threshold-vs-DL.json +0 -0
  40. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/help/cell-populations.json +0 -0
  41. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/help/exp-structure.json +0 -0
  42. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/help/feature-btrack.json +0 -0
  43. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/help/neighborhood.json +0 -0
  44. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/help/prefilter-for-segmentation.json +0 -0
  45. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/help/preprocessing.json +0 -0
  46. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/help/propagate-classification.json +0 -0
  47. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/help/track-postprocessing.json +0 -0
  48. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/help/tracking.json +0 -0
  49. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/layouts.py +0 -0
  50. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/measurement_options.py +0 -0
  51. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/neighborhood_options.py +0 -0
  52. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/plot_measurements.py +0 -0
  53. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/processes/downloader.py +0 -0
  54. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/processes/measure_cells.py +0 -0
  55. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/processes/track_cells.py +0 -0
  56. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/processes/train_segmentation_model.py +0 -0
  57. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/processes/train_signal_model.py +0 -0
  58. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/retrain_segmentation_model_options.py +0 -0
  59. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/retrain_signal_model_options.py +0 -0
  60. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/signal_annotator.py +0 -0
  61. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/styles.py +0 -0
  62. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/survival_ui.py +0 -0
  63. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/thresholds_gui.py +0 -0
  64. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/gui/workers.py +0 -0
  65. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/icons/logo-large.png +0 -0
  66. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/icons/logo.png +0 -0
  67. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/icons/signals_icon.png +0 -0
  68. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/icons/splash-test.png +0 -0
  69. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/icons/splash.png +0 -0
  70. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/icons/splash0.png +0 -0
  71. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/icons/survival2.png +0 -0
  72. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/icons/vignette_signals2.png +0 -0
  73. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/icons/vignette_signals2.svg +0 -0
  74. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/links/zenodo.json +0 -0
  75. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/measure.py +0 -0
  76. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/models/pair_signal_detection/blank +0 -0
  77. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/models/segmentation_effectors/blank +0 -0
  78. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/models/segmentation_effectors/ricm_bf_all_last/config_input.json +0 -0
  79. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/models/segmentation_effectors/ricm_bf_all_last/ricm_bf_all_last +0 -0
  80. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/models/segmentation_effectors/ricm_bf_all_last/training_instructions.json +0 -0
  81. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/models/segmentation_effectors/test-transfer/config_input.json +0 -0
  82. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/models/segmentation_effectors/test-transfer/test-transfer +0 -0
  83. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/models/segmentation_generic/blank +0 -0
  84. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/models/segmentation_targets/blank +0 -0
  85. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/models/signal_detection/blank +0 -0
  86. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/models/tracking_configs/biased_motion.json +0 -0
  87. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/models/tracking_configs/mcf7.json +0 -0
  88. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/models/tracking_configs/no_z_motion.json +0 -0
  89. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/models/tracking_configs/ricm.json +0 -0
  90. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/models/tracking_configs/ricm2.json +0 -0
  91. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/neighborhood.py +0 -0
  92. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/preprocessing.py +0 -0
  93. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/relative_measurements.py +0 -0
  94. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/scripts/analyze_signals.py +0 -0
  95. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/scripts/measure_cells.py +0 -0
  96. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/scripts/measure_relative.py +0 -0
  97. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/scripts/segment_cells.py +0 -0
  98. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/scripts/segment_cells_thresholds.py +0 -0
  99. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/scripts/track_cells.py +0 -0
  100. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/scripts/train_segmentation_model.py +0 -0
  101. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective/scripts/train_signal_model.py +0 -0
  102. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective.egg-info/SOURCES.txt +0 -0
  103. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective.egg-info/dependency_links.txt +0 -0
  104. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective.egg-info/entry_points.txt +0 -0
  105. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective.egg-info/not-zip-safe +0 -0
  106. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective.egg-info/requires.txt +0 -0
  107. {celldetective-1.3.7.post2 → celldetective-1.3.8}/celldetective.egg-info/top_level.txt +0 -0
  108. {celldetective-1.3.7.post2 → celldetective-1.3.8}/setup.cfg +0 -0
  109. {celldetective-1.3.7.post2 → celldetective-1.3.8}/setup.py +0 -0
  110. {celldetective-1.3.7.post2 → celldetective-1.3.8}/tests/__init__.py +0 -0
  111. {celldetective-1.3.7.post2 → celldetective-1.3.8}/tests/test_events.py +0 -0
  112. {celldetective-1.3.7.post2 → celldetective-1.3.8}/tests/test_filters.py +0 -0
  113. {celldetective-1.3.7.post2 → celldetective-1.3.8}/tests/test_io.py +0 -0
  114. {celldetective-1.3.7.post2 → celldetective-1.3.8}/tests/test_measure.py +0 -0
  115. {celldetective-1.3.7.post2 → celldetective-1.3.8}/tests/test_neighborhood.py +0 -0
  116. {celldetective-1.3.7.post2 → celldetective-1.3.8}/tests/test_preprocessing.py +0 -0
  117. {celldetective-1.3.7.post2 → celldetective-1.3.8}/tests/test_qt.py +0 -0
  118. {celldetective-1.3.7.post2 → celldetective-1.3.8}/tests/test_segmentation.py +0 -0
  119. {celldetective-1.3.7.post2 → celldetective-1.3.8}/tests/test_signals.py +0 -0
  120. {celldetective-1.3.7.post2 → celldetective-1.3.8}/tests/test_tracking.py +0 -0
  121. {celldetective-1.3.7.post2 → celldetective-1.3.8}/tests/test_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: celldetective
3
- Version: 1.3.7.post2
3
+ Version: 1.3.8
4
4
  Summary: description
5
5
  Home-page: http://github.com/remyeltorro/celldetective
6
6
  Author: Rémy Torro
@@ -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, self.interpolate_na_features_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, self.interpolate_na_features_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
- self.interpolate_na_features_checkbox.setChecked(post_processing_options["interpolate_na"])
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
- self.cbs[-1].addColormap(cm.lower())
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,20,20,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.interpret_pos_location()
275
- 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')
276
- self.plot_window.show()
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
- # REPLACE EVRYTHING WITH MEAN_SIGNAL FUNCTION
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
 
@@ -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
- if self.equalize:
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
- self.threshold_instructions.update({'equalize_reference': f_reference})
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
- if os.path.exists(self.threshold_instructions):
258
- with open(self.threshold_instructions, 'r') as f:
259
- self.threshold_instructions = json.load(f)
260
- else:
261
- print('The configuration path is not valid. Abort.')
262
- self.abort_process()
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 = [self.threshold_instructions['target_channel']]
267
- if 'equalize_reference' in self.threshold_instructions:
268
- self.equalize, self.equalize_time = self.threshold_instructions['equalize_reference']
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
- self.channel_indices = _extract_channel_indices_from_config(self.config, self.required_channels)
280
- print(f'Required channels: {self.required_channels} located at channel indices {self.channel_indices}.')
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
- f = load_frames(self.img_num_channels[:,t], self.file, scale=None, normalize_input=False)
294
- mask = segment_frame_from_thresholds(f, **self.threshold_instructions)
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, 10, 0, 1, 1)
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.file_dialog.exec_() == QFileDialog.Accepted:
211
- self.filename = self.file_dialog.selectedFiles()[0]
212
- if self.seg_mode=="stardist":
213
- subfiles = glob(self.filename+"/*")
214
- subfiles = [s.replace('\\','/') for s in subfiles]
215
- if self.filename+"/thresholds.json" in subfiles:
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
- self.destination = os.path.split(os.path.dirname(os.path.realpath(__file__)))[0]+f"/models/{self.target_folder}/"+self.modelname
219
- self.folder_dest = self.destination
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("StarDist model not recognized... Please ensure that it contains a thresholds.json file or that it is a valid StarDist model...")
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
- return None
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
- if self.seg_mode=="threshold":
238
- self.file_label.setText(self.filename.split("/")[-1])
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.mode=="targets":
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().to_numpy()
1581
- if t0!=[]:
1582
- t0=t0[0]
1583
- ymin,ymax = self.cell_ax.get_ylim()
1584
- self.line_dt.set_xdata([t0, t0])
1585
- self.line_dt.set_ydata([ymin,ymax])
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
 
@@ -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 == "neighborhood":
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"