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.
@@ -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
- test = self.parent_window.locate_selected_position()
825
- if test:
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
- if not getattr(self.event_annotator, "proceed", True):
829
- return
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
- self.signal_loader = StackLoaderThread(self.event_annotator)
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
- self.signal_progress = CelldetectiveProgressDialog(
834
- "Loading data...", "Cancel", 0, 100, self, window_title="Please wait"
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
- self.signal_progress.setValue(0)
851
+ if not getattr(self.event_annotator, "proceed", True):
852
+ return
838
853
 
839
- self.signal_loader.progress.connect(self.signal_progress.setValue)
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
- def on_finished():
844
- self.signal_progress.blockSignals(True)
845
- self.signal_progress.close()
846
- if not self.signal_loader._is_cancelled:
847
- try:
848
- self.event_annotator.finalize_init()
849
- self.event_annotator.show()
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
- QTimer.singleShot(
852
- 100,
853
- lambda: self.event_annotator.resize(
854
- self.event_annotator.width() + 1,
855
- self.event_annotator.height() + 1,
856
- ),
857
- )
858
- except:
859
- pass
860
- except Exception as e:
861
- print(f"Error finalizing annotator: {e}")
862
- else:
863
- self.event_annotator.close()
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
- self.signal_loader.finished.connect(on_finished)
866
- self.signal_loader.start()
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
- test = self.parent_window.locate_selected_position()
872
- if test:
873
- self.measure_annotator = MeasureAnnotator(self)
874
- self.measure_annotator.show()
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
- process_args = {
1579
- "experiment": self.exp_dir,
1580
- "population": self.mode,
1581
- "well_option": self.well_option,
1582
- "position_option": self.position_option,
1583
- "show_frame_progress": False,
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
- self.df = None
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 on_table_loaded(df):
1589
- self.df = df
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(self.df.columns):
1659
+ if "TRACK_ID" not in list(df.columns):
1593
1660
  plot_mode = "static"
1594
1661
  self.tab_ui = TableUI(
1595
- self.df,
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
- returnValue = msgBox.exec()
1677
+ msgBox.exec()
1611
1678
 
1612
- self.job = ProgressWindow(
1613
- TableLoaderProcess,
1614
- parent_window=self,
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
- result = self.job.exec_()
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
- if self.df is None:
1645
- logger.info("No table could be found for the selected position(s)...")
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
- model = CellposeModel(
117
- gpu=use_gpu,
118
- device=device,
119
- pretrained_model=path + model_name,
120
- model_type=None,
121
- nchan=n_channels,
122
- ) # diam_mean=30.0,
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]
@@ -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.morphology import distance_transform_edt
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
  Metadata-Version: 2.4
2
2
  Name: celldetective
3
- Version: 1.5.0b2
3
+ Version: 1.5.0b4
4
4
  Summary: description
5
5
  Home-page: http://github.com/remyeltorro/celldetective
6
6
  Author: Rémy Torro
@@ -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=CuIe9FnuPFwA2ifQ6Z1we7xlmfgZi2uaLGG8nhwu_eo,24
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=dZMqXYVAYSDDZBGb7_S6IXrQoLo83fSXfymwZw2YWvw,21676
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=ThLDKfUALDbXjKXWEG2gq9BTqinE_NEGWTyVU1XPnOQ,32446
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=vT8Ny9JHGnx25CygjkjqLHBqwj7tL7q-tE4R_iildiQ,24115
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=KbxgwOXGKup_w2FntJxFDSl-eUmc2aqq6h3O5nW8nO0,33258
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=GVyNW1EDHoy3gdGPckHhzHg1L0CkISFBjPRl2Xy-jxc,34541
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=pTBA8_XtAZRsxNtWqd8obOHbDqKyz-c1R085xy7y4Ns,56675
36
- celldetective/gui/plot_signals_ui.py,sha256=oReZwCZw89pFtwuezGQNI6kAz8Q_daKHvNoAKEgzn2w,28195
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=UZD8J2vvecooUW1l0Fl3HZnob0EjJMrVRbIjpSjzgUY,69424
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=RCJ5SPNzauKhs2sBFxpUZwb3k1yyD_5lHDZ30WkFyZo,8111
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=XxqSCxLHOvn1w8V8ZEEfPAvdwfS0IKz107ox4yll7AA,30229
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=1U936rVnRqevXtyqlZnu_1o_VbWx3BJVofKh_oKG1jM,29857
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=nsyneHM67R9r-mmWKI7Z6xpe5MQCLOFsaYKFhxw2R-c,34032
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=wz47NrCsLD_9WX2Goswl_ThgnxyLJokIN6cj8KH7ZjI,7075
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=grsglxR29vj42tlgsBoXnVnjrIJWsBXqbtkjFjzqH7A,4898
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.0b2.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
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=WP5TJM1HV1oN8Hp38MLyE2YuLXjUoMvMJBa343vp1Dg,299
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.0b2.dist-info/METADATA,sha256=D2o2GnCwnu6VqU_q3jJPPn56xqr1pnBtLDpZOfVACCg,10947
186
- celldetective-1.5.0b2.dist-info/WHEEL,sha256=qELbo2s1Yzl39ZmrAibXA2jjPLUYfnVhUNTlyF1rq0Y,92
187
- celldetective-1.5.0b2.dist-info/entry_points.txt,sha256=2NU6_EOByvPxqBbCvjwxlVlvnQreqZ3BKRCVIKEv3dg,62
188
- celldetective-1.5.0b2.dist-info/top_level.txt,sha256=6rsIKKfGMKgud7HPuATcpq6EhdXwcg_yknBVWn9x4C4,20
189
- celldetective-1.5.0b2.dist-info/RECORD,,
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,,