diff --git a/fsl/scripts/fsl_convert_x5.py b/fsl/scripts/fsl_convert_x5.py index b56e1dc96c8b4b3d6eaee44c0024b7bd1e6f7bea..87fc13dc5c5f1f13d0b871ba7cd5116ce09b3272 100644 --- a/fsl/scripts/fsl_convert_x5.py +++ b/fsl/scripts/fsl_convert_x5.py @@ -24,43 +24,100 @@ def parseArgs(args): parser = argparse.ArgumentParser('fsl_convert_x5') subparsers = parser.add_subparsers(dest='ctype') flirt = subparsers.add_parser('flirt') + fnirt = subparsers.add_parser('fnirt') + flirt.add_argument('input') flirt.add_argument('output') - flirt.add_argument('-s', '--source') - flirt.add_argument('-r', '--reference') + flirt.add_argument('-s', '--source') + flirt.add_argument('-r', '--reference') flirt.add_argument('-if', '--input_format', choices=('x5', 'mat')) flirt.add_argument('-of', '--output_format', choices=('x5', 'mat')) + intype = fnirt.add_mutually_exclusive_group() + outtype = fnirt.add_mutually_exclusive_group() + + fnirt .add_argument('input') + fnirt .add_argument('output') + fnirt .add_argument('-s', '--source') + fnirt .add_argument('-r', '--reference') + fnirt .add_argument('-if', '--input_format', choices=('x5', 'nii')) + fnirt .add_argument('-of', '--output_format', choices=('x5', 'nii')) + intype .add_argument('-ai', '--absin', action='store_const', const='absolute', dest='inDispType') + intype .add_argument('-ri', '--relin', action='store_const', const='relative', dest='inDispType') + outtype.add_argument('-ao', '--absout', action='store_const', const='absolute', dest='outDispType') + outtype.add_argument('-ro', '--relout', action='store_const', const='relative', dest='outDispType') + args = parser.parse_args(args) - def getfmt(fname): + if args.ctype is None: + parser.print_help() + sys.exit(0) + + def getfmt(arg, fname): ext = op.splitext(fname)[1] - if ext not in ('.x5', '.mat'): - raise argparse.ArgumentError('Could not infer format from ' - 'filename: {}'.format(args.input)) - return ext[1:] + if ext in ('.mat', '.x5'): + return ext[1:] + if fslimage.looksLikeImage(fslimage.fixExt(fname)): + return 'nii' + parser.error('Could not infer format from ' + 'filename: {}'.format(args.input)) - if args.ctype == 'flirt': - if args.input_format is None: args.input_format = getfmt(args.input) - if args.output_format is None: args.output_format = getfmt(args.output) + if args.input_format is None: args.input_format = getfmt('input', args.input) + if args.output_format is None: args.output_format = getfmt('output', args.output) return args def flirtToX5(args): - src = fslimage.Image(args.source) - ref = fslimage.Image(args.reference) + src = fslimage.Image(args.source, loadData=False) + ref = fslimage.Image(args.reference, loadData=False) xform = transform.readFlirt(args.input) - transform.writeFlirtX5(args.output, xform, src, ref) + xform = transform.fromFlirt(xform, src, ref, 'world', 'world') + transform.writeLinearX5(args.output, xform, src, ref) def X5ToFlirt(args): - xform, src, ref = transform.readFlirtX5(args.input) + xform, src, ref = transform.readLinearX5(args.input) xform = transform.toFlirt(xform, src, ref, 'world', 'world') transform.writeFlirt(xform, args.output) +def fnirtToX5(args): + src = fslimage.Image(args.source, loadData=False) + ref = fslimage.Image(args.reference, loadData=False) + field = transform.readFnirt(args.input, + src=src, + ref=ref, + dispType=args.inDispType) + field = transform.fromFnirt(field, 'world', 'world') + transform.writeNonLinearX5(args.output, field) + + +def X5ToFnirt(args): + field = transform.readNonLinearX5(args.input) + field = transform.toFnirt(field, 'world', 'world') + transform.writeFnirt(field, args.output) + + +def doFlirt(args): + infmt = args.input_format + outfmt = args.output_format + + if (infmt, outfmt) == ('x5', 'mat'): X5ToFlirt(args) + elif (infmt, outfmt) == ('mat', 'x5'): flirtToX5(args) + else: shutil.copy(args.input, args.output) + + +def doFnirt(args): + infmt = args.input_format + outfmt = args.output_format + + if (infmt, outfmt) == ('x5', 'nii'): X5ToFnirt(args) + elif (infmt, outfmt) == ('nii', 'x5'): fnirtToX5(args) + else: shutil.copy(args.input, args.output) + + def main(args=None): if args is None: @@ -69,13 +126,8 @@ def main(args=None): args = parseArgs(args) ctype = args.ctype - if ctype == 'flirt': - infmt = args.input_format - outfmt = args.output_format - - if (infmt, outfmt) == ('x5', 'mat'): X5ToFlirt(args) - elif (infmt, outfmt) == ('mat', 'x5'): flirtToX5(args) - else: shutil.copy(args.input, args.output) + if ctype == 'flirt': doFlirt(args) + elif ctype == 'fnirt': doFnirt(args) if __name__ == '__main__':