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.
- celldetective/__init__.py +2 -1
- celldetective/extra_properties.py +62 -34
- celldetective/gui/__init__.py +1 -0
- celldetective/gui/analyze_block.py +2 -1
- celldetective/gui/classifier_widget.py +15 -9
- celldetective/gui/control_panel.py +50 -6
- celldetective/gui/layouts.py +5 -4
- celldetective/gui/neighborhood_options.py +13 -9
- celldetective/gui/plot_signals_ui.py +39 -11
- celldetective/gui/process_block.py +413 -95
- celldetective/gui/retrain_segmentation_model_options.py +17 -4
- celldetective/gui/retrain_signal_model_options.py +106 -6
- celldetective/gui/signal_annotator.py +29 -9
- celldetective/gui/signal_annotator2.py +2708 -0
- celldetective/gui/signal_annotator_options.py +3 -1
- celldetective/gui/survival_ui.py +15 -6
- celldetective/gui/tableUI.py +222 -60
- celldetective/io.py +536 -420
- celldetective/measure.py +919 -969
- celldetective/models/pair_signal_detection/blank +0 -0
- celldetective/models/segmentation_effectors/ricm-bimodal/config_input.json +130 -0
- celldetective/models/segmentation_effectors/ricm-bimodal/ricm-bimodal +0 -0
- celldetective/models/segmentation_effectors/ricm-bimodal/training_instructions.json +37 -0
- celldetective/neighborhood.py +428 -354
- celldetective/relative_measurements.py +648 -0
- celldetective/scripts/analyze_signals.py +1 -1
- celldetective/scripts/measure_cells.py +28 -8
- celldetective/scripts/measure_relative.py +103 -0
- celldetective/scripts/segment_cells.py +5 -5
- celldetective/scripts/track_cells.py +4 -1
- celldetective/scripts/train_segmentation_model.py +23 -18
- celldetective/scripts/train_signal_model.py +33 -0
- celldetective/signals.py +405 -8
- celldetective/tracking.py +8 -2
- celldetective/utils.py +178 -17
- {celldetective-1.1.1.post4.dist-info → celldetective-1.2.1.dist-info}/METADATA +8 -8
- {celldetective-1.1.1.post4.dist-info → celldetective-1.2.1.dist-info}/RECORD +41 -34
- {celldetective-1.1.1.post4.dist-info → celldetective-1.2.1.dist-info}/WHEEL +1 -1
- {celldetective-1.1.1.post4.dist-info → celldetective-1.2.1.dist-info}/LICENSE +0 -0
- {celldetective-1.1.1.post4.dist-info → celldetective-1.2.1.dist-info}/entry_points.txt +0 -0
- {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
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
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
|
-
|
|
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
|
|
2116
|
-
idx =
|
|
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
|
-
|
|
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.
|
|
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
|
|
16
|
-
Requires-Dist: jinja2
|
|
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
|
|
19
|
+
Requires-Dist: cellpose<3
|
|
20
20
|
Requires-Dist: scikit-learn
|
|
21
21
|
Requires-Dist: btrack
|
|
22
|
-
Requires-Dist: tensorflow
|
|
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
|
|
32
|
+
Requires-Dist: opencv-python-headless==4.7.0.72
|
|
33
33
|
Requires-Dist: liblapack
|
|
34
34
|
Requires-Dist: gputools
|
|
35
|
-
Requires-Dist: lmfit
|
|
36
|
-
Requires-Dist: superqt[cmap]
|
|
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=
|
|
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=
|
|
4
|
+
celldetective/extra_properties.py,sha256=8DkxTvVs7gASsnnGurVZ3_zt6uR0pvvJhBKO2LC6hGk,5118
|
|
5
5
|
celldetective/filters.py,sha256=b0qKwHor1fvNA_dHovP17nQz8EsW5YlyhT2TJnayn08,3615
|
|
6
|
-
celldetective/io.py,sha256=
|
|
7
|
-
celldetective/measure.py,sha256=
|
|
8
|
-
celldetective/neighborhood.py,sha256=
|
|
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=
|
|
12
|
-
celldetective/tracking.py,sha256=
|
|
13
|
-
celldetective/utils.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
30
|
-
celldetective/gui/process_block.py,sha256=
|
|
31
|
-
celldetective/gui/retrain_segmentation_model_options.py,sha256=
|
|
32
|
-
celldetective/gui/retrain_signal_model_options.py,sha256=
|
|
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=
|
|
35
|
-
celldetective/gui/
|
|
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=
|
|
38
|
-
celldetective/gui/tableUI.py,sha256=
|
|
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=
|
|
62
|
-
celldetective/scripts/measure_cells.py,sha256=
|
|
63
|
-
celldetective/scripts/
|
|
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=
|
|
66
|
-
celldetective/scripts/train_segmentation_model.py,sha256=
|
|
67
|
-
celldetective/scripts/train_signal_model.py,sha256=
|
|
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.
|
|
80
|
-
celldetective-1.
|
|
81
|
-
celldetective-1.
|
|
82
|
-
celldetective-1.
|
|
83
|
-
celldetective-1.
|
|
84
|
-
celldetective-1.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|