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.
- celldetective/_version.py +1 -1
- celldetective/gui/InitWindow.py +51 -12
- celldetective/gui/base/components.py +22 -1
- celldetective/gui/base_annotator.py +20 -9
- celldetective/gui/control_panel.py +21 -16
- celldetective/gui/event_annotator.py +51 -1060
- celldetective/gui/gui_utils.py +14 -5
- celldetective/gui/interactions_block.py +55 -25
- celldetective/gui/interactive_timeseries_viewer.py +11 -1
- celldetective/gui/measure_annotator.py +1064 -0
- celldetective/gui/plot_measurements.py +2 -4
- celldetective/gui/plot_signals_ui.py +3 -4
- celldetective/gui/process_block.py +298 -72
- celldetective/gui/viewers/base_viewer.py +134 -3
- celldetective/gui/viewers/contour_viewer.py +4 -4
- celldetective/gui/workers.py +25 -10
- celldetective/measure.py +3 -0
- celldetective/napari/utils.py +29 -19
- celldetective/processes/load_table.py +55 -0
- celldetective/processes/measure_cells.py +107 -81
- celldetective/processes/track_cells.py +39 -39
- celldetective/segmentation.py +1 -1
- celldetective/tracking.py +9 -0
- celldetective/utils/data_loaders.py +21 -1
- celldetective/utils/image_loaders.py +3 -0
- celldetective/utils/masks.py +1 -1
- celldetective/utils/maths.py +14 -1
- {celldetective-1.5.0b1.dist-info → celldetective-1.5.0b3.dist-info}/METADATA +1 -1
- {celldetective-1.5.0b1.dist-info → celldetective-1.5.0b3.dist-info}/RECORD +35 -32
- tests/gui/test_enhancements.py +351 -0
- tests/test_notebooks.py +2 -1
- {celldetective-1.5.0b1.dist-info → celldetective-1.5.0b3.dist-info}/WHEEL +0 -0
- {celldetective-1.5.0b1.dist-info → celldetective-1.5.0b3.dist-info}/entry_points.txt +0 -0
- {celldetective-1.5.0b1.dist-info → celldetective-1.5.0b3.dist-info}/licenses/LICENSE +0 -0
- {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
|
-
|
|
325
|
-
|
|
326
|
-
if
|
|
327
|
-
|
|
328
|
-
if self.
|
|
329
|
-
#
|
|
330
|
-
if
|
|
331
|
-
|
|
332
|
-
|
|
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
|
-
#
|
|
335
|
-
positions_at_t =
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
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
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
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
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
)
|
celldetective/segmentation.py
CHANGED
|
@@ -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
|
-
|
|
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]
|
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
|
|
celldetective/utils/maths.py
CHANGED
|
@@ -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
|
-
|
|
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,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=
|
|
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=
|
|
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=
|
|
13
|
+
celldetective/segmentation.py,sha256=yIFZn0XDaudj9XkSjWW9k6LqZEM-OQdp98ylwQQtlTg,33583
|
|
14
14
|
celldetective/signals.py,sha256=2UURVmeonNgUHpiMQVSps0E9VuskKSbsfsmeCtEmfp8,137484
|
|
15
|
-
celldetective/tracking.py,sha256=
|
|
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
|
-
celldetective/gui/event_annotator.py,sha256=
|
|
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=
|
|
30
|
-
celldetective/gui/interactions_block.py,sha256=
|
|
31
|
-
celldetective/gui/interactive_timeseries_viewer.py,sha256=
|
|
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=
|
|
35
|
-
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
|
|
36
37
|
celldetective/gui/preprocessing_block.py,sha256=cgUBv-eQBwfidK48-cTWJi0PS62wlXhsNLnsKhy6MQY,14967
|
|
37
|
-
celldetective/gui/process_block.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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/
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
154
|
-
celldetective/utils/maths.py,sha256=
|
|
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.
|
|
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=
|
|
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.
|
|
184
|
-
celldetective-1.5.
|
|
185
|
-
celldetective-1.5.
|
|
186
|
-
celldetective-1.5.
|
|
187
|
-
celldetective-1.5.
|
|
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,,
|