/usr/lib/python2.7/dist-packages/dipy/io/gradients.py is in python-dipy 0.10.1-1.
This file is owned by root:root, with mode 0o644.
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 | from __future__ import division, print_function, absolute_import
from os.path import splitext
from ..utils.six import string_types
import numpy as np
def read_bvals_bvecs(fbvals, fbvecs):
"""
Read b-values and b-vectors from disk
Parameters
----------
fbvals : str
Full path to file with b-values. None to not read bvals.
fbvecs : str
Full path of file with b-vectors. None to not read bvecs.
Returns
-------
bvals : array, (N,) or None
bvecs : array, (N, 3) or None
Notes
-----
Files can be either '.bvals'/'.bvecs' or '.txt' or '.npy' (containing
arrays stored with the appropriate values).
"""
# Loop over the provided inputs, reading each one in turn and adding them
# to this list:
vals = []
for this_fname in [fbvals, fbvecs]:
# If the input was None, we don't read anything and move on:
if this_fname is None:
vals.append(None)
else:
if isinstance(this_fname, string_types):
base, ext = splitext(this_fname)
if ext in ['.bvals', '.bval', '.bvecs', '.bvec', '.txt', '']:
vals.append(np.squeeze(np.loadtxt(this_fname)))
elif ext == '.npy':
vals.append(np.squeeze(np.load(this_fname)))
else:
e_s = "File type %s is not recognized" % ext
raise ValueError(e_s)
else:
raise ValueError('String with full path to file is required')
# Once out of the loop, unpack them:
bvals, bvecs = vals[0], vals[1]
# If bvecs is None, you can just return now w/o making more checks:
if bvecs is None:
return bvals, bvecs
if bvecs.shape[1] > bvecs.shape[0]:
bvecs = bvecs.T
if min(bvecs.shape) != 3:
raise IOError('bvec file should have three rows')
if bvecs.ndim != 2:
raise IOError('bvec file should be saved as a two dimensional array')
# If bvals is None, you don't need to check that they have the same shape:
if bvals is None:
return bvals, bvecs
if len(bvals.shape) > 1:
raise IOError('bval file should have one row')
if max(bvals.shape) != max(bvecs.shape):
raise IOError('b-values and b-vectors shapes do not correspond')
return bvals, bvecs
|