dclab 0.62.16__cp312-cp312-win_amd64.whl → 0.63.0__cp312-cp312-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.

@@ -13,11 +13,11 @@ import h5py
13
13
  import hdf5plugin
14
14
 
15
15
  try:
16
- import imageio
16
+ import av
17
17
  except ModuleNotFoundError:
18
- IMAGEIO_AVAILABLE = False
18
+ PYAV_AVAILABLE = False
19
19
  else:
20
- IMAGEIO_AVAILABLE = True
20
+ PYAV_AVAILABLE = True
21
21
 
22
22
  try:
23
23
  import fcswrite
@@ -44,32 +44,51 @@ class Export(object):
44
44
  """Export functionalities for RT-DC datasets"""
45
45
  self.rtdc_ds = rtdc_ds
46
46
 
47
- def avi(self, path, filtered=True, override=False):
48
- """Exports filtered event images to an avi file
47
+ def avi(self,
48
+ path: str | pathlib.Path,
49
+ filtered: bool = True,
50
+ override: bool = False,
51
+ pixel_format: str = "yuv420p",
52
+ codec: str = "rawvideo",
53
+ codec_options: dict[str, str] = None,
54
+ progress_callback: callable = None,
55
+ ):
56
+ """Exports filtered event images to a video file
49
57
 
50
58
  Parameters
51
59
  ----------
52
60
  path: str
53
- Path to a .avi file. The ending .avi is added automatically.
61
+ Path to a video file. The container is (.avi, .mkv, ...) is
62
+ deduced from the file suffix.
54
63
  filtered: bool
55
64
  If set to `True`, only the filtered data
56
65
  (index in ds.filter.all) are used.
57
66
  override: bool
58
67
  If set to `True`, an existing file ``path`` will be overridden.
59
68
  If set to `False`, raises `OSError` if ``path`` exists.
69
+ pixel_format: str
70
+ Which pixel format to give to ffmpeg.
71
+ codec: str
72
+ Codec name; e.g. "rawvideo" or "libx264"
73
+ codec_options:
74
+ Additional arguments to give to the codec using ffmpeg,
75
+ e.g. `{'preset': 'slow', 'crf': '0'}` for "libx264" codec.
76
+ progress_callback: callable
77
+ Function that takes at least two arguments: float between 0 and
78
+ 1 for monitoring progress and a string describing what is being
79
+ done.
60
80
 
61
81
  Notes
62
82
  -----
63
83
  Raises OSError if current dataset does not contain image data
64
84
  """
65
- if not IMAGEIO_AVAILABLE:
85
+ if not PYAV_AVAILABLE:
66
86
  raise ModuleNotFoundError(
67
- "Package `imageio` required for avi export!")
87
+ "Package `av` required for avi export!")
68
88
  path = pathlib.Path(path)
89
+ if len(path.suffix) != 4:
90
+ path = path.with_suffix(".avi")
69
91
  ds = self.rtdc_ds
70
- # Make sure that path ends with .avi
71
- if path.suffix != ".avi":
72
- path = path.with_name(path.name + ".avi")
73
92
  # Check if file already exist
74
93
  if not override and path.exists():
75
94
  raise OSError("File already exists: {}\n".format(
@@ -78,29 +97,50 @@ class Export(object):
78
97
  # Start exporting
79
98
  if "image" in ds:
80
99
  # Open video for writing
81
- vout = imageio.get_writer(uri=path,
82
- format="FFMPEG",
83
- fps=25,
84
- codec="rawvideo",
85
- pixelformat="yuv420p",
86
- macro_block_size=None,
87
- ffmpeg_log_level="error")
88
- # write the filtered frames to avi file
89
- for evid in np.arange(len(ds)):
90
- # skip frames that were filtered out
91
- if filtered and not ds.filter.all[evid]:
92
- continue
93
- image = ds["image"][evid]
94
- # Convert image to RGB
95
- image = image.reshape(image.shape[0], image.shape[1], 1)
96
- image = np.repeat(image, 3, axis=2)
97
- vout.append_data(image)
100
+ with av.open(path, mode="w") as container:
101
+ stream = container.add_stream(codec_name=codec,
102
+ rate=25)
103
+ stream.pix_fmt = pixel_format
104
+ stream.height = ds["image"].shape[1]
105
+ stream.width = ds["image"].shape[2]
106
+ if codec_options:
107
+ stream.codec_context.options = codec_options
108
+
109
+ # write the filtered frames to the video file
110
+ for evid in np.arange(len(ds)):
111
+
112
+ if progress_callback is not None and evid % 10_000 == 0:
113
+ progress_callback(evid / len(ds), "exporting video")
114
+
115
+ # skip frames that were filtered out
116
+ if filtered and not ds.filter.all[evid]:
117
+ continue
118
+ image = ds["image"][evid]
119
+ # Convert to RGB
120
+ image = image.reshape(image.shape[0], image.shape[1], 1)
121
+ image = np.repeat(image, 3, axis=2)
122
+
123
+ av_frame = av.VideoFrame.from_ndarray(image,
124
+ format="rgb24")
125
+
126
+ for packet in stream.encode(av_frame):
127
+ container.mux(packet)
128
+
129
+ if progress_callback is not None:
130
+ progress_callback(1.0, "video export complete")
131
+
98
132
  else:
99
133
  msg = "No image data to export: dataset {} !".format(ds.title)
100
134
  raise OSError(msg)
101
135
 
102
- def fcs(self, path, features, meta_data=None, filtered=True,
103
- override=False):
136
+ def fcs(self,
137
+ path: pathlib.Path | str,
138
+ features: list[str],
139
+ meta_data: dict = None,
140
+ filtered: bool = True,
141
+ override: bool = False,
142
+ progress_callback: callable = None,
143
+ ):
104
144
  """Export the data of an RT-DC dataset to an .fcs file
105
145
 
106
146
  Parameters
@@ -121,6 +161,10 @@ class Export(object):
121
161
  override: bool
122
162
  If set to `True`, an existing file ``path`` will be overridden.
123
163
  If set to `False`, raises `OSError` if ``path`` exists.
164
+ progress_callback: callable
165
+ Function that takes at least two arguments: float between 0 and
166
+ 1 for monitoring progress and a string describing what is being
167
+ done.
124
168
 
125
169
  Notes
126
170
  -----
@@ -154,12 +198,18 @@ class Export(object):
154
198
  # Collect the header
155
199
  chn_names = [dfn.get_feature_label(c, rtdc_ds=ds) for c in features]
156
200
 
201
+ if progress_callback is not None:
202
+ progress_callback(0.0, "collecting data")
203
+
157
204
  # Collect the data
158
205
  if filtered:
159
206
  data = [ds[c][ds.filter.all] for c in features]
160
207
  else:
161
208
  data = [ds[c] for c in features]
162
209
 
210
+ if progress_callback is not None:
211
+ progress_callback(0.5, "exporting data")
212
+
163
213
  data = np.array(data).transpose()
164
214
  meta_data["dclab version"] = version
165
215
  fcswrite.write_fcs(filename=str(path),
@@ -168,6 +218,9 @@ class Export(object):
168
218
  text_kw_pr=meta_data,
169
219
  )
170
220
 
221
+ if progress_callback is not None:
222
+ progress_callback(1.0, "export complete")
223
+
171
224
  def hdf5(self,
172
225
  path: str | pathlib.Path,
173
226
  features: List[str] = None,
@@ -179,7 +232,9 @@ class Export(object):
179
232
  override: bool = False,
180
233
  compression_kwargs: Dict = None,
181
234
  compression: str = "deprecated",
182
- skip_checks: bool = False):
235
+ skip_checks: bool = False,
236
+ progress_callback: callable = None,
237
+ ):
183
238
  """Export the data of the current instance to an HDF5 file
184
239
 
185
240
  Parameters
@@ -223,7 +278,10 @@ class Export(object):
223
278
  Use `compression_kwargs` instead.
224
279
  skip_checks: bool
225
280
  Disable checking whether all features have the same length.
226
-
281
+ progress_callback: callable
282
+ Function that takes at least two arguments: float between 0 and
283
+ 1 for monitoring progress and a string describing what is being
284
+ done.
227
285
 
228
286
  .. versionchanged:: 0.58.0
229
287
 
@@ -314,6 +372,8 @@ class Export(object):
314
372
  with RTDCWriter(path,
315
373
  mode="append",
316
374
  compression_kwargs=compression_kwargs) as hw:
375
+ if progress_callback is not None:
376
+ progress_callback(0.0, "writing metadata")
317
377
  # write meta data
318
378
  hw.store_metadata(meta)
319
379
 
@@ -348,7 +408,10 @@ class Export(object):
348
408
  ds.tables[tab])
349
409
 
350
410
  # write each feature individually
351
- for feat in features:
411
+ for ii, feat in enumerate(features):
412
+ if progress_callback is not None:
413
+ progress_callback(ii / len(features), f"exporting {feat}")
414
+
352
415
  if (filter_arr is None or
353
416
  # This does not work for the .tdms file format
354
417
  # (and probably also not for DCOR).
@@ -372,6 +435,10 @@ class Export(object):
372
435
  filtarr=filter_arr)
373
436
 
374
437
  if basins:
438
+ if progress_callback:
439
+ progress_callback(1 - 1 / (len(features) or 1),
440
+ "writing basins")
441
+
375
442
  # We have to store basins. There are three options:
376
443
  # - filtering disabled: just copy basins
377
444
  # - filtering enabled
@@ -451,9 +518,17 @@ class Export(object):
451
518
 
452
519
  # Do not verify basins, it takes too long.
453
520
  hw.store_basin(**bn_dict, verify=False)
454
-
455
- def tsv(self, path, features, meta_data=None, filtered=True,
456
- override=False):
521
+ if progress_callback is not None:
522
+ progress_callback(1.0, "export complete")
523
+
524
+ def tsv(self,
525
+ path: pathlib.Path | str,
526
+ features: list[str],
527
+ meta_data: dict = None,
528
+ filtered: bool = True,
529
+ override: bool = False,
530
+ progress_callback: callable = None,
531
+ ):
457
532
  """Export the data of the current instance to a .tsv file
458
533
 
459
534
  Parameters
@@ -475,6 +550,10 @@ class Export(object):
475
550
  override: bool
476
551
  If set to `True`, an existing file ``path`` will be overridden.
477
552
  If set to `False`, raises `OSError` if ``path`` exists.
553
+ progress_callback: callable
554
+ Function that takes at least two arguments: float between 0 and
555
+ 1 for monitoring progress and a string describing what is being
556
+ done.
478
557
  """
479
558
  if meta_data is None:
480
559
  meta_data = {}
@@ -495,6 +574,10 @@ class Export(object):
495
574
  if c not in ds.features_scalar:
496
575
  raise ValueError("Invalid feature name {}".format(c))
497
576
  meta_data["dclab version"] = version
577
+
578
+ if progress_callback is not None:
579
+ progress_callback(0.0, "writing metadata")
580
+
498
581
  # Write BOM header
499
582
  with path.open("wb") as fd:
500
583
  fd.write(codecs.BOM_UTF8)
@@ -518,17 +601,26 @@ class Export(object):
518
601
  fd.write("# "+header2+"\n")
519
602
 
520
603
  with path.open("ab") as fd:
521
- # write data
604
+ if progress_callback is not None:
605
+ progress_callback(0.1, "collecting data")
606
+
607
+ # collect data
522
608
  if filtered:
523
609
  data = [ds[c][ds.filter.all] for c in features]
524
610
  else:
525
611
  data = [ds[c] for c in features]
526
612
 
613
+ if progress_callback is not None:
614
+ progress_callback(0.5, "writing data")
615
+
527
616
  np.savetxt(fd,
528
617
  np.array(data).transpose(),
529
618
  fmt=str("%.10e"),
530
619
  delimiter="\t")
531
620
 
621
+ if progress_callback is not None:
622
+ progress_callback(1.0, "export complete")
623
+
532
624
 
533
625
  def yield_filtered_array_stacks(data, indices):
534
626
  """Generator returning chunks with the filtered feature data
dclab/util.py CHANGED
@@ -1,6 +1,7 @@
1
1
  """Utility methods"""
2
2
  import functools
3
3
  import hashlib
4
+ import importlib
4
5
  import numbers
5
6
  import pathlib
6
7
  import warnings
@@ -60,6 +61,25 @@ class file_monitoring_lru_cache:
60
61
  return wrapper
61
62
 
62
63
 
64
+ class LazyLoader():
65
+ """Lazy load a module on first attribute access"""
66
+
67
+ def __init__(self, modname):
68
+ self._modname = modname
69
+ self._mod = None
70
+
71
+ def __getattr__(self, attr):
72
+ """Get attribute from module, load module if not loaded yet"""
73
+
74
+ if self._mod is None:
75
+ # module is unset, load it
76
+ self._mod = importlib.import_module(self._modname)
77
+
78
+ # retry getattr if module was just loaded for first time
79
+ # call this outside exception handler in case it raises new exception
80
+ return getattr(self._mod, attr)
81
+
82
+
63
83
  @file_monitoring_lru_cache(maxsize=100)
64
84
  def hashfile(fname, blocksize=65536, count=0, constructor=hashlib.md5,
65
85
  hasher_class=None):
@@ -1,10 +1,10 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dclab
3
- Version: 0.62.16
3
+ Version: 0.63.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>
7
- License: GPL version 2.0 or later
7
+ License: GPL-2.0-or-later
8
8
  Project-URL: source, https://github.com/DC-Analysis/dclab
9
9
  Project-URL: tracker, https://github.com/DC-Analysis/dclab/issues
10
10
  Project-URL: documentation, https://dclab.readthedocs.io/en/stable/
@@ -27,8 +27,8 @@ Requires-Dist: dclab[dcor,export,http,s3,tdms]; extra == "all"
27
27
  Provides-Extra: dcor
28
28
  Requires-Dist: requests<3,>=2.31.0; extra == "dcor"
29
29
  Provides-Extra: export
30
- Requires-Dist: fcswrite>=0.5.0; extra == "export"
31
- Requires-Dist: imageio[ffmpeg]; extra == "export"
30
+ Requires-Dist: fcswrite>=0.5.1; extra == "export"
31
+ Requires-Dist: av; extra == "export"
32
32
  Provides-Extra: http
33
33
  Requires-Dist: requests<3,>=2.31.0; extra == "http"
34
34
  Provides-Extra: s3
@@ -1,14 +1,14 @@
1
- dclab/__init__.py,sha256=7_y6YtYcoL_a5M6Q9PiwZPzHSxS66yCTgs_uuK5C1dg,835
2
- dclab/_version.py,sha256=V1PSOJkiHik4C_7xgfJIw-Tc3NWf3WXrKQTdE_Sl1Jo,536
1
+ dclab/__init__.py,sha256=kSr6VI0UI-beS9beOEpERTUAV1NINHx_G6u1VmBm9D8,1624
2
+ dclab/_version.py,sha256=fEfH5CgN0B2d7s9-sLi9m1eyhJDqpXxXrA_KEBY8D3Q,534
3
3
  dclab/cached.py,sha256=t01BYTf43VEsBYa0c-bMxgceF5vKoGV73b42UlLH6Lo,3014
4
- dclab/downsampling.cp312-win_amd64.pyd,sha256=vAzo0JTqWUpUohG0NUetjc4rA8h_hp4R8Og2qrZk-yw,186368
4
+ dclab/downsampling.cp312-win_amd64.pyd,sha256=1OYhb-GnzmziJsQMz7LF-xCMrxbKETqSDIWD4o6CzU0,186368
5
5
  dclab/downsampling.pyx,sha256=Ez6MbNbzCUzs2IXXKtAYsjtYqP22kI8hdA1IE-3mqvY,7488
6
6
  dclab/http_utils.py,sha256=nneq9Cx8dw8ChQx5oIg2pN0xGkvNWCMSY5VYmttqyXA,11232
7
- dclab/kde_contours.py,sha256=k0Y1UsJNtuYY8iqYmfQ-Nml-dFpJAcigd3vmt9U6zsY,6967
8
- dclab/kde_methods.py,sha256=_Fm91_cJZoTGQEgfuK5To4nEFcW7lolNsldY8a_AUoM,9509
7
+ dclab/kde_contours.py,sha256=cYeBtvbBqLHCz5W8AiEAAd9O3yLsSBbLcRVj1WZ1pRo,288
8
+ 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=6saNuiXCcYmI8_cmb8Tb7E34BbsxHzTvNNlbKeNoDIw,6558
11
- dclab/util.py,sha256=RG0p4dyO-G67r9-CeG6_GYuBkrxi1c6oGG1tQXAVG1Y,5409
11
+ dclab/util.py,sha256=X9LqxrEJNClzPSko49MMsz2MlybLwkButqqQmxfnj44,6036
12
12
  dclab/warn.py,sha256=pv_W9cKBJg-mUn-_6O4xBwRmwI9QaEIW9EBEIiyL0iU,538
13
13
  dclab/cli/__init__.py,sha256=IB33_cscv866CAwXnP1ZO9tlBpOldB0UQuR5P87FmSQ,493
14
14
  dclab/cli/common.py,sha256=_YEmejfizH54aBI2q5solRMz8HN421rDkLj1dRXp7Tk,7461
@@ -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.cp312-win_amd64.pyd,sha256=nj7EtFmC6g_aouBTnWDrI1kFV2L-eVqJLO56A16ID7c,146432
38
+ dclab/external/skimage/_find_contours_cy.cp312-win_amd64.pyd,sha256=URdLqBiR6io-Prndl_-YZ5gRHPw7e8uAU36_4S1nlBs,146432
39
39
  dclab/external/skimage/_find_contours_cy.pyx,sha256=c-EobLhKjZNCpuqWxmvrcH35uAY_Bu-_hZiUHbXODms,7349
40
- dclab/external/skimage/_pnpoly.cp312-win_amd64.pyd,sha256=b0PrZ1KQovLvTu0dSQK-VEVVH3Ul1-JqU2NPEPJ5Pag,160768
40
+ dclab/external/skimage/_pnpoly.cp312-win_amd64.pyd,sha256=ajdc5-lGkgjoyJ_r7yY-P1Xh9rC2g-eCcJ_8RPqmsNU,160768
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.cp312-win_amd64.pyd,sha256=CuVXJ8CrRy98ZuHRIN6twBDyNIn6ctLn--7ioKVPIg4,21504
45
+ dclab/external/skimage/_shared/geometry.cp312-win_amd64.pyd,sha256=KGCNZN0IGQSK1HBvjJj8CsmFDL8YGy1prdQT4NQ_eQo,21504
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
@@ -75,6 +75,10 @@ dclab/isoelastics/iso_HE-3D-FEM-22-volume-deform.txt,sha256=NlaE7yKz7N8yF65ri3H8
75
75
  dclab/isoelastics/iso_LE-2D-FEM-19-area_um-deform.txt,sha256=lcTjUUnIwj_bVBrG2T2OWBK1ApuLjxJkvL2KAuU51OM,79694
76
76
  dclab/isoelastics/iso_LE-2D-FEM-19-volume-deform.txt,sha256=vTcazOlOXo3BQ0NQtGB_IdHKA0neOLXZ_d3JuMU--RE,83358
77
77
  dclab/isoelastics/iso_LE-2D-ana-18-area_um-deform.txt,sha256=KD2RkhCfkrna20pLJ3UzNZZapMkhQydMYz0iKdMtRRE,46805
78
+ dclab/kde/__init__.py,sha256=A7GXfOI-6HNxD1ljkmnU9NjkFhoT2_WxlPmJa29PLm0,56
79
+ dclab/kde/base.py,sha256=DfOeLiBUohfj2AAPBDaTxYUQuh78X18HlMozZHihQUE,7921
80
+ dclab/kde/contours.py,sha256=vWx34Zxe9CuKd255Lje67pYEYZsLrCVPNopf_dHanL8,6964
81
+ dclab/kde/methods.py,sha256=o4JQIjv3rNb14El4Bkj-i9crk0sKxvp26i7ssqkZDZ8,9511
78
82
  dclab/lme4/__init__.py,sha256=85rlF3G9ZblRue7SB2DrMqSfVPVyE37ujr55Oy7OZaI,277
79
83
  dclab/lme4/lme4_template.R,sha256=9jRrdMVh9UlfzyE4BsktRTlFzeWI6AvbwzZXzNO5EfI,2664
80
84
  dclab/lme4/rsetup.py,sha256=_3ov0QlBH_CguoAanKmsm09JfgjfADhRimqMR16FnMk,6094
@@ -83,8 +87,8 @@ dclab/rtdc_dataset/__init__.py,sha256=BuWKEUm7QUe-Kj1wMR0AXON_XN2mzXlbOgouHdnvAw
83
87
  dclab/rtdc_dataset/check.py,sha256=l2QoIL3gno_Z2-e8RvYHAurHZP_oLGtZk8l6jUDiuTA,35908
84
88
  dclab/rtdc_dataset/config.py,sha256=HVJiqKlqd-SpYqnNTKSr1yUsq2Bkfq5s5zluT-8PUc0,17965
85
89
  dclab/rtdc_dataset/copier.py,sha256=imD0ijAz9BY0nksF2zUBeoGmeo_dUTUnBgY9TqRaD4g,14528
86
- dclab/rtdc_dataset/core.py,sha256=7pQOcFGEO2AnI7r8rJLjXkAi8mXkY4GCQ41eXfBHMx0,38999
87
- dclab/rtdc_dataset/export.py,sha256=gdcg8FSacFBdIfCPbquEOV7J96FlHAvWu9PpK2KTdkc,30351
90
+ dclab/rtdc_dataset/core.py,sha256=4ST8-Ta4-BxIcfMaAF2bhfWRSVaZrWh46JfhccZol1o,35326
91
+ dclab/rtdc_dataset/export.py,sha256=E-gyOiGWMAsl8D8d53nnggiiTAU6cFrrW3yM3ZcNK-A,33950
88
92
  dclab/rtdc_dataset/feat_basin.py,sha256=nDMMkjBmVrH26_lhSJ4pmgUfcwdV1wDON-Hu-864is8,21622
89
93
  dclab/rtdc_dataset/feat_temp.py,sha256=5QiF8Nc8MVoTtinYlvfoSuoopND-uvWVWKjMggBTHLw,3796
90
94
  dclab/rtdc_dataset/filter.py,sha256=IRaEUt0tWtZGLKYvtqzfYO2kN5yhqx9eLoHd3VOLCTE,10286
@@ -130,9 +134,9 @@ dclab/rtdc_dataset/fmt_tdms/event_mask.py,sha256=cW-Tw2PIe6X1Hc4UZJ22-mI_qFaIMWA
130
134
  dclab/rtdc_dataset/fmt_tdms/event_trace.py,sha256=ktWnXfMir1v5Wfeo7tOd0txSOe1bgsXotf9Ul5T5-B4,5361
131
135
  dclab/rtdc_dataset/fmt_tdms/exc.py,sha256=FfxUY4LGIMPGJTYmGITmEm7X5iu8GBsj7OfZR8Zb-IE,850
132
136
  dclab/rtdc_dataset/fmt_tdms/naming.py,sha256=SFeWiwIN7sg0qNe0Aya2bZshN1Zbw4YcOKunZ6kfIGM,5524
133
- dclab-0.62.16.dist-info/licenses/LICENSE,sha256=ayjnuJcdf_kpkDyD61tUcVqVAQaNSYXJ73m5HVB4G8s,18474
134
- dclab-0.62.16.dist-info/METADATA,sha256=tINRSqIq1QYsNqZQ39c8I_wjpAG_adwe6GEzQSZfAtE,4924
135
- dclab-0.62.16.dist-info/WHEEL,sha256=bD_lVjJPXnAmh08wyNd_NU-OTjIi9_WBp6WVHPsPU2g,101
136
- dclab-0.62.16.dist-info/entry_points.txt,sha256=eOpjgznu-eW-9utUpLU-77O5098YyUEgGF3ksGMdtec,273
137
- dclab-0.62.16.dist-info/top_level.txt,sha256=irvwZMgs1edY1Zj60ZFk7Almb9Zhk4k6E6aC4YPFnnM,6
138
- dclab-0.62.16.dist-info/RECORD,,
137
+ dclab-0.63.0.dist-info/licenses/LICENSE,sha256=Aq3cYb2xLk3Y_aIOhaoZxi8FlVeMVs3-3FMEBvAEixM,15643
138
+ dclab-0.63.0.dist-info/METADATA,sha256=4WwW4sVlOJ7YAtPu1uM4UW4QfTxDthscMJjrzpEXF8I,4902
139
+ dclab-0.63.0.dist-info/WHEEL,sha256=ovhA9_Ei_7ok2fAych90j-feDV4goiAxbO7REePtvw0,101
140
+ dclab-0.63.0.dist-info/entry_points.txt,sha256=eOpjgznu-eW-9utUpLU-77O5098YyUEgGF3ksGMdtec,273
141
+ dclab-0.63.0.dist-info/top_level.txt,sha256=irvwZMgs1edY1Zj60ZFk7Almb9Zhk4k6E6aC4YPFnnM,6
142
+ dclab-0.63.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (77.0.3)
2
+ Generator: setuptools (78.1.0)
3
3
  Root-Is-Purelib: false
4
4
  Tag: cp312-cp312-win_amd64
5
5
 
@@ -1,5 +1,5 @@
1
1
  Unless otherwise specified by LICENSE files in individual
2
- directories, all code is
2
+ directories, all code is licensed under the following license.
3
3
 
4
4
  GNU GENERAL PUBLIC LICENSE
5
5
  Version 2, June 1991
@@ -281,63 +281,3 @@ PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
281
281
  POSSIBILITY OF SUCH DAMAGES.
282
282
 
283
283
  END OF TERMS AND CONDITIONS
284
-
285
- How to Apply These Terms to Your New Programs
286
-
287
- If you develop a new program, and you want it to be of the greatest
288
- possible use to the public, the best way to achieve this is to make it
289
- free software which everyone can redistribute and change under these terms.
290
-
291
- To do so, attach the following notices to the program. It is safest
292
- to attach them to the start of each source file to most effectively
293
- convey the exclusion of warranty; and each file should have at least
294
- the "copyright" line and a pointer to where the full notice is found.
295
-
296
- {description}
297
- Copyright (C) {year} {fullname}
298
-
299
- This program is free software; you can redistribute it and/or modify
300
- it under the terms of the GNU General Public License as published by
301
- the Free Software Foundation; either version 2 of the License, or
302
- (at your option) any later version.
303
-
304
- This program is distributed in the hope that it will be useful,
305
- but WITHOUT ANY WARRANTY; without even the implied warranty of
306
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
307
- GNU General Public License for more details.
308
-
309
- You should have received a copy of the GNU General Public License along
310
- with this program; if not, write to the Free Software Foundation, Inc.,
311
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
312
-
313
- Also add information on how to contact you by electronic and paper mail.
314
-
315
- If the program is interactive, make it output a short notice like this
316
- when it starts in an interactive mode:
317
-
318
- Gnomovision version 69, Copyright (C) year name of author
319
- Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
320
- This is free software, and you are welcome to redistribute it
321
- under certain conditions; type `show c' for details.
322
-
323
- The hypothetical commands `show w' and `show c' should show the appropriate
324
- parts of the General Public License. Of course, the commands you use may
325
- be called something other than `show w' and `show c'; they could even be
326
- mouse-clicks or menu items--whatever suits your program.
327
-
328
- You should also get your employer (if you work as a programmer) or your
329
- school, if any, to sign a "copyright disclaimer" for the program, if
330
- necessary. Here is a sample; alter the names:
331
-
332
- Yoyodyne, Inc., hereby disclaims all copyright interest in the program
333
- `Gnomovision' (which makes passes at compilers) written by James Hacker.
334
-
335
- {signature of Ty Coon}, 1 April 1989
336
- Ty Coon, President of Vice
337
-
338
- This General Public License does not permit incorporating your program into
339
- proprietary programs. If your program is a subroutine library, you may
340
- consider it more useful to permit linking proprietary applications with the
341
- library. If this is what you want to do, use the GNU Lesser General
342
- Public License instead of this License.
343
-