celldetective 1.1.1.post4__py3-none-any.whl → 1.2.1__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 (41) hide show
  1. celldetective/__init__.py +2 -1
  2. celldetective/extra_properties.py +62 -34
  3. celldetective/gui/__init__.py +1 -0
  4. celldetective/gui/analyze_block.py +2 -1
  5. celldetective/gui/classifier_widget.py +15 -9
  6. celldetective/gui/control_panel.py +50 -6
  7. celldetective/gui/layouts.py +5 -4
  8. celldetective/gui/neighborhood_options.py +13 -9
  9. celldetective/gui/plot_signals_ui.py +39 -11
  10. celldetective/gui/process_block.py +413 -95
  11. celldetective/gui/retrain_segmentation_model_options.py +17 -4
  12. celldetective/gui/retrain_signal_model_options.py +106 -6
  13. celldetective/gui/signal_annotator.py +29 -9
  14. celldetective/gui/signal_annotator2.py +2708 -0
  15. celldetective/gui/signal_annotator_options.py +3 -1
  16. celldetective/gui/survival_ui.py +15 -6
  17. celldetective/gui/tableUI.py +222 -60
  18. celldetective/io.py +536 -420
  19. celldetective/measure.py +919 -969
  20. celldetective/models/pair_signal_detection/blank +0 -0
  21. celldetective/models/segmentation_effectors/ricm-bimodal/config_input.json +130 -0
  22. celldetective/models/segmentation_effectors/ricm-bimodal/ricm-bimodal +0 -0
  23. celldetective/models/segmentation_effectors/ricm-bimodal/training_instructions.json +37 -0
  24. celldetective/neighborhood.py +428 -354
  25. celldetective/relative_measurements.py +648 -0
  26. celldetective/scripts/analyze_signals.py +1 -1
  27. celldetective/scripts/measure_cells.py +28 -8
  28. celldetective/scripts/measure_relative.py +103 -0
  29. celldetective/scripts/segment_cells.py +5 -5
  30. celldetective/scripts/track_cells.py +4 -1
  31. celldetective/scripts/train_segmentation_model.py +23 -18
  32. celldetective/scripts/train_signal_model.py +33 -0
  33. celldetective/signals.py +405 -8
  34. celldetective/tracking.py +8 -2
  35. celldetective/utils.py +178 -17
  36. {celldetective-1.1.1.post4.dist-info → celldetective-1.2.1.dist-info}/METADATA +8 -8
  37. {celldetective-1.1.1.post4.dist-info → celldetective-1.2.1.dist-info}/RECORD +41 -34
  38. {celldetective-1.1.1.post4.dist-info → celldetective-1.2.1.dist-info}/WHEEL +1 -1
  39. {celldetective-1.1.1.post4.dist-info → celldetective-1.2.1.dist-info}/LICENSE +0 -0
  40. {celldetective-1.1.1.post4.dist-info → celldetective-1.2.1.dist-info}/entry_points.txt +0 -0
  41. {celldetective-1.1.1.post4.dist-info → celldetective-1.2.1.dist-info}/top_level.txt +0 -0
celldetective/utils.py CHANGED
@@ -24,7 +24,84 @@ import shutil
24
24
  import tempfile
25
25
  from scipy.interpolate import griddata
26
26
  import re
27
+ from scipy.ndimage.morphology import distance_transform_edt
28
+ from scipy import ndimage
29
+ from skimage.morphology import disk
27
30
 
31
+ def contour_of_instance_segmentation(label, distance):
32
+
33
+ """
34
+
35
+ Generate an instance mask containing the contour of the segmented objects.
36
+
37
+ Parameters
38
+ ----------
39
+ label : ndarray
40
+ The instance segmentation labels.
41
+ distance : int, float, list, or tuple
42
+ The distance or range of distances from the edge of each instance to include in the contour.
43
+ If a single value is provided, it represents the maximum distance. If a tuple or list is provided,
44
+ it represents the minimum and maximum distances.
45
+
46
+ Returns
47
+ -------
48
+ border_label : ndarray
49
+ An instance mask containing the contour of the segmented objects.
50
+
51
+ Notes
52
+ -----
53
+ This function generates an instance mask representing the contour of the segmented instances in the label image.
54
+ It use the distance_transform_edt function from the scipy.ndimage module to compute the Euclidean distance transform.
55
+ The contour is defined based on the specified distance(s) from the edge of each instance.
56
+ The resulting mask, `border_label`, contains the contour regions, while the interior regions are set to zero.
57
+
58
+ Examples
59
+ --------
60
+ >>> border_label = contour_of_instance_segmentation(label, distance=3)
61
+ # Generate a binary mask containing the contour of the segmented instances with a maximum distance of 3 pixels.
62
+
63
+ """
64
+ if isinstance(distance,(list,tuple)) or distance >= 0 :
65
+
66
+ edt = distance_transform_edt(label)
67
+
68
+ if isinstance(distance, list) or isinstance(distance, tuple):
69
+ min_distance = distance[0]; max_distance = distance[1]
70
+
71
+ elif isinstance(distance, (int, float)):
72
+ min_distance = 0
73
+ max_distance = distance
74
+
75
+ thresholded = (edt <= max_distance) * (edt > min_distance)
76
+ border_label = np.copy(label)
77
+ border_label[np.where(thresholded == 0)] = 0
78
+
79
+ else:
80
+ size = (2*abs(int(distance))+1, 2*abs(int(distance))+1)
81
+ dilated_image = ndimage.grey_dilation(label, footprint=disk(int(abs(distance)))) #size=size,
82
+ border_label=np.copy(dilated_image)
83
+ matching_cells = np.logical_and(dilated_image != 0, label == dilated_image)
84
+ border_label[np.where(matching_cells == True)] = 0
85
+ border_label[label!=0] = 0.
86
+
87
+ return border_label
88
+
89
+ def extract_identity_col(trajectories):
90
+
91
+ if 'TRACK_ID' in list(trajectories.columns):
92
+ if not np.all(trajectories['TRACK_ID'].isnull()):
93
+ id_col = 'TRACK_ID'
94
+ else:
95
+ if 'ID' in list(trajectories.columns):
96
+ id_col = 'ID'
97
+ elif 'ID' in list(trajectories.columns):
98
+
99
+ id_col = 'ID'
100
+ else:
101
+ print('ID or TRACK ID column could not be found in the table...')
102
+ id_col = None
103
+
104
+ return id_col
28
105
 
29
106
  def derivative(x, timeline, window, mode='bi'):
30
107
 
@@ -590,6 +667,22 @@ def rename_intensity_column(df, channels):
590
667
  else:
591
668
  new_name = new_name.replace('centre_of_mass', "centre_of_mass_orientation")
592
669
  to_rename.update({intensity_columns[k]: new_name.replace('-', '_')})
670
+ elif sections[-2] == "2":
671
+ new_name = np.delete(measure, -1)
672
+ new_name = '_'.join(list(new_name))
673
+ if 'edge' in intensity_columns[k]:
674
+ new_name = new_name.replace('centre_of_mass_displacement', "edge_centre_of_mass_x")
675
+ else:
676
+ new_name = new_name.replace('centre_of_mass', "centre_of_mass_x")
677
+ to_rename.update({intensity_columns[k]: new_name.replace('-', '_')})
678
+ elif sections[-2] == "3":
679
+ new_name = np.delete(measure, -1)
680
+ new_name = '_'.join(list(new_name))
681
+ if 'edge' in intensity_columns[k]:
682
+ new_name = new_name.replace('centre_of_mass_displacement', "edge_centre_of_mass_y")
683
+ else:
684
+ new_name = new_name.replace('centre_of_mass', "centre_of_mass_y")
685
+ to_rename.update({intensity_columns[k]: new_name.replace('-', '_')})
593
686
  if 'radial_gradient' in intensity_columns[k]:
594
687
  # sections = np.array(re.split('-|_', intensity_columns[k]))
595
688
  measure = np.array(re.split('-|_', new_name))
@@ -1196,16 +1289,27 @@ def _extract_channel_indices_from_config(config, channels_to_extract):
1196
1289
  # V2
1197
1290
  channels = []
1198
1291
  for c in channels_to_extract:
1199
- if c!='None' and c is not None:
1200
- try:
1201
- c1 = int(ConfigSectionMap(config,"Channels")[c])
1202
- channels.append(c1)
1203
- except Exception as e:
1204
- print(f"Error {e}. The channel required by the model is not available in your data... Check the configuration file.")
1205
- channels = None
1206
- break
1207
- else:
1292
+ try:
1293
+ c1 = int(ConfigSectionMap(config,"Channels")[c])
1294
+ channels.append(c1)
1295
+ except Exception as e:
1296
+ print(f"Warning... The channel {c} required by the model is not available in your data...")
1208
1297
  channels.append(None)
1298
+ if np.all([c is None for c in channels]):
1299
+ channels = None
1300
+
1301
+ # channels = []
1302
+ # for c in channels_to_extract:
1303
+ # if c!='None' and c is not None:
1304
+ # try:
1305
+ # c1 = int(ConfigSectionMap(config,"Channels")[c])
1306
+ # channels.append(c1)
1307
+ # except Exception as e:
1308
+ # print(f"Error {e}. The channel required by the model is not available in your data... Check the configuration file.")
1309
+ # channels = None
1310
+ # break
1311
+ # else:
1312
+ # channels.append(None)
1209
1313
 
1210
1314
  # LEGACY
1211
1315
  if channels is None:
@@ -2071,6 +2175,8 @@ def load_image_dataset(datasets, channels, train_spatial_calibration=None, mask_
2071
2175
  - Spatial calibration adjustment involves rescaling the images and masks to match the `train_spatial_calibration`.
2072
2176
  - Only images with a corresponding mask and a valid configuration file specifying channel indices and
2073
2177
  spatial calibration are loaded.
2178
+ - The image samples must have at least one channel in common with the required channels to be accepted. The missing
2179
+ channels are passed as black frames.
2074
2180
 
2075
2181
  Examples
2076
2182
  --------
@@ -2109,24 +2215,29 @@ def load_image_dataset(datasets, channels, train_spatial_calibration=None, mask_
2109
2215
  # Load config
2110
2216
  with open(config_path, 'r') as f:
2111
2217
  config = json.load(f)
2112
- try:
2218
+
2219
+ existing_channels = config['channels']
2220
+ intersection = list(set(list(channels)) & set(list(existing_channels)))
2221
+ print(f'{existing_channels=} {intersection=}')
2222
+ if len(intersection)==0:
2223
+ print(e,' channels could not be found in the config... Skipping image.')
2224
+ continue
2225
+ else:
2113
2226
  ch_idx = []
2114
2227
  for c in channels:
2115
- if c!='None':
2116
- idx = config['channels'].index(c)
2228
+ if c in existing_channels:
2229
+ idx = existing_channels.index(c)
2117
2230
  ch_idx.append(idx)
2118
2231
  else:
2232
+ # For None or missing channel pass black frame
2119
2233
  ch_idx.append(np.nan)
2120
2234
  im_calib = config['spatial_calibration']
2121
- except Exception as e:
2122
- print(e,' channels and/or spatial calibration could not be found in the config... Skipping image.')
2123
- continue
2124
2235
 
2125
2236
  ch_idx = np.array(ch_idx)
2126
2237
  ch_idx_safe = np.copy(ch_idx)
2127
2238
  ch_idx_safe[ch_idx_safe!=ch_idx_safe] = 0
2128
2239
  ch_idx_safe = ch_idx_safe.astype(int)
2129
- print(ch_idx_safe)
2240
+
2130
2241
  image = image[ch_idx_safe]
2131
2242
  image[np.where(ch_idx!=ch_idx)[0],:,:] = 0
2132
2243
 
@@ -2140,6 +2251,14 @@ def load_image_dataset(datasets, channels, train_spatial_calibration=None, mask_
2140
2251
 
2141
2252
  X.append(image)
2142
2253
  Y.append(mask)
2254
+
2255
+ # fig,ax = plt.subplots(1,image.shape[-1]+1)
2256
+ # for k in range(image.shape[-1]):
2257
+ # ax[k].imshow(image[:,:,k],cmap='gray')
2258
+ # ax[image.shape[-1]].imshow(mask)
2259
+ # plt.pause(1)
2260
+ # plt.close()
2261
+
2143
2262
  files.append(im)
2144
2263
 
2145
2264
  assert len(X)==len(Y),'The number of images does not match with the number of masks... Abort.'
@@ -2274,4 +2393,46 @@ def interpolate_nan(img, method='nearest'):
2274
2393
  interp_grid = griddata(points, values, (x_grid, y_grid), method=method)
2275
2394
  return interp_grid
2276
2395
  else:
2277
- return img
2396
+ return img
2397
+
2398
+ def collapse_trajectories_by_status(df, status=None, projection='mean', population='effectors', groupby_columns=['position','TRACK_ID']):
2399
+
2400
+ static_columns = ['well_index', 'well_name', 'pos_name', 'position', 'well', 'status', 't0', 'class','cell_type','concentration', 'antibody', 'pharmaceutical_agent','TRACK_ID','position', 'neighbor_population', 'reference_population', 'NEIGHBOR_ID', 'REFERENCE_ID', 'FRAME']
2401
+
2402
+ if status is None or status not in list(df.columns):
2403
+ print('invalid status selection...')
2404
+ return None
2405
+
2406
+ df = df.dropna(subset=status,ignore_index=True)
2407
+ unique_statuses = np.unique(df[status].to_numpy())
2408
+
2409
+ df_sections = []
2410
+ for s in unique_statuses:
2411
+ subtab = df.loc[df[status]==s,:]
2412
+ op = getattr(subtab.groupby(groupby_columns), projection)
2413
+ subtab_projected = op(subtab.groupby(groupby_columns))
2414
+ frame_duration = subtab.groupby(groupby_columns).size().to_numpy()
2415
+ for c in static_columns:
2416
+ try:
2417
+ subtab_projected[c] = subtab.groupby(groupby_columns)[c].apply(lambda x: x.unique()[0])
2418
+ except Exception as e:
2419
+ print(e)
2420
+ pass
2421
+ subtab_projected['duration_in_state'] = frame_duration
2422
+ df_sections.append(subtab_projected)
2423
+
2424
+ group_table = pd.concat(df_sections,axis=0,ignore_index=True)
2425
+ if population=='pairs':
2426
+ for col in ['duration_in_state',status, 'neighbor_population', 'reference_population', 'NEIGHBOR_ID', 'REFERENCE_ID']:
2427
+ first_column = group_table.pop(col)
2428
+ group_table.insert(0, col, first_column)
2429
+ else:
2430
+ for col in ['duration_in_state',status,'TRACK_ID']:
2431
+ first_column = group_table.pop(col)
2432
+ group_table.insert(0, col, first_column)
2433
+
2434
+ group_table.pop('FRAME')
2435
+ group_table = group_table.sort_values(by=groupby_columns + [status],ignore_index=True)
2436
+ group_table = group_table.reset_index(drop=True)
2437
+
2438
+ return group_table
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: celldetective
3
- Version: 1.1.1.post4
3
+ Version: 1.2.1
4
4
  Summary: description
5
5
  Home-page: http://github.com/remyeltorro/celldetective
6
6
  Author: Rémy Torro
@@ -12,14 +12,14 @@ Requires-Dist: wheel
12
12
  Requires-Dist: nbsphinx
13
13
  Requires-Dist: nbsphinx-link
14
14
  Requires-Dist: sphinx-rtd-theme
15
- Requires-Dist: sphinx ==5.0.2
16
- Requires-Dist: jinja2 <3.1
15
+ Requires-Dist: sphinx==5.0.2
16
+ Requires-Dist: jinja2<3.1
17
17
  Requires-Dist: ipykernel
18
18
  Requires-Dist: stardist
19
- Requires-Dist: cellpose <3
19
+ Requires-Dist: cellpose<3
20
20
  Requires-Dist: scikit-learn
21
21
  Requires-Dist: btrack
22
- Requires-Dist: tensorflow <=2.12.1
22
+ Requires-Dist: tensorflow<=2.12.1
23
23
  Requires-Dist: napari
24
24
  Requires-Dist: tqdm
25
25
  Requires-Dist: mahotas
@@ -29,11 +29,11 @@ Requires-Dist: lifelines
29
29
  Requires-Dist: setuptools
30
30
  Requires-Dist: scipy
31
31
  Requires-Dist: seaborn
32
- Requires-Dist: opencv-python-headless ==4.7.0.72
32
+ Requires-Dist: opencv-python-headless==4.7.0.72
33
33
  Requires-Dist: liblapack
34
34
  Requires-Dist: gputools
35
- Requires-Dist: lmfit ~=1.2.2
36
- Requires-Dist: superqt[cmap] >=0.6.1
35
+ Requires-Dist: lmfit~=1.2.2
36
+ Requires-Dist: superqt[cmap]>=0.6.1
37
37
  Requires-Dist: matplotlib-scalebar
38
38
 
39
39
  # Celldetective
@@ -1,41 +1,43 @@
1
- celldetective/__init__.py,sha256=FEZpJKcskBH2IginYzeqPWoR1lVGuyYCXhv7Hnlkoo8,49
1
+ celldetective/__init__.py,sha256=PH25g2_AZt7N5Jg1KB3YT9wFvfMr9lIb2WxYzmDqlX4,105
2
2
  celldetective/__main__.py,sha256=TQzL_FLAeEF1YIyRZXMiai40xXy21roPPV23ig4jwG0,14494
3
3
  celldetective/events.py,sha256=s2pWnR3Z1fcB15sET5WsF2Pi6v6qv16hks_m3WiklNs,3658
4
- celldetective/extra_properties.py,sha256=ZdWV046RR8jrQPYxLSVVb1cXkWYxfrrLj2tXfc358cU,4179
4
+ celldetective/extra_properties.py,sha256=8DkxTvVs7gASsnnGurVZ3_zt6uR0pvvJhBKO2LC6hGk,5118
5
5
  celldetective/filters.py,sha256=b0qKwHor1fvNA_dHovP17nQz8EsW5YlyhT2TJnayn08,3615
6
- celldetective/io.py,sha256=_ivq2zE5ffHadZ-YOWSSX5J1GTlEohg6WPvC3xEBZvQ,82819
7
- celldetective/measure.py,sha256=HDQZfSRx3daOCV5Snu1paYU5JYkwu8engO2qZqhTAUo,48089
8
- celldetective/neighborhood.py,sha256=Jl9VujKYZ9R2pcqmPt5HyeCy5LieNal-oCsD8b7uIWQ,51182
6
+ celldetective/io.py,sha256=28rN_spEv-kV3teTxCdz4qUygcbAs7S6wJ24wumwreU,86023
7
+ celldetective/measure.py,sha256=kTKoGeCEYvACOf-pg11NPfyByogBMIC91lIZA-qZk1E,41344
8
+ celldetective/neighborhood.py,sha256=u8VfR1Olo20zVcB0y2hzjZOCfXV1u2C5SDJTlWJ2J64,53042
9
9
  celldetective/preprocessing.py,sha256=TKOJTc5o4rSgXqtYeZz-0ox062dD494VMiie3L-9aV4,38305
10
+ celldetective/relative_measurements.py,sha256=WRTUewDZ7JKSjPZUZVQ5hUusevAYsFGHjkzCZ3yKHzg,25056
10
11
  celldetective/segmentation.py,sha256=L2VJKmOewC1CNZPiWCO6yUfxt78u9k1NHPr2qTyTaBM,30458
11
- celldetective/signals.py,sha256=P7eiDZGGIAYCFBKjGCBi8gMBvJYywxlxZNzyGgw-26Y,102783
12
- celldetective/tracking.py,sha256=A0mhdF4uq4m8OX1-rhtuhG69rlh_6Pb34Aebu7hIeKM,37601
13
- celldetective/utils.py,sha256=ahHZkLr6ceUDY5sN6uOcGzqKaLjpOIdB_kjhXj_gggA,79003
12
+ celldetective/signals.py,sha256=ec955qS7DfjePXeynNXCI6RQz0zpi3818-CBTwcDFDI,120428
13
+ celldetective/tracking.py,sha256=k5CtlLqH8WjTwAu7ELwBd9VUuiVPjaNxL5h07KKgjEQ,37860
14
+ celldetective/utils.py,sha256=CqGgzcSdVl0V11v3tSrlXsDbWP2x4JbPM9LzRLNvU9w,85157
14
15
  celldetective/datasets/segmentation_annotations/blank,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
16
  celldetective/datasets/signal_annotations/blank,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
- celldetective/gui/__init__.py,sha256=y2dvrUdJi17QMgPjl8WN3XFHYzJpu2ul4_8y7MQV1Bk,941
17
+ celldetective/gui/__init__.py,sha256=2_r2xfOj4_2xj0yBkCTIfzlF94AHKm-j6Pvpd7DddQc,989
17
18
  celldetective/gui/about.py,sha256=i-y54Opb10pKTVNUEcJC-D6Cbiqud2EJ3ZLayXqhdqc,1715
18
- celldetective/gui/analyze_block.py,sha256=WD3JQQylx_dVozFCvNqrOyR6LcNHV7R1_gGh7XqOVeI,25423
19
+ celldetective/gui/analyze_block.py,sha256=vF3ORldZBZHnXUHCj4PeI6KXJ3skY0qV28LxuazGdmk,25429
19
20
  celldetective/gui/btrack_options.py,sha256=eQEf63yTUsPCN-d1LqgAMmUQpfv2FH85FqnOSaR-9Q8,35575
20
- celldetective/gui/classifier_widget.py,sha256=PNg72YlFvKjGdlARaquvY4ALpNV7KZps9LJqAemSUqc,17225
21
+ celldetective/gui/classifier_widget.py,sha256=yS0yqCH_i8eJNDraoTNPjjJJu9wFYJbpr0FXCJJAnfU,17566
21
22
  celldetective/gui/configure_new_exp.py,sha256=ANJ-Zn4sjBphtj_aoJu6m1PFEKyv9gxeh9XqS6xOGjk,18969
22
- celldetective/gui/control_panel.py,sha256=srpQMxMA8ZOuxqfzRgFZl0OtV1H9bgf2nt20A7vtFps,18101
23
+ celldetective/gui/control_panel.py,sha256=LNWixLPyR3wHb-fq-RWdRir-E1R3eLkxi3uBTDsm0WM,19845
23
24
  celldetective/gui/gui_utils.py,sha256=PidFfdc8XASeIzZO5pfKgwqe4vROG7-KpYMcBZ42jdw,22673
24
25
  celldetective/gui/json_readers.py,sha256=fTrNrlxv9NCae8ZJexBEHxI3yCLRqt6F0Yo1OeDycfA,3686
25
- celldetective/gui/layouts.py,sha256=MCmGOjZFoL2a24Gu6WH9UgOnI6ZbGNqWxEEf1QMVqqQ,37678
26
+ celldetective/gui/layouts.py,sha256=Qrs_5ugNaLWy6l72zzPegrV8idfNWEnNNA2ltH1DC_M,37768
26
27
  celldetective/gui/measurement_options.py,sha256=i0CdAfupHJAqhOT7RsufEK919sAzQnFBkQO4IAMYZL0,47704
27
- celldetective/gui/neighborhood_options.py,sha256=sASKSSRl4Fwu0NwLaH-xX0SCvGRiyRA5JuNA288lP8o,20436
28
+ celldetective/gui/neighborhood_options.py,sha256=cWCu3dP0jdC6RHOrotTeH8E07F2mJyzQZQYN374g_z4,20550
28
29
  celldetective/gui/plot_measurements.py,sha256=xUoGxV6uXcen-t4yWtAmcGTUayICI-FxTVKPrWMNlfg,51799
29
- celldetective/gui/plot_signals_ui.py,sha256=TwWU2u3_mkRNsM8er0kI_kwr5EoZ29YEzlr0cQzyW4A,43732
30
- celldetective/gui/process_block.py,sha256=7n9glZ1ojEi1bObqwIj4giNhrteT69X1EPMQ1hK63aU,53565
31
- celldetective/gui/retrain_segmentation_model_options.py,sha256=VixtKZTjoJFJy8X6aDbAf0zgK46aXj3I6oPP_92yqhA,22457
32
- celldetective/gui/retrain_signal_model_options.py,sha256=gdK1ITuaTPNvnQWXYuUBcP_pH5cvaEEns5XejjTi_Eo,17854
30
+ celldetective/gui/plot_signals_ui.py,sha256=96iMud47aDGErVht_kQdUS9f0uQAIYeAg3OaGk4XBVw,44551
31
+ celldetective/gui/process_block.py,sha256=oT0bmZqqOjSZvdthqBKoy9MejButRrqdmZQRnUWfJy8,67366
32
+ celldetective/gui/retrain_segmentation_model_options.py,sha256=8mZpW5fb5ts6HjKPzRpG0_tIOQgtsQth_h7ruLdKVss,22954
33
+ celldetective/gui/retrain_signal_model_options.py,sha256=6OqiulBk4Rn709jyENl5rHKpOHJoUsEzslxSxhRugHw,22478
33
34
  celldetective/gui/seg_model_loader.py,sha256=uKp8oab-4QdTGqb-tb6bOD-FLD_154GOvgWFYz97BwY,17350
34
- celldetective/gui/signal_annotator.py,sha256=yHsVCu6Nm8_7bxXfvBfx-xymH9bXBpnQ4TUih1d66cM,86791
35
- celldetective/gui/signal_annotator_options.py,sha256=-Q7f8eCwniqbgLJqMCa91Wc-V3VHAZidwt7LPd4Z5yU,10879
35
+ celldetective/gui/signal_annotator.py,sha256=ArcLcFBH-FZaTqGVSGhir4f-UIor7POot9_Ht-oWRxk,87539
36
+ celldetective/gui/signal_annotator2.py,sha256=pO8kIJqvpueOGRWfqFks9bub0CtuxHfTl794Wj_VYw8,109622
37
+ celldetective/gui/signal_annotator_options.py,sha256=ztFFgA70SJ0QkntxYGsgDNCvSuSR5GjF7_J6pYVYc1g,11020
36
38
  celldetective/gui/styles.py,sha256=Vw4wr6MQ4iBwhOY-ZWAxFDZZ3CNohmEnuPPazwhJaho,4129
37
- celldetective/gui/survival_ui.py,sha256=2JGLC5m6D_gVLwnBAM7uEvuCKw1Cli8nM9i5s7TIpGg,33612
38
- celldetective/gui/tableUI.py,sha256=jkvXkLv2GLimApClvwtwAgpYJi8cpLKBM7MEBdbejbE,34572
39
+ celldetective/gui/survival_ui.py,sha256=sWY5rsxLaNHgfUCB0fphBM2c8J4LLY9q5cdSxF1aq1Q,33792
40
+ celldetective/gui/tableUI.py,sha256=Tgq7fr1eSuVpGbuUlg0qTp3rFXP_zNGdbMZGI3Yq3kI,40636
39
41
  celldetective/gui/thresholds_gui.py,sha256=b8SkG4DlfxBRjacKTe1NSNkq7rJm8lnSLifH-mg846k,49529
40
42
  celldetective/gui/viewers.py,sha256=buBholjAieaVVb6YinVhxPshEHxBEU3er_N0UrkwAew,27734
41
43
  celldetective/icons/logo-large.png,sha256=FXSwV3u6zEKcfpuSn4unnqB0oUnN9cHqQ9BCKWytrpg,36631
@@ -48,23 +50,28 @@ celldetective/icons/survival2.png,sha256=8zsualD7d9VPAecoFA4Om9TFARErqpJzMg6U7XA
48
50
  celldetective/icons/vignette_signals2.png,sha256=hsVOdQDpEfMGM45aaSeacEm3lvxbquRKKYutiS9qoS0,20743
49
51
  celldetective/icons/vignette_signals2.svg,sha256=muGNcQudV1jG-bmFd9FwV-Wb8PcrRV5osdZ7pHR7Ekk,5947
50
52
  celldetective/links/zenodo.json,sha256=7WKRuZY7MHTR-IChWBbU0i47H_479NtlxsCGaJn9-xM,22728
53
+ celldetective/models/pair_signal_detection/blank,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
51
54
  celldetective/models/segmentation_effectors/blank,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
52
55
  celldetective/models/segmentation_effectors/primNK_cfse/config_input.json,sha256=gwEGP5wc6iVcwLrR5IbEb-9lTbdQuPyLLFYXh00374U,509
53
56
  celldetective/models/segmentation_effectors/primNK_cfse/cp-cfse-transfer,sha256=ps4BAzGxr2i2R0uBGJqfF9wjg5bIeSeBGQb0YcUChhY,26559970
54
57
  celldetective/models/segmentation_effectors/primNK_cfse/training_instructions.json,sha256=DqEO4_oQuQmJkZiefREXz8ts60svoqxIQB-LMScuCnc,909
58
+ celldetective/models/segmentation_effectors/ricm-bimodal/config_input.json,sha256=4KUHF-DAHcJgJf9wiGEd880qxRMRKCkiFjDi0PE7Dvg,10579
59
+ celldetective/models/segmentation_effectors/ricm-bimodal/ricm-bimodal,sha256=xmTtQVIlrqLMitjS8WKhnVxcUFuJDbvmn0TghUMM6pE,26559153
60
+ celldetective/models/segmentation_effectors/ricm-bimodal/training_instructions.json,sha256=yIz0oMDX2lTCjwMO0PlRp_7B_RD9O9aMQizd-6SAQEc,831
55
61
  celldetective/models/segmentation_generic/blank,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
56
62
  celldetective/models/segmentation_targets/blank,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
57
63
  celldetective/models/signal_detection/blank,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
58
64
  celldetective/models/tracking_configs/mcf7.json,sha256=iDjb8i6yxs0GleW39dvY3Ld5bZJatlXJrwI8PG3vCT0,1780
59
65
  celldetective/models/tracking_configs/ricm.json,sha256=L-vmwCR1f89U-qnH2Ms0cBfPFR_dxIWoe2ccH8V-QBA,2727
60
66
  celldetective/models/tracking_configs/ricm2.json,sha256=DDjJ6ScYcDWvlsy7ujPID8v8H28vcNcMuZmNR8XmGxo,2718
61
- celldetective/scripts/analyze_signals.py,sha256=23TXGNw-j5xT3ss4mXlnKdBgFLnQ50JUEQOC6_H7Q_0,2203
62
- celldetective/scripts/measure_cells.py,sha256=4uRG6Dg0WsO-N8ZaBJ4loWOvX6FdHaCblIFXq6Dtirc,11000
63
- celldetective/scripts/segment_cells.py,sha256=55hM3JbMoW5TB43uENgtvADL8BziI17B3GjG4axsj6s,8291
67
+ celldetective/scripts/analyze_signals.py,sha256=c_vdd6Z0yAcuNAQJioVH5k6WmOnQBuvRqdWkn6fnCjg,2204
68
+ celldetective/scripts/measure_cells.py,sha256=ex9fOcc8CP7RTVBbSyNHX5yHozhhl1XhTmHJXvtIr1Y,11870
69
+ celldetective/scripts/measure_relative.py,sha256=lGW3zxtXcr4jEPMMkhLbc--OE6vE5GGlLnxa9ma7yfY,4296
70
+ celldetective/scripts/segment_cells.py,sha256=YtTVPjaaLuIqBaV3hlpa__fMeDB3trTPOFJRfEl0jQs,8231
64
71
  celldetective/scripts/segment_cells_thresholds.py,sha256=GbWXa6xoO8s4PinJPZIxAuosw4vpzyJ7FiFYpSURojk,4998
65
- celldetective/scripts/track_cells.py,sha256=AaNiYEW4osYKKR2kbdVLOUnQEBbcZIA-D0mkhcxPWTY,7985
66
- celldetective/scripts/train_segmentation_model.py,sha256=rw5LD70PrE_SCBvaFt0ri1uSa-YI5DM5exH_BGVlw5Y,8515
67
- celldetective/scripts/train_signal_model.py,sha256=9-dmPCLKJ9ypjsV9AwFd-Sb6B6YaHS0QGT218H5hUPo,1861
72
+ celldetective/scripts/track_cells.py,sha256=qATUotwsFrINe_uBMGlcCZbFU0iT1J9K8bEZ3TVouIg,8173
73
+ celldetective/scripts/train_segmentation_model.py,sha256=Fm-46uhn5zd_1iwRiunBq_ziqiO4Fv-bzS5OgS0B_2c,9284
74
+ celldetective/scripts/train_signal_model.py,sha256=LNLIViFEMzyDZvbdfU2L1p90uu2Bha5FLH2qCKSX424,3234
68
75
  tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
69
76
  tests/test_events.py,sha256=eLFwwEEJfQAdwhews3-fn1HSvzozcNNFN_Qn0gOvQkE,685
70
77
  tests/test_filters.py,sha256=iJksl_HgquqGzPPv46qpNtlD4rkBpZ5eVtIotgZ7LDs,656
@@ -76,9 +83,9 @@ tests/test_segmentation.py,sha256=_HB8CCq-Ci6amf0xAmDIUuwtBUU_EGpgqLvcvSHrGug,34
76
83
  tests/test_signals.py,sha256=No4cah6KxplhDcKXnU8RrA7eDla4hWw6ccf7xGnBokU,3599
77
84
  tests/test_tracking.py,sha256=8hebWSqEIuttD1ABn-6dKCT7EXKRR7-4RwyFWi1WPFo,8800
78
85
  tests/test_utils.py,sha256=NKRCAC1d89aBK5cWjTb7-pInYow901RrT-uBlIdz4KI,3692
79
- celldetective-1.1.1.post4.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
80
- celldetective-1.1.1.post4.dist-info/METADATA,sha256=hN7LbHEXIAV9Saz6XZZIxWnhbVQmvbJ9QRFwJ00PHLo,12418
81
- celldetective-1.1.1.post4.dist-info/WHEEL,sha256=Z4pYXqR_rTB7OWNDYFOm1qRk0RX6GFP2o8LgvP453Hk,91
82
- celldetective-1.1.1.post4.dist-info/entry_points.txt,sha256=2NU6_EOByvPxqBbCvjwxlVlvnQreqZ3BKRCVIKEv3dg,62
83
- celldetective-1.1.1.post4.dist-info/top_level.txt,sha256=6rsIKKfGMKgud7HPuATcpq6EhdXwcg_yknBVWn9x4C4,20
84
- celldetective-1.1.1.post4.dist-info/RECORD,,
86
+ celldetective-1.2.1.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
87
+ celldetective-1.2.1.dist-info/METADATA,sha256=cjQ13u8SwSQ5ayCkYTkj_TbXTPpqky7HB1eMdx37KIA,12405
88
+ celldetective-1.2.1.dist-info/WHEEL,sha256=Mdi9PDNwEZptOjTlUcAth7XJDFtKrHYaQMPulZeBCiQ,91
89
+ celldetective-1.2.1.dist-info/entry_points.txt,sha256=2NU6_EOByvPxqBbCvjwxlVlvnQreqZ3BKRCVIKEv3dg,62
90
+ celldetective-1.2.1.dist-info/top_level.txt,sha256=6rsIKKfGMKgud7HPuATcpq6EhdXwcg_yknBVWn9x4C4,20
91
+ celldetective-1.2.1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (70.3.0)
2
+ Generator: setuptools (73.0.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5