Skip to content
Snippets Groups Projects
Commit ecd7d3d3 authored by William Clarke's avatar William Clarke
Browse files

Merge branch 'bf/preproc_noalign' into 'master'

BF: preproc(edit) noalign

See merge request !131
parents 6d2e9814 1ff81407
Branches master
Tags 2.4.3
1 merge request!131BF: preproc(edit) noalign
This document contains the FSL-MRS release history in reverse chronological order.
2.4.3 (Friday 21st March 2025)
------------------------------
- Fixed bug introduced in 2.4.2 where the option to suppress alignment step in `fsl_mrs_preproc{_edit}` only suppressed some alignment.
- Update minimum hlsvdpropy version to 2.0.2
2.4.2 (Monday 17th March 2025)
------------------------------
- Added a `freeshift_lorentzian` model with inter-metabolite shifts (freeshift) and lorentzian lineshape.
......
......@@ -275,13 +275,21 @@ def main():
covariance=covariance,
no_prewhiten=no_prewhiten)
verbose_print('... Align Dynamics (1st iteration) ...')
supp_data = nifti_mrs_proc.align(
supp_data,
'DIM_DYN',
ppmlim=args.align_limits,
window=args.align_window,
report=report_dir)
if args.align:
verbose_print('... Align Dynamics (1st iteration) ...')
supp_data = nifti_mrs_proc.align(
supp_data,
'DIM_DYN',
ppmlim=args.align_limits,
window=args.align_window,
report=report_dir)
if has_multiple_dynamics(ref_data):
ref_data = nifti_mrs_proc.align(ref_data, 'DIM_DYN', ppmlim=(0, 8))
if args.quant is not None and has_multiple_dynamics(quant_data):
quant_data = nifti_mrs_proc.align(quant_data, 'DIM_DYN', ppmlim=(0, 8))
if args.ecc is not None and has_multiple_dynamics(ecc_data):
ecc_data = nifti_mrs_proc.align(ecc_data, 'DIM_DYN', ppmlim=(0, 8))
# Bad average removal on the suppressed data
if args.unlike:
......@@ -307,23 +315,15 @@ def main():
verbose_print(f'{bd_shape}/{supp_shape + bd_shape} '
'bad averages identified and removed.')
# Frequency and phase align the FIDs
if args.align:
verbose_print('... Align Dynamics (2nd iteration) ...')
supp_data = nifti_mrs_proc.align(
supp_data,
'DIM_DYN',
ppmlim=args.align_limits,
window=args.align_window,
report=report_dir)
if has_multiple_dynamics(ref_data):
ref_data = nifti_mrs_proc.align(ref_data, 'DIM_DYN', ppmlim=(0, 8))
if args.quant is not None and has_multiple_dynamics(quant_data):
quant_data = nifti_mrs_proc.align(quant_data, 'DIM_DYN', ppmlim=(0, 8))
if args.ecc is not None and has_multiple_dynamics(ecc_data):
ecc_data = nifti_mrs_proc.align(ecc_data, 'DIM_DYN', ppmlim=(0, 8))
# After removal repeat frequency and phase align the FIDs
if args.align:
verbose_print('... Align Dynamics (2nd iteration) ...')
supp_data = nifti_mrs_proc.align(
supp_data,
'DIM_DYN',
ppmlim=args.align_limits,
window=args.align_window,
report=report_dir)
# Average the data (if asked to do so)
if args.average:
......
......@@ -263,17 +263,19 @@ def main():
no_prewhiten=no_prewhiten)
# Frequency and phase align the FIDs in the ON/OFF condition
verbose_print('... Align Dynamics ...')
supp_data = nifti_mrs_proc.align(
supp_data,
'DIM_DYN',
ppmlim=args.align_ppm_dynamic,
niter=4,
window=args.align_window_dynamic,
report=report_dir,
report_all=True)
if args.align:
verbose_print('... Align Dynamics ...')
supp_data = nifti_mrs_proc.align(
supp_data,
'DIM_DYN',
ppmlim=args.align_ppm_dynamic,
niter=4,
window=args.align_window_dynamic,
report=report_dir,
report_all=True)
if args.dynamic_align and args.align:
verbose_print('... Align Dynamics using spectral model ...')
# Run dynamic fitting based alignment
edit_0, edit_1 = ntools.split(supp_data, 'DIM_EDIT', 0)
......@@ -296,7 +298,7 @@ def main():
supp_data = ntools.merge([edit_0_aligned, edit_1_aligned], 'DIM_EDIT')
elif args.align:
if args.align:
if 'DIM_DYN' in ref_data.dim_tags:
ref_data = nifti_mrs_proc.align(ref_data, 'DIM_DYN', ppmlim=(0, 8))
......
......@@ -97,16 +97,14 @@ def test_noalign(tmp_path):
'--ecc', ecc,
'--noalign',
'--overwrite',
'--report',
'--verbose'])
assert retcode == 0
assert (tmp_path / 'mergedReports.html').exists()
assert (tmp_path / 'metab.nii.gz').exists()
assert (tmp_path / 'wref.nii.gz').exists()
proc_nii = mrs_io.read_FID(tmp_path / 'metab.nii.gz')
assert proc_nii.shape == (1, 1, 1, 4096)
assert all(['.align' not in step['Details'] for step in proc_nii.hdr_ext['ProcessingApplied']])
def test_window_align_preproc(tmp_path):
......
......@@ -241,8 +241,7 @@ def test_noalign(tmp_path):
'--verbose'])
assert retcode == 0
assert (tmp_path / 'diff.nii.gz').exists()
assert (tmp_path / 'edit_0.nii.gz').exists()
assert (tmp_path / 'edit_1.nii.gz').exists()
assert (tmp_path / 'wref.nii.gz').exists()
assert (tmp_path / 'options.txt').exists()
proc_nii = mrs_io.read_FID(tmp_path / 'edit_0.nii.gz')
assert all(['.align, dim=DIM_DYN' not in step['Details'] for step in proc_nii.hdr_ext['ProcessingApplied']])
......@@ -6,7 +6,7 @@ pandas
jinja2
beautifulsoup4
nibabel>=5.3
hlsvdpropy
hlsvdpropy>=2.0.2
fslpy>=3.9.0
pillow
spec2nii>=0.8.5
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment