def run(self, input_files, cluster=False, cluster_thr=15., random_colors=False, length_gt=0, length_lt=1000, clusters_gt=0, clusters_lt=10**8, native_coords=False, stealth=False, emergency_header='icbm_2009a', bg_color=(0, 0, 0), disable_order_transparency=False, buan=False, buan_thr=0.5, buan_highlight=(1, 0, 0), out_dir='', out_stealth_png='tmp.png'): """ Interactive medical visualization - Invert the Horizon! Interact with any number of .trk, .tck or .dpy tractograms and anatomy files .nii or .nii.gz. Cluster streamlines on loading. Parameters ---------- input_files : variable string cluster : bool, optional Enable QuickBundlesX clustering. cluster_thr : float, optional Distance threshold used for clustering. Default value 15.0 for small animal brains you may need to use something smaller such as 2.0. The distance is in mm. For this parameter to be active ``cluster`` should be enabled. random_colors : bool, optional Given multiple tractograms have been included then each tractogram will be shown with different color. length_gt : float, optional Clusters with average length greater than ``length_gt`` amount in mm will be shown. length_lt : float, optional Clusters with average length less than ``length_lt`` amount in mm will be shown. clusters_gt : int, optional Clusters with size greater than ``clusters_gt`` will be shown. clusters_lt : int, optional Clusters with size less than ``clusters_gt`` will be shown. native_coords : bool, optional Show results in native coordinates. stealth : bool, optional Do not use interactive mode just save figure. emergency_header : str, optional If no anatomy reference is provided an emergency header is provided. Current options 'icbm_2009a' and 'icbm_2009c'. bg_color : variable float, optional Define the background color of the scene. Colors can be defined with 1 or 3 values and should be between [0-1]. disable_order_transparency : bool, optional Use depth peeling to sort transparent objects. If True also enables anti-aliasing. buan : bool, optional Enables BUAN framework visualization. buan_thr : float, optional Uses the threshold value to highlight segments on the bundle which have pvalues less than this threshold. buan_highlight : variable float, optional Define the bundle highlight area color. Colors can be defined with 1 or 3 values and should be between [0-1]. For example, a value of (1, 0, 0) would mean the red color. out_dir : str, optional Output directory. (default current directory) out_stealth_png : str, optional Filename of saved picture. References ---------- .. [Horizon_ISMRM19] Garyfallidis E., M-A. Cote, B.Q. Chandio, S. Fadnavis, J. Guaje, R. Aggarwal, E. St-Onge, K.S. Juneja, S. Koudoro, D. Reagan, DIPY Horizon: fast, modular, unified and adaptive visualization, Proceedings of: International Society of Magnetic Resonance in Medicine (ISMRM), Montreal, Canada, 2019. """ verbose = True tractograms = [] images = [] pams = [] numpy_files = [] interactive = not stealth world_coords = not native_coords bundle_colors = None mni_2009a = {} mni_2009a['affine'] = np.array([[1., 0., 0., -98.], [0., 1., 0., -134.], [0., 0., 1., -72.], [0., 0., 0., 1.]]) mni_2009a['dims'] = (197, 233, 189) mni_2009a['vox_size'] = (1., 1., 1.) mni_2009a['vox_space'] = 'RAS' mni_2009c = {} mni_2009c['affine'] = np.array([[1., 0., 0., -96.], [0., 1., 0., -132.], [0., 0., 1., -78.], [0., 0., 0., 1.]]) mni_2009c['dims'] = (193, 229, 193) mni_2009c['vox_size'] = (1., 1., 1.) mni_2009c['vox_space'] = 'RAS' if emergency_header == 'icbm_2009a': hdr = mni_2009c else: hdr = mni_2009c emergency_ref = create_nifti_header(hdr['affine'], hdr['dims'], hdr['vox_size']) io_it = self.get_io_iterator() for input_output in io_it: fname = input_output[0] if verbose: print('Loading file ...') print(fname) print('\n') fl = fname.lower() ends = fl.endswith if ends('.trk'): sft = load_tractogram(fname, 'same', bbox_valid_check=False) tractograms.append(sft) if ends('.dpy') or ends('.tck'): sft = load_tractogram(fname, emergency_ref) tractograms.append(sft) if ends('.nii.gz') or ends('.nii'): data, affine = load_nifti(fname) images.append((data, affine)) if verbose: print('Affine to RAS') np.set_printoptions(3, suppress=True) print(affine) np.set_printoptions() if ends(".pam5"): pam = load_peaks(fname) pams.append(pam) if verbose: print('Peak_dirs shape') print(pam.peak_dirs.shape) if ends(".npy"): data = np.load(fname) numpy_files.append(data) if verbose: print('numpy array length') print(len(data)) if buan: bundle_colors = [] for i in range(len(numpy_files)): n = len(numpy_files[i]) pvalues = numpy_files[i] bundle = tractograms[i].streamlines indx = assignment_map(bundle, bundle, n) ind = np.array(indx) nb_lines = len(bundle) lines_range = range(nb_lines) points_per_line = [len(bundle[i]) for i in lines_range] points_per_line = np.array(points_per_line, np.intp) cols_arr = line_colors(bundle) colors_mapper = np.repeat(lines_range, points_per_line, axis=0) vtk_colors = numpy_to_vtk_colors(255 * cols_arr[colors_mapper]) colors = numpy_support.vtk_to_numpy(vtk_colors) colors = (colors - np.min(colors)) / np.ptp(colors) for i in range(n): if pvalues[i] < buan_thr: colors[ind == i] = buan_highlight bundle_colors.append(colors) if len(bg_color) == 1: bg_color *= 3 elif len(bg_color) != 3: raise ValueError('You need 3 values to set up backgound color. ' 'e.g --bg_color 0.5 0.5 0.5') order_transparent = not disable_order_transparency horizon(tractograms=tractograms, images=images, pams=pams, cluster=cluster, cluster_thr=cluster_thr, random_colors=random_colors, bg_color=bg_color, order_transparent=order_transparent, length_gt=length_gt, length_lt=length_lt, clusters_gt=clusters_gt, clusters_lt=clusters_lt, world_coords=world_coords, interactive=interactive, buan=buan, buan_colors=bundle_colors, out_png=pjoin(out_dir, out_stealth_png))
def buan_bundle_profiles(model_bundle_folder, bundle_folder, orig_bundle_folder, metric_folder, group_id, subject, no_disks=100, out_dir=''): """ Applies statistical analysis on bundles and saves the results in a directory specified by ``out_dir``. Parameters ---------- model_bundle_folder : string Path to the input model bundle files. This path may contain wildcards to process multiple inputs at once. bundle_folder : string Path to the input bundle files in common space. This path may contain wildcards to process multiple inputs at once. orig_folder : string Path to the input bundle files in native space. This path may contain wildcards to process multiple inputs at once. metric_folder : string Path to the input dti metric or/and peak files. It will be used as metric for statistical analysis of bundles. group_id : integer what group subject belongs to either 0 for control or 1 for patient subject : string subject id e.g. 10001 no_disks : integer, optional Number of disks used for dividing bundle into disks. (Default 100) out_dir : string, optional Output directory (default input file directory) References ---------- .. [Chandio19] Chandio, B.Q., S. Koudoro, D. Reagan, J. Harezlak, E. Garyfallidis, Bundle Analytics: a computational and statistical analyses framework for tractometric studies, Proceedings of: International Society of Magnetic Resonance in Medicine (ISMRM), Montreal, Canada, 2019. """ t = time() dt = dict() mb = glob(os.path.join(model_bundle_folder, "*.trk")) print(mb) mb.sort() bd = glob(os.path.join(bundle_folder, "*.trk")) bd.sort() print(bd) org_bd = glob(os.path.join(orig_bundle_folder, "*.trk")) org_bd.sort() print(org_bd) n = len(org_bd) n = len(mb) for io in range(n): mbundles = load_tractogram(mb[io], reference='same', bbox_valid_check=False).streamlines bundles = load_tractogram(bd[io], reference='same', bbox_valid_check=False).streamlines orig_bundles = load_tractogram(org_bd[io], reference='same', bbox_valid_check=False).streamlines if len(orig_bundles) > 5: indx = assignment_map(bundles, mbundles, no_disks) ind = np.array(indx) metric_files_names_dti = glob(os.path.join(metric_folder, "*.nii.gz")) metric_files_names_csa = glob(os.path.join(metric_folder, "*.pam5")) _, affine = load_nifti(metric_files_names_dti[0]) affine_r = np.linalg.inv(affine) transformed_orig_bundles = transform_streamlines(orig_bundles, affine_r) for mn in range(len(metric_files_names_dti)): ab = os.path.split(metric_files_names_dti[mn]) metric_name = ab[1] fm = metric_name[:-7] bm = os.path.split(mb[io])[1][:-4] logging.info("bm = " + bm) dt = dict() logging.info("metric = " + metric_files_names_dti[mn]) metric, _ = load_nifti(metric_files_names_dti[mn]) anatomical_measures(transformed_orig_bundles, metric, dt, fm, bm, subject, group_id, ind, out_dir) for mn in range(len(metric_files_names_csa)): ab = os.path.split(metric_files_names_csa[mn]) metric_name = ab[1] fm = metric_name[:-5] bm = os.path.split(mb[io])[1][:-4] logging.info("bm = " + bm) logging.info("metric = " + metric_files_names_csa[mn]) dt = dict() metric = load_peaks(metric_files_names_csa[mn]) peak_values(transformed_orig_bundles, metric, dt, fm, bm, subject, group_id, ind, out_dir) print("total time taken in minutes = ", (-t + time())/60)
def buan_bundle_profiles(model_bundle_folder, bundle_folder, orig_bundle_folder, metric_folder, group_id, subject, no_disks=100, out_dir=''): """ Applies statistical analysis on bundles and saves the results in a directory specified by ``out_dir``. Parameters ---------- model_bundle_folder : string Path to the input model bundle files. This path may contain wildcards to process multiple inputs at once. bundle_folder : string Path to the input bundle files in common space. This path may contain wildcards to process multiple inputs at once. orig_folder : string Path to the input bundle files in native space. This path may contain wildcards to process multiple inputs at once. metric_folder : string Path to the input dti metric or/and peak files. It will be used as metric for statistical analysis of bundles. group_id : integer what group subject belongs to either 0 for control or 1 for patient. subject : string subject id e.g. 10001. no_disks : integer, optional Number of disks used for dividing bundle into disks. out_dir : string, optional Output directory. (default current directory) References ---------- .. [Chandio2020] Chandio, B.Q., Risacher, S.L., Pestilli, F., Bullock, D., Yeh, FC., Koudoro, S., Rokem, A., Harezlak, J., and Garyfallidis, E. Bundle analytics, a computational framework for investigating the shapes and profiles of brain pathways across populations. Sci Rep 10, 17149 (2020) """ t = time() dt = dict() mb = glob(os.path.join(model_bundle_folder, "*.trk")) print(mb) mb.sort() bd = glob(os.path.join(bundle_folder, "*.trk")) bd.sort() print(bd) org_bd = glob(os.path.join(orig_bundle_folder, "*.trk")) org_bd.sort() print(org_bd) n = len(org_bd) n = len(mb) for io in range(n): mbundles = load_tractogram(mb[io], reference='same', bbox_valid_check=False).streamlines bundles = load_tractogram(bd[io], reference='same', bbox_valid_check=False).streamlines orig_bundles = load_tractogram(org_bd[io], reference='same', bbox_valid_check=False).streamlines if len(orig_bundles) > 5: indx = assignment_map(bundles, mbundles, no_disks) ind = np.array(indx) metric_files_names_dti = glob( os.path.join(metric_folder, "*.nii.gz")) metric_files_names_csa = glob(os.path.join(metric_folder, "*.pam5")) _, affine = load_nifti(metric_files_names_dti[0]) affine_r = np.linalg.inv(affine) transformed_orig_bundles = transform_streamlines( orig_bundles, affine_r) for mn in range(len(metric_files_names_dti)): ab = os.path.split(metric_files_names_dti[mn]) metric_name = ab[1] fm = metric_name[:-7] bm = os.path.split(mb[io])[1][:-4] logging.info("bm = " + bm) dt = dict() logging.info("metric = " + metric_files_names_dti[mn]) metric, _ = load_nifti(metric_files_names_dti[mn]) anatomical_measures(transformed_orig_bundles, metric, dt, fm, bm, subject, group_id, ind, out_dir) for mn in range(len(metric_files_names_csa)): ab = os.path.split(metric_files_names_csa[mn]) metric_name = ab[1] fm = metric_name[:-5] bm = os.path.split(mb[io])[1][:-4] logging.info("bm = " + bm) logging.info("metric = " + metric_files_names_csa[mn]) dt = dict() metric = load_peaks(metric_files_names_csa[mn]) peak_values(transformed_orig_bundles, metric, dt, fm, bm, subject, group_id, ind, out_dir) print("total time taken in minutes = ", (-t + time()) / 60)
window.show(scene) """ .. figure:: af_l_before_assignment_maps.png :align: center AF_L before assignment maps """ """ Creating 100 bundle assignment maps on AF_L using BUAN [Chandio2020]_ """ n = 100 indx = assignment_map(model_af_l, model_af_l, n) indx = np.array(indx) colors = [np.random.rand(3) for si in range(n)] disks_color = [] for i in range(len(indx)): disks_color.append(tuple(colors[indx[i]])) """ let's visualize Arcuate Fasiculus Left (AF_L) bundle after assignment maps """ interactive = False scene = window.Scene()