celldetective 1.5.0b1__py3-none-any.whl → 1.5.0b3__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 (35) hide show
  1. celldetective/_version.py +1 -1
  2. celldetective/gui/InitWindow.py +51 -12
  3. celldetective/gui/base/components.py +22 -1
  4. celldetective/gui/base_annotator.py +20 -9
  5. celldetective/gui/control_panel.py +21 -16
  6. celldetective/gui/event_annotator.py +51 -1060
  7. celldetective/gui/gui_utils.py +14 -5
  8. celldetective/gui/interactions_block.py +55 -25
  9. celldetective/gui/interactive_timeseries_viewer.py +11 -1
  10. celldetective/gui/measure_annotator.py +1064 -0
  11. celldetective/gui/plot_measurements.py +2 -4
  12. celldetective/gui/plot_signals_ui.py +3 -4
  13. celldetective/gui/process_block.py +298 -72
  14. celldetective/gui/viewers/base_viewer.py +134 -3
  15. celldetective/gui/viewers/contour_viewer.py +4 -4
  16. celldetective/gui/workers.py +25 -10
  17. celldetective/measure.py +3 -0
  18. celldetective/napari/utils.py +29 -19
  19. celldetective/processes/load_table.py +55 -0
  20. celldetective/processes/measure_cells.py +107 -81
  21. celldetective/processes/track_cells.py +39 -39
  22. celldetective/segmentation.py +1 -1
  23. celldetective/tracking.py +9 -0
  24. celldetective/utils/data_loaders.py +21 -1
  25. celldetective/utils/image_loaders.py +3 -0
  26. celldetective/utils/masks.py +1 -1
  27. celldetective/utils/maths.py +14 -1
  28. {celldetective-1.5.0b1.dist-info → celldetective-1.5.0b3.dist-info}/METADATA +1 -1
  29. {celldetective-1.5.0b1.dist-info → celldetective-1.5.0b3.dist-info}/RECORD +35 -32
  30. tests/gui/test_enhancements.py +351 -0
  31. tests/test_notebooks.py +2 -1
  32. {celldetective-1.5.0b1.dist-info → celldetective-1.5.0b3.dist-info}/WHEEL +0 -0
  33. {celldetective-1.5.0b1.dist-info → celldetective-1.5.0b3.dist-info}/entry_points.txt +0 -0
  34. {celldetective-1.5.0b1.dist-info → celldetective-1.5.0b3.dist-info}/licenses/LICENSE +0 -0
  35. {celldetective-1.5.0b1.dist-info → celldetective-1.5.0b3.dist-info}/top_level.txt +0 -0
@@ -310,6 +310,9 @@ class MeasurementProcess(Process):
310
310
 
311
311
  for t in tqdm(indices, desc="frame"):
312
312
 
313
+ measurements_at_t = None
314
+ perform_measurement = True
315
+
313
316
  if self.file is not None:
314
317
  img = load_frames(
315
318
  self.img_num_channels[:, t],
@@ -321,92 +324,115 @@ class MeasurementProcess(Process):
321
324
  if self.label_path is not None:
322
325
  lbl = locate_labels(self.pos, population=self.mode, frames=t)
323
326
  if lbl is None:
324
- continue
325
-
326
- if self.trajectories is not None:
327
- # Optimized access
328
- if self.frame_slices is not None:
329
- # Check if frame t is in our precomputed slices
330
- if t in self.frame_slices:
331
- start, end = self.frame_slices[t]
332
- positions_at_t = self.trajectories.iloc[start:end].copy()
327
+ perform_measurement = False
328
+
329
+ if perform_measurement:
330
+
331
+ if self.trajectories is not None:
332
+ # Optimized access
333
+ if self.frame_slices is not None:
334
+ # Check if frame t is in our precomputed slices
335
+ if t in self.frame_slices:
336
+ start, end = self.frame_slices[t]
337
+ positions_at_t = self.trajectories.iloc[start:end].copy()
338
+ else:
339
+ # Empty frame for trajectories
340
+ positions_at_t = pd.DataFrame(
341
+ columns=self.trajectories.columns
342
+ )
333
343
  else:
334
- # Empty frame for trajectories
335
- positions_at_t = pd.DataFrame(columns=self.trajectories.columns)
336
- else:
337
- # Fallback or original method (should not be reached if optimized)
338
- positions_at_t = self.trajectories.loc[
339
- self.trajectories[self.column_labels["time"]] == t
340
- ].copy()
341
-
342
- if self.do_features:
343
- feature_table = measure_features(
344
- img,
345
- lbl,
346
- features=self.features,
347
- border_dist=self.border_distances,
348
- channels=self.channel_names,
349
- haralick_options=self.haralick_options,
350
- verbose=False,
351
- normalisation_list=self.background_correction,
352
- spot_detection=self.spot_detection,
353
- )
354
- if self.trajectories is None:
355
- positions_at_t = _extract_coordinates_from_features(
356
- feature_table, timepoint=t
344
+ # Fallback or original method (should not be reached if optimized)
345
+ positions_at_t = self.trajectories.loc[
346
+ self.trajectories[self.column_labels["time"]] == t
347
+ ].copy()
348
+
349
+ if self.do_features:
350
+ feature_table = measure_features(
351
+ img,
352
+ lbl,
353
+ features=self.features,
354
+ border_dist=self.border_distances,
355
+ channels=self.channel_names,
356
+ haralick_options=self.haralick_options,
357
+ verbose=False,
358
+ normalisation_list=self.background_correction,
359
+ spot_detection=self.spot_detection,
360
+ )
361
+ if self.trajectories is None:
362
+ positions_at_t = _extract_coordinates_from_features(
363
+ feature_table, timepoint=t
364
+ )
365
+ column_labels = {
366
+ "track": "ID",
367
+ "time": self.column_labels["time"],
368
+ "x": self.column_labels["x"],
369
+ "y": self.column_labels["y"],
370
+ }
371
+ feature_table.rename(
372
+ columns={
373
+ "centroid-1": "POSITION_X",
374
+ "centroid-0": "POSITION_Y",
375
+ },
376
+ inplace=True,
357
377
  )
358
- column_labels = {
359
- "track": "ID",
360
- "time": self.column_labels["time"],
361
- "x": self.column_labels["x"],
362
- "y": self.column_labels["y"],
363
- }
364
- feature_table.rename(
365
- columns={"centroid-1": "POSITION_X", "centroid-0": "POSITION_Y"},
366
- inplace=True,
367
- )
368
378
 
369
- if self.do_iso_intensities and not self.trajectories is None:
370
- iso_table = measure_isotropic_intensity(
371
- positions_at_t,
372
- img,
373
- channels=self.channel_names,
374
- intensity_measurement_radii=self.intensity_measurement_radii,
375
- column_labels=self.column_labels,
376
- operations=self.isotropic_operations,
377
- verbose=False,
378
- )
379
+ if self.do_iso_intensities and not self.trajectories is None:
380
+ iso_table = measure_isotropic_intensity(
381
+ positions_at_t,
382
+ img,
383
+ channels=self.channel_names,
384
+ intensity_measurement_radii=self.intensity_measurement_radii,
385
+ column_labels=self.column_labels,
386
+ operations=self.isotropic_operations,
387
+ verbose=False,
388
+ )
379
389
 
380
- if (
381
- self.do_iso_intensities
382
- and self.do_features
383
- and not self.trajectories is None
384
- ):
385
- measurements_at_t = iso_table.merge(
386
- feature_table, how="outer", on="class_id", suffixes=("_delme", "")
387
- )
388
- measurements_at_t = measurements_at_t[
389
- [c for c in measurements_at_t.columns if not c.endswith("_delme")]
390
- ]
391
- elif (
392
- self.do_iso_intensities
393
- * (not self.do_features)
394
- * (not self.trajectories is None)
395
- ):
396
- measurements_at_t = iso_table
397
- elif self.do_features:
398
- measurements_at_t = positions_at_t.merge(
399
- feature_table, how="outer", on="class_id", suffixes=("_delme", "")
390
+ if (
391
+ self.do_iso_intensities
392
+ and self.do_features
393
+ and not self.trajectories is None
394
+ ):
395
+ measurements_at_t = iso_table.merge(
396
+ feature_table,
397
+ how="outer",
398
+ on="class_id",
399
+ suffixes=("_delme", ""),
400
+ )
401
+ measurements_at_t = measurements_at_t[
402
+ [
403
+ c
404
+ for c in measurements_at_t.columns
405
+ if not c.endswith("_delme")
406
+ ]
407
+ ]
408
+ elif (
409
+ self.do_iso_intensities
410
+ * (not self.do_features)
411
+ * (not self.trajectories is None)
412
+ ):
413
+ measurements_at_t = iso_table
414
+ elif self.do_features:
415
+ measurements_at_t = positions_at_t.merge(
416
+ feature_table,
417
+ how="outer",
418
+ on="class_id",
419
+ suffixes=("_delme", ""),
420
+ )
421
+ measurements_at_t = measurements_at_t[
422
+ [
423
+ c
424
+ for c in measurements_at_t.columns
425
+ if not c.endswith("_delme")
426
+ ]
427
+ ]
428
+
429
+ measurements_at_t = center_of_mass_to_abs_coordinates(measurements_at_t)
430
+
431
+ measurements_at_t = measure_radial_distance_to_center(
432
+ measurements_at_t,
433
+ volume=img.shape,
434
+ column_labels=self.column_labels,
400
435
  )
401
- measurements_at_t = measurements_at_t[
402
- [c for c in measurements_at_t.columns if not c.endswith("_delme")]
403
- ]
404
-
405
- measurements_at_t = center_of_mass_to_abs_coordinates(measurements_at_t)
406
-
407
- measurements_at_t = measure_radial_distance_to_center(
408
- measurements_at_t, volume=img.shape, column_labels=self.column_labels
409
- )
410
436
 
411
437
  self.sum_done += 1
412
438
  data = {}
@@ -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)
@@ -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
 
@@ -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.0b1
3
+ Version: 1.5.0b3
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=6QH0Vgfkt-TPgdS6Nql1G9jeZAByFTkMEeYsa6NspPk,24
3
+ celldetective/_version.py,sha256=xyBMhGEXnWbOInuedgW565vK5NILuhG2r2EYCw9E9eU,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=fNuY7d8EtNNOB2_ZrijyNdoQ7x5GOlq1IFqPBUv1ElM,20953
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=zMvfbuijCiEdPFOGTc_LPxGpdBX-BRtq6VuDXGvXk08,32364
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
- 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
- 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
29
+ celldetective/gui/gui_utils.py,sha256=t6SjEfjcaRH9a0TlbTGEiVRpCgocaCh4lgkIvRgRRwE,33497
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=HdhrU3N207evB9s-pqZNfzJC2Jswx3yHdPPLR8CRILc,38354
33
34
  celldetective/gui/pair_event_annotator.py,sha256=QJHaM-z0K2I36sLf6XCMFMymfw-nFhzfGJ8oxrMfZco,124091
34
- celldetective/gui/plot_measurements.py,sha256=pTBA8_XtAZRsxNtWqd8obOHbDqKyz-c1R085xy7y4Ns,56675
35
- 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
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=NBSwg32Juz3dyXMe0uRyYE-qttfsTqSDPyoBgVc5T1c,76891
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=6uk4skcwNd3qowBrpSSgv0hvbL-4naH-g-TmF3u7NB4,14363
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=jNUsCU_QE7QUFR0_xEvEPFEBYolMJt7YXGUKMjF7uOE,8155
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
122
  celldetective/processes/downloader.py,sha256=3SA5T1AoLch90d-VZzIY4wVAlSjDY_kgVLPN3ztRyVk,4589
122
- celldetective/processes/measure_cells.py,sha256=ccf2j7_6dcRevEhseVXioIjiATx8IvIsi5ZG3IcdhJY,20876
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,19 +141,19 @@ 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
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
148
- celldetective/utils/image_loaders.py,sha256=nsyneHM67R9r-mmWKI7Z6xpe5MQCLOFsaYKFhxw2R-c,34032
150
+ celldetective/utils/image_loaders.py,sha256=9O0kpG2ZQWC2-7VNS5kf7ihmusHTqeBk9po4uiUvsFY,34107
149
151
  celldetective/utils/image_transforms.py,sha256=cgaHuEUArWWHgxlBlcQLf--zQa-4VphPJ2s2EyPN29o,11213
150
152
  celldetective/utils/io.py,sha256=WQH6B27iS722eVV8HHRaSvxMRZ217LoiEIPOqNGtqJk,1632
151
153
  celldetective/utils/mask_cleaning.py,sha256=n1Q2RfyhX0W3AcLO0U6ucSyDGRCofj6bPLSO_xeVZPI,12545
152
154
  celldetective/utils/mask_transforms.py,sha256=fX-ajhUhzZwOe7rAnMcQc6w4e2B8SZeRp9jrQLF6DFs,144
153
- celldetective/utils/masks.py,sha256=wz47NrCsLD_9WX2Goswl_ThgnxyLJokIN6cj8KH7ZjI,7075
154
- celldetective/utils/maths.py,sha256=cYdIqSgpaDO1JZOpmgGFPPikEvu66absC64op_6kw0o,12003
155
+ celldetective/utils/masks.py,sha256=g3QHtqyVg6RN0BfmDoPXVjwL3O4xa_dKPC_ZeGmzkeE,7064
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,24 +166,25 @@ 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.0b1.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
169
+ celldetective-1.5.0b3.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
171
173
  tests/test_io.py,sha256=gk5FmoI7ANEczUtNXYRxc48KzkfYzemwS_eYaLq4_NI,2093
172
174
  tests/test_measure.py,sha256=FEUAs1rVHylvIvubCb0bJDNGZLVmkgXNgI3NaGQ1dA8,4542
173
175
  tests/test_neighborhood.py,sha256=gk5FmoI7ANEczUtNXYRxc48KzkfYzemwS_eYaLq4_NI,2093
174
- tests/test_notebooks.py,sha256=WP5TJM1HV1oN8Hp38MLyE2YuLXjUoMvMJBa343vp1Dg,299
176
+ tests/test_notebooks.py,sha256=7HVmYiytsz0QIJ11iRkGGs4_hzNjofXAUs_OZou3Gm0,301
175
177
  tests/test_preprocessing.py,sha256=c0rKS9d5h37uDcV7fVOTnn5GMVbEB84b8ZTCTdRmvFs,1422
176
178
  tests/test_segmentation.py,sha256=k1b_zIZdlytEdJcHjAUQEO3gTBAHtv5WvrwQN2xD4kc,3470
177
179
  tests/test_signals.py,sha256=No4cah6KxplhDcKXnU8RrA7eDla4hWw6ccf7xGnBokU,3599
178
180
  tests/test_tracking.py,sha256=_YLjwQ3EChQssoHDfEnUJ7fI1yC5KEcJsFnAVR64L70,18909
179
181
  tests/test_utils.py,sha256=aSB_eMw9fzTsnxxdYoNmdQQRrXkWqBXB7Uv4TGU6kYE,4778
180
182
  tests/gui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
183
+ tests/gui/test_enhancements.py,sha256=3x9au_rkQtMZ94DRj3OaEHKPr511RrWqBAUAcNQn1ys,13453
181
184
  tests/gui/test_new_project.py,sha256=wRjW2vEaZb0LWT-f8G8-Ptk8CW9z8-FDPLpV5uqj6ck,8778
182
185
  tests/gui/test_project.py,sha256=KzAnodIc0Ovta0ARL5Kr5PkOR5euA6qczT_GhEZpyE4,4710
183
- celldetective-1.5.0b1.dist-info/METADATA,sha256=_caTP5XkidOp8X2DIaINXht-jIS1cznMI0IPzzU3K68,10947
184
- celldetective-1.5.0b1.dist-info/WHEEL,sha256=qELbo2s1Yzl39ZmrAibXA2jjPLUYfnVhUNTlyF1rq0Y,92
185
- celldetective-1.5.0b1.dist-info/entry_points.txt,sha256=2NU6_EOByvPxqBbCvjwxlVlvnQreqZ3BKRCVIKEv3dg,62
186
- celldetective-1.5.0b1.dist-info/top_level.txt,sha256=6rsIKKfGMKgud7HPuATcpq6EhdXwcg_yknBVWn9x4C4,20
187
- celldetective-1.5.0b1.dist-info/RECORD,,
186
+ celldetective-1.5.0b3.dist-info/METADATA,sha256=D4LkOtPQrdeuX4zW5_OKXlN1dxkxaZx_zqdILC36-Hk,10947
187
+ celldetective-1.5.0b3.dist-info/WHEEL,sha256=qELbo2s1Yzl39ZmrAibXA2jjPLUYfnVhUNTlyF1rq0Y,92
188
+ celldetective-1.5.0b3.dist-info/entry_points.txt,sha256=2NU6_EOByvPxqBbCvjwxlVlvnQreqZ3BKRCVIKEv3dg,62
189
+ celldetective-1.5.0b3.dist-info/top_level.txt,sha256=6rsIKKfGMKgud7HPuATcpq6EhdXwcg_yknBVWn9x4C4,20
190
+ celldetective-1.5.0b3.dist-info/RECORD,,