celldetective 1.3.9.post4__py3-none-any.whl → 1.3.9.post5__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/extra_properties.py +188 -24
- celldetective/gui/classifier_widget.py +5 -1
- celldetective/gui/plot_signals_ui.py +6 -3
- celldetective/gui/signal_annotator.py +10 -2
- celldetective/io.py +16 -7
- {celldetective-1.3.9.post4.dist-info → celldetective-1.3.9.post5.dist-info}/METADATA +1 -1
- {celldetective-1.3.9.post4.dist-info → celldetective-1.3.9.post5.dist-info}/RECORD +12 -12
- {celldetective-1.3.9.post4.dist-info → celldetective-1.3.9.post5.dist-info}/WHEEL +1 -1
- {celldetective-1.3.9.post4.dist-info → celldetective-1.3.9.post5.dist-info}/LICENSE +0 -0
- {celldetective-1.3.9.post4.dist-info → celldetective-1.3.9.post5.dist-info}/entry_points.txt +0 -0
- {celldetective-1.3.9.post4.dist-info → celldetective-1.3.9.post5.dist-info}/top_level.txt +0 -0
celldetective/_version.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__version__ = "1.3.9.
|
|
1
|
+
__version__ = "1.3.9.post5"
|
|
@@ -1,23 +1,45 @@
|
|
|
1
1
|
"""
|
|
2
|
-
Copyright © 2022 Laboratoire Adhesion et Inflammation
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
2
|
+
Copyright © 2022 Laboratoire Adhesion et Inflammation
|
|
3
|
+
Authored by R. Torro, K. Dervanova, L. Limozin
|
|
4
|
+
|
|
5
|
+
This module defines additional measurement functions for use with `regionprops` via `measure_features`.
|
|
6
|
+
|
|
7
|
+
Usage
|
|
8
|
+
-----
|
|
9
|
+
Each function must follow these conventions:
|
|
10
|
+
|
|
11
|
+
- **First argument:** `regionmask` (numpy array)
|
|
12
|
+
A binary mask of the cell of interest, as provided by `regionprops`.
|
|
13
|
+
- **Optional second argument:** `intensity_image` (numpy array)
|
|
14
|
+
An image crop/bounding box associated with the cell (single-channel at a time).
|
|
15
|
+
|
|
16
|
+
Unlike the default `regionprops` from `scikit-image`, the cell image is **not** masked with zeros outside its boundaries.
|
|
17
|
+
This allows thresholding techniques to be used in measurements.
|
|
18
|
+
|
|
19
|
+
Naming Conventions & Indexing
|
|
20
|
+
------------------------------
|
|
21
|
+
- The measurement name is derived from the function name.
|
|
22
|
+
- If a function returns multiple values (e.g., for multichannel images), outputs are labeled sequentially:
|
|
23
|
+
`function-0`, `function-1`, etc.
|
|
24
|
+
- To rename these outputs, use `rename_intensity_column` from `celldetective.utils`.
|
|
25
|
+
- `"intensity"` in function names is automatically replaced with the actual channel name:
|
|
26
|
+
- Example: `"intensity-0"` → `"brightfield_channel"`.
|
|
27
|
+
- **Avoid digits smaller than the number of channels in function names** to prevent indexing conflicts.
|
|
28
|
+
Prefer text-based names instead:
|
|
29
|
+
|
|
30
|
+
.. code-block:: python
|
|
31
|
+
|
|
32
|
+
# Bad practice:
|
|
33
|
+
def intensity2(regionmask, intensity_image):
|
|
34
|
+
pass
|
|
35
|
+
|
|
36
|
+
# Recommended:
|
|
37
|
+
def intensity_two(regionmask, intensity_image):
|
|
38
|
+
pass
|
|
39
|
+
|
|
40
|
+
GUI Integration
|
|
41
|
+
---------------
|
|
42
|
+
New functions are **automatically** added to the list of available measurements in the graphical interface.
|
|
21
43
|
"""
|
|
22
44
|
|
|
23
45
|
import warnings
|
|
@@ -97,6 +119,45 @@ def fraction_of_area_detected_in_intensity(regionmask, intensity_image, target_c
|
|
|
97
119
|
|
|
98
120
|
def area_detected_in_intensity(regionmask, intensity_image, target_channel='adhesion_channel'):
|
|
99
121
|
|
|
122
|
+
"""
|
|
123
|
+
Computes the detected area within the regionmask based on threshold-based segmentation.
|
|
124
|
+
|
|
125
|
+
The function applies a predefined filtering and thresholding pipeline to the intensity image (normalized adhesion channel)
|
|
126
|
+
to detect significant regions. The resulting segmented regions are restricted to the
|
|
127
|
+
`regionmask`, ensuring that only the relevant area is measured.
|
|
128
|
+
|
|
129
|
+
Parameters
|
|
130
|
+
----------
|
|
131
|
+
regionmask : ndarray
|
|
132
|
+
A binary mask (2D array) where nonzero values define the region of interest.
|
|
133
|
+
intensity_image : ndarray
|
|
134
|
+
A 2D array of the same shape as `regionmask`, representing the intensity
|
|
135
|
+
values associated with the region.
|
|
136
|
+
target_channel : str, optional
|
|
137
|
+
Name of the intensity channel used for measurement. Defaults to `'adhesion_channel'`.
|
|
138
|
+
|
|
139
|
+
Returns
|
|
140
|
+
-------
|
|
141
|
+
detected_area : float
|
|
142
|
+
The total area (number of pixels) detected based on intensity-based segmentation.
|
|
143
|
+
|
|
144
|
+
Notes
|
|
145
|
+
-----
|
|
146
|
+
- The segmentation is performed using `segment_frame_from_thresholds()` with predefined parameters:
|
|
147
|
+
|
|
148
|
+
- Thresholding range: `[0.02, 1000]`
|
|
149
|
+
- Filters applied in sequence:
|
|
150
|
+
|
|
151
|
+
- `"subtract"` with value `1` (subtract 1 from intensity values)
|
|
152
|
+
- `"abs"` (take absolute value of intensities)
|
|
153
|
+
- `"gauss"` with sigma `0.8` (apply Gauss filter with sigma `0.8`)
|
|
154
|
+
|
|
155
|
+
- The segmentation includes hole filling.
|
|
156
|
+
- The detected regions are converted to a binary mask (`lbl > 0`).
|
|
157
|
+
- Any pixels outside the `regionmask` are excluded from the measurement.
|
|
158
|
+
|
|
159
|
+
"""
|
|
160
|
+
|
|
100
161
|
instructions = {
|
|
101
162
|
"thresholds": [
|
|
102
163
|
0.02,
|
|
@@ -125,9 +186,46 @@ def area_detected_in_intensity(regionmask, intensity_image, target_channel='adhe
|
|
|
125
186
|
return float(np.sum(lbl))
|
|
126
187
|
|
|
127
188
|
|
|
128
|
-
def area_dark_intensity(regionmask, intensity_image, target_channel='adhesion_channel', fill_holes=True): #, target_channel='adhesion_channel'
|
|
189
|
+
def area_dark_intensity(regionmask, intensity_image, target_channel='adhesion_channel', fill_holes=True, threshold=0.95): #, target_channel='adhesion_channel'
|
|
129
190
|
|
|
130
|
-
|
|
191
|
+
"""
|
|
192
|
+
Computes the absolute area within the regionmask where the intensity is below a given threshold.
|
|
193
|
+
|
|
194
|
+
This function identifies pixels in the region where the intensity is lower than `threshold`.
|
|
195
|
+
If `fill_holes` is `True`, small enclosed holes in the detected dark regions are filled before
|
|
196
|
+
computing the total area.
|
|
197
|
+
|
|
198
|
+
Parameters
|
|
199
|
+
----------
|
|
200
|
+
regionmask : ndarray
|
|
201
|
+
A binary mask (2D array) where nonzero values define the region of interest.
|
|
202
|
+
intensity_image : ndarray
|
|
203
|
+
A 2D array of the same shape as `regionmask`, representing the intensity
|
|
204
|
+
values associated with the region.
|
|
205
|
+
target_channel : str, optional
|
|
206
|
+
Name of the intensity channel used for measurement. Defaults to `'adhesion_channel'`.
|
|
207
|
+
fill_holes : bool, optional
|
|
208
|
+
If `True`, fills enclosed holes in the detected dark intensity regions before computing
|
|
209
|
+
the area. Defaults to `True`.
|
|
210
|
+
threshold : float, optional
|
|
211
|
+
Intensity threshold below which a pixel is considered part of a dark region.
|
|
212
|
+
Defaults to `0.95`.
|
|
213
|
+
|
|
214
|
+
Returns
|
|
215
|
+
-------
|
|
216
|
+
dark_area : float
|
|
217
|
+
The absolute area (number of pixels) where intensity values are below `threshold`, within the regionmask.
|
|
218
|
+
|
|
219
|
+
Notes
|
|
220
|
+
-----
|
|
221
|
+
- The default threshold for defining "dark" intensity regions is `0.95`, but it can be adjusted.
|
|
222
|
+
- If `fill_holes` is `True`, the function applies hole-filling to the detected dark regions
|
|
223
|
+
using `skimage.measure.label` and `fill_label_holes()`.
|
|
224
|
+
- The `target_channel` parameter tells regionprops to only measure this channel.
|
|
225
|
+
|
|
226
|
+
"""
|
|
227
|
+
|
|
228
|
+
subregion = (intensity_image < threshold)*regionmask # under one, under 0.8, under 0.6, whatever value!
|
|
131
229
|
if fill_holes:
|
|
132
230
|
subregion = skm.label(subregion, connectivity=2, background=0)
|
|
133
231
|
subregion = fill_label_holes(subregion)
|
|
@@ -136,9 +234,9 @@ def area_dark_intensity(regionmask, intensity_image, target_channel='adhesion_ch
|
|
|
136
234
|
return float(np.sum(subregion))
|
|
137
235
|
|
|
138
236
|
|
|
139
|
-
def fraction_of_area_dark_intensity(regionmask, intensity_image, target_channel='adhesion_channel', fill_holes=True): #, target_channel='adhesion_channel'
|
|
237
|
+
def fraction_of_area_dark_intensity(regionmask, intensity_image, target_channel='adhesion_channel', fill_holes=True, threshold=0.95): #, target_channel='adhesion_channel'
|
|
140
238
|
|
|
141
|
-
subregion = (intensity_image <
|
|
239
|
+
subregion = (intensity_image < threshold)*regionmask # under one, under 0.8, under 0.6, whatever value!
|
|
142
240
|
if fill_holes:
|
|
143
241
|
subregion = skm.label(subregion, connectivity=2, background=0)
|
|
144
242
|
subregion = fill_label_holes(subregion)
|
|
@@ -183,6 +281,38 @@ def intensity_nanmean(regionmask, intensity_image):
|
|
|
183
281
|
|
|
184
282
|
def intensity_center_of_mass_displacement(regionmask, intensity_image):
|
|
185
283
|
|
|
284
|
+
"""
|
|
285
|
+
Computes the displacement between the geometric centroid and the
|
|
286
|
+
intensity-weighted center of mass of a region.
|
|
287
|
+
|
|
288
|
+
Parameters
|
|
289
|
+
----------
|
|
290
|
+
regionmask : ndarray
|
|
291
|
+
A binary mask (2D array) where nonzero values indicate the region of interest.
|
|
292
|
+
intensity_image : ndarray
|
|
293
|
+
A 2D array of the same shape as `regionmask`, representing the intensity
|
|
294
|
+
values associated with the region.
|
|
295
|
+
|
|
296
|
+
Returns
|
|
297
|
+
-------
|
|
298
|
+
distance : float
|
|
299
|
+
Euclidean distance between the geometric centroid and the intensity-weighted center of mass.
|
|
300
|
+
direction_arctan : float
|
|
301
|
+
Angle (in degrees) of displacement from the geometric centroid to the intensity-weighted center of mass,
|
|
302
|
+
computed using `arctan2(delta_y, delta_x)`.
|
|
303
|
+
delta_x : float
|
|
304
|
+
Difference in x-coordinates (intensity-weighted centroid - geometric centroid).
|
|
305
|
+
delta_y : float
|
|
306
|
+
Difference in y-coordinates (intensity-weighted centroid - geometric centroid).
|
|
307
|
+
|
|
308
|
+
Notes
|
|
309
|
+
-----
|
|
310
|
+
- If the `intensity_image` contains NaN values, it is first processed using `interpolate_nan()`.
|
|
311
|
+
- Negative intensity values are set to zero to prevent misbehavior in center of mass calculation.
|
|
312
|
+
- If the intensity image is entirely zero, all outputs are `NaN`.
|
|
313
|
+
|
|
314
|
+
"""
|
|
315
|
+
|
|
186
316
|
if np.any(intensity_image!=intensity_image):
|
|
187
317
|
intensity_image = interpolate_nan(intensity_image.copy())
|
|
188
318
|
|
|
@@ -247,7 +377,41 @@ def intensity_center_of_mass_displacement_edge(regionmask, intensity_image):
|
|
|
247
377
|
def intensity_radial_gradient(regionmask, intensity_image):
|
|
248
378
|
|
|
249
379
|
"""
|
|
250
|
-
|
|
380
|
+
Determines whether the intensity follows a radial gradient from the center to the edge of the cell.
|
|
381
|
+
|
|
382
|
+
The function fits a linear model to the intensity values as a function of distance from the center
|
|
383
|
+
(computed via the Euclidean distance transform). The slope of the fitted line indicates whether
|
|
384
|
+
the intensity is higher at the center or at the edges.
|
|
385
|
+
|
|
386
|
+
Parameters
|
|
387
|
+
----------
|
|
388
|
+
regionmask : ndarray
|
|
389
|
+
A binary mask (2D array) where nonzero values define the region of interest.
|
|
390
|
+
intensity_image : ndarray
|
|
391
|
+
A 2D array of the same shape as `regionmask`, representing the intensity
|
|
392
|
+
values associated with the region.
|
|
393
|
+
|
|
394
|
+
Returns
|
|
395
|
+
-------
|
|
396
|
+
slope : float
|
|
397
|
+
Slope of the fitted linear model.
|
|
398
|
+
|
|
399
|
+
- If `slope > 0`: Intensity increases towards the edge.
|
|
400
|
+
- If `slope < 0`: Intensity is higher at the center.
|
|
401
|
+
|
|
402
|
+
intercept : float
|
|
403
|
+
Intercept of the fitted linear model.
|
|
404
|
+
r2 : float
|
|
405
|
+
Coefficient of determination (R²), indicating how well the linear model fits the intensity profile.
|
|
406
|
+
|
|
407
|
+
Notes
|
|
408
|
+
-----
|
|
409
|
+
- If the `intensity_image` contains NaN values, they are interpolated using `interpolate_nan()`.
|
|
410
|
+
- The Euclidean distance transform (`distance_transform_edt`) is used to compute the distance
|
|
411
|
+
of each pixel from the edge.
|
|
412
|
+
- The x-values for the linear fit are reversed so that the origin is at the center.
|
|
413
|
+
- A warning suppression is applied to ignore messages about poorly conditioned polynomial fits.
|
|
414
|
+
|
|
251
415
|
"""
|
|
252
416
|
|
|
253
417
|
if np.any(intensity_image!=intensity_image):
|
|
@@ -482,8 +482,12 @@ class ClassifierWidget(QWidget, Styles):
|
|
|
482
482
|
|
|
483
483
|
if 'custom' in list(self.df.columns):
|
|
484
484
|
self.df = self.df.drop(['custom'],axis=1)
|
|
485
|
-
|
|
485
|
+
|
|
486
|
+
self.fig_props.set_size_inches(4,3)
|
|
487
|
+
self.fig_props.suptitle(self.property_query_le.text(), fontsize=10)
|
|
488
|
+
self.fig_props.tight_layout()
|
|
486
489
|
for pos,pos_group in self.df.groupby('position'):
|
|
490
|
+
self.fig_props.savefig(pos+os.sep.join(['output',f'{self.class_name}.png']), bbox_inches='tight', dpi=300)
|
|
487
491
|
pos_group.to_csv(pos+os.sep.join(['output', 'tables', f'trajectories_{self.mode}.csv']), index=False)
|
|
488
492
|
|
|
489
493
|
self.parent_window.parent_window.update_position_options()
|
|
@@ -297,9 +297,12 @@ class ConfigSignalPlot(QWidget, Styles):
|
|
|
297
297
|
self.compute_signal_functions()
|
|
298
298
|
if self.open_widget:
|
|
299
299
|
self.interpret_pos_location()
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
300
|
+
try:
|
|
301
|
+
self.plot_window = GenericSignalPlotWidget(parent_window=self, df=self.df, df_pos_info = self.df_pos_info, df_well_info = self.df_well_info, feature_selected=self.feature_selected, title='plot signals')
|
|
302
|
+
self.plot_window.show()
|
|
303
|
+
except Exception as e:
|
|
304
|
+
print(f"{e=}")
|
|
305
|
+
|
|
303
306
|
def process_signal(self):
|
|
304
307
|
|
|
305
308
|
self.FrameToMin = float(self.time_calibration_le.text().replace(',','.'))
|
|
@@ -807,8 +807,6 @@ class SignalAnnotator(QMainWindow, Styles):
|
|
|
807
807
|
cols_to_remove += time_cols
|
|
808
808
|
#cols_to_remove.extend(self.df_tracks.select_dtypes(include=['object']).columns)
|
|
809
809
|
|
|
810
|
-
print(f"{cols_to_remove=}")
|
|
811
|
-
|
|
812
810
|
for tr in cols_to_remove:
|
|
813
811
|
try:
|
|
814
812
|
self.columns_to_rescale.remove(tr)
|
|
@@ -856,6 +854,16 @@ class SignalAnnotator(QMainWindow, Styles):
|
|
|
856
854
|
'class', 't0', 'POSITION_X', 'POSITION_Y', 'position', 'well', 'well_index', 'well_name',
|
|
857
855
|
'pos_name', 'index','class_color','status_color']
|
|
858
856
|
|
|
857
|
+
meta = get_experiment_metadata(self.exp_dir)
|
|
858
|
+
if meta is not None:
|
|
859
|
+
keys = list(meta.keys())
|
|
860
|
+
to_remove.extend(keys)
|
|
861
|
+
|
|
862
|
+
labels = get_experiment_labels(self.exp_dir)
|
|
863
|
+
if labels is not None:
|
|
864
|
+
keys = list(labels.keys())
|
|
865
|
+
to_remove.extend(labels)
|
|
866
|
+
|
|
859
867
|
for c in to_remove:
|
|
860
868
|
if c in signals:
|
|
861
869
|
signals.remove(c)
|
celldetective/io.py
CHANGED
|
@@ -1941,10 +1941,10 @@ def relabel_segmentation(labels, df, exclude_nans=True, column_labels={'track':
|
|
|
1941
1941
|
|
|
1942
1942
|
def rewrite_labels(indices):
|
|
1943
1943
|
|
|
1944
|
-
all_track_ids = df[column_labels['track']].unique()
|
|
1944
|
+
all_track_ids = df[column_labels['track']].dropna().unique()
|
|
1945
1945
|
|
|
1946
1946
|
for t in tqdm(indices):
|
|
1947
|
-
|
|
1947
|
+
|
|
1948
1948
|
f = int(t)
|
|
1949
1949
|
cells = df.loc[df[column_labels['frame']] == f, [column_labels['track'], column_labels['label']]].to_numpy()
|
|
1950
1950
|
tracks_at_t = list(cells[:,0])
|
|
@@ -1974,15 +1974,23 @@ def relabel_segmentation(labels, df, exclude_nans=True, column_labels={'track':
|
|
|
1974
1974
|
|
|
1975
1975
|
loc_i, loc_j = np.where(labels[f] == identities[k])
|
|
1976
1976
|
track_id = tracks_at_t[k]
|
|
1977
|
-
|
|
1977
|
+
|
|
1978
|
+
if track_id==track_id:
|
|
1979
|
+
new_labels[f, loc_i, loc_j] = round(track_id)
|
|
1978
1980
|
|
|
1979
1981
|
# Multithreading
|
|
1980
|
-
indices = list(df[column_labels['frame']].unique())
|
|
1982
|
+
indices = list(df[column_labels['frame']].dropna().unique())
|
|
1981
1983
|
chunks = np.array_split(indices, n_threads)
|
|
1982
1984
|
|
|
1983
|
-
with concurrent.futures.ThreadPoolExecutor() as executor:
|
|
1984
|
-
|
|
1985
|
-
|
|
1985
|
+
with concurrent.futures.ThreadPoolExecutor(max_workers=threads) as executor:
|
|
1986
|
+
|
|
1987
|
+
results = executor.map(rewrite_labels, chunks) #list(map(lambda x: executor.submit(self.parallel_job, x), chunks))
|
|
1988
|
+
try:
|
|
1989
|
+
for i,return_value in enumerate(results):
|
|
1990
|
+
print(f"Thread {i} output check: ",return_value)
|
|
1991
|
+
except Exception as e:
|
|
1992
|
+
print("Exception: ", e)
|
|
1993
|
+
|
|
1986
1994
|
print("\nDone.")
|
|
1987
1995
|
|
|
1988
1996
|
return new_labels
|
|
@@ -2088,6 +2096,7 @@ def tracks_to_btrack(df, exclude_nans=False):
|
|
|
2088
2096
|
graph = {}
|
|
2089
2097
|
if exclude_nans:
|
|
2090
2098
|
df.dropna(subset='class_id',inplace=True)
|
|
2099
|
+
df.dropna(subset='TRACK_ID',inplace=True)
|
|
2091
2100
|
|
|
2092
2101
|
df["z"] = 0.
|
|
2093
2102
|
data = df[["TRACK_ID","FRAME","z","POSITION_Y","POSITION_X"]].to_numpy()
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
celldetective/__init__.py,sha256=bi3SGTMo6s2qQBsJAaKy-a4xaGcTQVW8zsqaiX5XKeY,139
|
|
2
2
|
celldetective/__main__.py,sha256=bxTlSvbKhqn3LW_azd2baDCnDsgb37PAP9DfuAJ1_5M,1844
|
|
3
|
-
celldetective/_version.py,sha256
|
|
3
|
+
celldetective/_version.py,sha256=LI2Zi5wYb3f4Us7DLo9zDTT_AexVCZzSS1LVTRQbzKQ,28
|
|
4
4
|
celldetective/events.py,sha256=UkjY_-THo6WviWWCLnDbma7jWOd_O9a60C4IOX2htG8,8254
|
|
5
|
-
celldetective/extra_properties.py,sha256=
|
|
5
|
+
celldetective/extra_properties.py,sha256=N1cZZNAqhuZDxsw6EzATnze5fharxaMvzQ6IjuJfqS0,14866
|
|
6
6
|
celldetective/filters.py,sha256=6pl2IGPK2FH8KPWbjzQEbT4C-ruqE1fQ8NQNN7Euvy8,4433
|
|
7
|
-
celldetective/io.py,sha256=
|
|
7
|
+
celldetective/io.py,sha256=TLnYok-AiCTUVKABew7Irf-FlV2ofg-RjN7EneptjMc,122104
|
|
8
8
|
celldetective/measure.py,sha256=h1F08Vf7sy-20syMFZTUl1lHzE4h6cQvswJpwD9fcfE,58475
|
|
9
9
|
celldetective/neighborhood.py,sha256=s-zVsfGnPlqs6HlDJCXRh21lLiPKbA_S1JC6uZvfG_0,56712
|
|
10
10
|
celldetective/preprocessing.py,sha256=Wlt_PJua97CpMuWe_M65znUmz_yjYPqWIcs2ZK_RLgk,44109
|
|
@@ -20,7 +20,7 @@ celldetective/gui/__init__.py,sha256=2_r2xfOj4_2xj0yBkCTIfzlF94AHKm-j6Pvpd7DddQc
|
|
|
20
20
|
celldetective/gui/about.py,sha256=FJZrj6C-p6uqp_3UaprKosuW-Sw9_HPNQAvFbis9Gdk,1749
|
|
21
21
|
celldetective/gui/analyze_block.py,sha256=h0sp7Tk3hZFM8w0yTidwIjZX4WRI-lQF3JCFObrLCPo,2761
|
|
22
22
|
celldetective/gui/btrack_options.py,sha256=F2wrhuaNSaBr6vNApI22XSjdI5Cl3q138qCYBk-FDu4,44684
|
|
23
|
-
celldetective/gui/classifier_widget.py,sha256=
|
|
23
|
+
celldetective/gui/classifier_widget.py,sha256=81B9iDVSYsCp9O1noyLVOKiEZ6YhxWX4S-O0xB9U8-c,20476
|
|
24
24
|
celldetective/gui/configure_new_exp.py,sha256=N4SdL-4Xo0XbTAkCtt1ywr74HmHc5eaPlHGv1XgxAX0,20772
|
|
25
25
|
celldetective/gui/control_panel.py,sha256=jFpedm03x6_jKabeadsNiigKnlh7sXCkulwe4gMCJaM,22042
|
|
26
26
|
celldetective/gui/generic_signal_plot.py,sha256=Gv4KhA5vhbgVSj5jteE42T0aNCoQZtmIAUkEsMi6JNA,36309
|
|
@@ -30,12 +30,12 @@ celldetective/gui/layouts.py,sha256=XsqiHR58DXsG5SSD5S8KOtUv4yw-y-s2_wZx_XsHeJs,
|
|
|
30
30
|
celldetective/gui/measurement_options.py,sha256=sxtQPKSixVbrFcBC1XLLC4-h7ZHlgTLcPfVAW2RVV7w,40357
|
|
31
31
|
celldetective/gui/neighborhood_options.py,sha256=FBNDvlzMPKp8s0Grxds90pCPHG1s27XrpMN0HV2gf0I,19839
|
|
32
32
|
celldetective/gui/plot_measurements.py,sha256=n0pDUcYcsKlSMaUaBSVplGziuWp_7jKaeXdREs-MqyI,50848
|
|
33
|
-
celldetective/gui/plot_signals_ui.py,sha256=
|
|
33
|
+
celldetective/gui/plot_signals_ui.py,sha256=ttm5ijtZV5wAvy8uOq45YfybvubVFHvDN1hSHC_Kkk8,18249
|
|
34
34
|
celldetective/gui/process_block.py,sha256=rFmtrnYBohjNRqSTjxC86yDNnzcXE7w9eo9Vm0heh6A,71215
|
|
35
35
|
celldetective/gui/retrain_segmentation_model_options.py,sha256=7iawDN4kwq56Z-dX9kQe9tLW8B3YMrIW_D85LMAAYwk,23906
|
|
36
36
|
celldetective/gui/retrain_signal_model_options.py,sha256=GCa0WKKsgmH2CFDHAKxPGbHtCE19p1_bbcWNasyZw5o,22482
|
|
37
37
|
celldetective/gui/seg_model_loader.py,sha256=b1BiHuAf_ZqroE4jSEVCo7ASQv-xyWMPWU799alpbNM,19727
|
|
38
|
-
celldetective/gui/signal_annotator.py,sha256=
|
|
38
|
+
celldetective/gui/signal_annotator.py,sha256=xr3w8nLD8JeAp_7Y851OqUKGUKeF2xrpbz3mNs5HJp4,89765
|
|
39
39
|
celldetective/gui/signal_annotator2.py,sha256=RhcMX32FH_zg8GgAofGIyda9H8euSFADau301qi1NU0,106342
|
|
40
40
|
celldetective/gui/signal_annotator_options.py,sha256=Tq20tybpelHFUqFCSemqH9es2FqM8S3I6Fab-u0FK0A,11015
|
|
41
41
|
celldetective/gui/styles.py,sha256=SZy_ACkA6QB_4ANyY1V0m1QF66C0SVGssOrwW1Qt1Aw,5076
|
|
@@ -121,9 +121,9 @@ tests/test_segmentation.py,sha256=k1b_zIZdlytEdJcHjAUQEO3gTBAHtv5WvrwQN2xD4kc,34
|
|
|
121
121
|
tests/test_signals.py,sha256=No4cah6KxplhDcKXnU8RrA7eDla4hWw6ccf7xGnBokU,3599
|
|
122
122
|
tests/test_tracking.py,sha256=8hebWSqEIuttD1ABn-6dKCT7EXKRR7-4RwyFWi1WPFo,8800
|
|
123
123
|
tests/test_utils.py,sha256=NKRCAC1d89aBK5cWjTb7-pInYow901RrT-uBlIdz4KI,3692
|
|
124
|
-
celldetective-1.3.9.
|
|
125
|
-
celldetective-1.3.9.
|
|
126
|
-
celldetective-1.3.9.
|
|
127
|
-
celldetective-1.3.9.
|
|
128
|
-
celldetective-1.3.9.
|
|
129
|
-
celldetective-1.3.9.
|
|
124
|
+
celldetective-1.3.9.post5.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
|
125
|
+
celldetective-1.3.9.post5.dist-info/METADATA,sha256=jn77YGkfor9ud4o0cvkEtDDwsKj4LnrMy6EDQj6aVWs,10753
|
|
126
|
+
celldetective-1.3.9.post5.dist-info/WHEEL,sha256=52BFRY2Up02UkjOa29eZOS2VxUrpPORXg1pkohGGUS8,91
|
|
127
|
+
celldetective-1.3.9.post5.dist-info/entry_points.txt,sha256=2NU6_EOByvPxqBbCvjwxlVlvnQreqZ3BKRCVIKEv3dg,62
|
|
128
|
+
celldetective-1.3.9.post5.dist-info/top_level.txt,sha256=6rsIKKfGMKgud7HPuATcpq6EhdXwcg_yknBVWn9x4C4,20
|
|
129
|
+
celldetective-1.3.9.post5.dist-info/RECORD,,
|
|
File without changes
|
{celldetective-1.3.9.post4.dist-info → celldetective-1.3.9.post5.dist-info}/entry_points.txt
RENAMED
|
File without changes
|
|
File without changes
|