def io_tractogram(extension): with InTemporaryDirectory(): fname = 'test.{}'.format(extension) in_affine = np.eye(4) in_dimensions = np.array([50, 50, 50]) in_voxel_sizes = np.array([2, 1.5, 1.5]) nii_header = create_nifti_header(in_affine, in_dimensions, in_voxel_sizes) sft = StatefulTractogram(streamlines, nii_header, space=Space.RASMM) save_tractogram(sft, fname, bbox_valid_check=False) if extension == 'trk': reference = 'same' else: reference = nii_header sft = load_tractogram(fname, reference, bbox_valid_check=False) affine, dimensions, voxel_sizes, _ = sft.space_attribute npt.assert_array_equal(in_affine, affine) npt.assert_array_equal(in_voxel_sizes, voxel_sizes) npt.assert_array_equal(in_dimensions, dimensions) npt.assert_equal(len(sft), len(streamlines)) npt.assert_array_almost_equal(sft.streamlines[1], streamline, decimal=4)
def reference_info_zero_affine(): header = create_nifti_header(np.zeros((4, 4)), [10, 10, 10], [1, 1, 1]) try: get_reference_info(header) return True except ValueError: return False
def test_horizon_events(): # using here MNI template affine 2009a affine = np.array([[1., 0., 0., -98.], [0., 1., 0., -134.], [0., 0., 1., -72.], [0., 0., 0., 1.]]) data = 255 * np.random.rand(197, 233, 189) vox_size = (1., 1., 1.) images = [(data, affine)] # images = None from dipy.segment.tests.test_bundles import setup_module setup_module() from dipy.segment.tests.test_bundles import f1 streamlines = f1.copy() streamlines._data += np.array([-98., -134., -72.]) header = create_nifti_header(affine, data.shape, vox_size) sft = StatefulTractogram(streamlines, header, Space.RASMM) tractograms = [sft] # select all centroids and expand and click everything else # do not press the key shortcuts as vtk generates warning that # blocks recording fname = os.path.join(DATA_DIR, 'record_horizon.log.gz') horizon(tractograms=tractograms, images=images, pams=None, cluster=True, cluster_thr=5.0, random_colors=False, length_gt=0, length_lt=np.inf, clusters_gt=0, clusters_lt=np.inf, world_coords=True, interactive=True, out_png='tmp.png', recorded_events=fname)
def _afd_rd_wrapper(args): in_hdf5_filename = args[0] key = args[1] fodf_img = args[2] sh_basis = args[3] length_weighting = args[4] with h5py.File(in_hdf5_filename, 'r') as in_hdf5_file: affine = in_hdf5_file.attrs['affine'] dimensions = in_hdf5_file.attrs['dimensions'] voxel_sizes = in_hdf5_file.attrs['voxel_sizes'] streamlines = reconstruct_streamlines_from_hdf5(in_hdf5_file, key) if len(streamlines) == 0: return key, 0 header = create_nifti_header(affine, dimensions, voxel_sizes) sft = StatefulTractogram(streamlines, header, Space.VOX, origin=Origin.TRACKVIS) afd_mean_map, rd_mean_map = afd_map_along_streamlines( sft, fodf_img, sh_basis, length_weighting) afd_mean = np.average(afd_mean_map[afd_mean_map > 0]) return key, afd_mean
def main(): parser = _build_arg_parser() args = parser.parse_args() assert_inputs_exist(parser, args.in_hdf5) assert_output_dirs_exist_and_empty(parser, args, args.out_dir, create_dir=True) hdf5_file = h5py.File(args.in_hdf5, 'r') for key in hdf5_file.keys(): affine = hdf5_file.attrs['affine'] dimensions = hdf5_file.attrs['dimensions'] voxel_sizes = hdf5_file.attrs['voxel_sizes'] streamlines = reconstruct_streamlines_from_hdf5(hdf5_file, key) header = create_nifti_header(affine, dimensions, voxel_sizes) sft = StatefulTractogram(streamlines, header, Space.VOX, origin=Origin.TRACKVIS) if args.include_dps: for dps_key in hdf5_file[key].keys(): if dps_key not in ['data', 'offsets', 'lengths']: sft.data_per_streamline[dps_key] = hdf5_file[key][dps_key] save_tractogram(sft, '{}.trk'.format(os.path.join(args.out_dir, key))) hdf5_file.close()
def main(): parser = _build_arg_parser() args = parser.parse_args() assert_inputs_exist(parser, args.in_hdf5) assert_output_dirs_exist_and_empty(parser, args, args.out_dir, create_dir=True) if args.save_empty and args.labels_list is None: parser.error("The option --save_empty requires --labels_list.") with h5py.File(args.in_hdf5, 'r') as hdf5_file: if args.save_empty: all_labels = np.loadtxt(args.labels_list, dtype='str') comb_list = list(itertools.combinations(all_labels, r=2)) comb_list.extend(zip(all_labels, all_labels)) keys = [i[0] + '_' + i[1] for i in comb_list] else: keys = hdf5_file.keys() if args.edge_keys is not None: selected_keys = [key for key in keys if key in args.edge_keys] elif args.node_keys is not None: selected_keys = [] for node in args.node_keys: selected_keys.extend([ key for key in keys if key.startswith(node + '_') or key.endswith('_' + node) ]) else: selected_keys = keys affine = hdf5_file.attrs['affine'] dimensions = hdf5_file.attrs['dimensions'] voxel_sizes = hdf5_file.attrs['voxel_sizes'] header = create_nifti_header(affine, dimensions, voxel_sizes) for key in selected_keys: streamlines = reconstruct_streamlines_from_hdf5(hdf5_file, key) if len(streamlines) == 0 and not args.save_empty: continue sft = StatefulTractogram(streamlines, header, Space.VOX, origin=Origin.TRACKVIS) if args.include_dps: for dps_key in hdf5_file[key].keys(): if dps_key not in ['data', 'offsets', 'lengths']: sft.data_per_streamline[dps_key] = hdf5_file[key][ dps_key] save_tractogram(sft, '{}.trk'.format(os.path.join(args.out_dir, key)))
def density_map(tractogram, n_sls=None, to_vox=False, normalize=False): """ Create a streamline density map. based on: https://dipy.org/documentation/1.1.1./examples_built/streamline_formats/ Parameters ---------- tractogram : StatefulTractogram Stateful tractogram whose streamlines are used to make the density map. n_sls : int or None, optional n_sls to randomly select to make the density map. If None, all streamlines are used. Default: None to_vox : bool, optional Whether to put the stateful tractogram in VOX space before making the density map. Default: False normalize : bool, optional Whether to normalize maximum values to 1. Default: False Returns ------- Nifti1Image containing the density map. """ if to_vox: tractogram.to_vox() sls = tractogram.streamlines if n_sls is not None: sls = select_random_set_of_streamlines(sls, n_sls) affine, vol_dims, voxel_sizes, voxel_order = get_reference_info(tractogram) tractogram_density = dtu.density_map(sls, np.eye(4), vol_dims) if normalize: tractogram_density = tractogram_density / tractogram_density.max() nifti_header = create_nifti_header(affine, vol_dims, voxel_sizes) density_map_img = nib.Nifti1Image(tractogram_density, affine, nifti_header) return density_map_img
def main(): parser = _build_arg_parser() args = parser.parse_args() assert_inputs_exist(parser, [args.in_hdf5, args.in_target_file, args.in_transfo], args.in_deformation) assert_outputs_exist(parser, args, args.out_hdf5) # HDF5 will not overwrite the file if os.path.isfile(args.out_hdf5): os.remove(args.out_hdf5) with h5py.File(args.in_hdf5, 'r') as in_hdf5_file: shutil.copy(args.in_hdf5, args.out_hdf5) with h5py.File(args.out_hdf5, 'a') as out_hdf5_file: transfo = load_matrix_in_any_format(args.in_transfo) deformation_data = None if args.in_deformation is not None: deformation_data = np.squeeze(nib.load( args.in_deformation).get_fdata(dtype=np.float32)) target_img = nib.load(args.in_target_file) for key in in_hdf5_file.keys(): affine = in_hdf5_file.attrs['affine'] dimensions = in_hdf5_file.attrs['dimensions'] voxel_sizes = in_hdf5_file.attrs['voxel_sizes'] streamlines = reconstruct_streamlines_from_hdf5( in_hdf5_file, key) if len(streamlines) == 0: continue header = create_nifti_header(affine, dimensions, voxel_sizes) moving_sft = StatefulTractogram(streamlines, header, Space.VOX, origin=Origin.TRACKVIS) new_sft = transform_warp_streamlines( moving_sft, transfo, target_img, inverse=args.inverse, deformation_data=deformation_data, remove_invalid=not args.cut_invalid, cut_invalid=args.cut_invalid) new_sft.to_vox() new_sft.to_corner() affine, dimensions, voxel_sizes, voxel_order = get_reference_info( target_img) out_hdf5_file.attrs['affine'] = affine out_hdf5_file.attrs['dimensions'] = dimensions out_hdf5_file.attrs['voxel_sizes'] = voxel_sizes out_hdf5_file.attrs['voxel_order'] = voxel_order group = out_hdf5_file[key] del group['data'] group.create_dataset('data', data=new_sft.streamlines.get_data()) del group['offsets'] group.create_dataset('offsets', data=new_sft.streamlines._offsets) del group['lengths'] group.create_dataset('lengths', data=new_sft.streamlines._lengths)
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 test_horizon_flow(): s1 = 10 * np.array([[0, 0, 0], [1, 0, 0], [2, 0, 0], [3, 0, 0], [4, 0, 0]], dtype='f8') s2 = 10 * np.array([[0, 0, 0], [0, 1, 0], [0, 2, 0], [0, 3, 0], [0, 4, 0]], dtype='f8') s3 = 10 * np.array( [[0, 0, 0], [1, 0.2, 0], [2, 0.2, 0], [3, 0.2, 0], [4, 0.2, 0]], dtype='f8') affine = np.array([[1., 0., 0., -98.], [0., 1., 0., -134.], [0., 0., 1., -72.], [0., 0., 0., 1.]]) data = 255 * np.random.rand(197, 233, 189) vox_size = (1., 1., 1.) streamlines = Streamlines() streamlines.append(s1) streamlines.append(s2) streamlines.append(s3) header = create_nifti_header(affine, data.shape, vox_size) sft = StatefulTractogram(streamlines, header, Space.RASMM) tractograms = [sft] images = None horizon(tractograms, images=images, cluster=True, cluster_thr=5, random_colors=False, length_lt=np.inf, length_gt=0, clusters_lt=np.inf, clusters_gt=0, world_coords=True, interactive=False) buan_colors = np.ones(streamlines.get_data().shape) horizon(tractograms, buan=True, buan_colors=buan_colors, world_coords=True, interactive=False) data = 255 * np.random.rand(197, 233, 189) images = [(data, affine)] horizon(tractograms, images=images, cluster=True, cluster_thr=5, random_colors=False, length_lt=np.inf, length_gt=0, clusters_lt=np.inf, clusters_gt=0, world_coords=True, interactive=False) with TemporaryDirectory() as out_dir: fimg = os.path.join(out_dir, 'test.nii.gz') ftrk = os.path.join(out_dir, 'test.trk') fnpy = os.path.join(out_dir, 'test.npy') save_nifti(fimg, data, affine) dimensions = data.shape nii_header = create_nifti_header(affine, dimensions, vox_size) sft = StatefulTractogram(streamlines, nii_header, space=Space.RASMM) save_tractogram(sft, ftrk, bbox_valid_check=False) pvalues = np.random.uniform(low=0, high=1, size=(10, )) np.save(fnpy, pvalues) input_files = [ftrk, fimg] npt.assert_equal(len(input_files), 2) hz_flow = HorizonFlow() hz_flow.run(input_files=input_files, stealth=True, out_dir=out_dir, out_stealth_png='tmp_x.png') npt.assert_equal(os.path.exists(os.path.join(out_dir, 'tmp_x.png')), True) npt.assert_raises(ValueError, hz_flow.run, input_files=input_files, bg_color=(0.2, 0.2)) hz_flow.run(input_files=input_files, stealth=True, bg_color=[ 0.5, ], out_dir=out_dir, out_stealth_png='tmp_x.png') npt.assert_equal(os.path.exists(os.path.join(out_dir, 'tmp_x.png')), True) input_files = [ftrk, fnpy] npt.assert_equal(len(input_files), 2) hz_flow.run(input_files=input_files, stealth=True, bg_color=[ 0.5, ], buan=True, buan_thr=0.5, buan_highlight=(1, 1, 0), out_dir=out_dir, out_stealth_png='tmp_x.png') npt.assert_equal(os.path.exists(os.path.join(out_dir, 'tmp_x.png')), True) npt.assert_raises(ValueError, hz_flow.run, input_files=input_files, roi_colors=(0.2, 0.2)) hz_flow.run(input_files=input_files, stealth=True, roi_colors=[ 0.5, ], out_dir=out_dir, out_stealth_png='tmp_x.png') npt.assert_equal(os.path.exists(os.path.join(out_dir, 'tmp_x.png')), True)
def test_horizon_flow(): s1 = 10 * np.array([[0, 0, 0], [1, 0, 0], [2, 0, 0], [3, 0, 0], [4, 0, 0]], dtype='f8') s2 = 10 * np.array([[0, 0, 0], [0, 1, 0], [0, 2, 0], [0, 3, 0], [0, 4, 0]], dtype='f8') s3 = 10 * np.array( [[0, 0, 0], [1, 0.2, 0], [2, 0.2, 0], [3, 0.2, 0], [4, 0.2, 0]], dtype='f8') print(s1.shape) print(s2.shape) print(s3.shape) streamlines = Streamlines() streamlines.append(s1) streamlines.append(s2) streamlines.append(s3) tractograms = [streamlines] images = None horizon(tractograms, images=images, cluster=True, cluster_thr=5, random_colors=False, length_lt=np.inf, length_gt=0, clusters_lt=np.inf, clusters_gt=0, world_coords=False, interactive=False) # affine = np.diag([2., 1, 1, 1]).astype('f8') # data = 255 * np.random.rand(150, 150, 150) # images = [(data, affine)] horizon(tractograms, images=images, cluster=True, cluster_thr=5, random_colors=False, length_lt=np.inf, length_gt=0, clusters_lt=np.inf, clusters_gt=0, world_coords=True, interactive=False) with TemporaryDirectory() as out_dir: fimg = os.path.join(out_dir, 'test.nii.gz') ftrk = os.path.join(out_dir, 'test.trk') save_nifti(fimg, data, affine) dimensions = data.shape voxel_sizes = np.array([2, 1.0, 1.0]) nii_header = create_nifti_header(affine, dimensions, voxel_sizes) sft = StatefulTractogram(streamlines, nii_header, space=Space.RASMM) save_tractogram(sft, ftrk, bbox_valid_check=False) input_files = [ftrk, fimg] npt.assert_equal(len(input_files), 2) hz_flow = HorizonFlow() hz_flow.run(input_files=input_files, stealth=True, out_dir=out_dir, out_stealth_png='tmp_x.png') npt.assert_equal(os.path.exists(os.path.join(out_dir, 'tmp_x.png')), True)
def test_horizon(): s1 = 10 * np.array([[0, 0, 0], [1, 0, 0], [2, 0, 0], [3, 0, 0], [4, 0, 0]], dtype='f8') s2 = 10 * np.array([[0, 0, 0], [0, 1, 0], [0, 2, 0], [0, 3, 0], [0, 4, 0]], dtype='f8') s3 = 10 * np.array([[0, 0, 0], [1, 0.2, 0], [2, 0.2, 0], [3, 0.2, 0], [4, 0.2, 0]], dtype='f8') streamlines = Streamlines() streamlines.append(s1) streamlines.append(s2) streamlines.append(s3) affine = np.array([[1., 0., 0., -98.], [0., 1., 0., -134.], [0., 0., 1., -72.], [0., 0., 0., 1.]]) data = 255 * np.random.rand(197, 233, 189) vox_size = (1., 1., 1.) streamlines._data += np.array([-98., -134., -72.]) header = create_nifti_header(affine, data.shape, vox_size) sft = StatefulTractogram(streamlines, header, Space.RASMM) # only tractograms tractograms = [sft] images = None horizon(tractograms, images=images, cluster=True, cluster_thr=5, random_colors=False, length_lt=np.inf, length_gt=0, clusters_lt=np.inf, clusters_gt=0, world_coords=True, interactive=False) images = [(data, affine)] # tractograms in native coords (not supported for now) with npt.assert_raises(ValueError) as ve: horizon(tractograms, images=images, cluster=True, cluster_thr=5, random_colors=False, length_lt=np.inf, length_gt=0, clusters_lt=np.inf, clusters_gt=0, world_coords=False, interactive=False) msg = 'Currently native coordinates are not supported for streamlines' npt.assert_(msg in str(ve.exception)) # only images tractograms = None horizon(tractograms, images=images, cluster=True, cluster_thr=5, random_colors=False, length_lt=np.inf, length_gt=0, clusters_lt=np.inf, clusters_gt=0, world_coords=True, interactive=False) # no clustering tractograms and images horizon(tractograms, images=images, cluster=False, cluster_thr=5, random_colors=False, length_lt=np.inf, length_gt=0, clusters_lt=np.inf, clusters_gt=0, world_coords=True, interactive=False)
to be considered valid all fields must correspond between the headers. It can be easily verified using this function, which also accept the same variety of input as ``get_reference_info`` """ print(is_header_compatible(reference_anatomy, bundles_filename[0])) """ If a TRK was generated with a valid header, but the reference NIFTI was lost a header can be generated to then generate a fake NIFTI file. If you wish to manually save Trk and Tck file using nibabel streamlines API for more freedom of action (not recommended for beginners) you can create a valid header using create_tractogram_header """ nifti_header = create_nifti_header(affine, dimensions, voxel_sizes) nib.save(nib.Nifti1Image(np.zeros(dimensions), affine, nifti_header), 'fake.nii.gz') nib.save(reference_anatomy, os.path.basename(ref_anat_filename)) """ Once loaded, no matter the original file format, the stateful tractogram is self-contained and maintains a valid state. By requiring a reference the tractogram's spatial transformation can be easily manipulated. Let's save all files as TRK to visualize in TrackVis for example. However, when loaded the lpt and rpt files contain invalid streamlines and for particular operations/tools/functions it is safer to remove them """ save_tractogram(cc_sft, 'cc.trk') save_tractogram(laf_sft, 'laf.trk')
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, 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]. Default is black (e.g --bg_color 0 0 0 or --bg_color 0). disable_order_transparency : bool, optional Default False. Use depth peeling to sort transparent objects. If True also enables anti-aliasing. 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 = [] interactive = not stealth world_coords = not native_coords 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 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, out_png=pjoin(out_dir, out_stealth_png))