Source code for AFQ.tractography.utils

import logging
from time import time

import dipy.tracking.utils as dtu
import numpy as np

[docs] logger = logging.getLogger("AFQ")
[docs] def get_percentile_threshold(mask, threshold): zero_mask = mask == 0 mask[zero_mask] = np.nan new_threshold = np.nanpercentile(mask, 100 - threshold) mask[zero_mask] = 0 return new_threshold
[docs] def _is_int(val): if isinstance(val, np.ndarray): return False if isinstance(val, int): return True elif isinstance(val, float): if val.is_integer(): return True else: raise ValueError(f"n_seeds is set to {val}, which is not an integer")
[docs] def gen_seeds( seed_mask, seed_threshold, n_seeds, thresholds_as_percentages, random_seeds, rng_seed, affine, ): """ Generate seeds for tracking. For parameters, see :func:`AFQ.tractography.tractography.track`. """ logger.info("Generating Seeds...") start_time = time() if _is_int(n_seeds): # If it's float type, cast to integer: if isinstance(n_seeds, float): n_seeds = int(n_seeds) if len(np.unique(seed_mask)) > 2: if thresholds_as_percentages: seed_threshold = get_percentile_threshold(seed_mask, seed_threshold) seed_mask = seed_mask > seed_threshold if random_seeds: seeds = dtu.random_seeds_from_mask( seed_mask, seeds_count=n_seeds, seed_count_per_voxel=False, affine=affine, random_seed=rng_seed, ) else: seeds = dtu.seeds_from_mask(seed_mask, density=n_seeds, affine=affine) else: # If user provided an array, we'll use n_seeds as the seeds: seeds = np.asarray(n_seeds) if len(seeds.shape) == 1: seeds = seeds[None, ...] logger.info(f"Generated {len(seeds)} seeds in {time() - start_time:.2f} seconds.") logger.info(f"Tracking with {len(seeds)} seeds...") return seeds