def main(): parser = _build_arg_parser() args = parser.parse_args() assert_inputs_exist( parser, [args.moving_tractogram, args.target_file, args.transformation]) assert_outputs_exist(parser, args, args.out_tractogram) moving_sft = load_tractogram_with_reference(parser, args, args.moving_tractogram, bbox_check=False) transfo = np.loadtxt(args.transformation) if args.inverse: transfo = np.linalg.inv(transfo) moved_streamlines = transform_streamlines(moving_sft.streamlines, transfo) new_sft = StatefulTractogram( moved_streamlines, args.target_file, Space.RASMM, data_per_point=moving_sft.data_per_point, data_per_streamline=moving_sft.data_per_streamline) if args.remove_invalid: ori_len = len(new_sft) new_sft.remove_invalid_streamlines() logging.warning('Removed {} invalid streamlines.'.format(ori_len - len(new_sft))) save_tractogram(new_sft, args.out_tractogram) elif args.keep_invalid: if not new_sft.is_bbox_in_vox_valid(): logging.warning('Saving tractogram with invalid streamlines.') save_tractogram(new_sft, args.out_tractogram, bbox_valid_check=False) else: save_tractogram(new_sft, args.out_tractogram)
def main(): parser = _build_arg_parser() args = parser.parse_args() assert_inputs_exist(parser, [args.moving_tractogram, args.target_file, args.deformation]) assert_outputs_exist(parser, args, args.out_tractogram) sft = load_tractogram_with_reference(parser, args, args.moving_tractogram, bbox_check=False) deformation = nib.load(args.deformation) deformation_data = np.squeeze(deformation.get_fdata()) if not is_header_compatible(sft, deformation): parser.error('Input tractogram/reference do not have the same spatial ' 'attribute as the deformation field.') # Warning: Apply warp in-place moved_streamlines = warp_streamlines(sft, deformation_data) new_sft = StatefulTractogram(moved_streamlines, args.target_file, Space.RASMM, data_per_point=sft.data_per_point, data_per_streamline=sft.data_per_streamline) if args.remove_invalid: ori_len = len(new_sft) new_sft.remove_invalid_streamlines() logging.warning('Removed {} invalid streamlines.'.format( ori_len - len(new_sft))) save_tractogram(new_sft, args.out_tractogram) elif args.keep_invalid: if not new_sft.is_bbox_in_vox_valid(): logging.warning('Saving tractogram with invalid streamlines.') save_tractogram(new_sft, args.out_tractogram, bbox_valid_check=False) else: save_tractogram(new_sft, args.out_tractogram)
def load_tractogram(filename, reference, to_space=Space.RASMM, shifted_origin=False, bbox_valid_check=True, trk_header_check=True): """ Load the stateful tractogram from any format (trk, tck, vtk, fib, dpy) Parameters ---------- filename : string Filename with valid extension reference : Nifti or Trk filename, Nifti1Image or TrkFile, Nifti1Header or trk.header (dict), or 'same' if the input is a trk file. Reference that provides the spatial attribute. Typically a nifti-related object from the native diffusion used for streamlines generation to_space : Enum (dipy.io.stateful_tractogram.Space) Space to which the streamlines will be transformed after loading. shifted_origin : bool Information on the position of the origin, False is Trackvis standard, default (center of the voxel) True is NIFTI standard (corner of the voxel) bbox_valid_check : bool Verification for negative voxel coordinates or values above the volume dimensions. Default is True, to enforce valid file. trk_header_check : bool Verification that the reference has the same header as the spatial attributes as the input tractogram when a Trk is loaded Returns ------- output : StatefulTractogram The tractogram to load (must have been saved properly) """ _, extension = os.path.splitext(filename) if extension not in ['.trk', '.tck', '.vtk', '.fib', '.dpy']: logging.error('Output filename is not one of the supported format') return False if to_space not in Space: logging.error('Space MUST be one of the 3 choices (Enum)') return False if reference == 'same': if extension == '.trk': reference = filename else: logging.error('Reference must be provided, "same" is only ' + 'available for Trk file.') return False if trk_header_check and extension == '.trk': if not is_header_compatible(filename, reference): logging.error('Trk file header does not match the provided ' + 'reference') return False timer = time.time() data_per_point = None data_per_streamline = None if extension in ['.trk', '.tck']: tractogram_obj = nib.streamlines.load(filename).tractogram streamlines = tractogram_obj.streamlines if extension == '.trk': data_per_point = tractogram_obj.data_per_point data_per_streamline = tractogram_obj.data_per_streamline elif extension in ['.vtk', '.fib']: streamlines = load_vtk_streamlines(filename) elif extension in ['.dpy']: dpy_obj = Dpy(filename, mode='r') streamlines = list(dpy_obj.read_tracks()) dpy_obj.close() logging.debug('Load %s with %s streamlines in %s seconds', filename, len(streamlines), round(time.time() - timer, 3)) sft = StatefulTractogram(streamlines, reference, Space.RASMM, shifted_origin=shifted_origin, data_per_point=data_per_point, data_per_streamline=data_per_streamline) if to_space == Space.VOX: sft.to_vox() elif to_space == Space.VOXMM: sft.to_voxmm() if bbox_valid_check and not sft.is_bbox_in_vox_valid(): raise ValueError('Bounding box is not valid in voxel space, cannot ' + 'load a valid file if some coordinates are invalid.' + 'Please set bbox_valid_check to False and then use' + 'the function remove_invalid_streamlines to discard' + 'invalid streamlines.') return sft