@@ -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+
3741class 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
0 commit comments