Source code for AFQ.recognition.preprocess

import numpy as np
import pimms
from time import time
import logging

import dipy.tracking.streamline as dts

import AFQ.recognition.utils as abu


[docs]logger = logging.getLogger('AFQ')
@pimms.calc("tol", "dist_to_atlas", "vox_dim")
[docs]def tolerance_mm_to_vox(img, dist_to_waypoint, input_dist_to_atlas): # We need to calculate the size of a voxel, so we can transform # from mm to voxel units: R = img.affine[0:3, 0:3] vox_dim = np.mean(np.diag(np.linalg.cholesky(R.T.dot(R)))) # Tolerance is set to the square of the distance to the corner # because we are using the squared Euclidean distance in calls to # `cdist` to make those calls faster. if dist_to_waypoint is None: tol = dts.dist_to_corner(img.affine) else: tol = dist_to_waypoint / vox_dim dist_to_atlas = int(input_dist_to_atlas / vox_dim) return tol, dist_to_atlas, vox_dim
@pimms.calc("fgarray")
[docs]def fgarray(tg): """ Streamlines resampled to 20 points. """ logger.info("Resampling Streamlines...") start_time = time() fg_array = np.array(abu.resample_tg(tg, 20)) logger.info(( "Streamlines Resampled " f"(time: {time()-start_time}s)")) return fg_array
@pimms.calc("crosses")
[docs]def crosses(fgarray, img): """ Classify the streamlines by whether they cross the midline. Creates a crosses attribute which is an array of booleans. Each boolean corresponds to a streamline, and is whether or not that streamline crosses the midline. """ # What is the x,y,z coordinate of 0,0,0 in the template space? zero_coord = np.dot(np.linalg.inv(img.affine), np.array([0, 0, 0, 1])) return np.logical_and( np.any(fgarray[:, :, 0] > zero_coord[0], axis=1), np.any(fgarray[:, :, 0] < zero_coord[0], axis=1))
# Things that can be calculated for multiple bundles at once # (i.e., for a whole tractogram) go here
[docs]def get_preproc_plan(img, tg, dist_to_waypoint, dist_to_atlas): preproc_plan = pimms.Plan( tolerance_mm_to_vox=tolerance_mm_to_vox, fgarray=fgarray, crosses=crosses) return preproc_plan( img=img, tg=tg, dist_to_waypoint=dist_to_waypoint, input_dist_to_atlas=dist_to_atlas)