def __freesurferToDWITransformation(self, source, reference, extraArgs): dwiToFreesurferMatrix = "dwiToFreesurfer_transformation.mat" freesurferToDWIMatrix = "freesurferToDWI_transformation.mat" cmd = "flirt -in {} -ref {} -omat {} {}".format(source, reference, dwiToFreesurferMatrix, extraArgs) self.launchCommand(cmd) mriutil.invertMatrix(dwiToFreesurferMatrix, freesurferToDWIMatrix) return freesurferToDWIMatrix
def __freesurferToDWITransformation(self, source, reference, extraArgs): dwiToFreesurferMatrix = "dwiToFreesurfer_transformation.mat" freesurferToDWIMatrix = "freesurferToDWI_transformation.mat" cmd = "flirt -in {} -ref {} -omat {} {}".format( source, reference, dwiToFreesurferMatrix, extraArgs) self.launchCommand(cmd) mriutil.invertMatrix(dwiToFreesurferMatrix, freesurferToDWIMatrix) return freesurferToDWIMatrix
def __computeFieldmap(self, dwi, bVals, mag, phase, norm, parcellationMask, freesurferAnat): # extract a b0 from the dwi image b0 = os.path.join(self.workingDir, os.path.basename(dwi).replace(self.get("prefix", 'dwi'), "b0_fieldmap_tmp")) self.info(mriutil.extractFirstB0FromDwi(dwi, b0, bVals)) self.info("rescaling the phase image") phaseRescale = self.__rescaleFieldMap(phase) self.info('Coregistring magnitude image with the anatomical image produce by freesurfer') fieldmapToAnat = self.__coregisterFieldmapToAnat(mag, freesurferAnat) extraArgs = " -dof 6 " if self.get("methodology", "intrasession"): extraArgs += " -usesqform -dof 6" interpolateMask, fm2anat, anat2fm = mriutil.computeDwiMaskFromFreesurfer( mag, norm, parcellationMask, self.buildName(parcellationMask, 'interpolate'), extraArgs) self.info('Resampling the anatomical mask into the phase image space') # interpolateMask = self.__interpolateAnatMaskToFieldmap(anat, phaseRescale, invertFielmapToAnat, mask) fieldmap = self.__computePhaseFieldmap(phaseRescale, interpolateMask) self.info('Generate a lossy magnitude file with signal loss and distortion') lossy = self.__simulateLossyMap(fieldmap, interpolateMask) magnitudeMask = self.__computeMap(mag, interpolateMask, 'brain') lossyMagnitude = self.__computeMap(magnitudeMask, lossy, 'lossy') warped = self.__computeForwardDistorsion(fieldmap, lossyMagnitude, interpolateMask) self.info('Coregister the simulated lossy fieldmap with the EPI') matrixName = self.get("epiTo_b0fm") self.__coregisterEpiLossyMap(b0, warped, matrixName, lossy) self.info('Reslice magnitude and fieldmap in the EPI space') invertMatrixName = self.buildName(matrixName, 'inverse', 'mat') self.info(mriutil.invertMatrix(matrixName, invertMatrixName)) magnitudeIntoDwiSpace = self.__interpolateFieldmapInEpiSpace(warped, b0, invertMatrixName) magnitudeIntoDwiSpaceMask = self.__mask(parcellationMask, b0, anat2fm, invertMatrixName) interpolateFieldmap = self.__interpolateFieldmapInEpiSpace(fieldmap, b0, invertMatrixName) self.info('Create the shift map') saveshift = self.__performDistortionCorrection(b0, interpolateFieldmap, magnitudeIntoDwiSpaceMask) self.info('Perform distortion correction of EPI data') dwiUnwarp = self.__performDistortionCorrectionToDWI(dwi, magnitudeIntoDwiSpaceMask, saveshift) return dwiUnwarp
def __computeFieldmap(self, dwi, bVals, mag, phase, norm, parcellationMask, freesurferAnat): # extract a b0 from the dwi image b0 = os.path.join( self.workingDir, os.path.basename(dwi).replace(self.get("prefix", 'dwi'), "b0_fieldmap_tmp")) self.info(mriutil.extractFirstB0FromDwi(dwi, b0, bVals)) self.info("rescaling the phase image") phaseRescale = self.__rescaleFieldMap(phase) self.info( 'Coregistring magnitude image with the anatomical image produce by freesurfer' ) fieldmapToAnat = self.__coregisterFieldmapToAnat(mag, freesurferAnat) extraArgs = " -dof 6 " if self.get("methodology", "intrasession"): extraArgs += " -usesqform -dof 6" interpolateMask = mriutil.computeDwiMaskFromFreesurfer( mag, norm, parcellationMask, self.buildName(parcellationMask, 'interpolate'), extraArgs) self.info('Resampling the anatomical mask into the phase image space') # interpolateMask = self.__interpolateAnatMaskToFieldmap(anat, phaseRescale, invertFielmapToAnat, mask) fieldmap = self.__computePhaseFieldmap(phaseRescale, interpolateMask) self.info( 'Generate a lossy magnitude file with signal loss and distortion') lossy = self.__simulateLossyMap(fieldmap, interpolateMask) magnitudeMask = self.__computeMap(mag, interpolateMask, 'brain') lossyMagnitude = self.__computeMap(magnitudeMask, lossy, 'lossy') warped = self.__computeForwardDistorsion(fieldmap, lossyMagnitude, interpolateMask) self.info('Coregister the simulated lossy fieldmap with the EPI') matrixName = self.get("epiTo_b0fm") self.__coregisterEpiLossyMap(b0, warped, matrixName, lossy) self.info('Reslice magnitude and fieldmap in the EPI space') invertMatrixName = self.buildName(matrixName, 'inverse', 'mat') self.info(mriutil.invertMatrix(matrixName, invertMatrixName)) magnitudeIntoDwiSpace = self.__interpolateFieldmapInEpiSpace( warped, b0, invertMatrixName) magnitudeIntoDwiSpaceMask = self.__mask(magnitudeIntoDwiSpace) interpolateFieldmap = self.__interpolateFieldmapInEpiSpace( fieldmap, b0, invertMatrixName) self.info('Create the shift map') saveshift = self.__performDistortionCorrection( b0, interpolateFieldmap, magnitudeIntoDwiSpaceMask) self.info('Perform distortion correction of EPI data') dwiUnwarp = self.__performDistortionCorrectionToDWI( dwi, magnitudeIntoDwiSpaceMask, saveshift) return dwiUnwarp