celldetective 1.5.0b0__py3-none-any.whl → 1.5.0b2__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 (29) hide show
  1. celldetective/_version.py +1 -1
  2. celldetective/gui/InitWindow.py +26 -4
  3. celldetective/gui/base/components.py +20 -1
  4. celldetective/gui/base_annotator.py +11 -7
  5. celldetective/gui/event_annotator.py +51 -1060
  6. celldetective/gui/interactions_block.py +55 -25
  7. celldetective/gui/interactive_timeseries_viewer.py +11 -1
  8. celldetective/gui/measure_annotator.py +968 -0
  9. celldetective/gui/process_block.py +88 -34
  10. celldetective/gui/viewers/base_viewer.py +134 -3
  11. celldetective/gui/viewers/contour_viewer.py +4 -4
  12. celldetective/gui/workers.py +124 -10
  13. celldetective/measure.py +3 -0
  14. celldetective/napari/utils.py +29 -19
  15. celldetective/processes/downloader.py +122 -96
  16. celldetective/processes/load_table.py +55 -0
  17. celldetective/processes/measure_cells.py +107 -81
  18. celldetective/processes/track_cells.py +39 -39
  19. celldetective/segmentation.py +1 -1
  20. celldetective/tracking.py +9 -0
  21. celldetective/utils/data_loaders.py +21 -1
  22. celldetective/utils/downloaders.py +38 -0
  23. celldetective/utils/maths.py +14 -1
  24. {celldetective-1.5.0b0.dist-info → celldetective-1.5.0b2.dist-info}/METADATA +1 -1
  25. {celldetective-1.5.0b0.dist-info → celldetective-1.5.0b2.dist-info}/RECORD +29 -27
  26. {celldetective-1.5.0b0.dist-info → celldetective-1.5.0b2.dist-info}/WHEEL +0 -0
  27. {celldetective-1.5.0b0.dist-info → celldetective-1.5.0b2.dist-info}/entry_points.txt +0 -0
  28. {celldetective-1.5.0b0.dist-info → celldetective-1.5.0b2.dist-info}/licenses/LICENSE +0 -0
  29. {celldetective-1.5.0b0.dist-info → celldetective-1.5.0b2.dist-info}/top_level.txt +0 -0
@@ -25,6 +25,7 @@ from celldetective.utils.image_loaders import (
25
25
  _get_img_num_per_channel,
26
26
  auto_load_number_of_frames,
27
27
  _load_frames_to_measure,
28
+ locate_labels,
28
29
  )
29
30
  from celldetective.utils.io import remove_file_if_exists
30
31
  from celldetective.utils.parsing import config_section_to_dict
@@ -210,15 +211,6 @@ class TrackingProcess(Process):
210
211
  )
211
212
  if len(self.label_path) > 0:
212
213
  logger.info(f"Found {len(self.label_path)} segmented frames...")
213
- # Optimize: Create a map of frame index to file path
214
- self.label_map = {}
215
- for path in self.label_path:
216
- try:
217
- # Assumes format ####.tif, e.g., 0001.tif
218
- frame_idx = int(os.path.basename(path).split(".")[0])
219
- self.label_map[frame_idx] = path
220
- except ValueError:
221
- continue
222
214
  else:
223
215
  logger.error(
224
216
  f"No segmented frames have been found. Please run segmentation first. Abort..."
@@ -245,37 +237,39 @@ class TrackingProcess(Process):
245
237
 
246
238
  for t in tqdm(indices, desc="frame"):
247
239
 
248
- # Load channels at time t
249
- img = _load_frames_to_measure(
250
- self.file, indices=self.img_num_channels[:, t]
251
- )
252
- # Optimize: Direct lookup instead of glob
253
- if t in self.label_map:
254
- try:
255
- # Load image from path in map
256
- lbl = np.array(imread(self.label_map[t]))
257
- except Exception as e:
258
- logger.error(f"Failed to load label for frame {t}: {e}")
259
- continue
260
- else:
261
- # Fallback or skip if not in map
262
- continue
263
-
264
- df_props = measure_features(
265
- img,
266
- lbl,
267
- features=self.features + ["centroid"],
268
- border_dist=None,
269
- channels=self.channel_names,
270
- haralick_options=self.haralick_options,
271
- verbose=False,
272
- )
273
- df_props.rename(
274
- columns={"centroid-1": "x", "centroid-0": "y"}, inplace=True
275
- )
276
- df_props["t"] = int(t)
240
+ perform_tracking = True
277
241
 
278
- props.append(df_props)
242
+ # Load channels at time t
243
+ try:
244
+ img = _load_frames_to_measure(
245
+ self.file, indices=self.img_num_channels[:, t]
246
+ )
247
+ except Exception as e:
248
+ logger.error(f"Failed to load image for frame {t}: {e}")
249
+ perform_tracking = False
250
+
251
+ if perform_tracking:
252
+ lbl = locate_labels(self.pos, population=self.mode, frames=t)
253
+ if lbl is None:
254
+ logger.warning(f"Failed to load label for frame {t}")
255
+ perform_tracking = False
256
+
257
+ if perform_tracking:
258
+ df_props = measure_features(
259
+ img,
260
+ lbl,
261
+ features=self.features + ["centroid"],
262
+ border_dist=None,
263
+ channels=self.channel_names,
264
+ haralick_options=self.haralick_options,
265
+ verbose=False,
266
+ )
267
+ df_props.rename(
268
+ columns={"centroid-1": "x", "centroid-0": "y"}, inplace=True
269
+ )
270
+ df_props["t"] = int(t)
271
+
272
+ props.append(df_props)
279
273
 
280
274
  # Progress Update
281
275
  self.loop_count += 1
@@ -349,6 +343,7 @@ class TrackingProcess(Process):
349
343
  return
350
344
 
351
345
  df = pd.concat(self.timestep_dataframes)
346
+ logger.info(f"Aggregated DataFrame shape: {df.shape}")
352
347
  if df.empty:
353
348
  logger.warning("Dataframe is empty. Skipping position.")
354
349
  return
@@ -357,6 +352,7 @@ class TrackingProcess(Process):
357
352
 
358
353
  df.reset_index(inplace=True, drop=True)
359
354
  df = _mask_intensity_measurements(df, self.mask_channels)
355
+ logger.info(f"DataFrame shape after masking intensity measurements: {df.shape}")
360
356
 
361
357
  # do tracking
362
358
  if self.btrack_option:
@@ -380,6 +376,9 @@ class TrackingProcess(Process):
380
376
  search_range=self.search_range,
381
377
  memory=self.memory,
382
378
  )
379
+ logger.info(
380
+ f"Tracking output: Trajectories shape: {trajectories.shape} if trajectories is not None else 'None'"
381
+ )
383
382
  except Exception as e:
384
383
  logger.error(f"Tracking failed: {e}")
385
384
  if "search_range" in str(e) or "SubnetOversizeException" in str(e):
@@ -399,6 +398,7 @@ class TrackingProcess(Process):
399
398
  allow_pickle=True,
400
399
  )
401
400
 
401
+ logger.info(f"Shape of trajectories before saving: {trajectories.shape}")
402
402
  trajectories.to_csv(
403
403
  self.pos + os.sep.join(["output", "tables", self.table_name]), index=False
404
404
  )
@@ -163,6 +163,7 @@ def segment(
163
163
  f"{spatial_calibration=} {required_spatial_calibration=} Scale = {scale}..."
164
164
  )
165
165
 
166
+ model = None
166
167
  if model_type == "stardist":
167
168
  model, scale_model = _prep_stardist_model(
168
169
  model_name, Path(model_path).parent, use_gpu=use_gpu, scale=scale
@@ -177,7 +178,6 @@ def segment(
177
178
  scale=scale,
178
179
  )
179
180
 
180
-
181
181
  if model is None:
182
182
  logger.error(f"Could not load model {model_name}. Aborting segmentation.")
183
183
  return None
celldetective/tracking.py CHANGED
@@ -176,6 +176,10 @@ def track(
176
176
  tracker.optimize(options=optimizer_options)
177
177
 
178
178
  data, properties, graph = tracker.to_napari() # ndim=2
179
+ print(f"DEBUG: tracker.to_napari() returned data shape: {data.shape}")
180
+ print(
181
+ f"DEBUG: tracker.to_napari() returned properties keys: {list(properties.keys()) if properties else 'None'}"
182
+ )
179
183
  # do the table post processing and napari options
180
184
  if data.shape[1] == 4:
181
185
  df = pd.DataFrame(
@@ -258,7 +262,12 @@ def track(
258
262
  df = write_first_detection_class(df, img_shape=volume, column_labels=column_labels)
259
263
 
260
264
  if clean_trajectories_kwargs is not None:
265
+ print(
266
+ f"DEBUG: Calling clean_trajectories with kwargs: {clean_trajectories_kwargs}"
267
+ )
268
+ print(f"DEBUG: df shape before clean: {df.shape}")
261
269
  df = clean_trajectories(df.copy(), **clean_trajectories_kwargs)
270
+ print(f"DEBUG: df shape after clean: {df.shape}")
262
271
 
263
272
  df.loc[df["status_firstdetection"].isna(), "status_firstdetection"] = 0
264
273
  df["ID"] = np.arange(len(df)).astype(int)
@@ -148,6 +148,7 @@ def load_experiment_tables(
148
148
  position_option="*",
149
149
  return_pos_info=False,
150
150
  load_pickle=False,
151
+ progress_callback=None,
151
152
  ):
152
153
  """
153
154
  Load tabular data for an experiment, optionally including position-level information.
@@ -225,7 +226,18 @@ def load_experiment_tables(
225
226
  df_pos_info = []
226
227
  real_well_index = 0
227
228
 
228
- for k, well_path in enumerate(tqdm(wells[well_indices])):
229
+ total_wells = len(well_indices)
230
+
231
+ iterator = wells[well_indices]
232
+ if progress_callback is None:
233
+ iterator = tqdm(wells[well_indices])
234
+
235
+ for k, well_path in enumerate(iterator):
236
+
237
+ if progress_callback is not None:
238
+ well_progress = round(k / total_wells * 100)
239
+ # Signal keep_going logic if needed, but for now just send progress
240
+ # If callback returns False, we could abort, but simpler to just update for now.
229
241
 
230
242
  any_table = False # assume no table
231
243
 
@@ -242,8 +254,16 @@ def load_experiment_tables(
242
254
  continue
243
255
 
244
256
  real_pos_index = 0
257
+ total_positions = len(positions)
258
+
245
259
  for pidx, pos_path in enumerate(positions):
246
260
 
261
+ if progress_callback is not None:
262
+ pos_progress = round(pidx / total_positions * 100)
263
+ should_continue = progress_callback(well_progress, pos_progress)
264
+ if should_continue is False:
265
+ return None, None if return_pos_info else None
266
+
247
267
  pos_name = extract_position_name(pos_path)
248
268
 
249
269
  stack_path = get_position_movie_path(pos_path, prefix=movie_prefix)
@@ -159,6 +159,44 @@ def download_url_to_file(url, dst, progress=True):
159
159
  def download_zenodo_file(file, output_dir):
160
160
 
161
161
  logger.info(f"{file=} {output_dir=}")
162
+
163
+ # GUI Check
164
+ try:
165
+ from PyQt5.QtWidgets import QApplication, QDialog
166
+
167
+ app = QApplication.instance()
168
+ use_gui = app is not None
169
+ except ImportError:
170
+ use_gui = False
171
+
172
+ if use_gui:
173
+ try:
174
+ from celldetective.gui.workers import GenericProgressWindow
175
+ from celldetective.processes.downloader import DownloadProcess
176
+
177
+ # Find parent window if possible, else None is fine for a dialog
178
+ parent = app.activeWindow()
179
+
180
+ process_args = {"output_dir": output_dir, "file": file}
181
+ job = GenericProgressWindow(
182
+ DownloadProcess,
183
+ parent_window=parent,
184
+ title="Download",
185
+ process_args=process_args,
186
+ label_text=f"Downloading {file}...",
187
+ )
188
+ result = job.exec_()
189
+ if result == QDialog.Accepted:
190
+ return # DownloadProcess handles the file operations
191
+ else:
192
+ logger.info("Download cancelled or failed.")
193
+ return
194
+
195
+ except Exception as e:
196
+ logger.error(f"Failed to use GUI downloader: {e}. Falling back to console.")
197
+ # Fallback to console implementation below if GUI fails
198
+
199
+ # Console Implementation
162
200
  zenodo_json = os.sep.join(
163
201
  [
164
202
  os.path.split(os.path.dirname(os.path.realpath(__file__)))[0],
@@ -2,6 +2,11 @@ from typing import Union, List
2
2
  import numpy as np
3
3
 
4
4
 
5
+ from celldetective import get_logger
6
+
7
+ logger = get_logger()
8
+
9
+
5
10
  def step_function(t: Union[np.ndarray, List], t_shift: float, dt: float) -> np.ndarray:
6
11
  """
7
12
  Computes a step function using the logistic sigmoid function.
@@ -40,7 +45,15 @@ def step_function(t: Union[np.ndarray, List], t_shift: float, dt: float) -> np.n
40
45
  array([0.26894142, 0.37754067, 0.5 , 0.62245933, 0.73105858, 0.81757448])
41
46
  """
42
47
 
43
- return 1 / (1 + np.exp(-(t - t_shift) / dt))
48
+ with np.errstate(over="raise", divide="raise"):
49
+ try:
50
+ return 1 / (1 + np.exp(-(t - t_shift) / dt))
51
+ except FloatingPointError as e:
52
+ logger.warning(
53
+ f"Math warning in step_function: {e}. t_shift={t_shift}, dt={dt}. Range of t: [{np.min(t)}, {np.max(t)}]"
54
+ )
55
+ with np.errstate(over="ignore", divide="ignore"):
56
+ return 1 / (1 + np.exp(-(t - t_shift) / dt))
44
57
 
45
58
 
46
59
  def derivative(x, timeline, window, mode="bi"):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: celldetective
3
- Version: 1.5.0b0
3
+ Version: 1.5.0b2
4
4
  Summary: description
5
5
  Home-page: http://github.com/remyeltorro/celldetective
6
6
  Author: Rémy Torro
@@ -1,48 +1,49 @@
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=AMZ674Vi7YVfxguQYyBETUqhTbHYuk3GDM_LK-X1UBg,23
3
+ celldetective/_version.py,sha256=CuIe9FnuPFwA2ifQ6Z1we7xlmfgZi2uaLGG8nhwu_eo,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
7
7
  celldetective/filters.py,sha256=QSRSpqvwUfa0YrU5EKoobJWCQFy07fFHwZ2bXxTL3hE,6933
8
8
  celldetective/log_manager.py,sha256=Tv7_mVn0TVOyTs_2VnyEKl9_NMeDUtEkLC5njUq-r-Y,2968
9
- celldetective/measure.py,sha256=Nlbh-YT7D2uafRRGFTl2a63UDkBkbBXnnMqs9zWXP_I,71854
9
+ celldetective/measure.py,sha256=V-1J9l5CIkxJWnEWQp0xMQVv1PPCPZJMS0tkIKCLGXM,72048
10
10
  celldetective/neighborhood.py,sha256=Z5wu2nSMvabrQz91oy6DRf2o90LUY0RMXTEwgW7ORAg,74844
11
11
  celldetective/preprocessing.py,sha256=tjAMLG4ZMfopMSFulGGjMQox7czEcReV2MzEkWlL2eQ,59948
12
12
  celldetective/relative_measurements.py,sha256=j7xIj1FiY3kn5nA_wMqHV3wvjqikjnk99kZ7v9G6I5Q,42928
13
- celldetective/segmentation.py,sha256=Itg8xbfEziQKApA7YCo9FTk8c44OrlsJbvtkik6tkgE,33567
13
+ celldetective/segmentation.py,sha256=yIFZn0XDaudj9XkSjWW9k6LqZEM-OQdp98ylwQQtlTg,33583
14
14
  celldetective/signals.py,sha256=2UURVmeonNgUHpiMQVSps0E9VuskKSbsfsmeCtEmfp8,137484
15
- celldetective/tracking.py,sha256=pjejp65IltUMjW_tlbxjYW0SoBR1-gaEeSJa0y2cWpw,49286
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=ynelHEkC9USY14MrsHr_HKtC6YPWQOahk3sv-ZcaKFc,20921
18
+ celldetective/gui/InitWindow.py,sha256=dZMqXYVAYSDDZBGb7_S6IXrQoLo83fSXfymwZw2YWvw,21676
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=zMvfbuijCiEdPFOGTc_LPxGpdBX-BRtq6VuDXGvXk08,32364
22
+ celldetective/gui/base_annotator.py,sha256=ThLDKfUALDbXjKXWEG2gq9BTqinE_NEGWTyVU1XPnOQ,32446
23
23
  celldetective/gui/classifier_widget.py,sha256=uQ9KQmUFp6qWy0Aic-AKB9DkGNpOLxaERtYBSIX9RHw,25424
24
24
  celldetective/gui/configure_new_exp.py,sha256=vgT6ozRIGDvT3R0qENlqvDn17BpKnwyJRhRhDS6ax8A,29954
25
25
  celldetective/gui/control_panel.py,sha256=vT8Ny9JHGnx25CygjkjqLHBqwj7tL7q-tE4R_iildiQ,24115
26
26
  celldetective/gui/dynamic_progress.py,sha256=wjTmDPy62qssY0zdteP3T9umIGGQk0UvebFIdn54CIc,16676
27
- celldetective/gui/event_annotator.py,sha256=kCrehnLQagLXqViWHcOF-kHj9i1pbdJ97CLUU-HOM7w,73019
27
+ celldetective/gui/event_annotator.py,sha256=bW6IcZsYOmGJPv-3wZHPYGmg2k43PXo0tvHa1ZAFFF8,36338
28
28
  celldetective/gui/generic_signal_plot.py,sha256=D3b6pG1yrSi8C2PPyYzK2yA6711CBBPRp5_OIrjayqs,49348
29
29
  celldetective/gui/gui_utils.py,sha256=KbxgwOXGKup_w2FntJxFDSl-eUmc2aqq6h3O5nW8nO0,33258
30
- celldetective/gui/interactions_block.py,sha256=6HiCvRnVpfxgPJLYOy9gFyPKTApsXjGgojTqri9gW6Y,27401
31
- celldetective/gui/interactive_timeseries_viewer.py,sha256=BLVOXf2Rx-6DFDW-dKqa8Fw0Q1OeC72J0qwUytuZUaU,15943
30
+ celldetective/gui/interactions_block.py,sha256=34VaHFrdKsq1hYuXrosmpP15JU26dSfbyx4lyt1jxNg,28440
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
34
  celldetective/gui/pair_event_annotator.py,sha256=QJHaM-z0K2I36sLf6XCMFMymfw-nFhzfGJ8oxrMfZco,124091
34
35
  celldetective/gui/plot_measurements.py,sha256=pTBA8_XtAZRsxNtWqd8obOHbDqKyz-c1R085xy7y4Ns,56675
35
36
  celldetective/gui/plot_signals_ui.py,sha256=oReZwCZw89pFtwuezGQNI6kAz8Q_daKHvNoAKEgzn2w,28195
36
37
  celldetective/gui/preprocessing_block.py,sha256=cgUBv-eQBwfidK48-cTWJi0PS62wlXhsNLnsKhy6MQY,14967
37
- celldetective/gui/process_block.py,sha256=byOZ-dz65mUJ66shzu3RNsuVQ4zGhiolAzI5LlKsxAc,67444
38
+ celldetective/gui/process_block.py,sha256=UZD8J2vvecooUW1l0Fl3HZnob0EjJMrVRbIjpSjzgUY,69424
38
39
  celldetective/gui/seg_model_loader.py,sha256=6DzpX630JJgtcsaDEuWA8PEkeb8FC3p__3xeSiFqdGo,23549
39
40
  celldetective/gui/survival_ui.py,sha256=IwdRm1gRvhkWdMtrQk04OIKKksW3NZSGYtZO_2GptrA,16034
40
41
  celldetective/gui/tableUI.py,sha256=kZP2lp9NwHtbWEqIyaDwohX42tRkhI0Hlf_8O5w5BD0,61267
41
42
  celldetective/gui/thresholds_gui.py,sha256=w6ke2TyIEi71LxbuFGz0UrwH8h21N_ESU-o6xq_NNKo,33346
42
- celldetective/gui/workers.py,sha256=0U-wn_dmZjB2idGjpM8s_1dLET9Eh2TmVWB6PLJTSas,11411
43
+ celldetective/gui/workers.py,sha256=WAtVxFEvHApBSAZMVyYsya_DHL_bYo8b57dbgUJQHc4,14890
43
44
  celldetective/gui/base/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
44
45
  celldetective/gui/base/channel_norm_generator.py,sha256=JqNAo87zA3nMKzkGjvoeV-SHI89eIATwQj4jHv3-LpI,13973
45
- celldetective/gui/base/components.py,sha256=DF1sT2AZIpTec7mYYihIMTDYKRrT5k2DoaceZjvAEEw,7452
46
+ celldetective/gui/base/components.py,sha256=RCJ5SPNzauKhs2sBFxpUZwb3k1yyD_5lHDZ30WkFyZo,8111
46
47
  celldetective/gui/base/feature_choice.py,sha256=n1T2fPoNLiTDS_6fa_GuGReDhBW11HdUrKy2RywotF8,2800
47
48
  celldetective/gui/base/figure_canvas.py,sha256=dQlmLfB3PUttFmyHZIvSc_9GQ5JRy7jH9w7lyKAGElk,1523
48
49
  celldetective/gui/base/list_widget.py,sha256=_WU3ZRU7UcJZIxm8qx_5HF7IK7dUu8IU1FY2AaW_qgo,4694
@@ -86,9 +87,9 @@ celldetective/gui/table_ops/_merge_one_hot.py,sha256=gKRgem-u_-JENkVkbjRobsH4TkS
86
87
  celldetective/gui/table_ops/_query_table.py,sha256=K-XHSZ1I4v2wwqWjyQAgyFRZJbem3CmTfHmO0vijh9g,1345
87
88
  celldetective/gui/table_ops/_rename_col.py,sha256=UAgDSpXJo_h4pLJpHaNc2w2VhbaW4D2JZTgJ3cYC4-g,1457
88
89
  celldetective/gui/viewers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
89
- celldetective/gui/viewers/base_viewer.py,sha256=etX9c9Fw-LXXzD_zUrcOHFEaHKF-XZt7VlZ2YmMvFhc,25303
90
+ celldetective/gui/viewers/base_viewer.py,sha256=1U936rVnRqevXtyqlZnu_1o_VbWx3BJVofKh_oKG1jM,29857
90
91
  celldetective/gui/viewers/channel_offset_viewer.py,sha256=aQpxrJX9qM_xX848XnFrxrhTqE22DIshtD-uKL8e4gU,12423
91
- celldetective/gui/viewers/contour_viewer.py,sha256=zN0MKYZRM4mSFIoaeDPf36RcH7D8j1VUsgD_r8HPtDc,14696
92
+ celldetective/gui/viewers/contour_viewer.py,sha256=riHj03LKXLoa-Ys2o2EhCE5nULfcHMohx9LFoXbI6zU,14720
92
93
  celldetective/gui/viewers/size_viewer.py,sha256=uXITjaxg5dhQ09Q6TNUxwLxi-ZglyGFcxEH1RtGIZWw,6020
93
94
  celldetective/gui/viewers/spot_detection_viewer.py,sha256=JO7kcqATHXR91lLvo8aQ5xVYdtxkMxV-xx36s01VlNQ,12545
94
95
  celldetective/gui/viewers/threshold_viewer.py,sha256=CBc6Y7cGK5U3ptAMMkmRLBvm5yl7pjGEUJjB4PKWjfM,11627
@@ -113,15 +114,16 @@ celldetective/models/tracking_configs/no_z_motion.json,sha256=b4RWOJ0w6Y2e0vJYwK
113
114
  celldetective/models/tracking_configs/ricm.json,sha256=L-vmwCR1f89U-qnH2Ms0cBfPFR_dxIWoe2ccH8V-QBA,2727
114
115
  celldetective/models/tracking_configs/ricm2.json,sha256=DDjJ6ScYcDWvlsy7ujPID8v8H28vcNcMuZmNR8XmGxo,2718
115
116
  celldetective/napari/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
116
- celldetective/napari/utils.py,sha256=mjFeG1TDqHJs7cRcpfGWwAoFpWzJYZOEmUue7ZMYmzI,35106
117
+ celldetective/napari/utils.py,sha256=NHaQhaVkgFZ9EuxD3b5N4dNSzQGSJ4dfB9WJ-Ga5N88,35436
117
118
  celldetective/processes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
118
119
  celldetective/processes/background_correction.py,sha256=fyv2_7ztUex7RDwIRaURweYZsRe-YD_ZPUHeiFmVq6Q,10715
119
120
  celldetective/processes/compute_neighborhood.py,sha256=DGi4U3el0OisRNaOQSzUaXpEgHBO440-Q4cUphB6FAA,34393
120
121
  celldetective/processes/detect_events.py,sha256=4psWjnYxbMB3p0BrRoQgkXgIdsnUIErrqUkE9CU4hRM,9733
121
- celldetective/processes/downloader.py,sha256=jnNitmQ9xUCGJHSvr3Myts5soe6rdYDBx_AGJKr1AWk,3406
122
- celldetective/processes/measure_cells.py,sha256=ccf2j7_6dcRevEhseVXioIjiATx8IvIsi5ZG3IcdhJY,20876
122
+ celldetective/processes/downloader.py,sha256=3SA5T1AoLch90d-VZzIY4wVAlSjDY_kgVLPN3ztRyVk,4589
123
+ celldetective/processes/load_table.py,sha256=GxB5ZWmtNbF5Iv6XPaeisNGl3KeNDgfosFm6w64xXrM,1730
124
+ celldetective/processes/measure_cells.py,sha256=yKFEomJ0y2leWn-bp3z4Rs_lAmwDLiQ-Ies3KkFHSxs,21877
123
125
  celldetective/processes/segment_cells.py,sha256=klGl5y3tHbLbQFNAQz0PV1FspmiPC-GHVGWYLgyLqwc,26500
124
- celldetective/processes/track_cells.py,sha256=cgQNn7fsqPCHODhe27sqvMUlubsi7qM_0qjAXbj68oY,15084
126
+ celldetective/processes/track_cells.py,sha256=ndKZpVXonnooOVnHK5AVED5i_i2bZ4FefTt1_dEZS48,15188
125
127
  celldetective/processes/train_segmentation_model.py,sha256=j1aPgR4CzF2OR-9njriNmUStVViiWaiicQA9YWRWOTo,25411
126
128
  celldetective/processes/train_signal_model.py,sha256=HInUHCXNePhfQs8-DQOreJ19LtLkQopvYSyX8tj0mOo,9498
127
129
  celldetective/processes/unified_process.py,sha256=vHAS_LbtwmlOjKho_FpwDy7WHVgyY38s3X2BtHxep7A,11671
@@ -139,9 +141,9 @@ celldetective/scripts/train_signal_model.py,sha256=zPSdlr4WnnL6yTSL9ZreFNVw1is4E
139
141
  celldetective/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
140
142
  celldetective/utils/color_mappings.py,sha256=yarqOTSrTsnOPPiPrrN_vLoPCbgWqF3wjqFwpbp-KsU,1007
141
143
  celldetective/utils/data_cleaning.py,sha256=K-2gScxLreX7QkrM0h3dZdP0IsmvCzcxNh2-M9PALZY,22025
142
- celldetective/utils/data_loaders.py,sha256=tExtC_7gX16VYmYFz8BU7jRKLDug2egVghU1YIcGRh0,16292
144
+ celldetective/utils/data_loaders.py,sha256=6Jg99U93qYjjs2xZErc2cz37tcH5e4vEqDH8PJgoEJs,17077
143
145
  celldetective/utils/dataset_helpers.py,sha256=3ezpHO6nytw2Mx0D3maP_4535V2ohOTQn6Qpfk8gnms,6898
144
- celldetective/utils/downloaders.py,sha256=Cf7K-f_Bm4M6HIfgiSoIoph0O1NS6LZIaYvgWKauXes,6595
146
+ celldetective/utils/downloaders.py,sha256=BIl_8XCeaKvtMVC36WITT2g5-O-n0csoMEQXVoa1B4o,7887
145
147
  celldetective/utils/experiment.py,sha256=bgADS70QuW4KGbzDJbVpVM-tw4qmZKMWtDT1cSxugrY,58342
146
148
  celldetective/utils/image_augmenters.py,sha256=USYd8z6dVn5z1x96IYJ4mG0smN9I_S21QMGU0wyHmjc,11654
147
149
  celldetective/utils/image_cleaning.py,sha256=KliQ3K5hdwPx4eFxJnmg3yi-ZIoimEveunPJkbbA6wA,2388
@@ -151,7 +153,7 @@ celldetective/utils/io.py,sha256=WQH6B27iS722eVV8HHRaSvxMRZ217LoiEIPOqNGtqJk,163
151
153
  celldetective/utils/mask_cleaning.py,sha256=n1Q2RfyhX0W3AcLO0U6ucSyDGRCofj6bPLSO_xeVZPI,12545
152
154
  celldetective/utils/mask_transforms.py,sha256=fX-ajhUhzZwOe7rAnMcQc6w4e2B8SZeRp9jrQLF6DFs,144
153
155
  celldetective/utils/masks.py,sha256=wz47NrCsLD_9WX2Goswl_ThgnxyLJokIN6cj8KH7ZjI,7075
154
- celldetective/utils/maths.py,sha256=cYdIqSgpaDO1JZOpmgGFPPikEvu66absC64op_6kw0o,12003
156
+ celldetective/utils/maths.py,sha256=pbbWWYNIHTnIBiaR2kJHPDaTPO0rpmQSPjHB7liUSG0,12465
155
157
  celldetective/utils/model_getters.py,sha256=jVq9FhAF-xUmFOETWP6hByhoWgapmJGlNmSK11fQ69g,11370
156
158
  celldetective/utils/model_loaders.py,sha256=CjScJBGtnenb8qRMZkEozdj1-ULYHvsDFS4AVgYbB5s,10576
157
159
  celldetective/utils/normalization.py,sha256=SN-nrycZtmtqv8v1S9bAKvDTGiN6cQKfryitwNtH1bA,15635
@@ -164,7 +166,7 @@ celldetective/utils/event_detection/__init__.py,sha256=KX20PwPTevdbZ-25otDy_QTme
164
166
  celldetective/utils/plots/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
165
167
  celldetective/utils/plots/regression.py,sha256=oUCn29-hp7PxMqC-R0yoL60KMw5ZWpZAIoCDh2ErlcY,1764
166
168
  celldetective/utils/stardist_utils/__init__.py,sha256=e9s3DEaTKCUOGZb5k_DgShBTl4B0U-Jmg3Ioo8D5PyE,3978
167
- celldetective-1.5.0b0.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
169
+ celldetective-1.5.0b2.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
168
170
  tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
169
171
  tests/test_events.py,sha256=eLFwwEEJfQAdwhews3-fn1HSvzozcNNFN_Qn0gOvQkE,685
170
172
  tests/test_filters.py,sha256=uj4NVyUnKXa18EpTSiWCetGKI1VFopDyNSJSUxX44wA,1689
@@ -180,8 +182,8 @@ tests/test_utils.py,sha256=aSB_eMw9fzTsnxxdYoNmdQQRrXkWqBXB7Uv4TGU6kYE,4778
180
182
  tests/gui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
181
183
  tests/gui/test_new_project.py,sha256=wRjW2vEaZb0LWT-f8G8-Ptk8CW9z8-FDPLpV5uqj6ck,8778
182
184
  tests/gui/test_project.py,sha256=KzAnodIc0Ovta0ARL5Kr5PkOR5euA6qczT_GhEZpyE4,4710
183
- celldetective-1.5.0b0.dist-info/METADATA,sha256=btAint9Y6sB0i_XItoVQqUHMsn1KtXNm0JSeavdXH48,10947
184
- celldetective-1.5.0b0.dist-info/WHEEL,sha256=qELbo2s1Yzl39ZmrAibXA2jjPLUYfnVhUNTlyF1rq0Y,92
185
- celldetective-1.5.0b0.dist-info/entry_points.txt,sha256=2NU6_EOByvPxqBbCvjwxlVlvnQreqZ3BKRCVIKEv3dg,62
186
- celldetective-1.5.0b0.dist-info/top_level.txt,sha256=6rsIKKfGMKgud7HPuATcpq6EhdXwcg_yknBVWn9x4C4,20
187
- celldetective-1.5.0b0.dist-info/RECORD,,
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,,