Menu

Package that provides tools for brain Lithium MRI pre-processing.

Source code for limri.workflows.registration

# -*- coding: utf-8 -*-
##########################################################################
# NSAp - Copyright (C) CEA, 2023
# Distributed under the terms of the CeCILL-B license, as published by
# the CEA-CNRS-INRIA. Refer to the LICENSE file or to
# http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
# for details.
##########################################################################

"""
Registration workflows definition.
"""

# Imports
import os
import glob
import limri
from limri.normtools import fslreorient2std, fast, gzfile
from limri.regtools import antsregister, apply_transforms, apply_translation
from limri.color_utils import print_title, print_result, print_warning


[docs]def li2mni(li_file, lianat_file, hanat_file, outdir, li2lianat=None): """ Transform the Lithium (Li) data to the MNI space by using intermediate Hydrogene (H) data. Parameters ---------- li_file: str path to the Li image. lianat_file: str path to the anat image acquired with the Li coil. hanat_file: str path of the anat image acquired with the H coil. outdir: str path to the destination folder. li2lianat: 3-uplet, default None the translation applied on the Li image to compensate for different field of view between the Li and Li anat images (in mm). """ print_title("Reorient images...") lianat_reo_file = os.path.join(outdir, "lianat.nii.gz") if not os.path.isfile(lianat_reo_file): gzfile(lianat_file, lianat_reo_file) fslreorient2std(lianat_reo_file, lianat_reo_file, save_trf=True) else: print_warning("lianat already reoriented") print_result(lianat_reo_file) hanat_reo_file = os.path.join(outdir, "hanat.nii.gz") if not os.path.isfile(hanat_reo_file): gzfile(hanat_file, hanat_reo_file) fslreorient2std(hanat_reo_file, hanat_reo_file, save_trf=True) else: print_warning("hanat already reoriented") print_result(hanat_reo_file) li_reo_file = os.path.join(outdir, "li.nii.gz") if not os.path.isfile(li_reo_file): gzfile(li_file, li_reo_file) fslreorient2std(li_reo_file, li_reo_file, save_trf=True) else: print_warning("li already reoriented") print_result(li_reo_file) print_title("Bias field correction...") lianat_bcorr_file = os.path.join(outdir, "lianat_restore.nii.gz") if not os.path.isfile(lianat_bcorr_file): lianat_bcorr_file = fast( lianat_reo_file, lianat_reo_file.replace(".nii.gz", "")) else: print_warning("lianat already bias corrected") print_result(lianat_bcorr_file) hanat_bcorr_file = os.path.join(outdir, "hanat_restore.nii.gz") if not os.path.isfile(hanat_bcorr_file): hanat_bcorr_file = fast( hanat_reo_file, hanat_reo_file.replace(".nii.gz", "")) else: print_warning("hanat already bias corrected") for key1 in ("lianat", "hanat"): for key2 in ("pve", "mixeltype", "seg"): regex = os.path.join(outdir, f"{key1}_{key2}*.nii.gz") for path in glob.glob(regex): os.remove(path) print_result(hanat_bcorr_file) print_title("Coregistration & normalization...") rigid_transforms = [os.path.join(outdir, "lianat2h0GenericAffine.mat")] deform_transforms = [ os.path.join(outdir, "h2mni1Warp.nii.gz"), os.path.join(outdir, "h2mni0GenericAffine.mat")] is_generated = True for path in rigid_transforms + deform_transforms: if not os.path.isfile(path): is_generated = False break ref_file = os.path.join(os.path.dirname(limri.__file__), "resources", "MNI152_T1_2mm.nii.gz") mask_file = os.path.join(os.path.dirname(limri.__file__), "resources", "MNI152_T1_2mm_brain.nii.gz") if not is_generated: antsregister( template_file=ref_file, lianat_file=lianat_bcorr_file, li_file=li_reo_file, hanat_file=hanat_bcorr_file, outdir=outdir, mask_file=mask_file) else: print_warning("li2mni transformation already computed") print_result(deform_transforms + rigid_transforms) print_title("Li image to MNI space...") li2mni_file = os.path.join(outdir, "li2mni.nii.gz") if not os.path.isfile(li2mni_file): li2lianat = li2lianat or (0, 0, 0) apply_translation(image_file=li_reo_file, translation=li2lianat, filename=li2mni_file) apply_transforms( fixed_file=ref_file, moving_file=li2mni_file, transformlist=deform_transforms + rigid_transforms, filename=li2mni_file) else: print_warning("li2mni transformation already applied") print_result(li2mni_file)
[docs]def applytrf(fixed_file, moving_file, transformlist, transform_file): """ Apply a transform list to map an image from one domain to another. Parameters ---------- fixed_file: str fixed image defining domain into which the moving image is transformed. moving_file: str moving image to be mapped to fixed space. transformlist: list of str list of transforms generated by ants.registration where each transform is a filename. transform_file: str the name of the transformed image. """ apply_transforms( fixed_file=fixed_file, moving_file=moving_file, transformlist=transformlist, filename=transform_file)

Follow us

© 2024, Limri developers