dcnum 0.20.0__tar.gz → 0.20.2__tar.gz
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 dcnum might be problematic. Click here for more details.
- {dcnum-0.20.0 → dcnum-0.20.2}/CHANGELOG +5 -0
- {dcnum-0.20.0/src/dcnum.egg-info → dcnum-0.20.2}/PKG-INFO +1 -1
- {dcnum-0.20.0 → dcnum-0.20.2}/src/dcnum/_version.py +2 -2
- {dcnum-0.20.0 → dcnum-0.20.2}/src/dcnum/feat/event_extractor_manager_thread.py +2 -2
- {dcnum-0.20.0 → dcnum-0.20.2}/src/dcnum/logic/ctrl.py +1 -2
- {dcnum-0.20.0 → dcnum-0.20.2}/src/dcnum/read/const.py +1 -1
- {dcnum-0.20.0 → dcnum-0.20.2}/src/dcnum/segm/segm_thresh.py +0 -12
- {dcnum-0.20.0 → dcnum-0.20.2/src/dcnum.egg-info}/PKG-INFO +1 -1
- {dcnum-0.20.0 → dcnum-0.20.2}/tests/test_logic_pipeline.py +39 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/tests/test_meta_ppid_segm.py +17 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/.github/workflows/check.yml +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/.github/workflows/deploy_pypi.yml +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/.gitignore +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/.readthedocs.yml +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/LICENSE +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/README.rst +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/docs/conf.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/docs/extensions/github_changelog.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/docs/index.rst +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/docs/requirements.txt +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/pyproject.toml +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/setup.cfg +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/src/dcnum/__init__.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/src/dcnum/feat/__init__.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/src/dcnum/feat/feat_background/__init__.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/src/dcnum/feat/feat_background/base.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/src/dcnum/feat/feat_background/bg_copy.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/src/dcnum/feat/feat_background/bg_roll_median.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/src/dcnum/feat/feat_background/bg_sparse_median.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/src/dcnum/feat/feat_brightness/__init__.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/src/dcnum/feat/feat_brightness/bright_all.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/src/dcnum/feat/feat_brightness/common.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/src/dcnum/feat/feat_contour/__init__.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/src/dcnum/feat/feat_contour/contour.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/src/dcnum/feat/feat_contour/moments.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/src/dcnum/feat/feat_contour/volume.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/src/dcnum/feat/feat_texture/__init__.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/src/dcnum/feat/feat_texture/common.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/src/dcnum/feat/feat_texture/tex_all.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/src/dcnum/feat/gate.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/src/dcnum/feat/queue_event_extractor.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/src/dcnum/logic/__init__.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/src/dcnum/logic/job.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/src/dcnum/logic/json_encoder.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/src/dcnum/meta/__init__.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/src/dcnum/meta/paths.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/src/dcnum/meta/ppid.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/src/dcnum/read/__init__.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/src/dcnum/read/cache.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/src/dcnum/read/hdf5_data.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/src/dcnum/read/mapped.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/src/dcnum/segm/__init__.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/src/dcnum/segm/segmenter.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/src/dcnum/segm/segmenter_cpu.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/src/dcnum/segm/segmenter_gpu.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/src/dcnum/segm/segmenter_manager_thread.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/src/dcnum/write/__init__.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/src/dcnum/write/deque_writer_thread.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/src/dcnum/write/queue_collector_thread.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/src/dcnum/write/writer.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/src/dcnum.egg-info/SOURCES.txt +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/src/dcnum.egg-info/dependency_links.txt +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/src/dcnum.egg-info/requires.txt +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/src/dcnum.egg-info/top_level.txt +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/tests/conftest.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/tests/data/fmt-hdf5_cytoshot_extended-moments-features.zip +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/tests/data/fmt-hdf5_cytoshot_full-features_2023.zip +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/tests/data/fmt-hdf5_cytoshot_full-features_2024.zip +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/tests/data/fmt-hdf5_cytoshot_full-features_legacy_allev_2023.zip +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/tests/data/fmt-hdf5_shapein_empty.zip +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/tests/data/fmt-hdf5_shapein_raw-with-variable-length-logs.zip +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/tests/helper_methods.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/tests/requirements.txt +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/tests/test_feat_background_base.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/tests/test_feat_background_bg_copy.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/tests/test_feat_background_bg_roll_median.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/tests/test_feat_background_bg_sparsemed.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/tests/test_feat_brightness.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/tests/test_feat_event_extractor_manager.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/tests/test_feat_gate.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/tests/test_feat_haralick.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/tests/test_feat_moments_based.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/tests/test_feat_moments_based_extended.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/tests/test_feat_volume.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/tests/test_init.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/tests/test_logic_job.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/tests/test_logic_join.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/tests/test_logic_json.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/tests/test_meta_paths.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/tests/test_meta_ppid_base.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/tests/test_meta_ppid_bg.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/tests/test_meta_ppid_data.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/tests/test_meta_ppid_feat.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/tests/test_meta_ppid_gate.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/tests/test_read_basin.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/tests/test_read_concat_hdf5.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/tests/test_read_hdf5.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/tests/test_read_hdf5_basins.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/tests/test_read_hdf5_index_mapping.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/tests/test_segm_base.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/tests/test_segm_no_mask_proc.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/tests/test_segm_thresh.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/tests/test_write_deque_writer_thread.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/tests/test_write_queue_collector_thread.py +0 -0
- {dcnum-0.20.0 → dcnum-0.20.2}/tests/test_write_writer.py +0 -0
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
0.20.2
|
|
2
|
+
- ref: remove __init__ from SegmentThresh
|
|
3
|
+
0.20.1
|
|
4
|
+
- fix: relative basin locations not written correctly
|
|
5
|
+
- enh: increase deque size threshold for waiting for writer
|
|
1
6
|
0.20.0
|
|
2
7
|
- feat: support reading mapped basins
|
|
3
8
|
- feat: support writing mapped-basin-based output files
|
|
@@ -96,8 +96,8 @@ class EventExtractorManagerThread(threading.Thread):
|
|
|
96
96
|
# If the writer_dq starts filling up, then this could lead to
|
|
97
97
|
# an oom-kill signal. Stall for the writer to prevent this.
|
|
98
98
|
ldq = len(self.writer_dq)
|
|
99
|
-
if ldq >
|
|
100
|
-
stallsec = ldq /
|
|
99
|
+
if ldq > 1000:
|
|
100
|
+
stallsec = ldq / 1000
|
|
101
101
|
self.logger.warning(
|
|
102
102
|
f"Stalling {stallsec:.1f}s for slow writer")
|
|
103
103
|
time.sleep(stallsec)
|
|
@@ -613,7 +613,7 @@ class DCNumJobRunner(threading.Thread):
|
|
|
613
613
|
self.logger.debug(f"Creating basin for {feats}")
|
|
614
614
|
# Relative and absolute paths.
|
|
615
615
|
pin = pathlib.Path(hin.filename).resolve()
|
|
616
|
-
pout = pathlib.Path(hout.filename).resolve()
|
|
616
|
+
pout = pathlib.Path(hout.filename).resolve().parent
|
|
617
617
|
paths = [pin, os.path.relpath(pin, pout)]
|
|
618
618
|
hw.store_basin(name="dcnum basin",
|
|
619
619
|
features=feats,
|
|
@@ -666,7 +666,6 @@ class DCNumJobRunner(threading.Thread):
|
|
|
666
666
|
num_extractors = max(1, num_extractors)
|
|
667
667
|
num_segmenters = max(1, num_segmenters)
|
|
668
668
|
self.job.kwargs["segmenter_kwargs"]["num_workers"] = num_segmenters
|
|
669
|
-
|
|
670
669
|
slot_chunks = mp_spawn.Array("i", num_slots)
|
|
671
670
|
slot_states = mp_spawn.Array("u", num_slots)
|
|
672
671
|
|
|
@@ -10,18 +10,6 @@ class SegmentThresh(CPUSegmenter):
|
|
|
10
10
|
}
|
|
11
11
|
requires_background_correction = True
|
|
12
12
|
|
|
13
|
-
def __init__(self, thresh=-6, *args, **kwargs):
|
|
14
|
-
"""Simple image thresholding segmentation
|
|
15
|
-
|
|
16
|
-
Parameters
|
|
17
|
-
----------
|
|
18
|
-
thresh: int
|
|
19
|
-
grayscale threshold value for creating the mask image;
|
|
20
|
-
For a background-corrected image, pixels with values below
|
|
21
|
-
this value are considered to be part of the mask.
|
|
22
|
-
"""
|
|
23
|
-
super(SegmentThresh, self).__init__(thresh=thresh, *args, **kwargs)
|
|
24
|
-
|
|
25
13
|
@staticmethod
|
|
26
14
|
def segment_approach(image, *,
|
|
27
15
|
thresh: float = -6):
|
|
@@ -88,6 +88,45 @@ def test_basin_strategy_tap():
|
|
|
88
88
|
assert "image" in hd
|
|
89
89
|
|
|
90
90
|
|
|
91
|
+
def test_basin_relative_path():
|
|
92
|
+
path_orig = retrieve_data("fmt-hdf5_cytoshot_full-features_2023.zip")
|
|
93
|
+
path = path_orig.with_name("input.rtdc")
|
|
94
|
+
path_out = path_orig.with_name("out.rtdc")
|
|
95
|
+
with read.concatenated_hdf5_data(5 * [path_orig], path_out=path):
|
|
96
|
+
pass
|
|
97
|
+
|
|
98
|
+
job = logic.DCNumPipelineJob(path_in=path,
|
|
99
|
+
path_out=path_out,
|
|
100
|
+
background_kwargs={"kernel_size": 150},
|
|
101
|
+
basin_strategy="tap",
|
|
102
|
+
debug=True)
|
|
103
|
+
with logic.DCNumJobRunner(job=job) as runner:
|
|
104
|
+
runner.run()
|
|
105
|
+
|
|
106
|
+
dir_new = path_orig.parent / "another_directory"
|
|
107
|
+
dir_new.mkdir()
|
|
108
|
+
path_new = dir_new / path.name
|
|
109
|
+
path_out_new = dir_new / path_out.name
|
|
110
|
+
path.rename(path_new)
|
|
111
|
+
path_out.rename(path_out_new)
|
|
112
|
+
|
|
113
|
+
# Everything should just work, because we have relative paths in the basin.
|
|
114
|
+
with h5py.File(path_out_new) as h5:
|
|
115
|
+
assert h5.attrs["pipeline:dcnum background"] \
|
|
116
|
+
== "sparsemed:k=150^s=1^t=0^f=0.8^o=1"
|
|
117
|
+
assert "image_bg" in h5["events"]
|
|
118
|
+
assert "bg_off" in h5["events"]
|
|
119
|
+
assert "deform" in h5["events"]
|
|
120
|
+
# the rest of the original features are basins!
|
|
121
|
+
assert "time" not in h5["events"]
|
|
122
|
+
assert "image" not in h5["events"]
|
|
123
|
+
for feat in h5["events"]:
|
|
124
|
+
assert len(h5["events"][feat]) == 275
|
|
125
|
+
# The other features are accessed via basins
|
|
126
|
+
hd = read.HDF5Data(h5)
|
|
127
|
+
assert "image" in hd
|
|
128
|
+
|
|
129
|
+
|
|
91
130
|
def test_chained_pipeline():
|
|
92
131
|
"""Test running two pipelines consecutively"""
|
|
93
132
|
path_orig = retrieve_data("fmt-hdf5_cytoshot_full-features_2023.zip")
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
from dcnum.meta import ppid
|
|
1
2
|
from dcnum import segm
|
|
2
3
|
|
|
3
4
|
import pytest
|
|
@@ -26,6 +27,22 @@ def test_ppid_decoding_thresh_check_kwargs():
|
|
|
26
27
|
assert kwargs["kwargs_mask"]["closing_disk"] == 3
|
|
27
28
|
|
|
28
29
|
|
|
30
|
+
def test_ppid_kwargs_to_ppid():
|
|
31
|
+
"""Make sure that subclasses correctly implement __init__ (if they do)"""
|
|
32
|
+
segm_dict = segm.get_available_segmenters()
|
|
33
|
+
for segm_key in segm_dict:
|
|
34
|
+
segm_cls = segm_dict[segm_key]
|
|
35
|
+
inst = segm_cls()
|
|
36
|
+
kwargs = inst.kwargs
|
|
37
|
+
kwargs["num_workers"] = 2
|
|
38
|
+
ppid.kwargs_to_ppid(
|
|
39
|
+
cls=segm_cls,
|
|
40
|
+
method="segment_approach",
|
|
41
|
+
kwargs=kwargs,
|
|
42
|
+
allow_invalid_keys=False,
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
|
|
29
46
|
@pytest.mark.parametrize("segm_code", segm.get_available_segmenters().keys())
|
|
30
47
|
def test_ppid_required_method_definitions(segm_code):
|
|
31
48
|
segm_class = segm.get_available_segmenters()[segm_code]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dcnum-0.20.0 → dcnum-0.20.2}/tests/data/fmt-hdf5_cytoshot_full-features_legacy_allev_2023.zip
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|