dclab 0.65.0__cp310-cp310-win_amd64.whl → 0.67.0__cp310-cp310-win_amd64.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.
Potentially problematic release.
This version of dclab might be problematic. Click here for more details.
- dclab/_version.py +16 -3
- dclab/cli/task_tdms2rtdc.py +1 -1
- dclab/definitions/__init__.py +1 -1
- dclab/definitions/feat_const.py +1 -1
- dclab/downsampling.cp310-win_amd64.pyd +0 -0
- dclab/external/skimage/_find_contours_cy.cp310-win_amd64.pyd +0 -0
- dclab/external/skimage/_pnpoly.cp310-win_amd64.pyd +0 -0
- dclab/external/skimage/_shared/geometry.cp310-win_amd64.pyd +0 -0
- dclab/rtdc_dataset/config.py +1 -1
- dclab/rtdc_dataset/core.py +3 -1
- dclab/rtdc_dataset/export.py +34 -1
- dclab/rtdc_dataset/feat_basin.py +85 -20
- dclab/rtdc_dataset/fmt_hdf5/events.py +20 -1
- dclab/rtdc_dataset/fmt_hierarchy/base.py +1 -1
- dclab/rtdc_dataset/fmt_tdms/event_trace.py +1 -1
- dclab/rtdc_dataset/fmt_tdms/naming.py +1 -1
- dclab/rtdc_dataset/writer.py +26 -7
- dclab/warn.py +1 -1
- {dclab-0.65.0.dist-info → dclab-0.67.0.dist-info}/METADATA +8 -2
- {dclab-0.65.0.dist-info → dclab-0.67.0.dist-info}/RECORD +24 -24
- {dclab-0.65.0.dist-info → dclab-0.67.0.dist-info}/WHEEL +0 -0
- {dclab-0.65.0.dist-info → dclab-0.67.0.dist-info}/entry_points.txt +0 -0
- {dclab-0.65.0.dist-info → dclab-0.67.0.dist-info}/licenses/LICENSE +0 -0
- {dclab-0.65.0.dist-info → dclab-0.67.0.dist-info}/top_level.txt +0 -0
dclab/_version.py
CHANGED
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
# file generated by setuptools-scm
|
|
2
2
|
# don't change, don't track in version control
|
|
3
3
|
|
|
4
|
-
__all__ = [
|
|
4
|
+
__all__ = [
|
|
5
|
+
"__version__",
|
|
6
|
+
"__version_tuple__",
|
|
7
|
+
"version",
|
|
8
|
+
"version_tuple",
|
|
9
|
+
"__commit_id__",
|
|
10
|
+
"commit_id",
|
|
11
|
+
]
|
|
5
12
|
|
|
6
13
|
TYPE_CHECKING = False
|
|
7
14
|
if TYPE_CHECKING:
|
|
@@ -9,13 +16,19 @@ if TYPE_CHECKING:
|
|
|
9
16
|
from typing import Union
|
|
10
17
|
|
|
11
18
|
VERSION_TUPLE = Tuple[Union[int, str], ...]
|
|
19
|
+
COMMIT_ID = Union[str, None]
|
|
12
20
|
else:
|
|
13
21
|
VERSION_TUPLE = object
|
|
22
|
+
COMMIT_ID = object
|
|
14
23
|
|
|
15
24
|
version: str
|
|
16
25
|
__version__: str
|
|
17
26
|
__version_tuple__: VERSION_TUPLE
|
|
18
27
|
version_tuple: VERSION_TUPLE
|
|
28
|
+
commit_id: COMMIT_ID
|
|
29
|
+
__commit_id__: COMMIT_ID
|
|
19
30
|
|
|
20
|
-
__version__ = version = '0.
|
|
21
|
-
__version_tuple__ = version_tuple = (0,
|
|
31
|
+
__version__ = version = '0.67.0'
|
|
32
|
+
__version_tuple__ = version_tuple = (0, 67, 0)
|
|
33
|
+
|
|
34
|
+
__commit_id__ = commit_id = 'g52c420117'
|
dclab/cli/task_tdms2rtdc.py
CHANGED
|
@@ -158,7 +158,7 @@ def tdms2rtdc_parser():
|
|
|
158
158
|
help='Compute features, such as volume or emodulus, '
|
|
159
159
|
+ 'that are otherwise computed on-the-fly. '
|
|
160
160
|
+ 'Use this if you want to minimize analysis '
|
|
161
|
-
+ 'time in e.g.
|
|
161
|
+
+ 'time in e.g. DCscope. CAUTION: ancillary '
|
|
162
162
|
+ 'feature recipes might be subject to change '
|
|
163
163
|
+ '(e.g. if an error is found in the recipe). '
|
|
164
164
|
+ 'Disabling this option maximizes '
|
dclab/definitions/__init__.py
CHANGED
|
@@ -6,7 +6,7 @@ from .feat_const import (
|
|
|
6
6
|
# these should not be used
|
|
7
7
|
feature_names, feature_labels, feature_name2label,
|
|
8
8
|
# this one should also not be used, but we wait with deprecation,
|
|
9
|
-
# because
|
|
9
|
+
# because DCscope heavily relies on it (it shouldn't)
|
|
10
10
|
scalar_feature_names
|
|
11
11
|
)
|
|
12
12
|
from .feat_logic import (
|
dclab/definitions/feat_const.py
CHANGED
|
@@ -149,7 +149,7 @@ for _i in range(10):
|
|
|
149
149
|
#: consist of the integer array `[1, 3, 5, 7, ...]` (indexing starts at zero).
|
|
150
150
|
#: The `basinmap1` feature must then be referenced in the corresponding basin
|
|
151
151
|
#: definition. These features should not be presented explicitly to the
|
|
152
|
-
#: normal user (e.g. in
|
|
152
|
+
#: normal user (e.g. in DCscope) to avoid ambiguities, and they should
|
|
153
153
|
#: always be exported alongside basins that refer to them.
|
|
154
154
|
for _j in range(10):
|
|
155
155
|
FEATURES_SCALAR.append([f"basinmap{_j}", f"Basin mapping {_j}"])
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
dclab/rtdc_dataset/config.py
CHANGED
|
@@ -437,7 +437,7 @@ def load_from_file(cfg_file):
|
|
|
437
437
|
convfunc = dfn.get_config_value_func(sec, var)
|
|
438
438
|
val = convfunc(val)
|
|
439
439
|
else:
|
|
440
|
-
# unknown parameter (e.g. plotting in
|
|
440
|
+
# unknown parameter (e.g. plotting in DCscope), guess type
|
|
441
441
|
var, val = keyval_str2typ(var, val)
|
|
442
442
|
if len(var) != 0 and len(str(val)) != 0:
|
|
443
443
|
cfg[sec][var] = val
|
dclab/rtdc_dataset/core.py
CHANGED
|
@@ -741,7 +741,9 @@ class RTDCBase(abc.ABC):
|
|
|
741
741
|
# need the referring dataset.
|
|
742
742
|
"mapping_referrer": self,
|
|
743
743
|
# Make sure the measurement identifier is checked.
|
|
744
|
-
"
|
|
744
|
+
"referrer_identifier": self.get_measurement_identifier(),
|
|
745
|
+
# Make sure the basin identifier is checked.
|
|
746
|
+
"basin_identifier": bdict.get("identifier"),
|
|
745
747
|
# allow to ignore basins
|
|
746
748
|
"ignored_basins": bd_keys,
|
|
747
749
|
# basin key
|
dclab/rtdc_dataset/export.py
CHANGED
|
@@ -39,6 +39,10 @@ class LimitingExportSizeWarning(UserWarning):
|
|
|
39
39
|
pass
|
|
40
40
|
|
|
41
41
|
|
|
42
|
+
class ContourNotExportedWarning(UserWarning):
|
|
43
|
+
pass
|
|
44
|
+
|
|
45
|
+
|
|
42
46
|
class Export(object):
|
|
43
47
|
def __init__(self, rtdc_ds):
|
|
44
48
|
"""Export functionalities for RT-DC datasets"""
|
|
@@ -228,6 +232,7 @@ class Export(object):
|
|
|
228
232
|
logs: bool = False,
|
|
229
233
|
tables: bool = False,
|
|
230
234
|
basins: bool = False,
|
|
235
|
+
allow_contour: bool = False,
|
|
231
236
|
meta_prefix: str = "src_",
|
|
232
237
|
override: bool = False,
|
|
233
238
|
compression_kwargs: Dict = None,
|
|
@@ -260,6 +265,14 @@ class Export(object):
|
|
|
260
265
|
Whether to export basins. If filtering is disabled, basins
|
|
261
266
|
are copied directly to the output file. If filtering is enabled,
|
|
262
267
|
then mapped basins are exported.
|
|
268
|
+
allow_contour: bool
|
|
269
|
+
Whether to allow exporting the "contour" feature. Writing this
|
|
270
|
+
feature to an HDF5 file is extremely inefficient, because it
|
|
271
|
+
cannot be represented by an ND array and thus must be stored
|
|
272
|
+
in a group, each contour stored in a separate dataset. The
|
|
273
|
+
contour can easily be computed via the mask, so actually storing
|
|
274
|
+
the contour should be avoided. If "contour" is in `features`,
|
|
275
|
+
it will only be written to the output file if `allow_contour=True`.
|
|
263
276
|
meta_prefix: str
|
|
264
277
|
Prefix for log and table names in the exported file
|
|
265
278
|
override: bool
|
|
@@ -318,8 +331,25 @@ class Export(object):
|
|
|
318
331
|
# for convenience
|
|
319
332
|
ds = self.rtdc_ds
|
|
320
333
|
|
|
334
|
+
# remove contour information from user-specified features
|
|
335
|
+
if "contour" in (features or []) and not allow_contour:
|
|
336
|
+
features = list(features)
|
|
337
|
+
features.remove("contour")
|
|
338
|
+
warnings.warn(
|
|
339
|
+
"Feature 'contour' not exported to output file, because "
|
|
340
|
+
"`allow_contour` is `False`. If you really need the "
|
|
341
|
+
"'contour' feature in the output file (unlikely, unless you "
|
|
342
|
+
"are venturing outside the DC Cosmos), you must set "
|
|
343
|
+
"`allow_contour=True`. Otherwise, you can safely ignore "
|
|
344
|
+
"this warning or silence it by not providing 'contour' in "
|
|
345
|
+
"`features`.",
|
|
346
|
+
ContourNotExportedWarning)
|
|
347
|
+
|
|
321
348
|
if features is None:
|
|
322
349
|
features = ds.features_innate
|
|
350
|
+
# silently remove contour information
|
|
351
|
+
if "contour" in features and not allow_contour:
|
|
352
|
+
features.remove("contour")
|
|
323
353
|
|
|
324
354
|
# decide which metadata to export
|
|
325
355
|
meta = {}
|
|
@@ -438,7 +468,6 @@ class Export(object):
|
|
|
438
468
|
if progress_callback:
|
|
439
469
|
progress_callback(1 - 1 / (len(features) or 1),
|
|
440
470
|
"writing basins")
|
|
441
|
-
|
|
442
471
|
# We have to store basins. There are three options:
|
|
443
472
|
# - filtering disabled: just copy basins
|
|
444
473
|
# - filtering enabled
|
|
@@ -450,6 +479,8 @@ class Export(object):
|
|
|
450
479
|
basin_list = [bn.as_dict() for bn in ds.basins]
|
|
451
480
|
# In addition to the upstream basins, also store a reference
|
|
452
481
|
# to the original file from which the export was done.
|
|
482
|
+
# Get the identifier of the current dataset for the new basins.
|
|
483
|
+
basin_id = ds.get_measurement_identifier()
|
|
453
484
|
if ds.format in get_basin_classes():
|
|
454
485
|
# The dataset has a format that matches a basin format
|
|
455
486
|
# directly.
|
|
@@ -464,6 +495,7 @@ class Export(object):
|
|
|
464
495
|
"basin_format": ds.format,
|
|
465
496
|
"basin_locs": basin_locs,
|
|
466
497
|
"basin_descr": f"Exported with dclab {version}",
|
|
498
|
+
"basin_id": basin_id,
|
|
467
499
|
})
|
|
468
500
|
elif (ds.format == "hierarchy"
|
|
469
501
|
and ds.get_root_parent().format in get_basin_classes()):
|
|
@@ -497,6 +529,7 @@ class Export(object):
|
|
|
497
529
|
child=ds,
|
|
498
530
|
child_indices=np.arange(len(ds))
|
|
499
531
|
),
|
|
532
|
+
"basin_id": basin_id,
|
|
500
533
|
})
|
|
501
534
|
|
|
502
535
|
for bn_dict in basin_list:
|
dclab/rtdc_dataset/feat_basin.py
CHANGED
|
@@ -176,7 +176,8 @@ class Basin(abc.ABC):
|
|
|
176
176
|
name: str = None,
|
|
177
177
|
description: str = None,
|
|
178
178
|
features: List[str] = None,
|
|
179
|
-
|
|
179
|
+
referrer_identifier: str = None,
|
|
180
|
+
basin_identifier: str = None,
|
|
180
181
|
mapping: Literal["same",
|
|
181
182
|
"basinmap0",
|
|
182
183
|
"basinmap1",
|
|
@@ -208,10 +209,18 @@ class Basin(abc.ABC):
|
|
|
208
209
|
features: list of str
|
|
209
210
|
List of features this basin provides; This list is enforced,
|
|
210
211
|
even if the basin actually contains more features.
|
|
211
|
-
|
|
212
|
+
referrer_identifier: str
|
|
212
213
|
A measurement identifier against which to check the basin.
|
|
214
|
+
If the basin mapping is "same", then this must match the
|
|
215
|
+
identifier of the basin exactly, otherwise it must start
|
|
216
|
+
with the basin identifier (e.g. "basin-id_referrer-sub-id").
|
|
213
217
|
If this is set to None (default), there is no certainty
|
|
214
218
|
that the downstream dataset is from the same measurement.
|
|
219
|
+
basin_identifier: str
|
|
220
|
+
A measurement identifier that must match the basin exactly.
|
|
221
|
+
In contrast to `referrer_identifier`, the basin identifier is
|
|
222
|
+
the identifier of the basin file. If `basin_identifier` is
|
|
223
|
+
specified, the identifier of the basin must be identical to it.
|
|
215
224
|
mapping: str
|
|
216
225
|
Which type of mapping to use. This can be either "same"
|
|
217
226
|
when the event list of the basin is identical to that
|
|
@@ -261,8 +270,9 @@ class Basin(abc.ABC):
|
|
|
261
270
|
# features this basin provides
|
|
262
271
|
self._features = features
|
|
263
272
|
#: measurement identifier of the referencing dataset
|
|
264
|
-
self.
|
|
265
|
-
self.
|
|
273
|
+
self.referrer_identifier = referrer_identifier
|
|
274
|
+
self.basin_identifier = basin_identifier or None
|
|
275
|
+
self._identifiers_verification = None
|
|
266
276
|
#: ignored basins
|
|
267
277
|
self.ignored_basins = ignored_basins or []
|
|
268
278
|
#: additional keyword arguments passed to the basin
|
|
@@ -304,13 +314,13 @@ class Basin(abc.ABC):
|
|
|
304
314
|
|
|
305
315
|
return f"<{self.__class__.__name__} ({opt_str}) at {hex(id(self))}>"
|
|
306
316
|
|
|
307
|
-
def
|
|
317
|
+
def _assert_referrer_identifier(self):
|
|
308
318
|
"""Make sure the basin matches the measurement identifier
|
|
309
319
|
"""
|
|
310
320
|
if not self.verify_basin(run_identifier=True):
|
|
311
321
|
raise KeyError(f"Measurement identifier of basin {self.ds} "
|
|
312
322
|
f"({self.get_measurement_identifier()}) does "
|
|
313
|
-
f"not match {self.
|
|
323
|
+
f"not match {self.referrer_identifier}!")
|
|
314
324
|
|
|
315
325
|
@property
|
|
316
326
|
def basinmap(self):
|
|
@@ -410,7 +420,7 @@ class Basin(abc.ABC):
|
|
|
410
420
|
|
|
411
421
|
def get_feature_data(self, feat):
|
|
412
422
|
"""Return an object representing feature data of the basin"""
|
|
413
|
-
self.
|
|
423
|
+
self._assert_referrer_identifier()
|
|
414
424
|
return self.ds[feat]
|
|
415
425
|
|
|
416
426
|
def get_measurement_identifier(self):
|
|
@@ -455,20 +465,30 @@ class Basin(abc.ABC):
|
|
|
455
465
|
# Only check for run identifier if requested and if the availability
|
|
456
466
|
# check did not fail.
|
|
457
467
|
if run_identifier and check_avail:
|
|
458
|
-
if
|
|
459
|
-
|
|
468
|
+
if self._identifiers_verification is None:
|
|
469
|
+
# This is the measurement identifier of the basin.
|
|
470
|
+
basin_identifier = self.get_measurement_identifier()
|
|
471
|
+
|
|
472
|
+
# Perform a sanity check for the basin identifier.
|
|
473
|
+
if (self.basin_identifier
|
|
474
|
+
and self.basin_identifier != basin_identifier):
|
|
475
|
+
# We should not proceed any further with this basin.
|
|
476
|
+
self._identifiers_verification = False
|
|
477
|
+
warnings.warn(
|
|
478
|
+
f"Basin identifier mismatch for {self}. Expected "
|
|
479
|
+
f"'{self.basin_identifier}', got '{basin_identifier}'")
|
|
480
|
+
|
|
481
|
+
if self.referrer_identifier is None:
|
|
460
482
|
# No measurement identifier was presented by the
|
|
461
483
|
# referencing dataset. We are in the dark.
|
|
462
484
|
# Don't perform any checks.
|
|
463
|
-
self.
|
|
485
|
+
self._identifiers_verification = True
|
|
464
486
|
else:
|
|
465
|
-
# This is the measurement identifier of the basin.
|
|
466
|
-
basin_identifier = self.get_measurement_identifier()
|
|
467
487
|
if basin_identifier is None:
|
|
468
488
|
# Again, we are in the dark, because the basin dataset
|
|
469
489
|
# does not have an identifier. This is an undesirable
|
|
470
490
|
# situation, but there is nothing we can do about it.
|
|
471
|
-
self.
|
|
491
|
+
self._identifiers_verification = True
|
|
472
492
|
else:
|
|
473
493
|
if self.mapping == "same":
|
|
474
494
|
# When we have identical mapping, then the
|
|
@@ -479,10 +499,10 @@ class Basin(abc.ABC):
|
|
|
479
499
|
# data), then the measurement identifier has to
|
|
480
500
|
# partially match.
|
|
481
501
|
verifier = str.startswith
|
|
482
|
-
self.
|
|
483
|
-
self.
|
|
502
|
+
self._identifiers_verification = verifier(
|
|
503
|
+
self.referrer_identifier, basin_identifier)
|
|
484
504
|
|
|
485
|
-
check_rid = self.
|
|
505
|
+
check_rid = self._identifiers_verification
|
|
486
506
|
else:
|
|
487
507
|
check_rid = True
|
|
488
508
|
|
|
@@ -547,8 +567,8 @@ class BasinProxy:
|
|
|
547
567
|
def __getitem__(self, feat):
|
|
548
568
|
if feat not in self._features:
|
|
549
569
|
if feat == "contour":
|
|
550
|
-
|
|
551
|
-
|
|
570
|
+
feat_obj = BasinProxyContour(feat_obj=self.ds[feat],
|
|
571
|
+
basinmap=self.basinmap)
|
|
552
572
|
else:
|
|
553
573
|
feat_obj = BasinProxyFeature(feat_obj=self.ds[feat],
|
|
554
574
|
basinmap=self.basinmap)
|
|
@@ -559,14 +579,61 @@ class BasinProxy:
|
|
|
559
579
|
return len(self.basinmap)
|
|
560
580
|
|
|
561
581
|
|
|
582
|
+
class BasinProxyContour:
|
|
583
|
+
def __init__(self, feat_obj, basinmap):
|
|
584
|
+
"""Wrap around a contour, mapping it upon data access, no caching"""
|
|
585
|
+
self.feat_obj = feat_obj
|
|
586
|
+
self.basinmap = basinmap
|
|
587
|
+
self.is_scalar = False
|
|
588
|
+
self.shape = (len(self.basinmap), np.nan, 2)
|
|
589
|
+
self.identifier = feat_obj.identifier
|
|
590
|
+
|
|
591
|
+
def __getattr__(self, item):
|
|
592
|
+
if item in [
|
|
593
|
+
"dtype",
|
|
594
|
+
]:
|
|
595
|
+
return getattr(self.feat_obj, item)
|
|
596
|
+
else:
|
|
597
|
+
raise AttributeError(
|
|
598
|
+
f"BasinProxyContour does not implement {item}")
|
|
599
|
+
|
|
600
|
+
def __getitem__(self, index):
|
|
601
|
+
if isinstance(index, numbers.Integral):
|
|
602
|
+
# single index, cheap operation
|
|
603
|
+
return self.feat_obj[self.basinmap[index]]
|
|
604
|
+
else:
|
|
605
|
+
raise NotImplementedError(
|
|
606
|
+
"Cannot index contours without anything else than integers.")
|
|
607
|
+
|
|
608
|
+
def __len__(self):
|
|
609
|
+
return self.shape[0]
|
|
610
|
+
|
|
611
|
+
|
|
562
612
|
class BasinProxyFeature(np.lib.mixins.NDArrayOperatorsMixin):
|
|
563
613
|
def __init__(self, feat_obj, basinmap):
|
|
564
614
|
"""Wrap around a feature object, mapping it upon data access"""
|
|
565
615
|
self.feat_obj = feat_obj
|
|
566
616
|
self.basinmap = basinmap
|
|
567
617
|
self._cache = None
|
|
618
|
+
self._shape = None
|
|
619
|
+
self._size = None
|
|
568
620
|
self.is_scalar = bool(len(self.feat_obj.shape) == 1)
|
|
569
621
|
|
|
622
|
+
@property
|
|
623
|
+
def shape(self):
|
|
624
|
+
if self._shape is None:
|
|
625
|
+
if self.is_scalar:
|
|
626
|
+
self._shape = self.basinmap.shape
|
|
627
|
+
else:
|
|
628
|
+
self._shape = (self.basinmap.size,) + self.feat_obj.shape[1:]
|
|
629
|
+
return self._shape
|
|
630
|
+
|
|
631
|
+
@property
|
|
632
|
+
def size(self):
|
|
633
|
+
if self._size is None:
|
|
634
|
+
self._size = np.prod(self.shape)
|
|
635
|
+
return self._size
|
|
636
|
+
|
|
570
637
|
def __array__(self, dtype=None, copy=copy_if_needed, *args, **kwargs):
|
|
571
638
|
if self._cache is None and self.is_scalar:
|
|
572
639
|
self._cache = self.feat_obj[:][self.basinmap]
|
|
@@ -583,8 +650,6 @@ class BasinProxyFeature(np.lib.mixins.NDArrayOperatorsMixin):
|
|
|
583
650
|
def __getattr__(self, item):
|
|
584
651
|
if item in [
|
|
585
652
|
"dtype",
|
|
586
|
-
"shape",
|
|
587
|
-
"size",
|
|
588
653
|
]:
|
|
589
654
|
return getattr(self.feat_obj, item)
|
|
590
655
|
else:
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"""RT-DC hdf5 format"""
|
|
2
2
|
from __future__ import annotations
|
|
3
3
|
|
|
4
|
+
import pathlib
|
|
4
5
|
import warnings
|
|
5
6
|
|
|
6
7
|
import numbers
|
|
@@ -17,7 +18,17 @@ class H5ContourEvent:
|
|
|
17
18
|
self._length = length
|
|
18
19
|
self.h5group = h5group
|
|
19
20
|
# for hashing in util.obj2bytes
|
|
20
|
-
|
|
21
|
+
# path within the HDF5 file
|
|
22
|
+
o_name = h5group["0"].name,
|
|
23
|
+
# filename
|
|
24
|
+
o_filename = h5group.file.filename
|
|
25
|
+
_data = [o_name, o_filename]
|
|
26
|
+
if pathlib.Path(o_filename).exists():
|
|
27
|
+
# when the file was changed
|
|
28
|
+
_data.append(pathlib.Path(h5group.file.filename).stat().st_mtime)
|
|
29
|
+
# size of the file
|
|
30
|
+
_data.append(pathlib.Path(h5group.file.filename).stat().st_size)
|
|
31
|
+
self.identifier = _data
|
|
21
32
|
|
|
22
33
|
def __getitem__(self, key):
|
|
23
34
|
if not isinstance(key, numbers.Integral):
|
|
@@ -168,6 +179,10 @@ class H5MaskEvent:
|
|
|
168
179
|
def shape(self):
|
|
169
180
|
return self.h5dataset.shape
|
|
170
181
|
|
|
182
|
+
@property
|
|
183
|
+
def size(self):
|
|
184
|
+
return np.prod(self.shape)
|
|
185
|
+
|
|
171
186
|
|
|
172
187
|
class H5ScalarEvent(np.lib.mixins.NDArrayOperatorsMixin):
|
|
173
188
|
def __init__(self, h5ds):
|
|
@@ -224,6 +239,10 @@ class H5ScalarEvent(np.lib.mixins.NDArrayOperatorsMixin):
|
|
|
224
239
|
def shape(self):
|
|
225
240
|
return self.h5ds.shape
|
|
226
241
|
|
|
242
|
+
@property
|
|
243
|
+
def size(self):
|
|
244
|
+
return len(self)
|
|
245
|
+
|
|
227
246
|
|
|
228
247
|
class H5TraceEvent:
|
|
229
248
|
def __init__(self, h5group):
|
|
@@ -29,7 +29,7 @@ class RTDC_Hierarchy(RTDCBase):
|
|
|
29
29
|
Children in hierarchies always update their data according to
|
|
30
30
|
the filtered event data from their parent when `apply_filter`
|
|
31
31
|
is called. This makes it easier to save and load hierarchy
|
|
32
|
-
children with e.g.
|
|
32
|
+
children with e.g. DCscope and it makes the handling of
|
|
33
33
|
hierarchies more intuitive (when the parent changes,
|
|
34
34
|
the child changes as well).
|
|
35
35
|
|
|
@@ -17,7 +17,7 @@ class TraceColumn(object):
|
|
|
17
17
|
|
|
18
18
|
The trace data is loaded when __getitem__, __len__, or __iter__
|
|
19
19
|
are called. This saves time and memory when the trace data is
|
|
20
|
-
not needed at all, e.g. for batch processing with
|
|
20
|
+
not needed at all, e.g. for batch processing with DCscope.
|
|
21
21
|
"""
|
|
22
22
|
self._trace = None
|
|
23
23
|
self.mname = rtdc_dataset.path
|
|
@@ -49,7 +49,7 @@ for kk in dclab2tdms:
|
|
|
49
49
|
tdms2dclab[dclab2tdms[kk]] = kk
|
|
50
50
|
|
|
51
51
|
# Add capitalized userdef features as well.
|
|
52
|
-
# see https://github.com/
|
|
52
|
+
# see https://github.com/DC-analysis/DCscope/issues/212
|
|
53
53
|
for _i in range(10):
|
|
54
54
|
tdms2dclab["UserDef{}".format(_i)] = "userdef{}".format(_i)
|
|
55
55
|
|
dclab/rtdc_dataset/writer.py
CHANGED
|
@@ -207,6 +207,7 @@ class RTDCWriter:
|
|
|
207
207
|
basin_descr: str | None = None,
|
|
208
208
|
basin_feats: List[str] = None,
|
|
209
209
|
basin_map: np.ndarray | Tuple[str, np.ndarray] = None,
|
|
210
|
+
basin_id: str = None,
|
|
210
211
|
internal_data: Dict | h5py.Group = None,
|
|
211
212
|
verify: bool = True,
|
|
212
213
|
perishable: bool = False,
|
|
@@ -243,6 +244,12 @@ class RTDCWriter:
|
|
|
243
244
|
a case, you may specify a tuple `(feature_name, mapping_array)`
|
|
244
245
|
where `feature_name` is the explicit mapping name, e.g.
|
|
245
246
|
`"basinmap3"`.
|
|
247
|
+
basin_id: str
|
|
248
|
+
Identifier of the basin. This is the string returned by
|
|
249
|
+
:meth:`.RTDCBase.get_measurement_identifier`. This is
|
|
250
|
+
a unique string that identifies the data within a basin.
|
|
251
|
+
If not specified and `verify=True`, this value is automatically
|
|
252
|
+
taken from the basin file.
|
|
246
253
|
internal_data: dict or instance of h5py.Group
|
|
247
254
|
A dictionary or an `h5py.Group` containing the basin data.
|
|
248
255
|
The data are copied to the "basin_events" group, if
|
|
@@ -310,19 +317,30 @@ class RTDCWriter:
|
|
|
310
317
|
# We have to import this here to avoid circular imports
|
|
311
318
|
from .load import new_dataset
|
|
312
319
|
# Make sure the basin can be opened by dclab, verify its ID
|
|
313
|
-
|
|
320
|
+
ref_id = self.h5file.attrs.get("experiment:run identifier")
|
|
314
321
|
for loc in basin_locs:
|
|
315
322
|
with new_dataset(loc) as ds:
|
|
316
323
|
# We can open the file, which is great.
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
324
|
+
# Compare the IDs.
|
|
325
|
+
bn_id = ds.get_measurement_identifier()
|
|
326
|
+
# Check whether `basin_id` matches the actual basin
|
|
327
|
+
if basin_id:
|
|
328
|
+
if basin_id != bn_id:
|
|
329
|
+
raise ValueError(
|
|
330
|
+
f"Measurement identifier mismatch for "
|
|
331
|
+
f"{loc}: got {bn_id}, expected {basin_id=})!")
|
|
332
|
+
else:
|
|
333
|
+
# If `basin_id` was not specified, set it here for
|
|
334
|
+
# user convenience.
|
|
335
|
+
basin_id = bn_id or None
|
|
336
|
+
# Check whether the referrer ID matches the basin ID.
|
|
337
|
+
if ref_id:
|
|
338
|
+
if not (bn_id == ref_id
|
|
321
339
|
or (basin_map is not None
|
|
322
|
-
and
|
|
340
|
+
and ref_id.startswith(bn_id))):
|
|
323
341
|
raise ValueError(
|
|
324
342
|
f"Measurement identifier mismatch between "
|
|
325
|
-
f"{self.path} ({
|
|
343
|
+
f"{self.path} ({ref_id}) and {loc} ({bn_id})!")
|
|
326
344
|
if basin_feats:
|
|
327
345
|
for feat in basin_feats:
|
|
328
346
|
if not dfn.feature_exists(feat):
|
|
@@ -389,6 +407,7 @@ class RTDCWriter:
|
|
|
389
407
|
"features": None if basin_feats is None else sorted(basin_feats),
|
|
390
408
|
"mapping": basin_map_name,
|
|
391
409
|
"perishable": perishable,
|
|
410
|
+
"identifier": basin_id,
|
|
392
411
|
}
|
|
393
412
|
if basin_type == "file":
|
|
394
413
|
flocs = []
|
dclab/warn.py
CHANGED
|
@@ -9,7 +9,7 @@ class PipelineWarning(UserWarning):
|
|
|
9
9
|
computation) in his analysis pipeline. All of these
|
|
10
10
|
warnings should be subclassed from PipelineWarning
|
|
11
11
|
to allow identifying them in higher-level software
|
|
12
|
-
such as
|
|
12
|
+
such as DCscope and to present them correctly to the
|
|
13
13
|
user.
|
|
14
14
|
"""
|
|
15
15
|
pass
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dclab
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.67.0
|
|
4
4
|
Summary: Library for real-time deformability cytometry (RT-DC)
|
|
5
5
|
Author: Benedikt Hartmann, Eoghan O'Connell, Maik Herbig, Maximilian Schlögel, Nadia Sbaa, Paul Müller, Philipp Rosendahl, Raghava Alajangi
|
|
6
6
|
Maintainer-email: Paul Müller <dev@craban.de>
|
|
@@ -46,7 +46,13 @@ Dynamic: license-file
|
|
|
46
46
|
|
|
47
47
|
This is a Python library for the post-measurement analysis of
|
|
48
48
|
real-time deformability cytometry (RT-DC) datasets; an essential part of
|
|
49
|
-
|
|
49
|
+
the DC Cosmos (
|
|
50
|
+
`DCscope <https://github.com/DC-analysis/DCscope>`__,
|
|
51
|
+
`DCOR <https://github.com/DCOR-dev/dcor_control>`__,
|
|
52
|
+
`DCOR-Aid <https://github.com/DCOR-dev/DCOR-Aid>`__,
|
|
53
|
+
`DCTag <https://github.com/DC-analysis/DCTag>`__,
|
|
54
|
+
`DCKit <https://github.com/DC-analysis/DCKit>`__,
|
|
55
|
+
).
|
|
50
56
|
|
|
51
57
|
Documentation
|
|
52
58
|
-------------
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
dclab/__init__.py,sha256=kSr6VI0UI-beS9beOEpERTUAV1NINHx_G6u1VmBm9D8,1624
|
|
2
|
-
dclab/_version.py,sha256=
|
|
2
|
+
dclab/_version.py,sha256=lCyG3P8iqvkx1I6kMK1xxqcyHbK7HEOQIwzkbrwlN0E,748
|
|
3
3
|
dclab/cached.py,sha256=t01BYTf43VEsBYa0c-bMxgceF5vKoGV73b42UlLH6Lo,3014
|
|
4
|
-
dclab/downsampling.cp310-win_amd64.pyd,sha256=
|
|
4
|
+
dclab/downsampling.cp310-win_amd64.pyd,sha256=pDqHxv66KrVwCuq91GKbCwxDdT12gRhaz-MuC2Hn3vw,174080
|
|
5
5
|
dclab/downsampling.pyx,sha256=Ez6MbNbzCUzs2IXXKtAYsjtYqP22kI8hdA1IE-3mqvY,7488
|
|
6
6
|
dclab/http_utils.py,sha256=aIW4ATmyk02AjQmoTm7mAWdsaQD1siEPLx47IlEcYls,11234
|
|
7
7
|
dclab/kde_contours.py,sha256=cYeBtvbBqLHCz5W8AiEAAd9O3yLsSBbLcRVj1WZ1pRo,288
|
|
@@ -9,7 +9,7 @@ dclab/kde_methods.py,sha256=tY82WQsX2_5_Szb7zma9yQD-HxCg2fAkMvNs-K05jMQ,376
|
|
|
9
9
|
dclab/polygon_filter.py,sha256=C4uBvK8zzT8irUOIgITvASlCtc0EEMM5edp4dFx-9jw,13878
|
|
10
10
|
dclab/statistics.py,sha256=nluuzl9h-RokxpsYLFLTAx6gnt6ArBhmQJffZbeIlac,7824
|
|
11
11
|
dclab/util.py,sha256=X9LqxrEJNClzPSko49MMsz2MlybLwkButqqQmxfnj44,6036
|
|
12
|
-
dclab/warn.py,sha256=
|
|
12
|
+
dclab/warn.py,sha256=u5s1hinbH87wOL6IbcOQy1NAWn8834FeyOn8bqidsTM,536
|
|
13
13
|
dclab/cli/__init__.py,sha256=IB33_cscv866CAwXnP1ZO9tlBpOldB0UQuR5P87FmSQ,493
|
|
14
14
|
dclab/cli/common.py,sha256=_YEmejfizH54aBI2q5solRMz8HN421rDkLj1dRXp7Tk,7461
|
|
15
15
|
dclab/cli/task_compress.py,sha256=d3ha6vEhz4g5BA3UPgm2jtWvPpEHDrVhlB7bB_dAOgc,4226
|
|
@@ -17,10 +17,10 @@ dclab/cli/task_condense.py,sha256=6gNjdkOQ2IdzYn4WGEOGMJVTNJICsQkiqX3ugyqxQgk,87
|
|
|
17
17
|
dclab/cli/task_join.py,sha256=glg7odwm7_1-hE1-2PrMfThpwhg2L_2quFSzzNSAJag,9693
|
|
18
18
|
dclab/cli/task_repack.py,sha256=FrWE73U1EmZlns4NTsW0Vx84xJoYu-fz-IPq5XsDCGg,3413
|
|
19
19
|
dclab/cli/task_split.py,sha256=amzoRWig8icmuSG8j4Jl_CC-ZCPMiFRUgVNuFF91Q5I,6214
|
|
20
|
-
dclab/cli/task_tdms2rtdc.py,sha256=
|
|
20
|
+
dclab/cli/task_tdms2rtdc.py,sha256=MStzHA9KnjnDeWPiPGVoRbyjurGCIDYyQkuZ4ooet-I,8467
|
|
21
21
|
dclab/cli/task_verify_dataset.py,sha256=OFy7aWHvA6NInndnMBg0MVZSBibvJeNHhc_C79_9PAk,2780
|
|
22
|
-
dclab/definitions/__init__.py,sha256=
|
|
23
|
-
dclab/definitions/feat_const.py,sha256=
|
|
22
|
+
dclab/definitions/__init__.py,sha256=oe-prINhfmT8HeIdOCpBGMdHhI6E_QIcFGi-EGd9MGE,2858
|
|
23
|
+
dclab/definitions/feat_const.py,sha256=6SpkCcQcPpZ0wPUB5SS6nnSMCeVeWJAnTsKSId5k57c,9834
|
|
24
24
|
dclab/definitions/feat_logic.py,sha256=ZZlf3-uze5qFvRtlTHJQZmE9mTF3L7TMyk8YTnCCRzw,5561
|
|
25
25
|
dclab/definitions/meta_const.py,sha256=X3U3orhlY_i78TYN4DUBJaOGBltNnXaRsQauH1LxuJ0,13377
|
|
26
26
|
dclab/definitions/meta_logic.py,sha256=no6fTCmKFrwpmirs_9358-Ysh5aZeib1xJrL_30WkqU,4305
|
|
@@ -35,14 +35,14 @@ dclab/external/packaging/version.py,sha256=NgEgv7me4UCvFMyiNYD-nc_28b9UHUvBVh8RD
|
|
|
35
35
|
dclab/external/skimage/LICENSE,sha256=Tdv08zzxYV32WRdYnco9P3nVyS5w17OTxIAFeRSd1wc,1480
|
|
36
36
|
dclab/external/skimage/__init__.py,sha256=icOIlThkyn_hxmnM_i7OpbU7fhvqYWNpGdNGD38qthU,74
|
|
37
37
|
dclab/external/skimage/_find_contours.py,sha256=auRMNfZg7B73DX7kPXxgD8gMXXB3Lk9QDWt4wlQnUWg,9556
|
|
38
|
-
dclab/external/skimage/_find_contours_cy.cp310-win_amd64.pyd,sha256=
|
|
38
|
+
dclab/external/skimage/_find_contours_cy.cp310-win_amd64.pyd,sha256=QfpK3mTCje4N3wEPYAI9uCgEyPengaZlh4JZmJRcdIQ,136704
|
|
39
39
|
dclab/external/skimage/_find_contours_cy.pyx,sha256=c-EobLhKjZNCpuqWxmvrcH35uAY_Bu-_hZiUHbXODms,7349
|
|
40
|
-
dclab/external/skimage/_pnpoly.cp310-win_amd64.pyd,sha256=
|
|
40
|
+
dclab/external/skimage/_pnpoly.cp310-win_amd64.pyd,sha256=72hdA3gQ3wLak057KaGUSafjXy8HkWBbiM6vGVei0Ag,150016
|
|
41
41
|
dclab/external/skimage/_pnpoly.pyx,sha256=eHV3DlIGcBhAQ12-Y58EYq8xcq0Sibyc4xTxzX9NJsk,2603
|
|
42
42
|
dclab/external/skimage/measure.py,sha256=rzyI0HCr9O9GJNieVW8pcqDjTGRAdSehDUawD8QkIAE,254
|
|
43
43
|
dclab/external/skimage/pnpoly.py,sha256=zB4rSxjHJyY1OsGZ7QfFQqxIEDLGK8CWPehwutoFqm4,1400
|
|
44
44
|
dclab/external/skimage/_shared/__init__.py,sha256=q29esTsNh0HfQxcd2EuwdYNbEBJwo_qY4dfv7RihzoA,38
|
|
45
|
-
dclab/external/skimage/_shared/geometry.cp310-win_amd64.pyd,sha256=
|
|
45
|
+
dclab/external/skimage/_shared/geometry.cp310-win_amd64.pyd,sha256=d_9zhzMpoHXQNIoymLdGH0R_vwPvS1wMfYsvgVITXWQ,19968
|
|
46
46
|
dclab/external/skimage/_shared/geometry.pxd,sha256=3gJ7fbXXsxJunSN4biE0dzEbZpX9ZqzR4cUDDN0JnAU,352
|
|
47
47
|
dclab/external/skimage/_shared/geometry.pyx,sha256=b6hADE8chse63haO1Kdt13_oQ54J9tkBf7dVA22-s-M,1722
|
|
48
48
|
dclab/external/statsmodels/LICENSE,sha256=8D7nwukc6YgsZCdN9mG0psM3I9j-z8fuUgFyVhnMXpU,1672
|
|
@@ -85,11 +85,11 @@ dclab/lme4/rsetup.py,sha256=_3ov0QlBH_CguoAanKmsm09JfgjfADhRimqMR16FnMk,6094
|
|
|
85
85
|
dclab/lme4/wrapr.py,sha256=tZYvUy5LUM7sM3d8NiOIlxbrtu89LAihG4hqI6MSv2Q,15403
|
|
86
86
|
dclab/rtdc_dataset/__init__.py,sha256=BuWKEUm7QUe-Kj1wMR0AXON_XN2mzXlbOgouHdnvAw4,501
|
|
87
87
|
dclab/rtdc_dataset/check.py,sha256=l2QoIL3gno_Z2-e8RvYHAurHZP_oLGtZk8l6jUDiuTA,35908
|
|
88
|
-
dclab/rtdc_dataset/config.py,sha256=
|
|
88
|
+
dclab/rtdc_dataset/config.py,sha256=Dxyw-EGvooUhn3FAK--nzJotBs0E70snuQ2VqDWd2gc,17963
|
|
89
89
|
dclab/rtdc_dataset/copier.py,sha256=imD0ijAz9BY0nksF2zUBeoGmeo_dUTUnBgY9TqRaD4g,14528
|
|
90
|
-
dclab/rtdc_dataset/core.py,sha256=
|
|
91
|
-
dclab/rtdc_dataset/export.py,sha256=
|
|
92
|
-
dclab/rtdc_dataset/feat_basin.py,sha256=
|
|
90
|
+
dclab/rtdc_dataset/core.py,sha256=nyv6CtHTJSyEeh3_4tB62iZo9xhm7GSb55gxx9OPPBg,35792
|
|
91
|
+
dclab/rtdc_dataset/export.py,sha256=QNcQiWlywCaZqp1vth8Pl9DXfBMwDF1Dn9GpeH8ZWU8,36078
|
|
92
|
+
dclab/rtdc_dataset/feat_basin.py,sha256=ovjqAbf_CL50-XcNu1eSJb4cehKNehUCr00G7W7nw5U,30127
|
|
93
93
|
dclab/rtdc_dataset/feat_temp.py,sha256=5QiF8Nc8MVoTtinYlvfoSuoopND-uvWVWKjMggBTHLw,3796
|
|
94
94
|
dclab/rtdc_dataset/filter.py,sha256=IRaEUt0tWtZGLKYvtqzfYO2kN5yhqx9eLoHd3VOLCTE,10286
|
|
95
95
|
dclab/rtdc_dataset/fmt_dict.py,sha256=-tlzOwsOCh4Vt3rSiBUvMKW7vBgrRNubU7ZHdGMB3gE,3112
|
|
@@ -97,7 +97,7 @@ dclab/rtdc_dataset/fmt_http.py,sha256=XzcgvJ4lm-eWbveBraBc5PPJeGWeUGC35p8ptnxByc
|
|
|
97
97
|
dclab/rtdc_dataset/fmt_s3.py,sha256=yOBrwN6Fwz0EVNolVlPvZggTeIeCHUYYBVb8w1izO3Y,12231
|
|
98
98
|
dclab/rtdc_dataset/load.py,sha256=odD0ZfIHBkBLgHIKv6z5PJ6yvTEfSawC3OKeRSjk_YU,2838
|
|
99
99
|
dclab/rtdc_dataset/meta_table.py,sha256=srz1mq-oS3OoL-qRScvWX98smNNVXLF99zpTO3GlvwI,673
|
|
100
|
-
dclab/rtdc_dataset/writer.py,sha256=
|
|
100
|
+
dclab/rtdc_dataset/writer.py,sha256=iO9LOUAt9Exndr9sgy9kszoc4f0CHpEXxhkJLGTLDsA,43864
|
|
101
101
|
dclab/rtdc_dataset/feat_anc_core/__init__.py,sha256=j7vtbQGJid3hchXryo19cxnwanepdDQ_RuJVf740mZs,488
|
|
102
102
|
dclab/rtdc_dataset/feat_anc_core/af_basic.py,sha256=7pM6Gn1ZkuttHNfkaLijPudddAu0jMDPGJS9HzKh8rE,2268
|
|
103
103
|
dclab/rtdc_dataset/feat_anc_core/af_emodulus.py,sha256=lsJpQ409EsxnMtyhO7igquWnJxIhXz_w9f8vtIq7F1M,6830
|
|
@@ -118,12 +118,12 @@ dclab/rtdc_dataset/fmt_dcor/tables.py,sha256=X3FOtM7V2VEIqnm2OaE3HnUoKHwzGWeSZPs
|
|
|
118
118
|
dclab/rtdc_dataset/fmt_hdf5/__init__.py,sha256=UnitCqiMkY8mMcUKgfLBRVBP5srpTNLrZd3BIRr2tZE,276
|
|
119
119
|
dclab/rtdc_dataset/fmt_hdf5/base.py,sha256=CAcYaN_6X10NK-R1IvlJj6y70lNyAVyT0OnGMs4VMB4,6583
|
|
120
120
|
dclab/rtdc_dataset/fmt_hdf5/basin.py,sha256=qbYgj0RKS9k6RTu5XmYEtgdcbqnVNokD3rAxogyrWrU,822
|
|
121
|
-
dclab/rtdc_dataset/fmt_hdf5/events.py,sha256=
|
|
121
|
+
dclab/rtdc_dataset/fmt_hdf5/events.py,sha256=Qr_ecgtpHNm4tXG6W5SiFmO_tbyL-itEgttZ8u3Zgdo,9058
|
|
122
122
|
dclab/rtdc_dataset/fmt_hdf5/feat_defect.py,sha256=w7dfs6pULUVJ8Ypz2VBYIKokKVhCn6as6fn3GL8Z7s0,6704
|
|
123
123
|
dclab/rtdc_dataset/fmt_hdf5/logs.py,sha256=c33YLC70h7RR4uw-RPc-vvTPTMZgSfd_0Nz9pAeA6d4,1037
|
|
124
124
|
dclab/rtdc_dataset/fmt_hdf5/tables.py,sha256=AK5PpB_UDO4ovJSAGsve2YfKBbMkhntRqjC47zVtDKM,1613
|
|
125
125
|
dclab/rtdc_dataset/fmt_hierarchy/__init__.py,sha256=NB8Tz6-AquG0rAiCeCSQGIzw_W1y7mNz4V4MI-yaEJ0,366
|
|
126
|
-
dclab/rtdc_dataset/fmt_hierarchy/base.py,sha256=
|
|
126
|
+
dclab/rtdc_dataset/fmt_hierarchy/base.py,sha256=WZmwHe7KBgUFzAzAIoHVMTrhxmHO2_Oe2Ih6kb8N-Hc,9716
|
|
127
127
|
dclab/rtdc_dataset/fmt_hierarchy/events.py,sha256=36aIw3wyOLi6uPGUO4gG6DhLzJHFiwXTh-2bJjSqMmI,4693
|
|
128
128
|
dclab/rtdc_dataset/fmt_hierarchy/hfilter.py,sha256=EQhA8grohdMYOdbzJdB4rGv7hjtnDkpXWG7REOopmB4,5992
|
|
129
129
|
dclab/rtdc_dataset/fmt_hierarchy/mapper.py,sha256=lTnHKtTOpljcdzDflucsFKW4SfxP62bl_VpAvIhRBts,4344
|
|
@@ -131,12 +131,12 @@ dclab/rtdc_dataset/fmt_tdms/__init__.py,sha256=2aQki_mZeiPl0yxmDhdpveXiUOFnzjlj-
|
|
|
131
131
|
dclab/rtdc_dataset/fmt_tdms/event_contour.py,sha256=zKmlOFXhLSYGl4uZlvZRLiv76Vf1jP4R1zUhfIaoJVg,9891
|
|
132
132
|
dclab/rtdc_dataset/fmt_tdms/event_image.py,sha256=z8SIjmuJ5UtoohcmQ94i1qNJBi8HNbtsTZBVd6Bsw_o,8226
|
|
133
133
|
dclab/rtdc_dataset/fmt_tdms/event_mask.py,sha256=cW-Tw2PIe6X1Hc4UZJ22-mI_qFaIMWA5x0sZ7Slb1rE,2237
|
|
134
|
-
dclab/rtdc_dataset/fmt_tdms/event_trace.py,sha256=
|
|
134
|
+
dclab/rtdc_dataset/fmt_tdms/event_trace.py,sha256=ilQ315tH_aP6xL9pR_p3ZNJkrXV2rpV_FJu9tdA6ekg,5359
|
|
135
135
|
dclab/rtdc_dataset/fmt_tdms/exc.py,sha256=FfxUY4LGIMPGJTYmGITmEm7X5iu8GBsj7OfZR8Zb-IE,850
|
|
136
|
-
dclab/rtdc_dataset/fmt_tdms/naming.py,sha256=
|
|
137
|
-
dclab-0.
|
|
138
|
-
dclab-0.
|
|
139
|
-
dclab-0.
|
|
140
|
-
dclab-0.
|
|
141
|
-
dclab-0.
|
|
142
|
-
dclab-0.
|
|
136
|
+
dclab/rtdc_dataset/fmt_tdms/naming.py,sha256=Gu36Bvsy3apJj6Du8DpVWTmxkqOshcsGNMLPVXUGk8w,5514
|
|
137
|
+
dclab-0.67.0.dist-info/licenses/LICENSE,sha256=Aq3cYb2xLk3Y_aIOhaoZxi8FlVeMVs3-3FMEBvAEixM,15643
|
|
138
|
+
dclab-0.67.0.dist-info/METADATA,sha256=IVsyfVFODL-Ohuo4wW6JvUs-acpUSDM1JAxYuD8-hi4,5131
|
|
139
|
+
dclab-0.67.0.dist-info/WHEEL,sha256=KUuBC6lxAbHCKilKua8R9W_TM71_-9Sg5uEP3uDWcoU,101
|
|
140
|
+
dclab-0.67.0.dist-info/entry_points.txt,sha256=eOpjgznu-eW-9utUpLU-77O5098YyUEgGF3ksGMdtec,273
|
|
141
|
+
dclab-0.67.0.dist-info/top_level.txt,sha256=irvwZMgs1edY1Zj60ZFk7Almb9Zhk4k6E6aC4YPFnnM,6
|
|
142
|
+
dclab-0.67.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|