annotate diffusion_signal_reconstruction.py @ 10:7bcc39c8ccfd draft

Uploaded
author greg
date Thu, 30 Nov 2017 08:51:01 -0500
parents dc700deb06c1
children bca3ded6d5cc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
fe569aad237c Uploaded
greg
parents:
diff changeset
1 #!/usr/bin/env python
fe569aad237c Uploaded
greg
parents:
diff changeset
2 import argparse
9
dc700deb06c1 Uploaded
greg
parents: 3
diff changeset
3 import os
0
fe569aad237c Uploaded
greg
parents:
diff changeset
4 import shutil
fe569aad237c Uploaded
greg
parents:
diff changeset
5
fe569aad237c Uploaded
greg
parents:
diff changeset
6 from dipy.data import fetch_sherbrooke_3shell
fe569aad237c Uploaded
greg
parents:
diff changeset
7 from dipy.data import fetch_stanford_hardi
fe569aad237c Uploaded
greg
parents:
diff changeset
8 from dipy.data import get_sphere
fe569aad237c Uploaded
greg
parents:
diff changeset
9 from dipy.data import read_sherbrooke_3shell
fe569aad237c Uploaded
greg
parents:
diff changeset
10 from dipy.data import read_stanford_hardi
fe569aad237c Uploaded
greg
parents:
diff changeset
11 from dipy.reconst import dti
fe569aad237c Uploaded
greg
parents:
diff changeset
12 from dipy.reconst.dti import color_fa
fe569aad237c Uploaded
greg
parents:
diff changeset
13 from dipy.reconst.dti import fractional_anisotropy
fe569aad237c Uploaded
greg
parents:
diff changeset
14 from dipy.segment.mask import median_otsu
fe569aad237c Uploaded
greg
parents:
diff changeset
15 from dipy.viz import fvtk
fe569aad237c Uploaded
greg
parents:
diff changeset
16 from matplotlib import pyplot
fe569aad237c Uploaded
greg
parents:
diff changeset
17
fe569aad237c Uploaded
greg
parents:
diff changeset
18 import nibabel
fe569aad237c Uploaded
greg
parents:
diff changeset
19 import numpy
fe569aad237c Uploaded
greg
parents:
diff changeset
20
fe569aad237c Uploaded
greg
parents:
diff changeset
21 # http://nipy.org/dipy/examples_built/reconst_dti.html#example-reconst-dti
fe569aad237c Uploaded
greg
parents:
diff changeset
22 parser = argparse.ArgumentParser()
9
dc700deb06c1 Uploaded
greg
parents: 3
diff changeset
23 parser.add_argument('--input', dest='input', help='Input dataset')
dc700deb06c1 Uploaded
greg
parents: 3
diff changeset
24 parser.add_argument('--input_extra_files_path', dest='input_extra_files_path', help='Input dataset extra files path')
0
fe569aad237c Uploaded
greg
parents:
diff changeset
25 parser.add_argument('--output_nifti1_fa', dest='output_nifti1_fa', help='Output fractional anisotropy Nifti1 dataset')
9
dc700deb06c1 Uploaded
greg
parents: 3
diff changeset
26 parser.add_argument('--output_nifti1_fa_files_path', dest='output_nifti1_fa_files_path', help='Output fractional anisotropy Nifti1 extra files path')
3
85df19d98cd0 Uploaded
greg
parents: 0
diff changeset
27 parser.add_argument('--output_nifti1_evecs', dest='output_nifti1_evecs', help='Output eigen vectors Nifti1 dataset')
9
dc700deb06c1 Uploaded
greg
parents: 3
diff changeset
28 parser.add_argument('--output_nifti1_evecs_files_path', dest='output_nifti1_evecs_files_path', help='Output eigen vectors Nifti1 extra files path')
0
fe569aad237c Uploaded
greg
parents:
diff changeset
29 parser.add_argument('--output_nifti1_md', dest='output_nifti1_md', help='Output mean diffusivity Nifti1 dataset')
9
dc700deb06c1 Uploaded
greg
parents: 3
diff changeset
30 parser.add_argument('--output_nifti1_md_files_path', dest='output_nifti1_md_files_path', help='Output mean diffusivity Nifti1 extra files path')
0
fe569aad237c Uploaded
greg
parents:
diff changeset
31 parser.add_argument('--output_nifti1_rgb', dest='output_nifti1_rgb', help='Output RGB-map Nifti1 dataset')
9
dc700deb06c1 Uploaded
greg
parents: 3
diff changeset
32 parser.add_argument('--output_nifti1_rgb_files_path', dest='output_nifti1_rgb_files_path', help='Output RGB-map Nifti1 extra files path')
0
fe569aad237c Uploaded
greg
parents:
diff changeset
33 parser.add_argument('--output_png_ellipsoids', dest='output_png_ellipsoids', help='Output ellipsoids PNG dataset')
fe569aad237c Uploaded
greg
parents:
diff changeset
34 parser.add_argument('--output_png_odfs', dest='output_png_odfs', help='Output orientation distribution functions PNG dataset')
fe569aad237c Uploaded
greg
parents:
diff changeset
35 parser.add_argument('--output_png_middle_axial_slice', dest='output_png_middle_axial_slice', help='Output middle axial slice PNG dataset')
fe569aad237c Uploaded
greg
parents:
diff changeset
36
fe569aad237c Uploaded
greg
parents:
diff changeset
37 args = parser.parse_args()
fe569aad237c Uploaded
greg
parents:
diff changeset
38
9
dc700deb06c1 Uploaded
greg
parents: 3
diff changeset
39 def move_directory_files(source_dir, destination_dir, copy=False, remove_source_dir=False):
dc700deb06c1 Uploaded
greg
parents: 3
diff changeset
40 source_directory = os.path.abspath(source_dir)
dc700deb06c1 Uploaded
greg
parents: 3
diff changeset
41 destination_directory = os.path.abspath(destination_dir)
dc700deb06c1 Uploaded
greg
parents: 3
diff changeset
42 if not os.path.isdir(destination_directory):
dc700deb06c1 Uploaded
greg
parents: 3
diff changeset
43 os.makedirs(destination_directory)
dc700deb06c1 Uploaded
greg
parents: 3
diff changeset
44 for dir_entry in os.listdir(source_directory):
dc700deb06c1 Uploaded
greg
parents: 3
diff changeset
45 source_entry = os.path.join(source_directory, dir_entry)
dc700deb06c1 Uploaded
greg
parents: 3
diff changeset
46 if copy:
dc700deb06c1 Uploaded
greg
parents: 3
diff changeset
47 shutil.copy(source_entry, destination_directory)
dc700deb06c1 Uploaded
greg
parents: 3
diff changeset
48 else:
dc700deb06c1 Uploaded
greg
parents: 3
diff changeset
49 shutil.move(source_entry, destination_directory)
dc700deb06c1 Uploaded
greg
parents: 3
diff changeset
50 if remove_source_dir:
dc700deb06c1 Uploaded
greg
parents: 3
diff changeset
51 os.rmdir(source_directory)
dc700deb06c1 Uploaded
greg
parents: 3
diff changeset
52
0
fe569aad237c Uploaded
greg
parents:
diff changeset
53 # Get input data.
9
dc700deb06c1 Uploaded
greg
parents: 3
diff changeset
54 # TODO: do not hard-code 'stanford_hardi'
dc700deb06c1 Uploaded
greg
parents: 3
diff changeset
55 input_dir = 'stanford_hardi'
dc700deb06c1 Uploaded
greg
parents: 3
diff changeset
56 os.mkdir(input_dir)
dc700deb06c1 Uploaded
greg
parents: 3
diff changeset
57 for f in os.list_dir(args.input_extra_files_path):
10
7bcc39c8ccfd Uploaded
greg
parents: 9
diff changeset
58 shutil.copy(os.path.join(args.input_extra_files_path, f), input_dir)
9
dc700deb06c1 Uploaded
greg
parents: 3
diff changeset
59 img, gtab = read_stanford_hardi()
0
fe569aad237c Uploaded
greg
parents:
diff changeset
60
fe569aad237c Uploaded
greg
parents:
diff changeset
61 data = img.get_data()
fe569aad237c Uploaded
greg
parents:
diff changeset
62 maskdata, mask = median_otsu(data, 3, 1, True, vol_idx=range(10, 50), dilate=2)
fe569aad237c Uploaded
greg
parents:
diff changeset
63
fe569aad237c Uploaded
greg
parents:
diff changeset
64 axial_middle = data.shape[2] // 2
fe569aad237c Uploaded
greg
parents:
diff changeset
65 pyplot.subplot(1, 2, 1).set_axis_off()
fe569aad237c Uploaded
greg
parents:
diff changeset
66 pyplot.imshow(data[:, :, axial_middle, 0].T, cmap='gray', origin='lower')
fe569aad237c Uploaded
greg
parents:
diff changeset
67 pyplot.subplot(1, 2, 2).set_axis_off()
fe569aad237c Uploaded
greg
parents:
diff changeset
68 pyplot.imshow(data[:, :, axial_middle, 10].T, cmap='gray', origin='lower')
fe569aad237c Uploaded
greg
parents:
diff changeset
69 pyplot.savefig('middle_axial.png', bbox_inches='tight')
fe569aad237c Uploaded
greg
parents:
diff changeset
70 shutil.move('middle_axial.png', args.output_png_middle_axial_slice)
fe569aad237c Uploaded
greg
parents:
diff changeset
71
fe569aad237c Uploaded
greg
parents:
diff changeset
72 tenmodel = dti.TensorModel(gtab)
fe569aad237c Uploaded
greg
parents:
diff changeset
73 tenfit = tenmodel.fit(maskdata)
fe569aad237c Uploaded
greg
parents:
diff changeset
74
fe569aad237c Uploaded
greg
parents:
diff changeset
75 fa = fractional_anisotropy(tenfit.evals)
fe569aad237c Uploaded
greg
parents:
diff changeset
76 fa[numpy.isnan(fa)] = 0
fe569aad237c Uploaded
greg
parents:
diff changeset
77 fa_img = nibabel.Nifti1Image(fa.astype(numpy.float32), img.affine)
fe569aad237c Uploaded
greg
parents:
diff changeset
78 nibabel.save(fa_img, 'output_fa.nii')
fe569aad237c Uploaded
greg
parents:
diff changeset
79 shutil.move('output_fa.nii', args.output_nifti1_fa)
9
dc700deb06c1 Uploaded
greg
parents: 3
diff changeset
80 move_directory_files(input_dir, args.output_nifti1_fa_files_path)
0
fe569aad237c Uploaded
greg
parents:
diff changeset
81
fe569aad237c Uploaded
greg
parents:
diff changeset
82 evecs_img = nibabel.Nifti1Image(tenfit.evecs.astype(numpy.float32), img.affine)
fe569aad237c Uploaded
greg
parents:
diff changeset
83 nibabel.save(evecs_img, 'output_evecs.nii')
fe569aad237c Uploaded
greg
parents:
diff changeset
84 shutil.move('output_evecs.nii', args.output_nifti1_evecs)
9
dc700deb06c1 Uploaded
greg
parents: 3
diff changeset
85 move_directory_files(input_dir, args.output_nifti1_evecs_files_path)
0
fe569aad237c Uploaded
greg
parents:
diff changeset
86
fe569aad237c Uploaded
greg
parents:
diff changeset
87 md1 = dti.mean_diffusivity(tenfit.evals)
fe569aad237c Uploaded
greg
parents:
diff changeset
88 nibabel.save(nibabel.Nifti1Image(md1.astype(numpy.float32), img.affine), 'output_md.nii')
fe569aad237c Uploaded
greg
parents:
diff changeset
89 shutil.move('output_md.nii', args.output_nifti1_md)
9
dc700deb06c1 Uploaded
greg
parents: 3
diff changeset
90 move_directory_files(input_dir, args.output_nifti1_md_files_path)
0
fe569aad237c Uploaded
greg
parents:
diff changeset
91
fe569aad237c Uploaded
greg
parents:
diff changeset
92 fa = numpy.clip(fa, 0, 1)
fe569aad237c Uploaded
greg
parents:
diff changeset
93 rgb = color_fa(fa, tenfit.evecs)
fe569aad237c Uploaded
greg
parents:
diff changeset
94 nibabel.save(nibabel.Nifti1Image(numpy.array(255 * rgb, 'uint8'), img.affine), 'output_rgb.nii')
fe569aad237c Uploaded
greg
parents:
diff changeset
95 shutil.move('output_rgb.nii', args.output_nifti1_rgb)
9
dc700deb06c1 Uploaded
greg
parents: 3
diff changeset
96 move_directory_files(input_dir, args.output_nifti1_rgb_files_path)
0
fe569aad237c Uploaded
greg
parents:
diff changeset
97
fe569aad237c Uploaded
greg
parents:
diff changeset
98 sphere = get_sphere('symmetric724')
fe569aad237c Uploaded
greg
parents:
diff changeset
99 ren = fvtk.ren()
fe569aad237c Uploaded
greg
parents:
diff changeset
100
fe569aad237c Uploaded
greg
parents:
diff changeset
101 evals = tenfit.evals[13:43, 44:74, 28:29]
fe569aad237c Uploaded
greg
parents:
diff changeset
102 evecs = tenfit.evecs[13:43, 44:74, 28:29]
fe569aad237c Uploaded
greg
parents:
diff changeset
103 cfa = rgb[13:43, 44:74, 28:29]
fe569aad237c Uploaded
greg
parents:
diff changeset
104 cfa /= cfa.max()
fe569aad237c Uploaded
greg
parents:
diff changeset
105 fvtk.add(ren, fvtk.tensor(evals, evecs, cfa, sphere))
fe569aad237c Uploaded
greg
parents:
diff changeset
106 fvtk.record(ren, n_frames=1, out_path='tensor_ellipsoids.png', size=(600, 600))
fe569aad237c Uploaded
greg
parents:
diff changeset
107 shutil.move('tensor_ellipsoids.png', args.output_png_ellipsoids)
fe569aad237c Uploaded
greg
parents:
diff changeset
108
fe569aad237c Uploaded
greg
parents:
diff changeset
109 fvtk.clear(ren)
fe569aad237c Uploaded
greg
parents:
diff changeset
110
fe569aad237c Uploaded
greg
parents:
diff changeset
111 tensor_odfs = tenmodel.fit(data[20:50, 55:85, 38:39]).odf(sphere)
fe569aad237c Uploaded
greg
parents:
diff changeset
112 fvtk.add(ren, fvtk.sphere_funcs(tensor_odfs, sphere, colormap=None))
fe569aad237c Uploaded
greg
parents:
diff changeset
113 fvtk.record(ren, n_frames=1, out_path='tensor_odfs.png', size=(600, 600))
fe569aad237c Uploaded
greg
parents:
diff changeset
114 shutil.move('tensor_odfs.png', args.output_png_odfs)