/usr/bin/dipy_quickbundles is in python-dipy 0.7.1-2.
This file is owned by root:root, with mode 0o755.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 | #!/usr/bin/python
from dipy.fixes import argparse as arg
import os
import warnings
import dipy.io.pickles as pkl
import numpy as np
import scipy.io as sio
from nibabel import trackvis
import dipy.segment.quickbundles as qb
parser = arg.ArgumentParser(description='Segment a fiber-group into clusters using the QuickBundles algorithm (Garyfallidis et al. 2012)')
parser.add_argument('in_file', action='store', metavar='File',
help='Trackvis fiber file (.trk) or Vistasoft fiber-group file (.mat)')
parser.add_argument('--dist_thr', action='store', metavar='Float',
help='Distance threshold (default: 30.)', default=30.)
parser.add_argument('--pts', action='store', metavar='Int',
help='Points (default: 12)', default=12)
parser.add_argument('--pkl_file', action='store', metavar='File',
help='Whether to save a QB object in pickle format. Provide full path to the file name (default: none)')
parser.add_argument('--out_file', action='store', metavar='File',
help='Full path to the output file name (defaults to the same location as the original input file')
params = parser.parse_args()
if __name__ == "__main__":
def gimme_clusters(streamlines, th, pts):
bundles = qb.QuickBundles(streamlines,
dist_thr=th,
pts=pts)
return bundles, bundles.clusters(), bundles.centroids
fname_orig = params.in_file
split = os.path.splitext(fname_orig)
if params.in_file.endswith('.trk'):
tracks, hdr = trackvis.read(params.in_file)
streamlines = [fibers[0] for fibers in tracks]
bundles, clusters, centroids = gimme_clusters(streamlines,
np.float(params.dist_thr),
np.int(params.pts))
for c in clusters:
new_streamlines = [(s, None, None) for s in
np.array(streamlines)[clusters[c]['indices']]]
if params.out_file:
this_split = params.out_file.split('.')
out_fname_clust = this_split[0] + '_%s'%(c + 1) + '.trk'
else:
out_fname_clust = split[0] + '_%s'%(c + 1) + split[1]
trackvis.write(out_fname_clust, new_streamlines, hdr)
if params.out_file:
this_split = params.out_file.split('.')
out_fname_cent = this_split[0] + '_centroids' + '.trk'
else:
out_fname_cent = split[0] + '_centroids' + split[1]
trackvis.write(out_fname_cent, [(s, None, None) for s in centroids], hdr)
elif params.in_file.endswith('.mat'):
# Once read this as a mat-object
fg_mat = sio.loadmat(params.in_file, struct_as_record=False,
squeeze_me=True)
# So that you can painlessly get the fiber-group:
fg = fg_mat['fg']
# And once as a non-struct, so that you can use this later to pass back
# to savemat:
fg_mat_clust = sio.loadmat(params.in_file, squeeze_me=True)
fg_mat_cent = sio.loadmat(params.in_file, squeeze_me=True)
name_orig = fg.name
fibers = fg.fibers
streamlines = np.array([np.array(ff).T for ff in fibers])
bundles, clusters, centroids = gimme_clusters(streamlines,
np.float(params.dist_thr),
np.int(params.pts))
# We will give each cluster a different random RGB color:
cmap_arr = np.random.rand(len(clusters), 3)
# We prepare a struct array to assign into with the original dtype:
dt = [('name', 'O'),
('colorRgb', 'O'),
('thickness', 'O'),
('visible', 'O'),
('seeds', 'O'),
('seedRadius', 'O'),
('seedVoxelOffsets', 'O'),
('params', 'O'),
('fibers', 'O'),
('query_id', 'O')]
cluster_arr = np.empty(len(clusters), dtype=dt)
centroid_arr = np.empty(len(clusters), dtype=dt)
for c in clusters:
ff = streamlines[clusters[c]['indices']]
new_fibers = np.empty(len(ff), dtype=object)
for f in range(new_fibers.shape[0]):
new_fibers[f] = ff[f].T
cluster_arr[c]['fibers'] = new_fibers
cluster_arr[c]['colorRgb']=\
np.array(cmap_arr[c]).astype(np.float).reshape(1,3)
cluster_arr[c]['name'] = str(name_orig) + '_%s'%(c + 1)
centroid_arr[c]['fibers'] = centroids[c].T
centroid_arr[c]['colorRgb']=\
np.array(cmap_arr[c]).astype(np.float).reshape(1,3)
for d in dt:
if cluster_arr[c][d[0]] is None:
cluster_arr[c][d[0]] = fg_mat_clust['fg'][d[0]]
if centroid_arr[c][d[0]] is None:
centroid_arr[c][d[0]] = fg_mat_cent['fg'][d[0]]
fg_mat_clust['fg'] = cluster_arr
fg_mat_cent['fg'] = centroid_arr
with warnings.catch_warnings():
warnings.simplefilter("ignore")
if params.out_file:
out_fname_clust = params.out_file + '_cluster.mat'
out_fname_cent = params.out_file + '_centroids.mat'
else:
out_fname_clust = split[0] + '_cluster.mat'
out_fname_cent = split[0] + '_centroids.mat'
sio.savemat(out_fname_cent, fg_mat_cent)
sio.savemat(out_fname_clust, fg_mat_clust)
else:
raise ValueError('Unrecognized file-format')
if params.pkl_file:
pkl.save_pickle(params.pkl_file, bundles)
|