Skip to content

Commit eccd701

Browse files
authored
Disable gzip compression for float NIfTI intermediates (#285)
1 parent e586636 commit eccd701

6 files changed

Lines changed: 24 additions & 18 deletions

File tree

src/rbc/core/common.py

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,14 @@
1010
from typing import TYPE_CHECKING
1111

1212
import nibabel as nib
13-
from niwrap import afni, fsl
13+
from niwrap import afni
1414

1515
if TYPE_CHECKING:
1616
from collections.abc import Sequence
1717
from pathlib import Path
1818

1919
from rbc.core.fileops import file_tmp_copy
20+
from rbc.core.niwrap import generate_exec_folder
2021

2122
__all__ = ["deoblique_and_reorient", "merge_3d_to_4d", "split_4d"]
2223

@@ -49,19 +50,24 @@ def deoblique_and_reorient(
4950
def split_4d(img_4d: Path) -> list[Path]:
5051
"""Split a 4D NIfTI timeseries into individual 3D volumes.
5152
53+
Volumes are written as uncompressed NIfTI (.nii) to avoid gzip
54+
overhead on float intermediates that are read back immediately.
55+
5256
Args:
5357
img_4d: Path to a 4D NIfTI image.
5458
5559
Returns:
5660
Sorted list of paths to the individual 3D volume files.
5761
"""
58-
split_result = fsl.fslsplit(
59-
infile=img_4d, separation_time=True, output_basename="vol_"
60-
)
61-
assert split_result.out_files is not None # noqa: S101
62-
out_files = split_result.out_files
63-
out_dir = out_files[0].parent if isinstance(out_files, list) else out_files.parent
64-
return sorted(out_dir.glob("vol_*.nii.gz"))
62+
img = nib.nifti1.load(img_4d)
63+
volumes = nib.four_to_three(img)
64+
out_dir = generate_exec_folder(suffix="split4d")
65+
paths: list[Path] = []
66+
for idx, vol in enumerate(volumes):
67+
out_path = out_dir / f"vol_{idx:04d}.nii"
68+
nib.save(vol, out_path)
69+
paths.append(out_path)
70+
return paths
6571

6672

6773
def merge_3d_to_4d(volumes: Sequence[Path], output: Path) -> Path:

src/rbc/core/functional/distortion.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,7 @@ def correct_distortion_phasediff(
349349
diff_img = nib.Nifti1Image(
350350
diff_data, affine=p1_img.affine, header=p1_img.header
351351
)
352-
phasediff = out_dir / "phasediff.nii.gz"
352+
phasediff = out_dir / "phasediff.nii"
353353
nib.save(diff_img, phasediff)
354354

355355
# 4. Prepare fieldmap (rad/s)
@@ -454,7 +454,7 @@ def correct_distortion_pepolar(
454454
# 2. Merge forward/reverse into 4D
455455
merged_path = merge_3d_to_4d(
456456
volumes=[epi_forward, epi_reverse],
457-
output=out_dir / "merged_epi.nii.gz",
457+
output=out_dir / "merged_epi.nii",
458458
)
459459

460460
# 3. Estimate field with TOPUP

src/rbc/core/functional/masking.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ def bold_masking(
183183
warped_probseg = ants.ants_apply_transforms(
184184
reference_image=bold_ref,
185185
output=ants.ants_apply_transforms_warped_output(
186-
warped_output_file_name="probseg_transform.nii.gz"
186+
warped_output_file_name="probseg_transform.nii"
187187
),
188188
default_value=0,
189189
float_=True,
@@ -222,7 +222,7 @@ def bold_masking(
222222
# mismatches before N4 correction.
223223
bold_ref_dir_corrected = ants.set_direction_by_matrix(
224224
infile=bold_ref,
225-
outfile="bold_ref_dir_corrected.nii.gz",
225+
outfile="bold_ref_dir_corrected.nii",
226226
direction_matrix=parse_direction_matrix_from_header(
227227
dilated_binary_mask.output_file
228228
),
@@ -233,7 +233,7 @@ def bold_masking(
233233
n4_bias_correction = ants.n4_bias_field_correction(
234234
input_image=bold_ref_dir_corrected.outfile,
235235
output=ants.n4_bias_field_correction_corrected_output(
236-
corrected_output_file_name="ref_bold_corrected.nii.gz"
236+
corrected_output_file_name="ref_bold_corrected.nii"
237237
),
238238
image_dimensionality=3,
239239
bspline_fitting=ants.n4_bias_field_correction_bspline_fitting(
@@ -286,7 +286,7 @@ def bold_masking(
286286
in_file=masked_bold.output_file,
287287
cl_frac=0.2,
288288
rbt=[18.3, 65, 90],
289-
prefix="uni.nii.gz",
289+
prefix="uni.nii",
290290
t2=True,
291291
)
292292

src/rbc/core/functional/motion.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ def extract_motion_reference(in_file: Path) -> Path:
8080
header=ref_im.header,
8181
)
8282

83-
temp_slice_file = generate_exec_folder(suffix="motion_ref_input") / "slice.nii.gz"
83+
temp_slice_file = generate_exec_folder(suffix="motion_ref_input") / "slice.nii"
8484
ref_im.to_filename(temp_slice_file)
8585

8686
mc_output_prefix = f"{_MC_PREFIX}_volreg.nii.gz"

src/rbc/core/functional/resampling.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ def apply_motion_transforms(
9999
default_value=0,
100100
dimensionality=3,
101101
output=ants.ants_apply_transforms_warped_output(
102-
f"vol_{idx:04d}_motion.nii.gz"
102+
f"vol_{idx:04d}_motion.nii"
103103
),
104104
)
105105
transformed_vols.append(result.output.output_image_outfile)
@@ -193,7 +193,7 @@ def resample_bold_to_template(
193193
default_value=0,
194194
dimensionality=3,
195195
output=ants.ants_apply_transforms_warped_output(
196-
f"vol_{idx:04d}_template.nii.gz"
196+
f"vol_{idx:04d}_template.nii"
197197
),
198198
)
199199
transformed_vols.append(result.output.output_image_outfile)

src/rbc/core/longitudinal/transform.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ def _transform_4d_chunked(in_file: Path, template: Path, xfm: Path) -> Path:
137137
dimensionality=3,
138138
interpolation=ants.ants_apply_transforms_linear(),
139139
output=ants.ants_apply_transforms_warped_output(
140-
f"vol_{idx:04d}_template.nii.gz"
140+
f"vol_{idx:04d}_template.nii"
141141
),
142142
)
143143
transformed_vols.append(result.output.output_image_outfile)

0 commit comments

Comments
 (0)