Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
try:
print('Running FLIRT BBR registration: T1w-->DWI ...')
regutils.align(self.fa_path, self.t1w_brain, wmseg=self.wm_edge, xfm=self.dwi2t1w_bbr_xfm,
init=self.dwi2t1w_xfm, bins=256, dof=7, searchrad=True, interp="spline", out=None,
cost='bbr', sch="${FSLDIR}/etc/flirtsch/bbr.sch")
os.system("convert_xfm -omat {} -inverse {}".format(self.t1w2dwi_bbr_xfm, self.dwi2t1w_bbr_xfm))
# Apply the alignment
regutils.align(self.t1w_brain, self.fa_path, init=self.t1w2dwi_bbr_xfm, xfm=self.t1wtissue2dwi_xfm,
bins=None, interp="spline", dof=7, cost='mutualinfo', out=self.t1w2dwi, searchrad=True,
sch=None)
except RuntimeError('Error: FLIRT BBR failed!'):
pass
else:
# Apply the alignment
regutils.align(self.t1w_brain, self.fa_path, init=self.t1w2dwi_xfm, xfm=self.t1wtissue2dwi_xfm, bins=None,
interp="spline", dof=6, cost='mutualinfo', out=self.t1w2dwi, searchrad=True, sch=None)
return
def t1w2mni_align(self):
"""
A function to perform alignment from T1w --> MNI.
"""
# Create linear transform/ initializer T1w-->MNI
regutils.align(self.t1w_brain, self.input_mni_brain, xfm=self.t12mni_xfm_init, bins=None, interp="spline",
out=None, dof=12, cost='mutualinfo', searchrad=True)
# Attempt non-linear registration of T1 to MNI template
try:
print('Running non-linear registration: T1w-->MNI ...')
# Use FNIRT to nonlinearly align T1 to MNI template
regutils.align_nonlinear(self.t1w_brain, self.input_mni, xfm=self.t12mni_xfm_init, out=self.t1_aligned_mni,
warp=self.warp_t1w2mni, ref_mask=self.input_mni_mask)
except RuntimeError('Error: FNIRT failed!'):
pass
# Get mat from MNI -> T1
os.system("convert_xfm -omat {} -inverse {}".format(self.mni2t1_xfm_init, self.t12mni_xfm_init))
except RuntimeError('Error: FNIRT failed!'):
pass
else:
# Falling back to linear registration
regutils.align(self.t1w_brain, self.input_mni_brain, xfm=self.t12mni_xfm, init=self.t12mni_xfm_init,
bins=None, dof=12, cost='mutualinfo', searchrad=True, interp="spline",
out=self.t1_aligned_mni, sch=None)
# Get mat from MNI -> T1
os.system("convert_xfm -omat {} -inverse {}".format(self.t12mni_xfm, self.mni2t1_xfm))
# Align T1w-->DWI
regutils.align(self.fa_path, self.t1w_brain, xfm=self.t1w2dwi_xfm, bins=None, interp="spline", dof=6,
cost='mutualinfo', out=None, searchrad=True, sch=None)
os.system("convert_xfm -omat {} -inverse {}".format(self.dwi2t1w_xfm, self.t1w2dwi_xfm))
if self.simple is False:
# Flirt bbr
try:
print('Running FLIRT BBR registration: T1w-->DWI ...')
regutils.align(self.fa_path, self.t1w_brain, wmseg=self.wm_edge, xfm=self.dwi2t1w_bbr_xfm,
init=self.dwi2t1w_xfm, bins=256, dof=7, searchrad=True, interp="spline", out=None,
cost='bbr', sch="${FSLDIR}/etc/flirtsch/bbr.sch")
os.system("convert_xfm -omat {} -inverse {}".format(self.t1w2dwi_bbr_xfm, self.dwi2t1w_bbr_xfm))
# Apply the alignment
regutils.align(self.t1w_brain, self.fa_path, init=self.t1w2dwi_bbr_xfm, xfm=self.t1wtissue2dwi_xfm,
bins=None, interp="spline", dof=7, cost='mutualinfo', out=self.t1w2dwi, searchrad=True,
sch=None)
# Align T1w-->DWI
regutils.align(self.fa_path, self.t1w_brain, xfm=self.t1w2dwi_xfm, bins=None, interp="spline", dof=6,
cost='mutualinfo', out=None, searchrad=True, sch=None)
os.system("convert_xfm -omat {} -inverse {}".format(self.dwi2t1w_xfm, self.t1w2dwi_xfm))
if self.simple is False:
# Flirt bbr
try:
print('Running FLIRT BBR registration: T1w-->DWI ...')
regutils.align(self.fa_path, self.t1w_brain, wmseg=self.wm_edge, xfm=self.dwi2t1w_bbr_xfm,
init=self.dwi2t1w_xfm, bins=256, dof=7, searchrad=True, interp="spline", out=None,
cost='bbr', sch="${FSLDIR}/etc/flirtsch/bbr.sch")
os.system("convert_xfm -omat {} -inverse {}".format(self.t1w2dwi_bbr_xfm, self.dwi2t1w_bbr_xfm))
# Apply the alignment
regutils.align(self.t1w_brain, self.fa_path, init=self.t1w2dwi_bbr_xfm, xfm=self.t1wtissue2dwi_xfm,
bins=None, interp="spline", dof=7, cost='mutualinfo', out=self.t1w2dwi, searchrad=True,
sch=None)
except RuntimeError('Error: FLIRT BBR failed!'):
pass
else:
# Apply the alignment
regutils.align(self.t1w_brain, self.fa_path, init=self.t1w2dwi_xfm, xfm=self.t1wtissue2dwi_xfm, bins=None,
interp="spline", dof=6, cost='mutualinfo', out=self.t1w2dwi, searchrad=True, sch=None)
return
def atlas2t1wmni_align(self, uatlas, uatlas_parcels, atlas):
"""
A function to perform atlas alignment from atlas --> T1_MNI.
"""
from nilearn.image import resample_img
aligned_atlas_t1mni = "%s%s%s%s" % (self.anat_path, '/', atlas, "_t1w_mni.nii.gz")
gm_mask_mni = "%s%s%s%s%s" % (self.anat_path, '/', atlas, self.t1w_name, "_gm_mask_t1w_mni.nii.gz")
gm_mask_mni_atlas_res = "%s%s%s%s%s" % (self.anat_path, '/', atlas, self.t1w_name, "_gm_mask_t1w_mni.nii.gz")
aligned_atlas_t1mni_gm = "%s%s%s%s" % (self.anat_path, '/', atlas, "_t1w_mni_gm.nii.gz")
uatlas_filled = "%s%s%s%s" % (self.anat_path, '/', atlas, "_filled.nii.gz")
os.system("fslmaths {} -add {} -mas {} {}".format(self.input_mni_brain, uatlas, self.input_mni_mask,
uatlas_filled))
regutils.align(uatlas_filled, self.t1_aligned_mni, init=None, xfm=self.atlas2t1wmni_xfm_init,
out=None, dof=12, searchrad=True, interp="nearestneighbour", cost='mutualinfo')
if uatlas_parcels is not None:
regutils.applyxfm(self.t1_aligned_mni, uatlas_parcels, self.atlas2t1wmni_xfm_init, aligned_atlas_t1mni,
interp="nearestneighbour")
else:
regutils.applyxfm(self.t1_aligned_mni, uatlas, self.atlas2t1wmni_xfm_init, aligned_atlas_t1mni,
interp="nearestneighbour")
try:
regutils.apply_warp(self.t1_aligned_mni, self.gm_mask_thr, gm_mask_mni, warp=self.warp_t1w2mni,
xfm=self.t12mni_xfm_init, interp='nn', sup=True)
except:
regutils.applyxfm(self.t1_aligned_mni, self.gm_mask_thr, self.t12mni_xfm_init, gm_mask_mni,
interp="nearestneighbour")
def tissue2dwi_align(self):
"""
A function to perform alignment of ventricle ROI's from MNI space --> dwi and CSF from T1w space --> dwi.
First generates and performs dwi space alignment of avoidance/waypoint masks for tractography.
First creates ventricle ROI. Then creates transforms from stock MNI template to dwi space.
For this to succeed, must first have called both t1w2dwi_align and atlas2t1w2dwi_align.
"""
# Register Lateral Ventricles and Corpus Callosum rois to t1w
if not os.path.isfile(self.mni_atlas):
raise ValueError('FSL atlas for ventricle reference not found!')
# Create transform to MNI atlas to T1w using flirt. This will be use to transform the ventricles to dwi space.
regutils.align(self.mni_atlas, self.input_mni_brain, xfm=self.xfm_roi2mni_init, init=None, bins=None, dof=6,
cost='mutualinfo', searchrad=True, interp="spline", out=None)
# Create transform to align roi to mni and T1w using flirt
regutils.applyxfm(self.input_mni_brain, self.mni_vent_loc, self.xfm_roi2mni_init, self.vent_mask_mni)
if self.simple is False:
# Apply warp resulting from the inverse MNI->T1w created earlier
regutils.apply_warp(self.t1w_brain, self.vent_mask_mni, self.vent_mask_t1w, warp=self.mni2t1w_warp,
interp='nn', sup=True)
regutils.apply_warp(self.t1w_brain, self.corpuscallosum, self.corpuscallosum_mask_t1w,
warp=self.mni2t1w_warp, interp="nn", sup=True)
else:
regutils.applyxfm(self.vent_mask_mni, self.t1w_brain, self.mni2t1_xfm, self.vent_mask_t1w)
regutils.applyxfm(self.corpuscallosum, self.t1w_brain, self.mni2t1_xfm, self.corpuscallosum_mask_t1w)
def atlas2t1w2dwi_align(self, uatlas, uatlas_parcels, atlas):
"""
A function to perform atlas alignment atlas --> T1 --> dwi.
Tries nonlinear registration first, and if that fails, does a linear registration instead. For this to succeed,
must first have called t1w2dwi_align.
"""
aligned_atlas_t1mni = "%s%s%s%s" % (self.anat_path, '/', atlas, "_t1w_mni.nii.gz")
aligned_atlas_skull = "%s%s%s%s" % (self.anat_path, '/', atlas, "_t1w_skull.nii.gz")
dwi_aligned_atlas = "%s%s%s%s" % (self.reg_path_img, '/', atlas, "_dwi_track.nii.gz")
dwi_aligned_atlas_wmgm_int = "%s%s%s%s" % (self.reg_path_img, '/', atlas, "_dwi_track_wmgm_int.nii.gz")
uatlas_filled = "%s%s%s%s" % (self.reg_path_img, '/', atlas, "_filled.nii.gz")
os.system("fslmaths {} -add {} -mas {} {}".format(self.input_mni_brain, uatlas, self.input_mni_mask,
uatlas_filled))
regutils.align(uatlas_filled, self.t1_aligned_mni, init=None, xfm=self.atlas2t1mni_xfm_init,
out=None, dof=12, searchrad=True, interp="nearestneighbour", cost='mutualinfo')
if self.simple is False:
try:
# Apply warp resulting from the inverse of T1w-->MNI created earlier
regutils.apply_warp(self.t1w_brain, uatlas, aligned_atlas_skull,
warp=self.mni2t1w_warp, interp='nn', sup=True)
if uatlas_parcels is not None:
aligned_atlas_t1mni_parcels = "%s%s%s%s" % (self.anat_path, '/', atlas, "_t1w_mni_parcels.nii.gz")
aligned_atlas_skull_parcels = "%s%s%s%s" % (self.anat_path, '/', atlas, "_t1w_skull_parcels.nii.gz")
regutils.applyxfm(self.t1_aligned_mni, uatlas_parcels, self.atlas2t1mni_xfm_init,
aligned_atlas_t1mni_parcels, interp="nearestneighbour")
regutils.apply_warp(self.t1w_brain, aligned_atlas_t1mni_parcels, aligned_atlas_skull_parcels,
warp=self.mni2t1w_warp, interp='nn', sup=True)
else:
def t1w2dwi_align(self):
"""
A function to perform alignment from T1w --> MNI and T1w_MNI --> DWI. Uses a local optimisation
cost function to get the two images close, and then uses bbr to obtain a good alignment of brain boundaries.
Assumes input dwi is already preprocessed and brain extracted.
"""
# Create linear transform/ initializer T1w-->MNI
regutils.align(self.t1w_brain, self.input_mni_brain, xfm=self.t12mni_xfm_init, bins=None, interp="spline",
out=None, dof=12, cost='mutualinfo', searchrad=True)
# Attempt non-linear registration of T1 to MNI template
if self.simple is False:
try:
print('Running non-linear registration: T1w-->MNI ...')
# Use FNIRT to nonlinearly align T1 to MNI template
regutils.align_nonlinear(self.t1w_brain, self.input_mni, xfm=self.t12mni_xfm_init,
out=self.t1_aligned_mni, warp=self.warp_t1w2mni, ref_mask=self.input_mni_mask)
# Get warp from MNI -> T1
regutils.inverse_warp(self.t1w_brain, self.mni2t1w_warp, self.warp_t1w2mni)
# Get mat from MNI -> T1
os.system("convert_xfm -omat {} -inverse {}".format(self.mni2t1_xfm_init, self.t12mni_xfm_init))