def meetRequirement(self): images = Images( (self.getDenoisingImage("dwi", 'denoise'), 'denoise'), (self.getPreparationImage("dwi"), 'diffusion weighted')) if not images.isAtLeastOneImageExists(): return False images = Images( (self.getParcellationImage('norm'), 'freesurfer normalize'), (self.getParcellationImage('mask'), 'freesurfer mask'), (self.getPreparationImage('grad', None, 'bvals'), 'gradient .bvals encoding file'), (self.getPreparationImage( 'grad', None, 'bvecs'), 'gradient .bvecs encoding file'), (self.getPreparationImage('grad', None, 'b'), 'gradient .b encoding file')) # if fieldmap available if Images(self.getPreparationImage("mag"), self.getPreparationImage("phase")).isAllImagesExists(): images.append((self.getParcellationImage('anat', 'freesurfer'), "freesurfer anatomical")) return images
def qaSupplier(self): """Create and supply images for the report generated by qa task """ qaImages = Images() #Information on denoising algorithm information = 'Denoising was done using the {} algorithm'.format(self.algorithm) if self.matlabWarning: information = "Algorithm `aonlm` or `lpca` was set for the " \ "denoising, but Matlab is not available for this server. "\ "Please install and configure Matlab or set `ignore: True`"\ " into the [denoising] section of your config.cfg file." qaImages.extend(Images((False, 'Denoised diffusion image'))) qaImages.setInformation(information) #Get images dwi = self.getPreparationImage("dwi") dwiDenoised = self.getImage('dwi', 'denoise') brainMask = self.getImage('mask', 'resample') b0 = self.getImage('b0') noiseMask = self.getImage('dwi', 'noise_mask') #Build qa images if dwiDenoised: dwiDenoisedQa = self.plot4dVolume(dwiDenoised, fov=brainMask) qaImages.append((dwiDenoisedQa, 'Denoised diffusion image')) dwiCompareQa = self.compare4dVolumes( dwi, dwiDenoised, fov=brainMask) qaImages.append((dwiCompareQa, 'Before and after denoising')) if self.algorithm == "nlmeans": if self.sigmaVector != None: sigmaQa = self.plotSigma(self.sigmaVector, dwiDenoised) qaImages.append( (sigmaQa, 'Sigmas from the nlmeans algorithm')) if noiseMask: noiseMaskQa = self.plot3dVolume( b0, edges=noiseMask, fov=noiseMask) qaImages.append( (noiseMaskQa, 'Noise mask from the nlmeans algorithm')) return qaImages
def implement(self): dwi = self.getBackupImage('dwi') bEncs = self.getBackupImage('grad', None, 'b') bVals = self.getBackupImage('grad', None, 'bvals') bVecs = self.getBackupImage('grad', None, 'bvecs') (bEncs, bVecs, bVals) = self.__produceEncodingFiles(bEncs, bVecs, bVals, dwi) # Convert bvecs bval expectedLayout = self.get('stride_orientation') if not mriutil.isDataStridesOrientationExpected(dwi, expectedLayout) \ and self.get("force_realign_strides"): self.warning("Reorienting strides for image {}".format(dwi)) self.__stride4DImage(dwi, bEncs, bVecs, bVals, expectedLayout) else: self.info("Linking {} to {}".format( dwi, util.symlink(dwi, self.workingDir))) images = Images( (self.getBackupImage('anat'), 'high resolution'), (self.getBackupImage('b0_pa'), 'B0 posterior to anterior'), (self.getBackupImage('b0_ap'), 'B0 anterior to posterior'), (self.getBackupImage('mag'), 'MR magnitude'), (self.getBackupImage('phase'), 'MR phase '), (self.getBackupImage('aparc_aseg'), 'parcellation'), (self.getBackupImage('anat', 'freesurfer'), 'freesurfer anatomical'), (self.getBackupImage('lh_ribbon'), 'left hemisphere ribbon'), (self.getBackupImage('rh_ribbon'), 'right hemisphere ribbon'), (self.getBackupImage('brodmann'), 'brodmann'), ) for image, description in images.getData(): if image: if not mriutil.isDataStridesOrientationExpected(image, expectedLayout) \ and self.get("force_realign_strides"): self.info( mriutil.stride3DImage(image, self.buildName(image, "stride"), expectedLayout)) else: self.info("Found {} image, linking {} to {}".format( description, image, util.symlink(image, self.workingDir))) for directory in [ os.path.join(self.backupDir, directory) for directory in os.listdir(self.backupDir) if os.path.isdir(os.path.join(self.backupDir, directory)) ]: if mriutil.isAfreesurferStructure(directory): self.info( "{} seem\'s a valid freesurfer structure: linking to {} directory" .format(directory, self.workingDir)) util.symlink(directory, self.workingDir, self.get("parcellation", "id"))
def qaSupplier(self): """Create and supply images for the report generated by qa task """ #Get images b0 = self.getUpsamplingImage('b0', 'upsample') brainMask = self.getRegistrationImage('mask', 'resample') brodmann = self.getImage('brodmann', 'resample') aal2 = self.getImage('aal2', 'resample') networks7 = self.getImage('networks7', 'resample') #Build qa images brodmannQa = self.plot3dVolume(b0, segOverlay=brodmann, fov=brainMask) aal2Qa = self.plot3dVolume(b0, segOverlay=aal2, fov=brainMask) networks7Qa = self.plot3dVolume(b0, segOverlay=networks7, fov=brainMask) qaImages = Images( (brodmannQa, 'Brodmann segmentation on upsampled b0'), (aal2Qa, 'Aal2 segmentation on upsampled b0'), (networks7Qa, 'Resting state sevens networks segmentation ' \ 'on upsampled b0')) return qaImages
def isDirty(self): images = Images() dwi = self.getUpsamplingImage('dwi', 'upsample') if mriutil.getNbDirectionsFromDWI(dwi) <= 45 and not self.get( 'forceHardi'): if 'deterministic' in self.get('algorithm'): images.append(( self.getImage('dwi', 'tensor_det', 'trk'), "deterministic tensor connectome matrix from a streamlines" )) if 'probabilistic' in self.get('algorithm'): images.append(( self.getImage('dwi', 'tensor_prob', 'trk'), "probabilistic tensor connectome matrix from a streamlines" )) else: images.append( (self.getImage('dwi', 'hardi_prob', 'trk'), "tckgen hardi probabilistic streamlines tractography")) if self.get('sift'): images.append((self.getImage('dwi', 'tcksift', 'trk'), 'tcksift')) return images
def qaSupplier(self): """Create and supply images for the report generated by qa task """ #Get images b0 = self.getUpsamplingImage('b0', 'upsample') brainMask = self.getImage('mask', 'resample') aparcAseg = self.getImage('aparc_aseg', 'resample') wmparc = self.getImage('wmparc', 'resample') tt5 = self.getImage('tt5', 'resample') #Build qa images brainMaskQa = self.plot3dVolume(b0, edges=brainMask, fov=brainMask) aparcAsegQa = self.plot3dVolume(b0, segOverlay=aparcAseg, fov=brainMask) wmparcQa = self.plot3dVolume(b0, segOverlay=wmparc, fov=brainMask) tt5Qas = self.plot4dVolumeToFrames(tt5, fov=brainMask) qaImages = Images( (brainMaskQa, 'Brain mask on upsampled b0'), (aparcAsegQa, 'aparcaseg segmentation on upsampled b0'), (wmparcQa, 'white matter segmentation on upsampled b0'), (tt5Qas[0], 'Cortical grey matter'), (tt5Qas[1], 'Sub-cortical grey matter'), (tt5Qas[2], 'White matter'), (tt5Qas[3], 'CSF'), (tt5Qas[4], 'Pathological tissue'), ) return qaImages
def qaSupplier(self): """Create and supply images for the report generated by qa task """ anat = self.getImage('anat', 'freesurfer') # Get freesurfer anat norm = self.getImage('norm') brainMask = self.getImage('mask') aparcAseg = self.getImage('aparc_aseg') wmparc = self.getImage('wmparc') tt5 = self.getImage('tt5') # Build qa images anatQa = self.plot3dVolume(anat, fov=brainMask) brainMaskQa = self.plot3dVolume(norm, edges=brainMask, fov=brainMask) aparcAsegQa = self.plot3dVolume(anat, segOverlay=aparcAseg, fov=aparcAseg) wmparcQa = self.plot3dVolume(anat, segOverlay=wmparc, fov=wmparc) tt5Qas = self.plot4dVolumeToFrames(tt5, fov=brainMask) qaImages = Images( (anatQa, 'High resolution anatomical image from Freesurfer'), (brainMaskQa, 'Brain mask on norm from Freesurfer'), (aparcAsegQa, 'Aparc aseg segmentation from Freesurfer'), (wmparcQa, 'White matter segmentation from Freesurfer'), (tt5Qas[0], 'Cortical grey matter'), (tt5Qas[1], 'Sub-cortical grey matter'), (tt5Qas[2], 'White matter'), (tt5Qas[3], 'CSF'), (tt5Qas[4], 'Pathological tissue'), ) return qaImages
def isDirty(self): return Images( (self.getImage('dwi', None, 'txt'), "response function estimation text file"), (self.getImage( 'dwi', 'csd'), "constrained spherical deconvolution"), (self.getImage('dwi', 'nufo'), 'nufo'), (self.getImage('dwi', 'fixel_peak', 'msf'), 'fixel peak image'))
def qaSupplier(self): """Create and supply images for the report generated by qa task """ qaImages = Images() #Get images b0 = self.getUpsamplingImage('b0', 'upsample') whiteMatter = self.getImage("tt5", ["resample", "wm", "mask"]) interfaceGmWm = self.getImage("tt5", ["register", "5tt2gmwmi"]) area253 = self.getImage('aparc_aseg', ['253', 'mask']) area1024 = self.getImage('aparc_aseg', ['1024', 'mask']) #Build qa images tags = ( (whiteMatter, 'resample white segmented mask'), #(interfaceGmWm, 'grey matter, white matter interface'), #(area253, 'area 253 from aparc_aseg atlas'), #(area1024, 'area 1024 from aparc_aseg atlas'), ) for image, description in tags: imageQa = self.plot3dVolume(b0, edges=image, fov=image) qaImages.append((imageQa, description)) return qaImages
def meetRequirement(self): """Validate if all requirements have been met prior to launch the task Returns: True if all requirement are meet, False otherwise """ return Images((self.getParcellationImage('anat', 'freesurfer'), 'anatomical'))
def isDirty(self): """Validate if this tasks need to be submit for implementation """ return Images( (os.path.join(self.workingDir, 'index.html'), 'QA index.html'), (os.path.join(self.workingDir, self.config.get('qa', 'jquery')), 'Jquery library'))
def isDirty(self): return Images( (self.getImage('brodmann', 'resample'), 'brodmann atlas resample'), (self.getImage('aal2', 'resample'), 'aal2 atlas resample'), (self.getImage('networks7', 'resample'), 'Resting state sevens networks atlas resample'))
def meetRequirement(self): return Images( (self.getPreparationImage('dwi'), 'diffusion weighted'), (self.getCorrectionImage('mask', 'corrected'), 'brain mask'), (self.getMaskingImage('aparc_aseg', ['253', 'mask']), 'Corpus Callusum mask from the masking task'), (self.getCorrectionImage('b0', 'corrected'), 'B0'))
def meetRequirement(self): return Images( (self.getUpsamplingImage('dwi', 'upsample'), 'diffusion weighted'), (self.getUpsamplingImage('grad', None, 'b'), "gradient encoding b file"), (self.getMaskingImage('tt5', ['resample', 'wm', 'mask']), 'white matter segmented mask'), (self.getRegistrationImage('mask', 'resample'), 'brain mask'))
def meetRequirement(self): return Images( self.getUpsamplingImage('b0', 'upsample'), self.getRegistrationImage("freesurfer_dwi", ["transformation", "mrtrix"], "mat"), self.getRegistrationImage("freesurfer_dwi", "transformation", "mat"), self.getAtlasImage("brodmann"), self.getAtlasImage("aal2"), self.getAtlasImage("networks7"))
def meetRequirement(self): return Images( (self.getUpsamplingImage('dwi', 'upsample'), "upsampled diffusion"), (self.getUpsamplingImage( 'grad', None, 'bvals'), "gradient value bvals encoding file"), (self.getUpsamplingImage( 'grad', None, 'bvecs'), "gradient vector bvecs encoding file"), (self.getRegistrationImage('mask', 'resample'), 'brain mask'))
def isDirty(self): return Images( (self.getImage('grad', None, 'bvals'), 'gradient .bvals encoding file'), (self.getImage( 'grad', None, 'bvecs'), 'gradient .bvecs encoding file'), (self.getImage('grad', None, 'b'), 'gradient .b encoding file'), (self.getImage('anat'), 'high resolution'), (self.getImage('dwi'), 'diffusion weighted'))
def meetRequirement(self, result=True): """Validate if all requirements have been met prior to launch the task """ return Images( (self.getUpsamplingImage('dwi', 'upsample'), 'diffusion weighted'), (self.getRegistrationImage('mask', 'resample'), 'brain mask'), (self.getUpsamplingImage('grad', None, 'bvals'), '.bvals gradient encoding file'), (self.getUpsamplingImage( 'grad', None, 'bvecs'), '.bvecs gradient encoding file'))
def isDirty(self): return Images( (self.getImage("dwi", "tensor"), "dipy tensor"), (self.getImage('dwi', 'v1'), "selected eigenvector 1"), (self.getImage('dwi', 'v2'), "selected eigenvector 2"), (self.getImage('dwi', 'v3'), "selected eigenvector 3"), (self.getImage('dwi', 'fa'), "fractional anisotropy"), (self.getImage('dwi', 'md'), "mean diffusivity MD"), (self.getImage('dwi', 'ad'), "selected eigenvalue(s) AD"), (self.getImage('dwi', 'rd'), "selected eigenvalue(s) RD"))
def meetRequirement(self): return Images( (self.getRegistrationImage("aparc_aseg", "resample"), 'resampled parcellation atlas'), (self.getRegistrationImage( "aparc_aseg", "register"), 'register parcellation atlas'), (self.getRegistrationImage('mask', 'resample'), 'brain extracted, resampled high resolution'), (self.getRegistrationImage('mask', 'register'), 'brain extracted, register high resolution'), (self.getRegistrationImage('tt5', 'resample'), '5tt resample'), (self.getRegistrationImage('tt5', 'register'), '5tt register'))
def implement(self): self.info("Build directories structure for subject: {}".format( os.path.basename(self.workingDir))) #@TODO add description to that struct images = Images((self.getSubjectImage('anat'), ""), (self.getSubjectImage('dwi'), ""), (self.getSubjectImage('mag',), ""), (self.getSubjectImage('phase'), ""), (self.getSubjectImage('aparc_aseg'), ""), (self.getSubjectImage('anat', 'freesurfer'), ""), (self.getSubjectImage('lh_ribbon'), ""), (self.getSubjectImage('rh_ribbon'), ""), (self.getSubjectImage('brodmann'), ""), (self.getSubjectImage('b0_ap'), ""), (self.getSubjectImage('b0_pa'), ""), (self.getSubjectImage('grad', None, 'b'), ""), (self.getSubjectImage('grad', None, 'bvals'), ""), (self.getSubjectImage('grad', None, 'bvecs'), ""), (self.getSubjectImage('tq_dict', None, 'qry'), ""), (self.getSubjectImage('queries', None, 'qry'), ""), (self.getSubjectImage('config', None, 'cfg'), ""),) for image, description in images.getData(): if image: self.info("Found {} image: moving it to {} directory".format( description, image, self.workingDir)) shutil.move(image, self.workingDir) directories = [] for directory in os.listdir(self.subjectDir): target = os.path.join(self.subjectDir, directory) if os.path.isdir(target): directories.append(target) for directory in directories: if mriutil.isAfreesurferStructure(directory): self.info("{} seem\'s a valid freesurfer structure: moving it to {} directory".format(directory, self.workingDir)) if os.path.islink(directory): os.chdir(self.subjectDir) # We need to chdir because `directory` is in # `self.subjectDir` and we need `os.path.abspath` to # work correctly fsDirName = os.path.basename(directory) linkto = os.path.abspath(os.readlink(directory)) newLinkto = os.path.relpath(linkto, self.workingDir) newTarget = os.path.join(self.workingDir, fsDirName) os.symlink(newLinkto, newTarget) os.unlink(directory) os.chdir(self.workingDir) else: shutil.move(directory, self.workingDir)
def meetRequirement(self): return Images( (self.getParcellationImage('anat', 'freesurfer'), 'high resolution'), (self.getUpsamplingImage('b0', 'upsample'), 'b0 upsampled'), (self.getParcellationImage('aparc_aseg'), 'parcellation'), (self.getParcellationImage('wmparc'), 'parcellation'), (self.getParcellationImage('rh_ribbon'), 'right hemisphere, ribbon'), (self.getParcellationImage('lh_ribbon'), 'left hemisphere ribbon'), (self.getParcellationImage('tt5'), '5tt'), (self.getParcellationImage('mask'), 'brain mask'))
def isDirty(self): return Images((self.getImage('aparc_aseg'), 'parcellation atlas'), (self.getImage('wmparc'), 'wm parcellation'), (self.getImage('anat', 'freesurfer'), 'anatomical'), (self.getImage('rh_ribbon'), 'rh_ribbon'), (self.getImage('lh_ribbon'), 'lh_ribbon'), (self.getImage('norm'), 'norm'), (self.getImage('mask'), 'freesurfer brain masks'), (self.getImage("brainstem"), 'Brainstem label'), (self.getImage("lhHipp"), 'Left Hippocampus label'), (self.getImage("rhHipp"), 'Right Hippocampus label'), (self.getImage('tt5'), '5tt'))
def qaSupplier(self): """Create and supply images for the report generated by qa task """ qaImages = Images() information = "Warning: due to storage restriction, streamlines were " \ "downsampled. Even if there is no difference in structural " \ "connectivity, you should be careful before computing any " \ "metrics along these streamlines.\n To run toad without this " \ "downsampling, please refer to the documentation." if self.defaultQuery: # get images norm = self.getRegistrationImage("norm", "resample") self.__buildNameTractfilteringOutputs() # images production tags = ( (self.outputs[0], 'Corpus Callosum', 95, 60, 40, -80, 0, 160), (self.outputs[1], 'Inferior Fronto Occipital tract left', 95, 80, 40, -90, 0, 90), (self.outputs[2], 'Inferior Fronto Occipital tract right', 95, 80, 40, -90, 0, -90), (self.outputs[3], 'inferior Longitudinal Fasciculus left', 95, 80, 40, -90, 0, 90), (self.outputs[4], 'Inferior Longitudinal Fasciculus right', 95, 80, 40, -90, 0, -90), (self.outputs[5], 'Uncinate Fasciculus left', 95, 80, 40, -90, 0, 90), (self.outputs[6], 'Uncinate Fasciculus right', 95, 80, 40, -90, 0, -90), (self.outputs[7], 'Corticospinal tract Left', 95, 80, 40, -90, 0, 160), (self.outputs[8], 'Corticospinal tract right', 95, 80, 40, -90, 0, 200), ) for data, description, xSlice, ySlice, zSlice, xRot, yRot, zRot in tags: if data is not None: imageQa = self.plotTrk(data, norm, None, xSlice, ySlice, zSlice, xRot, yRot, zRot) qaImages.append((imageQa, description)) else: # Add message about QA pass else: information = """ Because you didn't choose default queries and dictionnary, we are not able to create proper screenshots of the output bundles. """ qaImages.setInformation(information) return qaImages
def isDirty(self): """Validate if this tasks need to be submit for implementation """ return Images( (self.getImage('dwi', 'v1'), "1st eigenvector"), (self.getImage('dwi', 'v2'), "2rd eigenvector"), (self.getImage('dwi', 'v3'), "3rd eigenvector"), (self.getImage('dwi', 'ad'), "selected eigenvalue(s) AD"), (self.getImage('dwi', 'rd'), "selected eigenvalue(s) RD"), (self.getImage('dwi', 'md'), "mean diffusivity"), (self.getImage('dwi', 'fa'), "fractional anisotropy"), (self.getImage('dwi', 'so'), "raw T2 signal with no weighting"))
def __noiseAnalysis(self, dwi, noiseMask, ccMask, qaImages, description): """ """ snrPng = self.buildName(dwi, 'snr', 'png') histPng = self.buildName(dwi, 'hist', 'png') self.noiseAnalysis(dwi, noiseMask, ccMask, snrPng, histPng) qaImages.extend( Images( (snrPng, '{} DWI image: SNR for each volume'.format(description)), (histPng, '{} DWI image: noise histogram'.format(description)), )) return qaImages
def isDirty(self): return Images( (self.getImage('anat', 'resample'), 'anatomical resampled'), (self.getImage('aparc_aseg', 'resample'), 'parcellation atlas resample'), (self.getImage( 'aparc_aseg', 'register'), 'parcellation atlas register'), (self.getImage('wmparc', 'resample'), 'white matter parcellation atlas resample'), (self.getImage('wmparc', 'register'), 'white matter parcellation atlas register'), (self.getImage('tt5', 'register'), '5tt image register'), (self.getImage('mask', 'register'), 'brain mask register'), (self.getImage('tt5', 'resample'), '5tt image resample'), (self.getImage('mask', 'resample'), 'brain mask resample'), (self.getImage('norm', 'resample'), 'brain resample'))
def meetRequirement(self): """Validate if all requirements have been met prior to launch the task Returns: True if all requirement are meet, False otherwise """ images = Images() dwi = self.getUpsamplingImage('dwi', 'upsample') nbDirections = mriutil.getNbDirectionsFromDWI( dwi) # Get number of directions if nbDirections <= 45 and not self.get('tractographymrtrix', 'forceHardi'): postfixTractography = 'tensor_prob' else: postfixTractography = 'hardi_prob' Images((self.getTractographymrtrixImage('dwi', postfixTractography, 'trk'), 'Tractography file'), (self.__getAtlas(), 'Atlas')) # Check if tractographies are available return images
def meetRequirement(self): images = Images( (self.getUpsamplingImage('dwi'), 'diffusion weighted'), (self.getUpsamplingImage('grad', None, 'bvals'), 'gradient .bvals encoding file'), (self.getUpsamplingImage( 'grad', None, 'bvecs'), 'gradient .bvecs encoding file'), (self.getUpsamplingImage('grad', None, 'benc'), 'gradient .b encoding file'), (self.getRegistrationImage('anat', ['freesurfer', 'resample']), 'freesurfer anatomical resample'), (self.getRegistrationImage( 'mask', 'resample'), 'freesurfer mask resample')) #@TODO Add all metrics dependencies return images
def meetRequirement(self): #@TODO add brain mask and 5tt as requierement return Images( (self.getUpsamplingImage('dwi', 'upsample'), 'upsampled diffusion weighted'), (self.getUpsamplingImage( 'grad', None, 'b'), '.b gradient encoding file'), (self.getRegistrationImage("mask", "resample"), 'mask resampled'), (self.getRegistrationImage("norm", "resample"), 'brain resampled'), (self.getMaskingImage( 'aparc_aseg', ['253', 'mask']), 'area 253 from aparc_aseg'), (self.getRegistrationImage("tt5", "register"), '5tt register'), (self.getMaskingImage( 'aparc_aseg', ['1024', 'mask']), 'area 1024 from aparc_aseg'), (self.getMaskingImage("tt5", ["register", "5tt2gmwmi"]), 'grey matter, white matter interface'))