Source code for difit.workflows.dki

from . bin import config
from .inputnode import   inputfiles
[docs]def dki_wf(): """dti workflow""" from nipype import Workflow, Node, Function # Load data # Load data def data_loading(fdwi, fbvals, fbvecs, fmask, foutdir): from dipy.io.image import load_nifti from dipy.io.image import load_nifti_data from dipy.io.gradients import read_bvals_bvecs import numpy as np dwi, affine = load_nifti(fdwi) mask = load_nifti_data(fmask) bvals, bvecs = read_bvals_bvecs(fbvals, fbvecs) #data = [dwi, bvals, bvecs, mask, affine, foutdir] #del (dwi, affine, mask, bvals, bvecs) return dwi, bvals, bvecs, mask, affine, foutdir data_node = Node(Function( input_names=['fdwi', 'fbvals','fbvecs','fmask','foutdir'], output_names=['dwi','bvals','bvecs','mask','affine','foutdir'], function=data_loading), name='load_data' ) def dki_prepare(dwi, bvals, bvecs, mask, affine, foutdir, B0, B_values): from dipy.core.gradients import gradient_table import numpy as np outdir = foutdir b0 = B0 b0_images = np.array([False]*len(bvals)) b0_logical = (bvals < 50) for i in range(len(b0_logical)): if np.count_nonzero(b0_images)<b0 and b0_logical[i]: b0_images[i] = True b_values = B_values bval_num = len(b_values) shells = np.array([[False]*(len(bvals))]*bval_num) for k,p in zip(range(bval_num), b_values): shells[k] = np.logical_and(p-50 < bvals, bvals< p+50) dki_shell = np.array([False]*(len(bvals))) for l in shells: for m in range(len(bvals)): if l[m]: dki_shell[m]= True for n in range(len(b0_images)): if b0_images[n]: dki_shell[n]=True print("dki gradient indices done.") dki_data = dwi[..., dki_shell] print("dki data done.") gtab = gradient_table(bvals[dki_shell], bvecs[dki_shell]) print("dki gradient table done.") return dki_data, gtab, mask, affine, outdir dki_prep_node = Node(Function( input_names=['dwi', 'bvals', 'bvecs', 'mask', 'affine', 'foutdir','B0','B_values'], output_names=['dki_data', 'gtab', 'mask', 'affine', 'outdir'], function=dki_prepare), name='dki_preparation' ) dki_prep_node.inputs.B0 = config.Moptions.dki_b0_images dki_prep_node.inputs.B_values = config.Moptions.dki_b_values def dki_model(dki_data, gtab, mask, affine, outdir): import dipy.reconst.dki as dki dkimodel = dki.DiffusionKurtosisModel(gtab) dkifit = dkimodel.fit(dki_data, mask=mask) dki_FA = dkifit.fa dki_MD = dkifit.md dki_AD = dkifit.ad dki_RD = dkifit.rd MK = dkifit.mk(0, 3) AK = dkifit.ak(0, 3) RK = dkifit.rk(0, 3) kFA = dkifit.kfa del dkifit return dki_FA, dki_MD, dki_AD, dki_RD, MK, AK, RK, kFA, affine, outdir dki_model_node = Node(Function( input_names=['dki_data', 'gtab', 'mask', 'affine', 'outdir'], output_names=['dki_FA', 'dki_MD', 'dki_AD', 'dki_RD', 'MK', 'AK', 'RK', 'kFA', 'affine', 'outdir'], function=dki_model), name='dki_model_fitter' ) def dki_save(dki_FA, dki_MD, dki_AD, dki_RD, MK, AK, RK, kFA, affine, outdir): from dipy.io.image import save_nifti from os import path, mkdir dki_dir = path.join(outdir, 'dki') if not path.exists(dki_dir): mkdir(dki_dir) save_nifti(path.join(outdir + '/dki/dki_FA.nii.gz'), dki_FA, affine) save_nifti(path.join(outdir + '/dki/dki_MD.nii.gz'), dki_MD, affine) save_nifti(path.join(outdir + '/dki/dki_AD.nii.gz'), dki_AD, affine) save_nifti(path.join(outdir + '/dki/dki_RD.nii.gz'), dki_RD, affine) save_nifti(path.join(outdir + '/dki/MK.nii.gz'), MK, affine) save_nifti(path.join(outdir + '/dki/AK.nii.gz'), AK, affine) save_nifti(path.join(outdir + '/dki/RK.nii.gz'), RK, affine) save_nifti(path.join(outdir + '/dki/kFA.nii.gz'), kFA, affine) return outdir dki_save_node = Node(Function( input_names=['dki_FA', 'dki_MD', 'dki_AD', 'dki_RD', 'MK', 'AK', 'RK', 'kFA', 'affine', 'outdir'], output_names=['outdir'], function=dki_save), name='dki_save_models' ) def dti_summary(outdir): from weasyprint import HTML, CSS from nilearn.plotting import plot_anat from os import path plot_anat(path.join(outdir + '/dki/dki_FA.nii.gz'), display_mode = 'mosaic', title='dki_FA',output_file=path.join(outdir + '/dki/dki_FA_mosaic.png')) plot_anat(path.join(outdir + '/dki/dki_MD.nii.gz'), display_mode = 'mosaic', title='dki_MD',output_file=path.join(outdir + '/dki/dki_MD_mosaic.png')) plot_anat(path.join(outdir + '/dki/dki_AD.nii.gz'), display_mode = 'mosaic', title='dki_AD',output_file=path.join(outdir + '/dki/dki_AD_mosaic.png')) plot_anat(path.join(outdir + '/dki/dki_RD.nii.gz'), display_mode = 'mosaic', title='dki_RD',output_file=path.join(outdir + '/dki/dki_RD_mosaic.png')) plot_anat(path.join(outdir + '/dki/MK.nii.gz'), display_mode = 'mosaic', title='dki_MK',output_file=path.join(outdir + '/dki/dki_MK_mosaic.png')) plot_anat(path.join(outdir + '/dki/AK.nii.gz'), display_mode = 'mosaic', title='dki_AK',output_file=path.join(outdir + '/dki/dki_AK_mosaic.png')) plot_anat(path.join(outdir + '/dki/RK.nii.gz'), display_mode = 'mosaic', title='dki_RK',output_file=path.join(outdir + '/dki/dki_RK_mosaic.png')) plot_anat(path.join(outdir + '/dki/kFA.nii.gz'), display_mode = 'mosaic', title='dki_kFA',output_file=path.join(outdir + '/dki/dki_kFA_mosaic.png')) # summary html report page_title = 'Summary plots of DKI metrics' title_text = 'Sample plots of DKI metrics' text = 'This document presents sample plots of DKI metrics as a quick way to visually check your results.' dki_fa = path.join(outdir + '/dki/dki_FA_mosaic.png') dki_md = path.join(outdir + '/dki/dki_MD_mosaic.png') dki_ad = path.join(outdir + '/dki/dki_AD_mosaic.png') dki_rd = path.join(outdir + '/dki/dki_RD_mosaic.png') dki_mk = path.join(outdir + '/dki/dki_MK_mosaic.png') dki_ak = path.join(outdir + '/dki/dki_AK_mosaic.png') dki_rk = path.join(outdir + '/dki/dki_RK_mosaic.png') dki_kfa = path.join(outdir + '/dki/dki_kFA_mosaic.png') html = f''' <html> <head> <title>{page_title}</title> </head> <body> <h1>{title_text}</h1> <br> <p>{text}</p> <br><br> <img src={dki_fa} alt='dti_fa' > <br><br><br> <img src={dki_md} alt='dti_md' > <br><br><br> <img src={dki_ad} alt='dti_ad' > <br><br><br> <img src={dki_rd} alt='dti_rd' > <br><br><br> <img src={dki_mk} alt='dti_fa' > <br><br><br> <img src={dki_ak} alt='dti_md' > <br><br><br> <img src={dki_rk} alt='dti_ad' > <br><br><br> <img src={dki_kfa} alt='dti_rd' > </body> </html> ''' with open(path.join(outdir + '/dki/dki_summary_plots.html'), 'w') as f: f.write(html) dki_summary_node = Node(Function( input_names=['outdir'], output_names=['out'], function=dti_summary), name = 'dti_summary_plots' ) dki_workf = Workflow('dki') if isinstance(config.Output.workdir, str): dki_workf.base_dir = config.Output.workdir else: dki_workf.base_dir = config.Output.workdir[0] dki_workf.config['execution']['parameterize_dirs'] = False #avoid long name error # loading data_node inputnode = inputfiles() dki_workf.connect([(inputnode, data_node, [ ('fdwi','fdwi'), ('fbvals','fbvals'), ('fbvecs', 'fbvecs'), ('fmask','fmask'), ('foutdir', 'foutdir')])]) dki_workf.connect([(data_node, dki_prep_node, [ ('dwi','dwi'), ('bvals','bvals'), ('bvecs', 'bvecs'), ('mask','mask'),('affine','affine'), ('foutdir', 'foutdir')])]) dki_workf.connect([(dki_prep_node, dki_model_node, [ ('dki_data','dki_data'), ('gtab','gtab'), ('mask', 'mask'), ('affine','affine'), ('outdir', 'outdir')])]) dki_workf.connect([(dki_model_node, dki_save_node, [ ('dki_FA','dki_FA'), ('dki_MD','dki_MD'), ('dki_AD','dki_AD'), ('dki_RD','dki_RD'), ('MK','MK'), ('AK', 'AK'), ('RK','RK'), ('kFA', 'kFA'), ('affine','affine'), ('outdir', 'outdir')])]) dki_workf.connect(dki_save_node, "outdir", dki_summary_node, "outdir") dki_workf.write_graph(graph2use='exec') dki_workf.run(**config.Nipype.get_plugin())