Skip to content

Commit 3e68ab4

Browse files
rschwanholdnormanrz
authored andcommitted
Fix downsampling bug if non-default file_len is used (#141)
* fix downsampling bug if non-default file-len is used * reformat code * add default parameter * format logging correctly if no explicit buffer_edge_len is specified * log buffer_edge_length instead of cube_edge_length * changeing default value of buffer_cube_size
1 parent 8ff4fbf commit 3e68ab4

File tree

4 files changed

+56
-47
lines changed

4 files changed

+56
-47
lines changed

tests/test_downsampling.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,8 @@ def downsample_test_helper(use_compress):
100100
target_info,
101101
(2, 2, 2),
102102
InterpolationModes.MAX,
103-
CUBE_EDGE_LEN,
104103
offset,
104+
CUBE_EDGE_LEN,
105105
use_compress,
106106
)
107107
downsample_cube_job(downsample_args)
@@ -161,8 +161,8 @@ def test_downsample_multi_channel():
161161
target_info,
162162
(2, 2, 2),
163163
InterpolationModes.MAX,
164-
CUBE_EDGE_LEN,
165164
tuple(a * WKW_CUBE_SIZE for a in offset),
165+
CUBE_EDGE_LEN,
166166
False,
167167
)
168168
downsample_cube_job(downsample_args)

wkcuber/__main__.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,8 @@ def main(args):
6868
Mag(args.max_mag),
6969
scale,
7070
"default",
71-
DEFAULT_EDGE_LEN,
7271
not args.no_compress,
73-
args,
72+
args=args,
7473
)
7574

7675
else:
@@ -80,9 +79,8 @@ def main(args):
8079
Mag(1),
8180
Mag(args.max_mag),
8281
"default",
83-
DEFAULT_EDGE_LEN,
8482
not args.no_compress,
85-
args,
83+
args=args,
8684
)
8785

8886
refresh_metadata(args.target_path)

wkcuber/downsampling.py

Lines changed: 50 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@ def parse_cube_file_name(filename):
3434
return (int(m.group(3)), int(m.group(2)), int(m.group(1)))
3535

3636

37+
def determine_buffer_edge_len(dataset):
38+
return min(DEFAULT_EDGE_LEN, dataset.header.file_len * dataset.header.block_len)
39+
40+
3741
class InterpolationModes(Enum):
3842
MEDIAN = 0
3943
MODE = 1
@@ -92,7 +96,7 @@ def create_parser():
9296
"-b",
9397
help="Size of buffered cube to be downsampled (i.e. buffer cube edge length)",
9498
type=int,
95-
default=DEFAULT_EDGE_LEN,
99+
default=None,
96100
)
97101

98102
parser.add_argument(
@@ -124,8 +128,8 @@ def downsample(
124128
source_mag: Mag,
125129
target_mag: Mag,
126130
interpolation_mode,
127-
cube_edge_len,
128131
compress,
132+
buffer_edge_len=None,
129133
args=None,
130134
):
131135

@@ -145,30 +149,36 @@ def downsample(
145149
)
146150
)
147151
target_cube_addresses.sort()
148-
logging.debug(
149-
"Found source cubes: count={} size={} min={} max={}".format(
150-
len(source_cube_addresses),
151-
(cube_edge_len,) * 3,
152-
min(source_cube_addresses),
153-
max(source_cube_addresses),
152+
with open_wkw(source_wkw_info) as source_wkw:
153+
if buffer_edge_len is None:
154+
buffer_edge_len = determine_buffer_edge_len(source_wkw)
155+
logging.debug(
156+
"Found source cubes: count={} size={} min={} max={}".format(
157+
len(source_cube_addresses),
158+
(buffer_edge_len,) * 3,
159+
min(source_cube_addresses),
160+
max(source_cube_addresses),
161+
)
154162
)
155-
)
156-
logging.debug(
157-
"Found target cubes: count={} size={} min={} max={}".format(
158-
len(target_cube_addresses),
159-
(cube_edge_len,) * 3,
160-
min(target_cube_addresses),
161-
max(target_cube_addresses),
163+
logging.debug(
164+
"Found target cubes: count={} size={} min={} max={}".format(
165+
len(target_cube_addresses),
166+
(buffer_edge_len,) * 3,
167+
min(target_cube_addresses),
168+
max(target_cube_addresses),
169+
)
162170
)
163-
)
164171

165172
with open_wkw(source_wkw_info) as source_wkw:
166173
num_channels = source_wkw.header.num_channels
167174
header_block_type = (
168175
wkw.Header.BLOCK_TYPE_LZ4HC if compress else wkw.Header.BLOCK_TYPE_RAW
169176
)
170177
ensure_wkw(
171-
target_wkw_info, block_type=header_block_type, num_channels=num_channels
178+
target_wkw_info,
179+
block_type=header_block_type,
180+
num_channels=num_channels,
181+
file_len=source_wkw.header.file_len,
172182
)
173183

174184
with get_executor_for_args(args) as executor:
@@ -180,8 +190,8 @@ def downsample(
180190
target_wkw_info,
181191
mag_factors,
182192
interpolation_mode,
183-
cube_edge_len,
184193
target_cube_xyz,
194+
buffer_edge_len,
185195
compress,
186196
)
187197
)
@@ -196,10 +206,11 @@ def downsample_cube_job(args):
196206
target_wkw_info,
197207
mag_factors,
198208
interpolation_mode,
199-
cube_edge_len,
200209
target_cube_xyz,
210+
buffer_edge_len,
201211
compress,
202212
) = args
213+
203214
logging.info("Downsampling of {}".format(target_cube_xyz))
204215

205216
try:
@@ -212,17 +223,21 @@ def downsample_cube_job(args):
212223
num_channels = source_wkw.header.num_channels
213224
source_dtype = source_wkw.header.voxel_type
214225
with open_wkw(
215-
target_wkw_info, block_type=header_block_type, num_channels=num_channels
226+
target_wkw_info,
227+
block_type=header_block_type,
228+
num_channels=num_channels,
229+
file_len=source_wkw.header.file_len,
216230
) as target_wkw:
217231
wkw_cubelength = (
218232
source_wkw.header.file_len * source_wkw.header.block_len
219233
)
220234
shape = (num_channels,) + (wkw_cubelength,) * 3
221235
file_buffer = np.zeros(shape, source_dtype)
222-
tile_length = cube_edge_len
236+
tile_length = buffer_edge_len
223237
tile_count_per_dim = wkw_cubelength // tile_length
238+
224239
assert (
225-
wkw_cubelength % cube_edge_len == 0
240+
wkw_cubelength % buffer_edge_len == 0
226241
), "buffer_cube_size must be a divisor of wkw cube length"
227242

228243
tile_indices = list(range(0, tile_count_per_dim))
@@ -441,8 +456,8 @@ def downsample_mag(
441456
source_mag: Mag,
442457
target_mag: Mag,
443458
interpolation_mode="default",
444-
cube_edge_len=DEFAULT_EDGE_LEN,
445459
compress=False,
460+
buffer_edge_len=None,
446461
args=None,
447462
):
448463
interpolation_mode = parse_interpolation_mode(interpolation_mode, layer_name)
@@ -452,14 +467,15 @@ def downsample_mag(
452467
target_wkw_info = WkwDatasetInfo(
453468
path, layer_name, source.header.voxel_type, target_mag.to_layer_name()
454469
)
470+
455471
downsample(
456472
source_wkw_info,
457473
target_wkw_info,
458474
source_mag,
459475
target_mag,
460476
interpolation_mode,
461-
cube_edge_len,
462477
compress,
478+
buffer_edge_len,
463479
args,
464480
)
465481

@@ -481,7 +497,7 @@ def downsample_mags(
481497
from_mag: Mag = None,
482498
max_mag: Mag = Mag(32),
483499
interpolation_mode: str = "default",
484-
cube_edge_len: int = DEFAULT_EDGE_LEN,
500+
buffer_edge_len: int = None,
485501
compress: bool = True,
486502
args=None,
487503
anisotropic: bool = True,
@@ -519,8 +535,8 @@ def downsample_mags(
519535
max_mag,
520536
scale,
521537
interpolation_mode,
522-
cube_edge_len,
523538
compress,
539+
buffer_edge_len,
524540
args,
525541
)
526542
else:
@@ -530,8 +546,8 @@ def downsample_mags(
530546
from_mag,
531547
max_mag,
532548
interpolation_mode,
533-
cube_edge_len,
534549
compress,
550+
buffer_edge_len,
535551
args,
536552
)
537553

@@ -542,8 +558,8 @@ def downsample_mags_isotropic(
542558
from_mag: Mag,
543559
max_mag: Mag,
544560
interpolation_mode,
545-
cube_edge_len,
546561
compress,
562+
buffer_edge_len=None,
547563
args=None,
548564
):
549565

@@ -556,8 +572,8 @@ def downsample_mags_isotropic(
556572
source_mag,
557573
target_mag,
558574
interpolation_mode,
559-
cube_edge_len,
560575
compress,
576+
buffer_edge_len,
561577
args,
562578
)
563579
target_mag.scale_by(2)
@@ -570,8 +586,8 @@ def downsample_mags_anisotropic(
570586
max_mag: Mag,
571587
scale,
572588
interpolation_mode,
573-
cube_edge_len,
574589
compress,
590+
buffer_edge_len=None,
575591
args=None,
576592
):
577593

@@ -585,8 +601,8 @@ def downsample_mags_anisotropic(
585601
source_mag,
586602
target_mag,
587603
interpolation_mode,
588-
cube_edge_len,
589604
compress,
605+
buffer_edge_len,
590606
args,
591607
)
592608
prev_mag = target_mag
@@ -635,8 +651,8 @@ def detect_larger_and_smaller_dimension(scale):
635651
from_mag,
636652
anisotropic_target_mag,
637653
args.interpolation_mode,
638-
args.buffer_cube_size,
639654
not args.no_compress,
655+
args.buffer_cube_size,
640656
args,
641657
)
642658
elif not args.isotropic:
@@ -657,9 +673,8 @@ def detect_larger_and_smaller_dimension(scale):
657673
max_mag,
658674
scale,
659675
args.interpolation_mode,
660-
DEFAULT_EDGE_LEN,
661676
not args.no_compress,
662-
args,
677+
args=args,
663678
)
664679
else:
665680
downsample_mags_isotropic(
@@ -668,8 +683,8 @@ def detect_larger_and_smaller_dimension(scale):
668683
from_mag,
669684
max_mag,
670685
args.interpolation_mode,
671-
args.buffer_cube_size,
672686
not args.no_compress,
687+
args.buffer_cube_size,
673688
args,
674689
)
675690

wkcuber/utils.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,8 @@ def open_wkw(info, **kwargs):
3737
if hasattr(info, "dtype"):
3838
header = wkw.Header(np.dtype(info.dtype), **kwargs)
3939
else:
40-
logging.warn(
41-
"Discarding the following wkw header args, because dtype was not provided: {}".format(
42-
kwargs
43-
)
44-
)
45-
header = None
40+
header = wkw.Header(np.uint8, **kwargs)
41+
4642
ds = wkw.Dataset.open(
4743
path.join(info.dataset_path, info.layer_name, str(info.mag)), header
4844
)

0 commit comments

Comments
 (0)