dclab 0.65.0__cp313-cp313-macosx_11_0_arm64.whl → 0.67.0__cp313-cp313-macosx_11_0_arm64.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 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__ = ["__version__", "__version_tuple__", "version", "version_tuple"]
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.65.0'
21
- __version_tuple__ = version_tuple = (0, 65, 0)
31
+ __version__ = version = '0.67.0'
32
+ __version_tuple__ = version_tuple = (0, 67, 0)
33
+
34
+ __commit_id__ = commit_id = 'g52c420117'
@@ -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. Shape-Out. CAUTION: ancillary '
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 '
@@ -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 Shape-Out heavily relies on it (it shouldn't)
9
+ # because DCscope heavily relies on it (it shouldn't)
10
10
  scalar_feature_names
11
11
  )
12
12
  from .feat_logic import (
@@ -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 Shape-Out) to avoid ambiguities, and they should
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
@@ -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 Shape-Out), guess type
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
@@ -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
- "measurement_identifier": self.get_measurement_identifier(),
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
@@ -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:
@@ -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
- measurement_identifier: str = None,
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
- measurement_identifier: str
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.measurement_identifier = measurement_identifier
265
- self._measurement_identifier_verified = False
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 _assert_measurement_identifier(self):
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.measurement_identifier}!")
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._assert_measurement_identifier()
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 not self._measurement_identifier_verified:
459
- if self.measurement_identifier is None:
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._measurement_identifier_verified = True
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._measurement_identifier_verified = True
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._measurement_identifier_verified = verifier(
483
- self.measurement_identifier, basin_identifier)
502
+ self._identifiers_verification = verifier(
503
+ self.referrer_identifier, basin_identifier)
484
504
 
485
- check_rid = self._measurement_identifier_verified
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
- raise NotImplementedError("Feature 'contour' cannot be "
551
- "handled by BasinProxy.")
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
- self.identifier = (h5group.file.filename, h5group["0"].name)
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. Shape-Out and it makes the handling of
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 Shape-Out.
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/ZELLMECHANIK-DRESDEN/ShapeOut/issues/212
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
 
@@ -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
- cur_id = self.h5file.attrs.get("experiment:run identifier")
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
- if cur_id:
318
- # Compare the IDs.
319
- ds_id = ds.get_measurement_identifier()
320
- if not (ds_id == cur_id
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 cur_id.startswith(ds_id))):
340
+ and ref_id.startswith(bn_id))):
323
341
  raise ValueError(
324
342
  f"Measurement identifier mismatch between "
325
- f"{self.path} ({cur_id}) and {loc} ({ds_id})!")
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 Shape-Out and to present them correctly to the
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.65.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
- `Shape-Out <https://github.com/ZELLMECHANIK-DRESDEN/ShapeOut2>`__.
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,13 +1,13 @@
1
1
  dclab/kde_methods.py,sha256=f0-zDN7ETintvGB3gSzxwgBb53YtT9jZtzI70EAX50g,365
2
- dclab/_version.py,sha256=BT1Cb9U9MvH-WQX7Cjgfkn_LwsFhZPas-_Emage6tIU,513
2
+ dclab/_version.py,sha256=YrLn6YVZXLYQoooUIyEiuJXAqloz6_CdzCIn0buvzN8,714
3
3
  dclab/util.py,sha256=HFT5ZQV6AW8GIIruVMldukbVVdlMyKH50GUfOogAcxI,5860
4
4
  dclab/downsampling.pyx,sha256=OK7zbgGLl5gVyoU8ZBHo9EWwb8C9ChavmLNEvQvC9T0,7258
5
5
  dclab/__init__.py,sha256=wyJWhElQRPcq09vUqUnuquTU_KHgHxv6wQxuxQ988Iw,1583
6
- dclab/warn.py,sha256=MjJvyQeuvIXFQ2-fHDzbmXJ0scnHqqRJlIxfuLI_utE,523
6
+ dclab/warn.py,sha256=fy2fcZdA0YRMlVFIcOPNZJQOQLkvblJQ8pCfCx1phnw,521
7
7
  dclab/cached.py,sha256=eWTYBiI-HQM7JuPH-oxa5LLnhAX32GpRwlYg2kQ3sTA,2917
8
8
  dclab/http_utils.py,sha256=XHicbHQts5LY3zSNmYqNgAZpKTktotEiwQgJ8d2sBlk,10912
9
9
  dclab/polygon_filter.py,sha256=qexmo-rXe06CUPZhN6EMJy4y4B5gXZeqejdvIB2arOE,13480
10
- dclab/downsampling.cpython-313-darwin.so,sha256=8urjfT-XABnSjOAPCg4RiEHriNYU2a4dOpj2uBVphJQ,244064
10
+ dclab/downsampling.cpython-313-darwin.so,sha256=eqiiFrZvP3qN2Caz8VC2-M04sYEZJIW1LNytQhmeEwU,244032
11
11
  dclab/statistics.py,sha256=DWBG_Kj7cn89b_s5mqWYDCMGB881jHcCRFY-KAOBnhE,7598
12
12
  dclab/kde_contours.py,sha256=UlU64lrzMQUZH11oZndW7xf7NFCzwP3FcVujwuqXDCI,278
13
13
  dclab/isoelastics/iso_LE-2D-FEM-19-volume-deform.txt,sha256=vTcazOlOXo3BQ0NQtGB_IdHKA0neOLXZ_d3JuMU--RE,83358
@@ -38,7 +38,7 @@ dclab/lme4/lme4_template.R,sha256=CEXQIquvYCla9dCvRYgiBemI6fiVgAKnJTetJA2LAtk,25
38
38
  dclab/lme4/__init__.py,sha256=5WPFMTK-Yia3NJuwZEEBQ3fCyW3DiFgpZFrAwU33TV4,272
39
39
  dclab/lme4/rsetup.py,sha256=kH9VFtcK83ZaF9jvh1n5kcmGmPLLsmCPia_ElEHBLes,5890
40
40
  dclab/lme4/wrapr.py,sha256=rdIc2hS8GhgdU9WFA6pLzohJGlBga-mkm60qqqk6VO4,15017
41
- dclab/cli/task_tdms2rtdc.py,sha256=u0L1Fq9rXIeQG9b72SuUIh_qYC6fG2xXxht9_rcdCao,8283
41
+ dclab/cli/task_tdms2rtdc.py,sha256=5VBXEnTknaA-qlb9C-px6BTG3RzBg8vmY8iPIraGi8o,8281
42
42
  dclab/cli/__init__.py,sha256=84YzzV6aE_NY-o7wvqgvUoxBLvIOEXpSUbkVcGRyzQ0,483
43
43
  dclab/cli/task_condense.py,sha256=uNZzm04VuQOXJi6uXPmaLdQCk0g8ONueiO4p67yJv0k,8546
44
44
  dclab/cli/task_verify_dataset.py,sha256=aqBNCA5pjBL6r9wdEgzmSl5BWPIBEgPAmoQpeFw4Nts,2705
@@ -66,34 +66,34 @@ dclab/external/statsmodels/nonparametric/__init__.py,sha256=-GEWgwsF27ems5WTBvR1
66
66
  dclab/external/statsmodels/nonparametric/kernels.py,sha256=fuy4kStFz2ZA9pqgfUb4cly-YBpXLu4TJ9-ZujayuIw,1075
67
67
  dclab/external/skimage/measure.py,sha256=y1idCqD9TUxp3-QnOiWR_d674OKaeqBJ4MN2-gVP6ro,247
68
68
  dclab/external/skimage/LICENSE,sha256=ivsSBvn3c0R9mOctWRRdza7C7wdZSRYgCVxlVqUdlB8,1452
69
- dclab/external/skimage/_find_contours_cy.cpython-313-darwin.so,sha256=xn6VZBStT4V9j7eM5Rc0nyBSgfjj5QcbDknoBTrDUxI,188792
69
+ dclab/external/skimage/_find_contours_cy.cpython-313-darwin.so,sha256=FvghNS_yerWJ0cS0Yh7W0-n9FWQBGrYWt1EkytYd3b0,188760
70
70
  dclab/external/skimage/pnpoly.py,sha256=r8hFNiTz5XlUoNZjosqA0iyv1FPn0l7ewbplgFgkdaw,1347
71
71
  dclab/external/skimage/_find_contours.py,sha256=16v5eeTZBmevG8SSuXtJ6yUpVPhwfSmtc8pDD0nuuOU,9340
72
- dclab/external/skimage/_pnpoly.cpython-313-darwin.so,sha256=L2u9TUoP1aJl5wzKscAWtZcgBiswo3PbbU0mpLQMZzA,207200
72
+ dclab/external/skimage/_pnpoly.cpython-313-darwin.so,sha256=pSB_NxOsxgqeDiDwke48QtW_2oDQNpiEe2Nf8peIs7Q,207168
73
73
  dclab/external/skimage/__init__.py,sha256=-B2QUKHAFzQuBWuuKvPDC5JIl0Zb-x3OGmbwPaE9VwQ,72
74
74
  dclab/external/skimage/_pnpoly.pyx,sha256=Qdn6xPazDschBqbr46DzB75MB2MnqvdnoTSBMK7kUGE,2504
75
75
  dclab/external/skimage/_find_contours_cy.pyx,sha256=pZJOBhMHzYEMkcz4WQVyjn7jDNrdjCfet47FU1hRAxk,7161
76
76
  dclab/external/skimage/_shared/geometry.pxd,sha256=kRsu9ifv_rL3kbRIgSLf86p0hn2oTMp6s013lZ9bBZM,346
77
77
  dclab/external/skimage/_shared/__init__.py,sha256=2sHZwTtJSlMTa3Q2YSvQW7jrPLMUSqDJQa-ROe5zfcw,37
78
- dclab/external/skimage/_shared/geometry.cpython-313-darwin.so,sha256=dYh2cqGz4qLRMXHkaHYp1vZPr3ytezzCY0xiccRrOKM,55056
78
+ dclab/external/skimage/_shared/geometry.cpython-313-darwin.so,sha256=V1I19SkjOaL2yJR_xi97xvsUuQfSCaJawMlHwYNlqx0,55056
79
79
  dclab/external/skimage/_shared/geometry.pyx,sha256=miCHUh6mBDbRRIoaF_0xAER1MRzsCAzFdlYQZhV7RmE,1667
80
80
  dclab/definitions/feat_logic.py,sha256=_Rr2vK-nbRNjxk5Kf8Iohs_Q3jzUe9EZJgxB9vMwxwE,5379
81
81
  dclab/definitions/meta_parse.py,sha256=YdaTdM8DAMsIFn5ITH9OHYGTXeAOBGWtx22oVjxXcWk,2393
82
- dclab/definitions/__init__.py,sha256=56VL7rNTjP61gpGgN2GEUKicds2aBz_nWNwzfNxO_l8,2781
82
+ dclab/definitions/__init__.py,sha256=4OQhbMSfCdmibhMDmttjIlCdrQC9Y0Y_SJjOON8_iWU,2779
83
83
  dclab/definitions/meta_const.py,sha256=zqE-SrD2tJMCFWdtp_IenwnbIQg0lulvbQAw9dK0Gho,13125
84
- dclab/definitions/feat_const.py,sha256=3zii5bXN0d0lMtkiI8dR9ivNlNQYosZASAlOg1UKKPA,9634
84
+ dclab/definitions/feat_const.py,sha256=YRwR49jt3VVpMI5ctlxhgiTYqZR210_1HE_z6gwBKiY,9632
85
85
  dclab/definitions/meta_logic.py,sha256=wCgb7DPRHaR8DCWw_VbwNkpslUnazzWfgX0iS8oEe90,4194
86
- dclab/rtdc_dataset/config.py,sha256=MvBteFya3R6Ch3U6UgTakCsJoBgVykTxS_Z25STWPHU,17432
86
+ dclab/rtdc_dataset/config.py,sha256=lcJm13LYDyPqbH1E-TI8fM6B4_G8OkCEl0LXhQGuhf4,17430
87
87
  dclab/rtdc_dataset/check.py,sha256=lJNaz4QTe2WNlxik6zSohRHTiAYuP_bKOzSDjPGTUS0,35006
88
88
  dclab/rtdc_dataset/meta_table.py,sha256=ucqBNrgI6rDAuQFuMRckY8lp1LpnYAoRgEsLObWTJCE,648
89
- dclab/rtdc_dataset/feat_basin.py,sha256=iBGhuRkIy-zbonIjYHCQdLd3V3_cebpBfDTvqyLzJK4,26921
89
+ dclab/rtdc_dataset/feat_basin.py,sha256=e38J0Ty54xTBCuaelFuRLEzXdtklE_El5CFKjtI3ohc,29365
90
90
  dclab/rtdc_dataset/fmt_s3.py,sha256=bU3V_WGyqJhxPCH80X_nlNqq-jXcgoZKv_aUBIqwaL8,11877
91
91
  dclab/rtdc_dataset/feat_temp.py,sha256=XbDIS1iUUkRH0Zp9uVlwvK_untJ7hkOnKshK1Drsnt8,3694
92
92
  dclab/rtdc_dataset/__init__.py,sha256=MUHSGVQJ4Zc0IyU2lf01dpDWyOyNveHip-UjSkmPNvQ,486
93
- dclab/rtdc_dataset/core.py,sha256=LjddGHdqZINXKUQcvCyCDmOofdBzyJIXN_z_C-zWGnM,34777
94
- dclab/rtdc_dataset/export.py,sha256=SzQJpq9YfYfQFsIc3mnITwBwr2w7tYRMrvoPAzo3YPs,33427
93
+ dclab/rtdc_dataset/core.py,sha256=HNRia2qxlDwCK52ypJ9TsOTlTLqszOEvYtAoCH2od3w,34896
94
+ dclab/rtdc_dataset/export.py,sha256=B2GViMGOu3bkmocTe-O9_U7UYFaItoVO1iHgYJ48N-k,35211
95
95
  dclab/rtdc_dataset/fmt_dict.py,sha256=gumVQOiVVDFUKow_483PY7cxInqo-NiBBnBhIU8s4lg,3009
96
- dclab/rtdc_dataset/writer.py,sha256=BqP4QSzHxCSxp9z7_cJF2v04taO3ZXE3Wg6zJY6fMao,41819
96
+ dclab/rtdc_dataset/writer.py,sha256=MdqEFf4hpoBjjvNbp120BWCdaP1XjEyS3hxO2WNwApw,42845
97
97
  dclab/rtdc_dataset/filter.py,sha256=AFPUBzOIi3pqXgUdMQ5CIi9ZeGOKC71rfSZKLMLgtog,10023
98
98
  dclab/rtdc_dataset/fmt_http.py,sha256=vXVxRLXZp2_V1v3xk4lu4VUHYXfNHJdsRkVt3trC1RU,3374
99
99
  dclab/rtdc_dataset/load.py,sha256=5_xGw2P8Mjs0gW-vGr2Kn28j6Qv3BvvMvguMibC_mM4,2761
@@ -104,10 +104,10 @@ dclab/rtdc_dataset/fmt_hierarchy/events.py,sha256=pRqiFJpBoTwL2krG3asmLw4Fyp7O-v
104
104
  dclab/rtdc_dataset/fmt_hierarchy/mapper.py,sha256=dgGLO1ki2upV9QP6h7DCyNGgcMw45bzFbXc1CyyFAGw,4210
105
105
  dclab/rtdc_dataset/fmt_hierarchy/__init__.py,sha256=0e0lmGjeb9e7skZy1ksfEOFkwKLIu1N6MnuY1aUWkWA,355
106
106
  dclab/rtdc_dataset/fmt_hierarchy/hfilter.py,sha256=niYjYz6R-D2S2zurgmmIqrmsSFJ3tVgAS-UxweImAEU,5852
107
- dclab/rtdc_dataset/fmt_hierarchy/base.py,sha256=TaDFysJYhRMDDKwVpQn9qcpfmPZofHkvpu46TyHGht4,9440
107
+ dclab/rtdc_dataset/fmt_hierarchy/base.py,sha256=gIcUXaO4gfQ1m8KDkY3X2KN7KyjdVPV81ls1TtHZcwk,9438
108
108
  dclab/rtdc_dataset/fmt_hdf5/feat_defect.py,sha256=MeIxPz799x-sljbmSb0n40eVLw_iPnbCfOm07_lTBxo,6540
109
109
  dclab/rtdc_dataset/fmt_hdf5/basin.py,sha256=mJZR92Qoa71EwDVDYAP9KtOcjvRyjtA2wO1DkCBfBQc,792
110
- dclab/rtdc_dataset/fmt_hdf5/events.py,sha256=JUuPviS4lEXMjfNgJE-jkeArAwUVkdA1bmAszJGjPvc,8231
110
+ dclab/rtdc_dataset/fmt_hdf5/events.py,sha256=Us5xdKsmxOgTSDxFjnYSFIzm5kkDj6pTKPT9JcgI1cE,8782
111
111
  dclab/rtdc_dataset/fmt_hdf5/__init__.py,sha256=yWLYK-Fq0EYnp2eYfl1Ze02RBMOWg-iALJWs4dFSxxY,270
112
112
  dclab/rtdc_dataset/fmt_hdf5/logs.py,sha256=-mDewfv_aOeHaJykuJIWsqr9a7-moKhoGhqw9cR4ebg,1004
113
113
  dclab/rtdc_dataset/fmt_hdf5/tables.py,sha256=9Q-9N52BTtOT_9avGObpe71t6MpLAKQDhbJrcETJ4a8,1553
@@ -128,15 +128,15 @@ dclab/rtdc_dataset/fmt_dcor/logs.py,sha256=FHaDGjh4wMd18S2FFr6IVdd23l21S6s3fwZnF
128
128
  dclab/rtdc_dataset/fmt_dcor/tables.py,sha256=a4gMIjH0TgFdz36l_F-xriHTT4LMI64ur-atHyvAp80,1694
129
129
  dclab/rtdc_dataset/fmt_dcor/base.py,sha256=cFiZcWG43jOGTY3oNl-E_vdzbm5QZU1CEB7ucrLZP_U,11167
130
130
  dclab/rtdc_dataset/fmt_tdms/event_mask.py,sha256=eZiDHAGG3MCVckEMHsV-YBbL-pETVLomGk1gmpjc8-k,2175
131
- dclab/rtdc_dataset/fmt_tdms/naming.py,sha256=biI9l1EO6BuSYgwZG0deacj4i1fMHQcW78AKXEcm5Wc,5373
131
+ dclab/rtdc_dataset/fmt_tdms/naming.py,sha256=1t_NIHIJhvqkgbUUS27ta6mzId0t3lYhgB4Pz2NV2sU,5363
132
132
  dclab/rtdc_dataset/fmt_tdms/__init__.py,sha256=3Hc6ASVHEmZBW0pCdFiLZcBtNPcEjG6c7eddqeAZRK4,18923
133
133
  dclab/rtdc_dataset/fmt_tdms/event_image.py,sha256=-jp7Z-N91e4ieumYQ1huMicj7PMJqwIr5VsNWE_-EEk,8006
134
- dclab/rtdc_dataset/fmt_tdms/event_trace.py,sha256=Vkym0QKSw2mq1XZl5n8wDkgHXmaZwQGiMAV5AuRSJkE,5215
134
+ dclab/rtdc_dataset/fmt_tdms/event_trace.py,sha256=OdKOjW1cXURCWcb89PEcQKnkb0VqV0UA0m74maUu2GU,5213
135
135
  dclab/rtdc_dataset/fmt_tdms/exc.py,sha256=WzrMqnyrzp8gsT8Pf7JKqGGv43ewx7d_qgtirURppRI,813
136
136
  dclab/rtdc_dataset/fmt_tdms/event_contour.py,sha256=kjo0wJx9F0gmmOOyR0NoLw6VEtSl3h63WXXkcbfnoS8,9627
137
- dclab-0.65.0.dist-info/RECORD,,
138
- dclab-0.65.0.dist-info/WHEEL,sha256=oqGJCpG61FZJmvyZ3C_0aCv-2mdfcY9e3fXvyUNmWfM,136
139
- dclab-0.65.0.dist-info/entry_points.txt,sha256=eOpjgznu-eW-9utUpLU-77O5098YyUEgGF3ksGMdtec,273
140
- dclab-0.65.0.dist-info/top_level.txt,sha256=irvwZMgs1edY1Zj60ZFk7Almb9Zhk4k6E6aC4YPFnnM,6
141
- dclab-0.65.0.dist-info/METADATA,sha256=aDIGhFsgmVOULuMhp6vIRdd3uoJppcjW7tahpDRi-Dg,4766
142
- dclab-0.65.0.dist-info/licenses/LICENSE,sha256=gLDaVZWRrlnLdyfOrR0qfWjLbOVcjvoJ-kCLUK0fyXA,15360
137
+ dclab-0.67.0.dist-info/RECORD,,
138
+ dclab-0.67.0.dist-info/WHEEL,sha256=oqGJCpG61FZJmvyZ3C_0aCv-2mdfcY9e3fXvyUNmWfM,136
139
+ dclab-0.67.0.dist-info/entry_points.txt,sha256=eOpjgznu-eW-9utUpLU-77O5098YyUEgGF3ksGMdtec,273
140
+ dclab-0.67.0.dist-info/top_level.txt,sha256=irvwZMgs1edY1Zj60ZFk7Almb9Zhk4k6E6aC4YPFnnM,6
141
+ dclab-0.67.0.dist-info/METADATA,sha256=r6I9pE1qTWf1-zJgx95_itGLi9TcMI3vBpbGIcec8UI,4978
142
+ dclab-0.67.0.dist-info/licenses/LICENSE,sha256=gLDaVZWRrlnLdyfOrR0qfWjLbOVcjvoJ-kCLUK0fyXA,15360
File without changes