Source code for mdt.cli_scripts.mdt_volume_merge

#!/usr/bin/env python
# PYTHON_ARGCOMPLETE_OK
"""Merge a list of volume images on the 4th dimension. Writes the result to a single image.

Please note that by default this will sort the list of volume names based on a natural key sort. This is
the most convenient option in the case of globbing files. You can disable this behaviour
using the flag --no-sort.
"""
import argparse
import glob
import os
from argcomplete.completers import FilesCompleter
import textwrap

from mdt.utils import volume_merge
from mdt.lib.shell_utils import BasicShellApplication, get_argparse_extension_checker

__author__ = 'Robbert Harms'
__date__ = "2015-08-18"
__maintainer__ = "Robbert Harms"
__email__ = "robbert@xkls.nl"


[docs]class VolumeMerge(BasicShellApplication): def _get_arg_parser(self, doc_parser=False): description = textwrap.dedent(__doc__) examples = textwrap.dedent(''' mdt-volume-merge merged.nii.gz *.nii.gz mdt-volume-merge --no-sort merged.nii.gz *.nii.gz ''') epilog = self._format_examples(doc_parser, examples) parser = argparse.ArgumentParser(description=description, epilog=epilog, formatter_class=argparse.RawTextHelpFormatter) parser.add_argument('-o', '--output_file', required=True, action=get_argparse_extension_checker(['.nii', '.nii.gz', '.hdr', '.img']), help='the filename of the output file').completer = \ FilesCompleter(['nii', 'gz', 'hdr', 'img'], directories=False) parser.add_argument("input_files", metavar="input_files", nargs="+", type=str, help="The input images to merge") parser.add_argument('--sort', dest='sort', action='store_true', help="Sort the input images using a natural sort (default)") parser.add_argument('--no-sort', dest='sort', action='store_false', help="Do not sort the input images") parser.set_defaults(sort=True) parser.add_argument('--no-merge-order-file', dest='no_merge_order_file', action='store_true', help="Do not write the merge order file") return parser
[docs] def run(self, args, extra_args): output_file = os.path.realpath(args.output_file) if os.path.isfile(output_file): os.remove(output_file) file_names = [] for file in args.input_files: file_names.extend(glob.glob(file)) concatenated_names = volume_merge(file_names, output_file, sort=args.sort) if not args.no_merge_order_file: info_output_file = os.path.splitext(output_file)[0].replace('.nii', '') + '_merge_order.txt' if os.path.isfile(info_output_file): os.remove(info_output_file) with open(info_output_file, 'w') as f: f.write('Files merged in this order:\n') for name in concatenated_names: f.write(name + '\n')
[docs]def get_doc_arg_parser(): return VolumeMerge().get_documentation_arg_parser()
if __name__ == '__main__': VolumeMerge().start()