celldetective 1.5.0b2__py3-none-any.whl → 1.5.0b4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- celldetective/_version.py +1 -1
- celldetective/gui/InitWindow.py +28 -11
- celldetective/gui/base/components.py +2 -0
- celldetective/gui/base_annotator.py +9 -2
- celldetective/gui/control_panel.py +21 -16
- celldetective/gui/gui_utils.py +14 -5
- celldetective/gui/measure_annotator.py +114 -18
- celldetective/gui/plot_measurements.py +2 -4
- celldetective/gui/plot_signals_ui.py +3 -4
- celldetective/gui/process_block.py +238 -66
- celldetective/gui/settings/_settings_segmentation_model_training.py +6 -0
- celldetective/gui/viewers/base_viewer.py +5 -0
- celldetective/utils/cellpose_utils/__init__.py +23 -7
- celldetective/utils/image_loaders.py +3 -0
- celldetective/utils/masks.py +1 -1
- {celldetective-1.5.0b2.dist-info → celldetective-1.5.0b4.dist-info}/METADATA +1 -1
- {celldetective-1.5.0b2.dist-info → celldetective-1.5.0b4.dist-info}/RECORD +25 -22
- tests/gui/test_enhancements.py +351 -0
- tests/gui/test_measure_annotator_bugfix.py +130 -0
- tests/test_cellpose_fallback.py +101 -0
- tests/test_notebooks.py +2 -1
- {celldetective-1.5.0b2.dist-info → celldetective-1.5.0b4.dist-info}/WHEEL +0 -0
- {celldetective-1.5.0b2.dist-info → celldetective-1.5.0b4.dist-info}/entry_points.txt +0 -0
- {celldetective-1.5.0b2.dist-info → celldetective-1.5.0b4.dist-info}/licenses/LICENSE +0 -0
- {celldetective-1.5.0b2.dist-info → celldetective-1.5.0b4.dist-info}/top_level.txt +0 -0
|
@@ -820,58 +820,117 @@ class ProcessPanel(QFrame, Styles):
|
|
|
820
820
|
|
|
821
821
|
def check_signals(self):
|
|
822
822
|
from celldetective.gui.event_annotator import EventAnnotator, StackLoaderThread
|
|
823
|
+
from celldetective.utils.experiment import interpret_wells_and_positions
|
|
823
824
|
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
self.event_annotator = EventAnnotator(self, lazy_load=True)
|
|
825
|
+
self.well_option = self.parent_window.well_list.getSelectedIndices()
|
|
826
|
+
self.position_option = self.parent_window.position_list.getSelectedIndices()
|
|
827
827
|
|
|
828
|
-
|
|
829
|
-
|
|
828
|
+
# Count selected positions
|
|
829
|
+
well_indices, position_indices = interpret_wells_and_positions(
|
|
830
|
+
self.exp_dir, self.well_option, self.position_option
|
|
831
|
+
)
|
|
832
|
+
total_positions = 0
|
|
833
|
+
from celldetective.utils.experiment import (
|
|
834
|
+
get_positions_in_well,
|
|
835
|
+
get_experiment_wells,
|
|
836
|
+
)
|
|
830
837
|
|
|
831
|
-
|
|
838
|
+
wells = get_experiment_wells(self.exp_dir)
|
|
839
|
+
for widx in well_indices:
|
|
840
|
+
positions = get_positions_in_well(wells[widx])
|
|
841
|
+
if position_indices is not None:
|
|
842
|
+
total_positions += len(position_indices)
|
|
843
|
+
else:
|
|
844
|
+
total_positions += len(positions)
|
|
832
845
|
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
846
|
+
if total_positions == 1:
|
|
847
|
+
test = self.parent_window.locate_selected_position()
|
|
848
|
+
if test:
|
|
849
|
+
self.event_annotator = EventAnnotator(self, lazy_load=True)
|
|
836
850
|
|
|
837
|
-
|
|
851
|
+
if not getattr(self.event_annotator, "proceed", True):
|
|
852
|
+
return
|
|
838
853
|
|
|
839
|
-
|
|
840
|
-
self.signal_loader.status_update.connect(self.signal_progress.setLabelText)
|
|
841
|
-
self.signal_progress.canceled.connect(self.signal_loader.stop)
|
|
854
|
+
self.signal_loader = StackLoaderThread(self.event_annotator)
|
|
842
855
|
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
856
|
+
self.signal_progress = CelldetectiveProgressDialog(
|
|
857
|
+
"Loading data...",
|
|
858
|
+
"Cancel",
|
|
859
|
+
0,
|
|
860
|
+
100,
|
|
861
|
+
self,
|
|
862
|
+
window_title="Please wait",
|
|
863
|
+
)
|
|
864
|
+
|
|
865
|
+
self.signal_progress.setValue(0)
|
|
866
|
+
|
|
867
|
+
self.signal_loader.progress.connect(self.signal_progress.setValue)
|
|
868
|
+
self.signal_loader.status_update.connect(
|
|
869
|
+
self.signal_progress.setLabelText
|
|
870
|
+
)
|
|
871
|
+
self.signal_progress.canceled.connect(self.signal_loader.stop)
|
|
872
|
+
|
|
873
|
+
def on_finished():
|
|
874
|
+
self.signal_progress.blockSignals(True)
|
|
875
|
+
self.signal_progress.close()
|
|
876
|
+
if not self.signal_loader._is_cancelled:
|
|
850
877
|
try:
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
878
|
+
self.event_annotator.finalize_init()
|
|
879
|
+
self.event_annotator.show()
|
|
880
|
+
try:
|
|
881
|
+
QTimer.singleShot(
|
|
882
|
+
100,
|
|
883
|
+
lambda: self.event_annotator.resize(
|
|
884
|
+
self.event_annotator.width() + 1,
|
|
885
|
+
self.event_annotator.height() + 1,
|
|
886
|
+
),
|
|
887
|
+
)
|
|
888
|
+
except:
|
|
889
|
+
pass
|
|
890
|
+
except Exception as e:
|
|
891
|
+
print(f"Error finalizing annotator: {e}")
|
|
892
|
+
else:
|
|
893
|
+
self.event_annotator.close()
|
|
864
894
|
|
|
865
|
-
|
|
866
|
-
|
|
895
|
+
self.signal_loader.finished.connect(on_finished)
|
|
896
|
+
self.signal_loader.start()
|
|
897
|
+
else:
|
|
898
|
+
# Multi position explorer: redirect to TableUI with progress bar
|
|
899
|
+
self.view_table_ui()
|
|
867
900
|
|
|
868
901
|
def check_measurements(self):
|
|
869
902
|
from celldetective.gui.measure_annotator import MeasureAnnotator
|
|
903
|
+
from celldetective.utils.experiment import interpret_wells_and_positions
|
|
870
904
|
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
905
|
+
self.well_option = self.parent_window.well_list.getSelectedIndices()
|
|
906
|
+
self.position_option = self.parent_window.position_list.getSelectedIndices()
|
|
907
|
+
|
|
908
|
+
# Count selected positions
|
|
909
|
+
well_indices, position_indices = interpret_wells_and_positions(
|
|
910
|
+
self.exp_dir, self.well_option, self.position_option
|
|
911
|
+
)
|
|
912
|
+
total_positions = 0
|
|
913
|
+
from celldetective.utils.experiment import (
|
|
914
|
+
get_positions_in_well,
|
|
915
|
+
get_experiment_wells,
|
|
916
|
+
)
|
|
917
|
+
|
|
918
|
+
wells = get_experiment_wells(self.exp_dir)
|
|
919
|
+
for widx in well_indices:
|
|
920
|
+
positions = get_positions_in_well(wells[widx])
|
|
921
|
+
if position_indices is not None:
|
|
922
|
+
total_positions += len(position_indices)
|
|
923
|
+
else:
|
|
924
|
+
total_positions += len(positions)
|
|
925
|
+
|
|
926
|
+
if total_positions == 1:
|
|
927
|
+
test = self.parent_window.locate_selected_position()
|
|
928
|
+
if test:
|
|
929
|
+
self.measure_annotator = MeasureAnnotator(self)
|
|
930
|
+
self.measure_annotator.show()
|
|
931
|
+
else:
|
|
932
|
+
# Multi position explorer: redirect to TableUI with progress bar
|
|
933
|
+
self.view_table_ui()
|
|
875
934
|
|
|
876
935
|
def enable_segmentation_model_list(self):
|
|
877
936
|
if self.segment_action.isChecked():
|
|
@@ -1568,6 +1627,7 @@ class ProcessPanel(QFrame, Styles):
|
|
|
1568
1627
|
from celldetective.gui.tableUI import TableUI
|
|
1569
1628
|
from celldetective.gui.workers import ProgressWindow
|
|
1570
1629
|
from celldetective.processes.load_table import TableLoaderProcess
|
|
1630
|
+
from celldetective.utils.experiment import interpret_wells_and_positions
|
|
1571
1631
|
|
|
1572
1632
|
logger.info("Load table...")
|
|
1573
1633
|
|
|
@@ -1575,24 +1635,31 @@ class ProcessPanel(QFrame, Styles):
|
|
|
1575
1635
|
self.well_option = self.parent_window.well_list.getSelectedIndices()
|
|
1576
1636
|
self.position_option = self.parent_window.position_list.getSelectedIndices()
|
|
1577
1637
|
|
|
1578
|
-
|
|
1579
|
-
|
|
1580
|
-
|
|
1581
|
-
|
|
1582
|
-
|
|
1583
|
-
|
|
1584
|
-
|
|
1638
|
+
# Count selected positions
|
|
1639
|
+
well_indices, position_indices = interpret_wells_and_positions(
|
|
1640
|
+
self.exp_dir, self.well_option, self.position_option
|
|
1641
|
+
)
|
|
1642
|
+
total_positions = 0
|
|
1643
|
+
from celldetective.utils.experiment import (
|
|
1644
|
+
get_positions_in_well,
|
|
1645
|
+
get_experiment_wells,
|
|
1646
|
+
)
|
|
1585
1647
|
|
|
1586
|
-
|
|
1648
|
+
wells = get_experiment_wells(self.exp_dir)
|
|
1649
|
+
for widx in well_indices:
|
|
1650
|
+
positions = get_positions_in_well(wells[widx])
|
|
1651
|
+
if position_indices is not None:
|
|
1652
|
+
total_positions += len(position_indices)
|
|
1653
|
+
else:
|
|
1654
|
+
total_positions += len(positions)
|
|
1587
1655
|
|
|
1588
|
-
def
|
|
1589
|
-
|
|
1590
|
-
if self.df is not None:
|
|
1656
|
+
def show_table(df):
|
|
1657
|
+
if df is not None:
|
|
1591
1658
|
plot_mode = "plot_track_signals"
|
|
1592
|
-
if "TRACK_ID" not in list(
|
|
1659
|
+
if "TRACK_ID" not in list(df.columns):
|
|
1593
1660
|
plot_mode = "static"
|
|
1594
1661
|
self.tab_ui = TableUI(
|
|
1595
|
-
|
|
1662
|
+
df,
|
|
1596
1663
|
f"{self.parent_window.well_list.currentText()}; Position {self.parent_window.position_list.currentText()}",
|
|
1597
1664
|
population=self.mode,
|
|
1598
1665
|
plot_mode=plot_mode,
|
|
@@ -1607,20 +1674,46 @@ class ProcessPanel(QFrame, Styles):
|
|
|
1607
1674
|
msgBox.setText("No table could be loaded...")
|
|
1608
1675
|
msgBox.setWindowTitle("Info")
|
|
1609
1676
|
msgBox.setStandardButtons(QMessageBox.Ok)
|
|
1610
|
-
|
|
1677
|
+
msgBox.exec()
|
|
1611
1678
|
|
|
1612
|
-
|
|
1613
|
-
|
|
1614
|
-
|
|
1615
|
-
title="Loading tables...",
|
|
1616
|
-
process_args=process_args,
|
|
1617
|
-
position_info=False,
|
|
1618
|
-
well_label="Wells loaded:",
|
|
1619
|
-
pos_label="Positions loaded:",
|
|
1620
|
-
)
|
|
1621
|
-
self.job._ProgressWindow__runner.signals.result.connect(on_table_loaded)
|
|
1679
|
+
if total_positions == 1:
|
|
1680
|
+
# Synchronous load for single position
|
|
1681
|
+
from celldetective.utils.data_loaders import load_experiment_tables
|
|
1622
1682
|
|
|
1623
|
-
|
|
1683
|
+
df = load_experiment_tables(
|
|
1684
|
+
self.exp_dir,
|
|
1685
|
+
population=self.mode,
|
|
1686
|
+
well_option=self.well_option,
|
|
1687
|
+
position_option=self.position_option,
|
|
1688
|
+
)
|
|
1689
|
+
show_table(df)
|
|
1690
|
+
else:
|
|
1691
|
+
# Asynchronous load for multiple positions
|
|
1692
|
+
process_args = {
|
|
1693
|
+
"experiment": self.exp_dir,
|
|
1694
|
+
"population": self.mode,
|
|
1695
|
+
"well_option": self.well_option,
|
|
1696
|
+
"position_option": self.position_option,
|
|
1697
|
+
"show_frame_progress": False,
|
|
1698
|
+
}
|
|
1699
|
+
|
|
1700
|
+
self.df = None
|
|
1701
|
+
|
|
1702
|
+
def on_table_loaded(df):
|
|
1703
|
+
self.df = df
|
|
1704
|
+
show_table(self.df)
|
|
1705
|
+
|
|
1706
|
+
self.job = ProgressWindow(
|
|
1707
|
+
TableLoaderProcess,
|
|
1708
|
+
parent_window=self,
|
|
1709
|
+
title="Loading tables...",
|
|
1710
|
+
process_args=process_args,
|
|
1711
|
+
position_info=False,
|
|
1712
|
+
well_label="Wells loaded:",
|
|
1713
|
+
pos_label="Positions loaded:",
|
|
1714
|
+
)
|
|
1715
|
+
self.job._ProgressWindow__runner.signals.result.connect(on_table_loaded)
|
|
1716
|
+
self.job.exec_()
|
|
1624
1717
|
|
|
1625
1718
|
def load_available_tables(self):
|
|
1626
1719
|
"""
|
|
@@ -1641,8 +1734,87 @@ class ProcessPanel(QFrame, Styles):
|
|
|
1641
1734
|
self.signals = []
|
|
1642
1735
|
if self.df is not None:
|
|
1643
1736
|
self.signals = list(self.df.columns)
|
|
1644
|
-
|
|
1645
|
-
logger.info(
|
|
1737
|
+
else:
|
|
1738
|
+
logger.info(
|
|
1739
|
+
"No table could be found for the selected position(s)... Anticipating measurements..."
|
|
1740
|
+
)
|
|
1741
|
+
|
|
1742
|
+
from celldetective.utils.experiment import extract_experiment_channels
|
|
1743
|
+
|
|
1744
|
+
channel_names, _ = extract_experiment_channels(self.exp_dir)
|
|
1745
|
+
|
|
1746
|
+
# Standard measurements
|
|
1747
|
+
self.signals = ["area"]
|
|
1748
|
+
for ch in channel_names:
|
|
1749
|
+
self.signals.append(f"{ch}_mean")
|
|
1750
|
+
|
|
1751
|
+
# Anticipate from instructions
|
|
1752
|
+
instr_path = os.path.join(
|
|
1753
|
+
self.exp_dir, "configs", f"measurement_instructions_{self.mode}.json"
|
|
1754
|
+
)
|
|
1755
|
+
if os.path.exists(instr_path):
|
|
1756
|
+
try:
|
|
1757
|
+
with open(instr_path, "r") as f:
|
|
1758
|
+
instr = json.load(f)
|
|
1759
|
+
|
|
1760
|
+
# 1. Features
|
|
1761
|
+
features = instr.get("features", [])
|
|
1762
|
+
if features:
|
|
1763
|
+
for f_name in features:
|
|
1764
|
+
if f_name == "intensity_mean":
|
|
1765
|
+
continue # handled by standard
|
|
1766
|
+
if f_name == "area":
|
|
1767
|
+
continue
|
|
1768
|
+
|
|
1769
|
+
# For other features, skimage/celldetective might suffix them.
|
|
1770
|
+
# If it's a generic feature, skimage usually keeps the name.
|
|
1771
|
+
# If it's multichannel, it might need channel names.
|
|
1772
|
+
# For now, let's keep it simple as requested for intensity_mean and area.
|
|
1773
|
+
pass
|
|
1774
|
+
|
|
1775
|
+
# 2. Isotropic measurements
|
|
1776
|
+
radii = instr.get("intensity_measurement_radii", [])
|
|
1777
|
+
ops = instr.get("isotropic_operations", [])
|
|
1778
|
+
if radii and ops:
|
|
1779
|
+
for r in radii if isinstance(radii, list) else [radii]:
|
|
1780
|
+
for op in ops:
|
|
1781
|
+
for ch in channel_names:
|
|
1782
|
+
if isinstance(r, list):
|
|
1783
|
+
self.signals.append(
|
|
1784
|
+
f"{ch}_ring_{int(min(r))}_{int(max(r))}_{op}"
|
|
1785
|
+
)
|
|
1786
|
+
else:
|
|
1787
|
+
self.signals.append(
|
|
1788
|
+
f"{ch}_circle_{int(r)}_{op}"
|
|
1789
|
+
)
|
|
1790
|
+
|
|
1791
|
+
# 3. Border distances
|
|
1792
|
+
borders = instr.get("border_distances", [])
|
|
1793
|
+
if borders:
|
|
1794
|
+
for b in borders if isinstance(borders, list) else [borders]:
|
|
1795
|
+
# Logic from measure.py for suffix
|
|
1796
|
+
b_str = (
|
|
1797
|
+
str(b)
|
|
1798
|
+
.replace("(", "")
|
|
1799
|
+
.replace(")", "")
|
|
1800
|
+
.replace(", ", "_")
|
|
1801
|
+
.replace(",", "_")
|
|
1802
|
+
)
|
|
1803
|
+
suffix = (
|
|
1804
|
+
f"_slice_{b_str.replace('-', 'm')}px"
|
|
1805
|
+
if ("-" in str(b) or "," in str(b))
|
|
1806
|
+
else f"_edge_{b_str}px"
|
|
1807
|
+
)
|
|
1808
|
+
for ch in channel_names:
|
|
1809
|
+
# In measure_features, it's {ch}_mean{suffix}
|
|
1810
|
+
self.signals.append(f"{ch}_mean{suffix}")
|
|
1811
|
+
|
|
1812
|
+
except Exception as e:
|
|
1813
|
+
logger.warning(f"Could not parse measurement instructions: {e}")
|
|
1814
|
+
|
|
1815
|
+
# Remove duplicates and keep order
|
|
1816
|
+
seen = set()
|
|
1817
|
+
self.signals = [x for x in self.signals if not (x in seen or seen.add(x))]
|
|
1646
1818
|
|
|
1647
1819
|
def set_cellpose_scale(self):
|
|
1648
1820
|
|
|
@@ -84,6 +84,12 @@ class SettingsSegmentationModelTraining(CelldetectiveSettingsPanel):
|
|
|
84
84
|
self.bg_loader = BackgroundLoader()
|
|
85
85
|
self.bg_loader.start()
|
|
86
86
|
|
|
87
|
+
def closeEvent(self, event):
|
|
88
|
+
if self.bg_loader.isRunning():
|
|
89
|
+
logger.info("Waiting for background loader to finish...")
|
|
90
|
+
self.bg_loader.wait()
|
|
91
|
+
super().closeEvent(event)
|
|
92
|
+
|
|
87
93
|
def _add_to_layout(self):
|
|
88
94
|
|
|
89
95
|
self._layout.addWidget(self.model_frame)
|
|
@@ -111,6 +111,11 @@ class StackLoader(QThread):
|
|
|
111
111
|
# If nothing to load, wait
|
|
112
112
|
self.mutex.lock()
|
|
113
113
|
self.condition.wait(self.mutex, 500) # Wait 500ms or until new priority
|
|
114
|
+
|
|
115
|
+
if not self.running:
|
|
116
|
+
self.mutex.unlock()
|
|
117
|
+
break
|
|
118
|
+
|
|
114
119
|
self.mutex.unlock()
|
|
115
120
|
|
|
116
121
|
|
|
@@ -113,13 +113,29 @@ def _prep_cellpose_model(
|
|
|
113
113
|
|
|
114
114
|
from cellpose.models import CellposeModel
|
|
115
115
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
116
|
+
try:
|
|
117
|
+
model = CellposeModel(
|
|
118
|
+
gpu=use_gpu,
|
|
119
|
+
device=device,
|
|
120
|
+
pretrained_model=path + model_name,
|
|
121
|
+
model_type=None,
|
|
122
|
+
nchan=n_channels,
|
|
123
|
+
) # diam_mean=30.0,
|
|
124
|
+
except AssertionError as e:
|
|
125
|
+
if use_gpu:
|
|
126
|
+
print(
|
|
127
|
+
f"[WARNING] Could not load Cellpose model with GPU ({e}). Retrying with CPU..."
|
|
128
|
+
)
|
|
129
|
+
device = torch.device("cpu")
|
|
130
|
+
model = CellposeModel(
|
|
131
|
+
gpu=False,
|
|
132
|
+
device=device,
|
|
133
|
+
pretrained_model=path + model_name,
|
|
134
|
+
model_type=None,
|
|
135
|
+
nchan=n_channels,
|
|
136
|
+
)
|
|
137
|
+
else:
|
|
138
|
+
raise e
|
|
123
139
|
if scale is None:
|
|
124
140
|
scale_model = model.diam_mean / model.diam_labels
|
|
125
141
|
else:
|
|
@@ -623,6 +623,9 @@ def fix_missing_labels(position, population="target", prefix="Aligned"):
|
|
|
623
623
|
)
|
|
624
624
|
path = position + os.sep + f"labels_{population}"
|
|
625
625
|
|
|
626
|
+
if not os.path.exists(path):
|
|
627
|
+
os.makedirs(path, exist_ok=True)
|
|
628
|
+
|
|
626
629
|
if label_path != []:
|
|
627
630
|
# path = os.path.split(label_path[0])[0]
|
|
628
631
|
int_valid = [int(lbl.split(os.sep)[-1].split(".")[0]) for lbl in label_path]
|
celldetective/utils/masks.py
CHANGED
|
@@ -2,7 +2,7 @@ from typing import Union, List, Tuple
|
|
|
2
2
|
|
|
3
3
|
import numpy as np
|
|
4
4
|
from scipy import ndimage
|
|
5
|
-
from scipy.ndimage
|
|
5
|
+
from scipy.ndimage import distance_transform_edt
|
|
6
6
|
from skimage.morphology import disk
|
|
7
7
|
from celldetective.log_manager import get_logger
|
|
8
8
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
celldetective/__init__.py,sha256=LfnOyfUnYPGDc8xcsF_PfYEL7-CqAb7BMBPBIWGv84o,666
|
|
2
2
|
celldetective/__main__.py,sha256=Rzzu9ArxZSgfBVjV-lyn-3oanQB2MumQR6itK5ZaRpA,2597
|
|
3
|
-
celldetective/_version.py,sha256=
|
|
3
|
+
celldetective/_version.py,sha256=i0XQAcqdHCcwV-JF_A_FeVVfTjXROj_WnqM2Ktzzq1Q,24
|
|
4
4
|
celldetective/events.py,sha256=n15R53c7QZ2wT8gjb0oeNikQbuRBrVVbyNsRCqXjzXA,8166
|
|
5
5
|
celldetective/exceptions.py,sha256=f3VmIYOthWTiqMEV5xQCox2rw5c5e7yog88h-CcV4oI,356
|
|
6
6
|
celldetective/extra_properties.py,sha256=s_2R4_El2p-gQNZ_EpgDxgrN3UnRitN7KDKHhyLuoHc,21681
|
|
@@ -15,27 +15,27 @@ celldetective/signals.py,sha256=2UURVmeonNgUHpiMQVSps0E9VuskKSbsfsmeCtEmfp8,1374
|
|
|
15
15
|
celldetective/tracking.py,sha256=iwN6rQ9Bmz20JPrFoewywPBrhD864NUiMaZbIINJVZc,49758
|
|
16
16
|
celldetective/datasets/segmentation_annotations/blank,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
17
17
|
celldetective/datasets/signal_annotations/blank,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
18
|
-
celldetective/gui/InitWindow.py,sha256=
|
|
18
|
+
celldetective/gui/InitWindow.py,sha256=uta0lqFsiwcPz3bh8hz44LrTGhzKWa_SQWbylSBZU_w,22366
|
|
19
19
|
celldetective/gui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
20
20
|
celldetective/gui/about.py,sha256=l9SA7WnQs3ISPvZYAGMmf1A0GRXcinkyGwWJpG8akFQ,1977
|
|
21
21
|
celldetective/gui/analyze_block.py,sha256=R82PVFHXfKn8BvUCpbjDOkLBNF4xRVCzYKFHitjw0kk,4114
|
|
22
|
-
celldetective/gui/base_annotator.py,sha256=
|
|
22
|
+
celldetective/gui/base_annotator.py,sha256=xLCg5n4kl_EOajk1KNAdMzB05blaiGdb0kjylx88D_A,32690
|
|
23
23
|
celldetective/gui/classifier_widget.py,sha256=uQ9KQmUFp6qWy0Aic-AKB9DkGNpOLxaERtYBSIX9RHw,25424
|
|
24
24
|
celldetective/gui/configure_new_exp.py,sha256=vgT6ozRIGDvT3R0qENlqvDn17BpKnwyJRhRhDS6ax8A,29954
|
|
25
|
-
celldetective/gui/control_panel.py,sha256=
|
|
25
|
+
celldetective/gui/control_panel.py,sha256=dMNzgivt6GdYROPlYpEY5TTNcANenm9ifUI3W3OcpOo,24337
|
|
26
26
|
celldetective/gui/dynamic_progress.py,sha256=wjTmDPy62qssY0zdteP3T9umIGGQk0UvebFIdn54CIc,16676
|
|
27
27
|
celldetective/gui/event_annotator.py,sha256=bW6IcZsYOmGJPv-3wZHPYGmg2k43PXo0tvHa1ZAFFF8,36338
|
|
28
28
|
celldetective/gui/generic_signal_plot.py,sha256=D3b6pG1yrSi8C2PPyYzK2yA6711CBBPRp5_OIrjayqs,49348
|
|
29
|
-
celldetective/gui/gui_utils.py,sha256=
|
|
29
|
+
celldetective/gui/gui_utils.py,sha256=t6SjEfjcaRH9a0TlbTGEiVRpCgocaCh4lgkIvRgRRwE,33497
|
|
30
30
|
celldetective/gui/interactions_block.py,sha256=34VaHFrdKsq1hYuXrosmpP15JU26dSfbyx4lyt1jxNg,28440
|
|
31
31
|
celldetective/gui/interactive_timeseries_viewer.py,sha256=u_amAhLdEHRpYSRwPDtVm5v-JZIz0ANTcG4YGksX1Vo,16079
|
|
32
32
|
celldetective/gui/json_readers.py,sha256=t5rhtIxACj0pdwLrnPs-QjyhQo3P25UGWGgOCIBhQxs,4572
|
|
33
|
-
celldetective/gui/measure_annotator.py,sha256=
|
|
33
|
+
celldetective/gui/measure_annotator.py,sha256=ljNbsKmFXQk0R9zEfBZ6XfBHzFmlL7Gt6QyPHyqh08g,38357
|
|
34
34
|
celldetective/gui/pair_event_annotator.py,sha256=QJHaM-z0K2I36sLf6XCMFMymfw-nFhzfGJ8oxrMfZco,124091
|
|
35
|
-
celldetective/gui/plot_measurements.py,sha256=
|
|
36
|
-
celldetective/gui/plot_signals_ui.py,sha256=
|
|
35
|
+
celldetective/gui/plot_measurements.py,sha256=a_Mks-5XUTn2QEYih0PlXGp2lX3C34zuhK9ozzE1guM,56593
|
|
36
|
+
celldetective/gui/plot_signals_ui.py,sha256=9VmA1yaTcNf1jY7drtK41R1q87dhEk7bXBCq_cQ94fs,28133
|
|
37
37
|
celldetective/gui/preprocessing_block.py,sha256=cgUBv-eQBwfidK48-cTWJi0PS62wlXhsNLnsKhy6MQY,14967
|
|
38
|
-
celldetective/gui/process_block.py,sha256=
|
|
38
|
+
celldetective/gui/process_block.py,sha256=NBSwg32Juz3dyXMe0uRyYE-qttfsTqSDPyoBgVc5T1c,76891
|
|
39
39
|
celldetective/gui/seg_model_loader.py,sha256=6DzpX630JJgtcsaDEuWA8PEkeb8FC3p__3xeSiFqdGo,23549
|
|
40
40
|
celldetective/gui/survival_ui.py,sha256=IwdRm1gRvhkWdMtrQk04OIKKksW3NZSGYtZO_2GptrA,16034
|
|
41
41
|
celldetective/gui/tableUI.py,sha256=kZP2lp9NwHtbWEqIyaDwohX42tRkhI0Hlf_8O5w5BD0,61267
|
|
@@ -43,7 +43,7 @@ celldetective/gui/thresholds_gui.py,sha256=w6ke2TyIEi71LxbuFGz0UrwH8h21N_ESU-o6x
|
|
|
43
43
|
celldetective/gui/workers.py,sha256=WAtVxFEvHApBSAZMVyYsya_DHL_bYo8b57dbgUJQHc4,14890
|
|
44
44
|
celldetective/gui/base/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
45
45
|
celldetective/gui/base/channel_norm_generator.py,sha256=JqNAo87zA3nMKzkGjvoeV-SHI89eIATwQj4jHv3-LpI,13973
|
|
46
|
-
celldetective/gui/base/components.py,sha256=
|
|
46
|
+
celldetective/gui/base/components.py,sha256=jNUsCU_QE7QUFR0_xEvEPFEBYolMJt7YXGUKMjF7uOE,8155
|
|
47
47
|
celldetective/gui/base/feature_choice.py,sha256=n1T2fPoNLiTDS_6fa_GuGReDhBW11HdUrKy2RywotF8,2800
|
|
48
48
|
celldetective/gui/base/figure_canvas.py,sha256=dQlmLfB3PUttFmyHZIvSc_9GQ5JRy7jH9w7lyKAGElk,1523
|
|
49
49
|
celldetective/gui/base/list_widget.py,sha256=_WU3ZRU7UcJZIxm8qx_5HF7IK7dUu8IU1FY2AaW_qgo,4694
|
|
@@ -76,7 +76,7 @@ celldetective/gui/settings/_settings_event_model_training.py,sha256=TVPnnYPmdAF6
|
|
|
76
76
|
celldetective/gui/settings/_settings_measurements.py,sha256=nrVR1dG3B7iyJayRql1yierhKvgXZiu6qVtfkxI1ABA,47947
|
|
77
77
|
celldetective/gui/settings/_settings_neighborhood.py,sha256=ws6H99bKU4NYd2IYyaJj7g9-MScr5W6UB2raP88ytfE,23767
|
|
78
78
|
celldetective/gui/settings/_settings_segmentation.py,sha256=6DihD1mk-dN4Sstdth1iJ-0HR34rTVlTHP-pXUh_rY0,1901
|
|
79
|
-
celldetective/gui/settings/_settings_segmentation_model_training.py,sha256=
|
|
79
|
+
celldetective/gui/settings/_settings_segmentation_model_training.py,sha256=6Ftih-_1VaICHBFLs6BPO8kf5ZDohwvDF4dEnhYC19M,30440
|
|
80
80
|
celldetective/gui/settings/_settings_signal_annotator.py,sha256=Mvvre-yHJvRoR-slbkLNwEemuGgiMCQQ4H1BHjFk3r4,12412
|
|
81
81
|
celldetective/gui/settings/_settings_tracking.py,sha256=5ZxJp3o3stD2NKdhqZofIgsUNp73oAN_pIi_bDFAd0Y,53293
|
|
82
82
|
celldetective/gui/settings/_stardist_model_params.py,sha256=dEKhaLcJ4r8VxgBU2DI-hcTaTk5S181O-_CN0j7JSgE,4020
|
|
@@ -87,7 +87,7 @@ celldetective/gui/table_ops/_merge_one_hot.py,sha256=gKRgem-u_-JENkVkbjRobsH4TkS
|
|
|
87
87
|
celldetective/gui/table_ops/_query_table.py,sha256=K-XHSZ1I4v2wwqWjyQAgyFRZJbem3CmTfHmO0vijh9g,1345
|
|
88
88
|
celldetective/gui/table_ops/_rename_col.py,sha256=UAgDSpXJo_h4pLJpHaNc2w2VhbaW4D2JZTgJ3cYC4-g,1457
|
|
89
89
|
celldetective/gui/viewers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
90
|
-
celldetective/gui/viewers/base_viewer.py,sha256=
|
|
90
|
+
celldetective/gui/viewers/base_viewer.py,sha256=gHe9QBX6Lrn567Kc-9T6KoGuLqEP_1q4RROFBd9qLWE,29962
|
|
91
91
|
celldetective/gui/viewers/channel_offset_viewer.py,sha256=aQpxrJX9qM_xX848XnFrxrhTqE22DIshtD-uKL8e4gU,12423
|
|
92
92
|
celldetective/gui/viewers/contour_viewer.py,sha256=riHj03LKXLoa-Ys2o2EhCE5nULfcHMohx9LFoXbI6zU,14720
|
|
93
93
|
celldetective/gui/viewers/size_viewer.py,sha256=uXITjaxg5dhQ09Q6TNUxwLxi-ZglyGFcxEH1RtGIZWw,6020
|
|
@@ -147,12 +147,12 @@ celldetective/utils/downloaders.py,sha256=BIl_8XCeaKvtMVC36WITT2g5-O-n0csoMEQXVo
|
|
|
147
147
|
celldetective/utils/experiment.py,sha256=bgADS70QuW4KGbzDJbVpVM-tw4qmZKMWtDT1cSxugrY,58342
|
|
148
148
|
celldetective/utils/image_augmenters.py,sha256=USYd8z6dVn5z1x96IYJ4mG0smN9I_S21QMGU0wyHmjc,11654
|
|
149
149
|
celldetective/utils/image_cleaning.py,sha256=KliQ3K5hdwPx4eFxJnmg3yi-ZIoimEveunPJkbbA6wA,2388
|
|
150
|
-
celldetective/utils/image_loaders.py,sha256=
|
|
150
|
+
celldetective/utils/image_loaders.py,sha256=9O0kpG2ZQWC2-7VNS5kf7ihmusHTqeBk9po4uiUvsFY,34107
|
|
151
151
|
celldetective/utils/image_transforms.py,sha256=cgaHuEUArWWHgxlBlcQLf--zQa-4VphPJ2s2EyPN29o,11213
|
|
152
152
|
celldetective/utils/io.py,sha256=WQH6B27iS722eVV8HHRaSvxMRZ217LoiEIPOqNGtqJk,1632
|
|
153
153
|
celldetective/utils/mask_cleaning.py,sha256=n1Q2RfyhX0W3AcLO0U6ucSyDGRCofj6bPLSO_xeVZPI,12545
|
|
154
154
|
celldetective/utils/mask_transforms.py,sha256=fX-ajhUhzZwOe7rAnMcQc6w4e2B8SZeRp9jrQLF6DFs,144
|
|
155
|
-
celldetective/utils/masks.py,sha256=
|
|
155
|
+
celldetective/utils/masks.py,sha256=g3QHtqyVg6RN0BfmDoPXVjwL3O4xa_dKPC_ZeGmzkeE,7064
|
|
156
156
|
celldetective/utils/maths.py,sha256=pbbWWYNIHTnIBiaR2kJHPDaTPO0rpmQSPjHB7liUSG0,12465
|
|
157
157
|
celldetective/utils/model_getters.py,sha256=jVq9FhAF-xUmFOETWP6hByhoWgapmJGlNmSK11fQ69g,11370
|
|
158
158
|
celldetective/utils/model_loaders.py,sha256=CjScJBGtnenb8qRMZkEozdj1-ULYHvsDFS4AVgYbB5s,10576
|
|
@@ -161,29 +161,32 @@ celldetective/utils/parsing.py,sha256=1zpIH9tyULCRmO5Kwzy6yA01fqm5uE_mZKYtondy-V
|
|
|
161
161
|
celldetective/utils/resources.py,sha256=3Fz_W0NYWl_Ixc2AjEmkOv5f7ejXerCLJ2z1iWhGWUI,1153
|
|
162
162
|
celldetective/utils/stats.py,sha256=4TVHRqi38Y0sed-izaMI51sMP0fd5tC5M68EYyfJjkE,3636
|
|
163
163
|
celldetective/utils/types.py,sha256=lRfWSMVzTkxgoctGGp0NqD551akuxu0ygna7zVGonTg,397
|
|
164
|
-
celldetective/utils/cellpose_utils/__init__.py,sha256=
|
|
164
|
+
celldetective/utils/cellpose_utils/__init__.py,sha256=MeRDojrAkBSXe-wlLu5KIih5wXP9B2aPdP39JLYpoGE,5417
|
|
165
165
|
celldetective/utils/event_detection/__init__.py,sha256=KX20PwPTevdbZ-25otDy_QTmealcDx5xNCfH2SOVIZM,323
|
|
166
166
|
celldetective/utils/plots/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
167
167
|
celldetective/utils/plots/regression.py,sha256=oUCn29-hp7PxMqC-R0yoL60KMw5ZWpZAIoCDh2ErlcY,1764
|
|
168
168
|
celldetective/utils/stardist_utils/__init__.py,sha256=e9s3DEaTKCUOGZb5k_DgShBTl4B0U-Jmg3Ioo8D5PyE,3978
|
|
169
|
-
celldetective-1.5.
|
|
169
|
+
celldetective-1.5.0b4.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
|
170
170
|
tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
171
|
+
tests/test_cellpose_fallback.py,sha256=BJZTDFF8sFR1x7rDbvZQ2RQOB1OP6wuFBRfc8zbl5zw,3513
|
|
171
172
|
tests/test_events.py,sha256=eLFwwEEJfQAdwhews3-fn1HSvzozcNNFN_Qn0gOvQkE,685
|
|
172
173
|
tests/test_filters.py,sha256=uj4NVyUnKXa18EpTSiWCetGKI1VFopDyNSJSUxX44wA,1689
|
|
173
174
|
tests/test_io.py,sha256=gk5FmoI7ANEczUtNXYRxc48KzkfYzemwS_eYaLq4_NI,2093
|
|
174
175
|
tests/test_measure.py,sha256=FEUAs1rVHylvIvubCb0bJDNGZLVmkgXNgI3NaGQ1dA8,4542
|
|
175
176
|
tests/test_neighborhood.py,sha256=gk5FmoI7ANEczUtNXYRxc48KzkfYzemwS_eYaLq4_NI,2093
|
|
176
|
-
tests/test_notebooks.py,sha256=
|
|
177
|
+
tests/test_notebooks.py,sha256=7HVmYiytsz0QIJ11iRkGGs4_hzNjofXAUs_OZou3Gm0,301
|
|
177
178
|
tests/test_preprocessing.py,sha256=c0rKS9d5h37uDcV7fVOTnn5GMVbEB84b8ZTCTdRmvFs,1422
|
|
178
179
|
tests/test_segmentation.py,sha256=k1b_zIZdlytEdJcHjAUQEO3gTBAHtv5WvrwQN2xD4kc,3470
|
|
179
180
|
tests/test_signals.py,sha256=No4cah6KxplhDcKXnU8RrA7eDla4hWw6ccf7xGnBokU,3599
|
|
180
181
|
tests/test_tracking.py,sha256=_YLjwQ3EChQssoHDfEnUJ7fI1yC5KEcJsFnAVR64L70,18909
|
|
181
182
|
tests/test_utils.py,sha256=aSB_eMw9fzTsnxxdYoNmdQQRrXkWqBXB7Uv4TGU6kYE,4778
|
|
182
183
|
tests/gui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
184
|
+
tests/gui/test_enhancements.py,sha256=3x9au_rkQtMZ94DRj3OaEHKPr511RrWqBAUAcNQn1ys,13453
|
|
185
|
+
tests/gui/test_measure_annotator_bugfix.py,sha256=tPfgWNKC0UkvrVssSrUcVDC1qgpzx6l2yCqvKtKYkM4,4544
|
|
183
186
|
tests/gui/test_new_project.py,sha256=wRjW2vEaZb0LWT-f8G8-Ptk8CW9z8-FDPLpV5uqj6ck,8778
|
|
184
187
|
tests/gui/test_project.py,sha256=KzAnodIc0Ovta0ARL5Kr5PkOR5euA6qczT_GhEZpyE4,4710
|
|
185
|
-
celldetective-1.5.
|
|
186
|
-
celldetective-1.5.
|
|
187
|
-
celldetective-1.5.
|
|
188
|
-
celldetective-1.5.
|
|
189
|
-
celldetective-1.5.
|
|
188
|
+
celldetective-1.5.0b4.dist-info/METADATA,sha256=VgzQFDS1ExiiQdY4MjqmWfrRTC-MJQR1meL7t0Q8eMY,10947
|
|
189
|
+
celldetective-1.5.0b4.dist-info/WHEEL,sha256=qELbo2s1Yzl39ZmrAibXA2jjPLUYfnVhUNTlyF1rq0Y,92
|
|
190
|
+
celldetective-1.5.0b4.dist-info/entry_points.txt,sha256=2NU6_EOByvPxqBbCvjwxlVlvnQreqZ3BKRCVIKEv3dg,62
|
|
191
|
+
celldetective-1.5.0b4.dist-info/top_level.txt,sha256=6rsIKKfGMKgud7HPuATcpq6EhdXwcg_yknBVWn9x4C4,20
|
|
192
|
+
celldetective-1.5.0b4.dist-info/RECORD,,
|