itasc 0.2.0.dev0__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.
Files changed (162) hide show
  1. itasc/__init__.py +16 -0
  2. itasc/cellpose/__init__.py +31 -0
  3. itasc/cellpose/cellpose_runner.py +334 -0
  4. itasc/cellpose/divergence_maps.py +380 -0
  5. itasc/cellpose/flow_following.py +283 -0
  6. itasc/cellpose/joint.py +98 -0
  7. itasc/cellpose/napari.yaml +10 -0
  8. itasc/cellpose/native_masks.py +313 -0
  9. itasc/cellpose/retrack.py +232 -0
  10. itasc/cellpose/shape.py +51 -0
  11. itasc/cellpose/track_laptrack.py +279 -0
  12. itasc/contact_analysis/__init__.py +61 -0
  13. itasc/contact_analysis/_provenance.py +29 -0
  14. itasc/contact_analysis/catalog.py +393 -0
  15. itasc/contact_analysis/config.py +155 -0
  16. itasc/contact_analysis/contacts/__init__.py +24 -0
  17. itasc/contact_analysis/contacts/batch.py +158 -0
  18. itasc/contact_analysis/contacts/build.py +837 -0
  19. itasc/contact_analysis/contacts/contact_labels.py +136 -0
  20. itasc/contact_analysis/contacts/neighborhood.py +146 -0
  21. itasc/contact_analysis/contacts/reader.py +58 -0
  22. itasc/contact_analysis/contacts/signed_contact_length.py +143 -0
  23. itasc/contact_analysis/curation.py +185 -0
  24. itasc/contact_analysis/dynamics/__init__.py +43 -0
  25. itasc/contact_analysis/dynamics/collective.py +206 -0
  26. itasc/contact_analysis/dynamics/kinematics.py +278 -0
  27. itasc/contact_analysis/dynamics/msd.py +165 -0
  28. itasc/contact_analysis/dynamics/store.py +251 -0
  29. itasc/contact_analysis/dynamics/trajectories.py +100 -0
  30. itasc/contact_analysis/frame_interval.py +85 -0
  31. itasc/contact_analysis/napari.yaml +10 -0
  32. itasc/contact_analysis/pipeline.py +313 -0
  33. itasc/contact_analysis/pixel_size.py +166 -0
  34. itasc/contact_analysis/quantifier.py +204 -0
  35. itasc/contact_analysis/quantifiers/__init__.py +7 -0
  36. itasc/contact_analysis/quantifiers/_contacts_derived.py +42 -0
  37. itasc/contact_analysis/quantifiers/cell_density.py +65 -0
  38. itasc/contact_analysis/quantifiers/cell_dynamics.py +81 -0
  39. itasc/contact_analysis/quantifiers/cell_shape.py +32 -0
  40. itasc/contact_analysis/quantifiers/contacts.py +72 -0
  41. itasc/contact_analysis/quantifiers/neighbor_count.py +26 -0
  42. itasc/contact_analysis/quantifiers/nucleus_dynamics.py +77 -0
  43. itasc/contact_analysis/quantifiers/nucleus_shape.py +35 -0
  44. itasc/contact_analysis/quantifiers/shape_relational.py +34 -0
  45. itasc/contact_analysis/quantifiers/signed_contact_length.py +44 -0
  46. itasc/contact_analysis/records.py +129 -0
  47. itasc/contact_analysis/shape/__init__.py +19 -0
  48. itasc/contact_analysis/shape/core.py +141 -0
  49. itasc/contact_analysis/shape/relational.py +134 -0
  50. itasc/contact_analysis/shape_tables.py +387 -0
  51. itasc/core/__init__.py +0 -0
  52. itasc/core/cancellation.py +15 -0
  53. itasc/core/commit.py +61 -0
  54. itasc/core/imageops.py +34 -0
  55. itasc/core/label_store.py +53 -0
  56. itasc/core/lineage.py +113 -0
  57. itasc/core/logging.py +51 -0
  58. itasc/core/paths.py +34 -0
  59. itasc/core/tiff.py +13 -0
  60. itasc/correction/__init__.py +25 -0
  61. itasc/correction/labels.py +983 -0
  62. itasc/napari/__init__.py +7 -0
  63. itasc/napari/_experiments_panel.py +1091 -0
  64. itasc/napari/_flow_layout.py +98 -0
  65. itasc/napari/_icons.py +126 -0
  66. itasc/napari/_napari_compat.py +118 -0
  67. itasc/napari/_paths.py +231 -0
  68. itasc/napari/_preview_cache.py +60 -0
  69. itasc/napari/_spotlight.py +46 -0
  70. itasc/napari/_stage_loader.py +146 -0
  71. itasc/napari/_stage_status.py +110 -0
  72. itasc/napari/_standalone_paths.py +89 -0
  73. itasc/napari/_state.py +146 -0
  74. itasc/napari/_status_rail.py +128 -0
  75. itasc/napari/_track_render.py +114 -0
  76. itasc/napari/_widget_helpers.py +236 -0
  77. itasc/napari/aggregate_widget.py +339 -0
  78. itasc/napari/candidate_gallery_controller.py +285 -0
  79. itasc/napari/cell_workflow_widget.py +1405 -0
  80. itasc/napari/cellpose_segment_track_widget.py +1253 -0
  81. itasc/napari/cellpose_widget.py +1034 -0
  82. itasc/napari/contact_analysis/__init__.py +6 -0
  83. itasc/napari/contact_analysis/curation_controller.py +94 -0
  84. itasc/napari/contact_analysis/plugins/__init__.py +102 -0
  85. itasc/napari/contact_analysis/plugins/catalog_summary.py +56 -0
  86. itasc/napari/contact_analysis/plugins/curation.py +247 -0
  87. itasc/napari/contact_analysis/plugins/visualize_contacts.py +64 -0
  88. itasc/napari/contact_analysis_widget.py +951 -0
  89. itasc/napari/contact_visualization.py +895 -0
  90. itasc/napari/correction/__init__.py +8 -0
  91. itasc/napari/correction/_correction_anchor.py +54 -0
  92. itasc/napari/correction/_correction_candidate_panel.py +259 -0
  93. itasc/napari/correction/_correction_candidates.py +169 -0
  94. itasc/napari/correction/_correction_centroids.py +132 -0
  95. itasc/napari/correction/_correction_commit.py +71 -0
  96. itasc/napari/correction/_correction_events.py +39 -0
  97. itasc/napari/correction/_correction_keymap.py +80 -0
  98. itasc/napari/correction/_correction_layer_lifecycle.py +137 -0
  99. itasc/napari/correction/_correction_layer_loader.py +86 -0
  100. itasc/napari/correction/_correction_navigation.py +97 -0
  101. itasc/napari/correction/_correction_paint.py +46 -0
  102. itasc/napari/correction/_correction_playback.py +68 -0
  103. itasc/napari/correction/_correction_protection.py +44 -0
  104. itasc/napari/correction/_correction_takeover.py +64 -0
  105. itasc/napari/correction/_correction_track_accordion.py +566 -0
  106. itasc/napari/correction/_correction_track_path.py +388 -0
  107. itasc/napari/correction/_correction_ui.py +367 -0
  108. itasc/napari/correction/_correction_ui_nucleus.py +393 -0
  109. itasc/napari/correction/_correction_utils.py +204 -0
  110. itasc/napari/correction/_correction_validation.py +83 -0
  111. itasc/napari/correction/cell_correction_widget.py +1190 -0
  112. itasc/napari/correction/correction_widget.py +1363 -0
  113. itasc/napari/correction/nucleus_correction_widget.py +2185 -0
  114. itasc/napari/divergence_maps_widget.py +795 -0
  115. itasc/napari/lineage_canvas_controller.py +351 -0
  116. itasc/napari/main_widget.py +1184 -0
  117. itasc/napari/nucleus_atom_extraction_widget.py +648 -0
  118. itasc/napari/nucleus_db_browser_widget.py +1442 -0
  119. itasc/napari/nucleus_pipeline_widget.py +579 -0
  120. itasc/napari/nucleus_segmentation_inputs_widget.py +21 -0
  121. itasc/napari/nucleus_tracking_inputs_widget.py +248 -0
  122. itasc/napari/nucleus_workflow_widget.py +963 -0
  123. itasc/napari/track_path_controller.py +387 -0
  124. itasc/napari/ui_gate.py +266 -0
  125. itasc/napari/ui_style.py +503 -0
  126. itasc/napari/validated_overlay_controller.py +254 -0
  127. itasc/napari/widgets.py +616 -0
  128. itasc/napari.yaml +45 -0
  129. itasc/segmentation/__init__.py +60 -0
  130. itasc/segmentation/cell_divergence_segmentation.py +433 -0
  131. itasc/segmentation/cell_label_icm.py +637 -0
  132. itasc/segmentation/contour_filtering.py +128 -0
  133. itasc/segmentation/lineage.py +18 -0
  134. itasc/segmentation/nucleus_segmentation.py +35 -0
  135. itasc/tracking_ultrack/__init__.py +12 -0
  136. itasc/tracking_ultrack/_node_geometry.py +191 -0
  137. itasc/tracking_ultrack/atoms.py +470 -0
  138. itasc/tracking_ultrack/config.py +76 -0
  139. itasc/tracking_ultrack/corrections.py +1213 -0
  140. itasc/tracking_ultrack/db_build.py +492 -0
  141. itasc/tracking_ultrack/db_query.py +952 -0
  142. itasc/tracking_ultrack/export.py +133 -0
  143. itasc/tracking_ultrack/extend.py +243 -0
  144. itasc/tracking_ultrack/ingest.py +83 -0
  145. itasc/tracking_ultrack/linking.py +286 -0
  146. itasc/tracking_ultrack/multi_threshold.py +46 -0
  147. itasc/tracking_ultrack/napari.yaml +10 -0
  148. itasc/tracking_ultrack/reseed.py +456 -0
  149. itasc/tracking_ultrack/retracker.py +153 -0
  150. itasc/tracking_ultrack/scoring.py +74 -0
  151. itasc/tracking_ultrack/seed_prior.py +175 -0
  152. itasc/tracking_ultrack/solve.py +52 -0
  153. itasc/tracking_ultrack/swap_candidate.py +171 -0
  154. itasc/tracking_ultrack/track_quality.py +142 -0
  155. itasc/tracking_ultrack/validation_nodes.py +315 -0
  156. itasc/tracking_ultrack/validation_state.py +430 -0
  157. itasc-0.2.0.dev0.data/data/itasc/napari.yaml +45 -0
  158. itasc-0.2.0.dev0.dist-info/METADATA +186 -0
  159. itasc-0.2.0.dev0.dist-info/RECORD +162 -0
  160. itasc-0.2.0.dev0.dist-info/WHEEL +4 -0
  161. itasc-0.2.0.dev0.dist-info/entry_points.txt +2 -0
  162. itasc-0.2.0.dev0.dist-info/licenses/LICENSE +661 -0
@@ -0,0 +1,248 @@
1
+ """Ultrack tracking and database-generation parameter section for the nucleus workflow widget."""
2
+ from __future__ import annotations
3
+
4
+ import os
5
+
6
+ from qtpy.QtWidgets import (
7
+ QComboBox,
8
+ QLabel,
9
+ QWidget,
10
+ )
11
+
12
+ from itasc.napari._widget_helpers import (
13
+ dslider as _dslider,
14
+ heading as _heading,
15
+ islider as _islider,
16
+ )
17
+ from itasc.napari.ui_style import (
18
+ add_section_header,
19
+ add_section_pair_row,
20
+ section_grid,
21
+ )
22
+ from itasc.napari.widgets import CollapsibleSection
23
+ from itasc.tracking_ultrack.config import TrackingConfig as _UltrackConfig
24
+
25
+
26
+ class NucleusTrackingInputsWidget(QWidget):
27
+ """Qt controls for Ultrack tracking and database-generation parameters."""
28
+
29
+ def __init__(self, parent: QWidget | None = None) -> None:
30
+ super().__init__(parent)
31
+
32
+ db_inner = QWidget(self)
33
+ db_grid = section_grid()
34
+ db_grid.setContentsMargins(0, 0, 0, 0)
35
+ db_inner.setLayout(db_grid)
36
+
37
+ solve_inner = QWidget(self)
38
+ solve_grid = section_grid()
39
+ solve_grid.setContentsMargins(0, 0, 0, 0)
40
+ solve_inner.setLayout(solve_grid)
41
+
42
+ # ─── DB Generation — Atom-Union Candidates ──────────────────
43
+ self.db_gen_min_area_spin = _islider(
44
+ 0, 1_000_000, 100, tooltip="Minimum single-atom candidate area in pixels.")
45
+ self.atom_union_max_area_spin = _islider(
46
+ 0, 100_000, 8000, tooltip="Maximum total pixel area of a candidate union.")
47
+ self.atom_overlap_budget_spin = _islider(
48
+ 0, 5_000_000, 300_000, step=10_000,
49
+ tooltip="Per-frame overlap-pair budget — the single branching knob. "
50
+ "0 = nested hierarchy, larger = richer non-nested alternatives.")
51
+
52
+ # ─── Retained for backward compat (not surfaced in UI) ──────
53
+ self.db_gen_min_frontier_spin = _dslider(0, 1, 0.0, 0.01, 2, "")
54
+ self.db_gen_ws_hierarchy_combo = QComboBox()
55
+ self.db_gen_ws_hierarchy_combo.addItems(["area", "dynamics", "volume"])
56
+ self.db_gen_n_workers_spin = _islider(1, max(1, os.cpu_count() or 1), 1, tooltip="")
57
+ self.db_gen_max_area_spin = _islider(0, 10_000_000, 100_000, tooltip="")
58
+
59
+ # ─── DB Generation — Linking ────────────────────────────────
60
+ self.db_gen_max_dist_spin = _dslider(0, 500, 15.0, 1.0, 1)
61
+ self.db_gen_max_neighbors_spin = _islider(1, 50, 5)
62
+ self.db_gen_linking_mode_combo = QComboBox()
63
+ self.db_gen_linking_mode_combo.addItems(["default", "shape"])
64
+ self.db_gen_area_weight_spin = _dslider(0, 10, 1.0, 0.1, 2)
65
+ self.db_gen_area_weight_spin.setEnabled(False)
66
+ self.db_gen_iou_weight_spin = _dslider(0, 10, 1.0, 0.1, 2)
67
+ self.db_gen_iou_weight_spin.setEnabled(False)
68
+ self.db_gen_distance_weight_spin = _dslider(0, 10, 0.05, 0.01, 2)
69
+ self.db_gen_distance_weight_spin.setEnabled(False)
70
+
71
+ # ─── DB Generation — Node Scoring ───────────────────────────
72
+ self.db_gen_quality_weight_spin = _dslider(
73
+ 0, 10, 1.0, 0.05, 2,
74
+ "Weight applied to signal-based segmentation quality.",
75
+ )
76
+ self.db_gen_quality_exp_spin = _dslider(
77
+ 0.1, 50, 8.0, 0.5, 2,
78
+ "Raises the combined quality and circularity score before storing as node_prob.",
79
+ )
80
+ self.db_gen_circularity_weight_spin = _dslider(
81
+ 0, 10, 0.25, 0.05, 2,
82
+ "Weight applied to shape circularity.",
83
+ )
84
+
85
+ # ─── Ultrack — Track Scope ──────────────────────────────────
86
+ self.ultrack_max_partitions_spin = _islider(
87
+ 0, 1000, 30, tooltip="0 = use all partitions.")
88
+ self.ultrack_n_frames_spin = _islider(
89
+ 0, 10000, 0, tooltip="0 = process all frames.")
90
+
91
+ # ─── Ultrack — Event Penalties ──────────────────────────────
92
+ self.ultrack_appear_spin = _dslider(
93
+ -10, 0, -0.1, 0.05, 2,
94
+ "ILP penalty for cells appearing. More negative = fewer appearances.",
95
+ )
96
+ self.ultrack_disappear_spin = _dslider(
97
+ -10, 0, -0.1, 0.05, 2,
98
+ "ILP penalty for cells disappearing. More negative = fewer disappearances.",
99
+ )
100
+ self.ultrack_division_spin = _dslider(
101
+ -10, 0, -0.01, 0.05, 2,
102
+ "ILP penalty for divisions. More negative = fewer divisions.",
103
+ )
104
+
105
+ # ─── Ultrack — Solver ───────────────────────────────────────
106
+ self.ultrack_power_spin = _islider(
107
+ 1, 20, 4,
108
+ tooltip="Solver transform for node_prob and link weights (link_function=power).",
109
+ )
110
+ self.ultrack_bias_spin = _dslider(
111
+ -10, 10, 0.0, 0.05, 2,
112
+ "Constant offset applied by Ultrack tracking_config.bias.",
113
+ )
114
+ self.ultrack_solver_lbl = QLabel("—")
115
+
116
+ # ─── Pack DB Generation controls ────────────────────────────
117
+ row = 0
118
+
119
+ add_section_header(db_grid, row, _heading("Candidates")); row += 1
120
+ add_section_pair_row(
121
+ db_grid, row,
122
+ "Min area:", self.db_gen_min_area_spin,
123
+ "Max union area:", self.atom_union_max_area_spin,
124
+ ); row += 1
125
+ add_section_pair_row(
126
+ db_grid, row,
127
+ "Overlap budget:", self.atom_overlap_budget_spin,
128
+ ); row += 1
129
+
130
+ add_section_header(db_grid, row, _heading("Linking")); row += 1
131
+ add_section_pair_row(
132
+ db_grid, row,
133
+ "Max distance:", self.db_gen_max_dist_spin,
134
+ "Max neighbors:", self.db_gen_max_neighbors_spin,
135
+ ); row += 1
136
+ add_section_pair_row(
137
+ db_grid, row,
138
+ "Linking mode:", self.db_gen_linking_mode_combo,
139
+ "Area weight:", self.db_gen_area_weight_spin,
140
+ ); row += 1
141
+ add_section_pair_row(
142
+ db_grid, row,
143
+ "IoU weight:", self.db_gen_iou_weight_spin,
144
+ "Distance weight:", self.db_gen_distance_weight_spin,
145
+ ); row += 1
146
+
147
+ add_section_header(db_grid, row, _heading("Node Scoring")); row += 1
148
+ add_section_pair_row(
149
+ db_grid, row,
150
+ "Quality weight:", self.db_gen_quality_weight_spin,
151
+ "Circularity weight:", self.db_gen_circularity_weight_spin,
152
+ ); row += 1
153
+ add_section_pair_row(
154
+ db_grid, row,
155
+ "Scoring exponent:", self.db_gen_quality_exp_spin,
156
+ ); row += 1
157
+
158
+ # ─── Pack Ultrack solver controls ───────────────────────────
159
+ row = 0
160
+
161
+ add_section_header(solve_grid, row, _heading("Track Scope")); row += 1
162
+ add_section_pair_row(
163
+ solve_grid, row,
164
+ "Max partitions:", self.ultrack_max_partitions_spin,
165
+ "N frames:", self.ultrack_n_frames_spin,
166
+ ); row += 1
167
+
168
+ add_section_header(solve_grid, row, _heading("Event Penalties")); row += 1
169
+ add_section_pair_row(
170
+ solve_grid, row,
171
+ "Appear:", self.ultrack_appear_spin,
172
+ "Disappear:", self.ultrack_disappear_spin,
173
+ ); row += 1
174
+ add_section_pair_row(solve_grid, row, "Division:", self.ultrack_division_spin); row += 1
175
+
176
+ add_section_header(solve_grid, row, _heading("Solver")); row += 1
177
+ add_section_pair_row(
178
+ solve_grid, row,
179
+ "Power:", self.ultrack_power_spin,
180
+ "Bias:", self.ultrack_bias_spin,
181
+ ); row += 1
182
+ add_section_pair_row(solve_grid, row, "Solver:", self.ultrack_solver_lbl); row += 1
183
+
184
+ self.db_section = CollapsibleSection(
185
+ "Database Generation Parameters",
186
+ db_inner,
187
+ expanded=False,
188
+ )
189
+ self.solve_section = CollapsibleSection(
190
+ "Ultrack Solver Parameters",
191
+ solve_inner,
192
+ expanded=False,
193
+ )
194
+
195
+ self.db_gen_linking_mode_combo.currentTextChanged.connect(
196
+ self._on_db_gen_mode_changed
197
+ )
198
+
199
+ def _on_db_gen_mode_changed(self, mode: str) -> None:
200
+ enabled = mode == "shape"
201
+ self.db_gen_area_weight_spin.setEnabled(enabled)
202
+ self.db_gen_iou_weight_spin.setEnabled(enabled)
203
+ self.db_gen_distance_weight_spin.setEnabled(enabled)
204
+
205
+ def db_gen_config(self) -> _UltrackConfig:
206
+ """Build a TrackingConfig from the current DB-generation controls."""
207
+ return _UltrackConfig(
208
+ min_area=self.db_gen_min_area_spin.value(),
209
+ seg_min_area=self.db_gen_min_area_spin.value(),
210
+ seg_foreground_threshold=0.0,
211
+ atom_union_max_area=self.atom_union_max_area_spin.value(),
212
+ atom_overlap_budget=self.atom_overlap_budget_spin.value(),
213
+ max_distance=self.db_gen_max_dist_spin.value(),
214
+ max_neighbors=self.db_gen_max_neighbors_spin.value(),
215
+ linking_mode=self.db_gen_linking_mode_combo.currentText(),
216
+ area_weight=self.db_gen_area_weight_spin.value(),
217
+ iou_weight=self.db_gen_iou_weight_spin.value(),
218
+ distance_weight=self.db_gen_distance_weight_spin.value(),
219
+ quality_weight=self.db_gen_quality_weight_spin.value(),
220
+ quality_exponent=self.db_gen_quality_exp_spin.value(),
221
+ circularity_weight=self.db_gen_circularity_weight_spin.value(),
222
+ link_n_workers=self.db_gen_n_workers_spin.value(),
223
+ )
224
+
225
+ def ultrack_config(self) -> _UltrackConfig:
226
+ """Build a TrackingConfig from all tracking controls (DB-gen + Ultrack solver)."""
227
+ return _UltrackConfig(
228
+ seg_min_area=self.db_gen_min_area_spin.value(),
229
+ seg_max_area=self.db_gen_max_area_spin.value(),
230
+ seg_foreground_threshold=0.0,
231
+ seg_min_frontier=self.db_gen_min_frontier_spin.value(),
232
+ seg_ws_hierarchy=self.db_gen_ws_hierarchy_combo.currentText(),
233
+ seg_n_workers=self.db_gen_n_workers_spin.value(),
234
+ max_distance=self.db_gen_max_dist_spin.value(),
235
+ max_neighbors=self.db_gen_max_neighbors_spin.value(),
236
+ linking_mode=self.db_gen_linking_mode_combo.currentText(),
237
+ area_weight=self.db_gen_area_weight_spin.value(),
238
+ iou_weight=self.db_gen_iou_weight_spin.value(),
239
+ distance_weight=self.db_gen_distance_weight_spin.value(),
240
+ quality_weight=self.db_gen_quality_weight_spin.value(),
241
+ quality_exponent=self.db_gen_quality_exp_spin.value(),
242
+ circularity_weight=self.db_gen_circularity_weight_spin.value(),
243
+ power=self.ultrack_power_spin.value(),
244
+ bias=self.ultrack_bias_spin.value(),
245
+ appear_weight=self.ultrack_appear_spin.value(),
246
+ disappear_weight=self.ultrack_disappear_spin.value(),
247
+ division_weight=self.ultrack_division_spin.value(),
248
+ )