def run():
    """
    meta_parser is first used to find out location
    of the configuration file. Based on the application_name
    or meta_parser.prog name, the section parsers are organised
    to find system parameters and application specific
    parameters.

    :return: system parameters is a group of parameters including
        SYSTEM_SECTIONS and app_module.REQUIRED_CONFIG_SECTION
        input_data_args is a group of input data sources to be
        used by niftynet.io.ImageReader
    """
    meta_parser = argparse.ArgumentParser(
        description="Launch a NiftyNet application.",
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog=textwrap.dedent(EPILOG_STRING))
    version_string = get_niftynet_version_string()
    meta_parser.add_argument("action",
                             help="train networks, run inferences "
                             "or evaluate inferences",
                             metavar='ACTION',
                             choices=list(ACTIONS))
    meta_parser.add_argument("-v",
                             "--version",
                             action='version',
                             version=version_string)
    meta_parser.add_argument("-c",
                             "--conf",
                             help="specify configurations from a file",
                             metavar="CONFIG_FILE")
    meta_parser.add_argument("-a",
                             "--application_name",
                             help="specify an application module name",
                             metavar='APPLICATION_NAME',
                             default="")

    meta_args, args_from_cmdline = meta_parser.parse_known_args()
    print(version_string)

    # read configurations, to be parsed by sections
    config_file_name = __resolve_config_file_path(meta_args.conf)
    config = NiftyNetLaunchConfig()
    config.read([config_file_name])

    # infer application name from command
    app_name = None
    try:
        parser_prog = meta_parser.prog.replace('.py', '')
        app_name = parser_prog if parser_prog in SUPPORTED_APP \
            else meta_args.application_name
        assert app_name
    except (AttributeError, AssertionError):
        raise ValueError("\nUnknown application {}, or did you forget '-a' "
                         "command argument?{}".format(app_name, EPILOG_STRING))

    # load application by name
    app_module = ApplicationFactory.create(app_name)
    try:
        assert app_module.REQUIRED_CONFIG_SECTION, \
            "\nREQUIRED_CONFIG_SECTION should be static variable " \
            "in {}".format(app_module)
        has_section_in_config(config, app_module.REQUIRED_CONFIG_SECTION)
    except AttributeError:
        raise AttributeError(
            "Application code doesn't have REQUIRED_CONFIG_SECTION property. "
            "{} should be an instance of "
            "niftynet.application.base_application".format(app_module))
    except ValueError:
        raise ValueError(
            "\n{} requires [{}] section in the config file.{}".format(
                app_name, app_module.REQUIRED_CONFIG_SECTION, EPILOG_STRING))

    # check keywords in configuration file
    _check_config_file_keywords(config)

    # using configuration as default, and parsing all command line arguments
    # command line args override the configure file options
    all_args = {}
    for section in config.sections():
        # try to rename user-specified sections for consistency
        section = standardise_section_name(config, section)
        section_defaults = dict(config.items(section))
        section_args, args_from_cmdline = \
            _parse_arguments_by_section([],
                                        section,
                                        section_defaults,
                                        args_from_cmdline,
                                        app_module.REQUIRED_CONFIG_SECTION)
        all_args[section] = section_args

    # check if any args from command line not recognised
    _check_cmd_remaining_keywords(list(args_from_cmdline))

    # split parsed results in all_args
    # into dictionaries of system_args and input_data_args
    system_args, input_data_args = {}, {}
    for section in all_args:

        # copy system default sections to ``system_args``
        if section in SYSTEM_SECTIONS:
            system_args[section] = all_args[section]
            continue

        # copy application specific sections to ``system_args``
        if section == app_module.REQUIRED_CONFIG_SECTION:
            system_args['CUSTOM'] = all_args[section]
            vars(system_args['CUSTOM'])['name'] = app_name
            continue

        # copy non-default sections to ``input_data_args``
        input_data_args[section] = all_args[section]

        # set the output path of csv list if not exists
        try:
            csv_path = resolve_file_name(
                input_data_args[section].csv_file,
                (os.path.dirname(config_file_name), NIFTYNET_HOME))
            input_data_args[section].csv_file = csv_path
            # don't search files if csv specified in config
            try:
                delattr(input_data_args[section], 'path_to_search')
            except AttributeError:
                pass
        except (IOError, TypeError):
            input_data_args[section].csv_file = ''

    # preserve ``config_file`` and ``action parameter`` from the meta_args
    system_args['CONFIG_FILE'] = argparse.Namespace(path=config_file_name)
    # mapping the captured action argument to a string in ACTIONS
    system_args['SYSTEM'].action = \
        look_up_operations(meta_args.action, ACTIONS)
    if not system_args['SYSTEM'].model_dir:
        system_args['SYSTEM'].model_dir = os.path.join(
            os.path.dirname(config_file_name), 'model')
    return system_args, input_data_args
示例#2
0
def run():
    """
    meta_parser is first used to find out location
    of the configuration file. based on the application_name
    or meta_parser.prog name, the section parsers are organised
    to find system parameters and application specific
    parameters.

    :return: system parameters is a group of parameters including
        SYSTEM_SECTIONS and app_module.REQUIRED_CONFIG_SECTION
        input_data_args is a group of input data sources to be
        used by niftynet.io.ImageReader
    """
    meta_parser = argparse.ArgumentParser(
        description="Launch a NiftyNet application.",
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog=textwrap.dedent(epilog_string))
    version_string = get_niftynet_version_string()
    meta_parser.add_argument("action",
                             help="train networks or run inferences",
                             metavar='ACTION',
                             choices=['train', 'inference'])
    meta_parser.add_argument("-v",
                             "--version",
                             action='version',
                             version=version_string)
    meta_parser.add_argument("-c",
                             "--conf",
                             help="specify configurations from a file",
                             metavar="CONFIG_FILE")
    meta_parser.add_argument("-a",
                             "--application_name",
                             help="specify an application module name",
                             metavar='APPLICATION_NAME',
                             default="")

    meta_args, args_from_cmdline = meta_parser.parse_known_args()
    print(version_string)

    # read configurations, to be parsed by sections
    if not meta_args.conf:
        print("\nNo configuration file has been provided, did you "
              "forget '-c' command argument?{}".format(epilog_string))
        raise IOError

    # Resolve relative configuration file location
    config_path = meta_args.conf
    if not os.path.isfile(config_path):
        relative_conf_file = os.path.join(
            NiftyNetGlobalConfig().get_default_examples_folder(), config_path,
            config_path + "_config.ini")
        if os.path.isfile(relative_conf_file):
            config_path = relative_conf_file
            os.chdir(os.path.dirname(config_path))
        else:
            print("\nConfiguration file not found: {}.{}".format(
                config_path, epilog_string))
            raise IOError

    config = configparser.ConfigParser()
    config.read([config_path])
    app_module = None
    module_name = None
    try:
        if meta_parser.prog[:-3] in SUPPORTED_APP:
            module_name = meta_parser.prog[:-3]
        elif meta_parser.prog in SUPPORTED_APP:
            module_name = meta_parser.prog
        else:
            module_name = meta_args.application_name
        app_module = ApplicationFactory.create(module_name)
        assert app_module.REQUIRED_CONFIG_SECTION, \
            "\nREQUIRED_CONFIG_SECTION should be static variable " \
            "in {}".format(app_module)
        has_section_in_config(config, app_module.REQUIRED_CONFIG_SECTION)
    except ValueError:
        if app_module:
            section_name = app_module.REQUIRED_CONFIG_SECTION
            print('\n{} requires [{}] section in the config file.{}'.format(
                module_name, section_name, epilog_string))
        if not module_name:
            print("\nUnknown application {}, or did you forget '-a' "
                  "command argument?{}".format(module_name, epilog_string))
        raise

    # check keywords in configuration file
    check_keywords(config)

    # using configuration as default, and parsing all command line arguments
    all_args = {}
    for section in config.sections():
        # try to rename user-specified sections for consistency
        section = standardise_section_name(config, section)
        section_defaults = dict(config.items(section))
        section_args, args_from_cmdline = \
            _parse_arguments_by_section([],
                                        section,
                                        section_defaults,
                                        args_from_cmdline,
                                        app_module.REQUIRED_CONFIG_SECTION)
        all_args[section] = section_args
    # command line parameters should be valid
    assert not args_from_cmdline, \
        '\nUnknown parameter: {}{}'.format(args_from_cmdline, epilog_string)

    # split parsed results in all_args
    # into dictionaries of system_args and input_data_args
    system_args = {}
    input_data_args = {}

    # copy system default sections to ``system_args``
    for section in all_args:
        if section in SYSTEM_SECTIONS:
            system_args[section] = all_args[section]
        elif section == app_module.REQUIRED_CONFIG_SECTION:
            system_args['CUSTOM'] = all_args[section]
            vars(system_args['CUSTOM'])['name'] = module_name

    if all_args['SYSTEM'].model_dir is None:
        all_args['SYSTEM'].model_dir = os.path.join(
            os.path.dirname(meta_args.conf), 'model')

    # copy non-default sections to ``input_data_args``
    for section in all_args:
        if section in SYSTEM_SECTIONS:
            continue
        if section == app_module.REQUIRED_CONFIG_SECTION:
            continue
        input_data_args[section] = all_args[section]
        # set the output path of csv list if not exists
        csv_path = input_data_args[section].csv_file
        if os.path.isfile(csv_path):
            # don't search files if csv specified in config
            try:
                delattr(input_data_args[section], 'path_to_search')
            except AttributeError:
                pass
        else:
            input_data_args[section].csv_file = ''

    # preserve ``config_file`` and ``action parameter`` from the meta_args
    system_args['CONFIG_FILE'] = argparse.Namespace(path=meta_args.conf)
    system_args['SYSTEM'].action = meta_args.action
    return system_args, input_data_args
示例#3
0
def run():
    """
    meta_parser is first used to find out location
    of the configuration file. based on the application_name
    or meta_parser.prog name, the section parsers are organised
    to find system parameters and application specific
    parameters

    :return: system parameters is a group of parameters including
        SYSTEM_SECTIONS and app_module.REQUIRED_CONFIG_SECTION
        input_data_args is a group of input data sources to be
        used by niftynet.io.ImageReader
    """
    meta_parser = argparse.ArgumentParser(
        epilog=
        'Please visit https://cmiclab.cs.ucl.ac.uk/CMIC/NiftyNet/tree/dev/demos '
        'for more info.')
    version_string = get_niftynet_version_string()
    meta_parser.add_argument("-v",
                             "--version",
                             action='version',
                             version=version_string)
    meta_parser.add_argument(
        "-c",
        "--conf",
        help="Specify configurations from a file",
        metavar="File",
    )
    meta_parser.add_argument(
        "-a",
        "--application_name",
        help="Specify application name",
        default="",
    )
    meta_args, args_from_cmdline = meta_parser.parse_known_args()
    print(version_string)

    # read configurations, to be parsed by sections
    if (meta_args.conf is None) or (not os.path.isfile(meta_args.conf)):
        raise IOError("Configuration file not found {}".format(meta_args.conf))
    config = configparser.ConfigParser()
    config.read([meta_args.conf])
    try:
        if meta_parser.prog[:-3] in SUPPORTED_APP:
            module_name = meta_parser.prog[:-3]
        elif meta_parser.prog in SUPPORTED_APP:
            module_name = meta_parser.prog
        else:
            module_name = meta_args.application_name
        app_module = ApplicationFactory.create(module_name)
        assert app_module.REQUIRED_CONFIG_SECTION, \
            "REQUIRED_CONFIG_SECTION should be static variable " \
            "in {}".format(app_module)
        has_section_in_config(config, app_module.REQUIRED_CONFIG_SECTION)
    except ValueError:
        raise ValueError('{} requires [{}] section in the config file'.format(
            module_name, app_module.REQUIRED_CONFIG_SECTION))

    # check keywords in configuration file
    check_keywords(config)

    # using configuration as default, and parsing all command line arguments
    all_args = {}
    for section in config.sections():
        # try to rename user-specified sections for consistency
        section = standardise_section_name(config, section)
        section_defaults = dict(config.items(section))
        section_args, args_from_cmdline = \
            _parse_arguments_by_section([],
                                        section,
                                        section_defaults,
                                        args_from_cmdline,
                                        app_module.REQUIRED_CONFIG_SECTION)
        all_args[section] = section_args
    # command line parameters should be valid
    assert not args_from_cmdline, \
        'unknown parameter: {}'.format(args_from_cmdline)

    # split parsed results in all_args
    # into dictionary of system_args and input_data_args
    system_args = {}
    input_data_args = {}
    for section in all_args:
        if section in SYSTEM_SECTIONS:
            system_args[section] = all_args[section]
        elif section == app_module.REQUIRED_CONFIG_SECTION:
            system_args['CUSTOM'] = all_args[section]
            vars(system_args['CUSTOM'])['name'] = module_name
        else:
            input_data_args[section] = all_args[section]
            # set the output path of csv list if not exists
            csv_path = input_data_args[section].csv_file
            if not os.path.isfile(csv_path):
                csv_filename = os.path.join(all_args['SYSTEM'].model_dir,
                                            '{}.csv'.format(section))
                input_data_args[section].csv_file = csv_filename
            else:
                # don't search files if csv specified in config
                try:
                    delattr(input_data_args[section], 'path_to_search')
                except AttributeError:
                    pass

    # update conf path
    system_args['CONFIG_FILE'] = argparse.Namespace(path=meta_args.conf)
    return system_args, input_data_args
def run():
    """
    meta_parser is first used to find out location
    of the configuration file. based on the application_name
    or meta_parser.prog name, the section parsers are organised
    to find system parameters and application specific
    parameters.

    :return: system parameters is a group of parameters including
        SYSTEM_SECTIONS and app_module.REQUIRED_CONFIG_SECTION
        input_data_args is a group of input data sources to be
        used by niftynet.io.ImageReader
    """
    meta_parser = argparse.ArgumentParser(
        description="Launch a NiftyNet application.",
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog=textwrap.dedent(epilog_string))
    version_string = get_niftynet_version_string()
    meta_parser.add_argument("action",
                             help="train networks or run inferences",
                             metavar='ACTION',
                             choices=['train', 'inference'])
    meta_parser.add_argument("-v", "--version",
                             action='version',
                             version=version_string)
    meta_parser.add_argument("-c", "--conf",
                             help="specify configurations from a file",
                             metavar="CONFIG_FILE")
    meta_parser.add_argument("-a", "--application_name",
                             help="specify an application module name",
                             metavar='APPLICATION_NAME',
                             default="")

    meta_args, args_from_cmdline = meta_parser.parse_known_args()
    print(version_string)

    # read configurations, to be parsed by sections
    if not meta_args.conf:
        print("\nNo configuration file has been provided, did you "
              "forget '-c' command argument?{}".format(epilog_string))
        raise IOError

    # Resolve relative configuration file location
    config_path = os.path.expanduser(meta_args.conf)
    if not os.path.isfile(config_path):
        relative_conf_file = os.path.join(
            NiftyNetGlobalConfig().get_default_examples_folder(),
            config_path,
            config_path + "_config.ini")
        if os.path.isfile(relative_conf_file):
            config_path = relative_conf_file
            os.chdir(os.path.dirname(config_path))
        else:
            print("\nConfiguration file not found: {}.{}".format(
                config_path, epilog_string))
            raise IOError

    config = configparser.ConfigParser()
    config.read([config_path])
    app_module = None
    module_name = None
    try:
        if meta_parser.prog[:-3] in SUPPORTED_APP:
            module_name = meta_parser.prog[:-3]
        elif meta_parser.prog in SUPPORTED_APP:
            module_name = meta_parser.prog
        else:
            module_name = meta_args.application_name
        app_module = ApplicationFactory.create(module_name)
        assert app_module.REQUIRED_CONFIG_SECTION, \
            "\nREQUIRED_CONFIG_SECTION should be static variable " \
            "in {}".format(app_module)
        has_section_in_config(config, app_module.REQUIRED_CONFIG_SECTION)
    except ValueError:
        if app_module:
            section_name = app_module.REQUIRED_CONFIG_SECTION
            print('\n{} requires [{}] section in the config file.{}'.format(
                module_name, section_name, epilog_string))
        if not module_name:
            print("\nUnknown application {}, or did you forget '-a' "
                  "command argument?{}".format(module_name, epilog_string))
        raise

    # check keywords in configuration file
    check_keywords(config)

    # using configuration as default, and parsing all command line arguments
    all_args = {}
    for section in config.sections():
        # try to rename user-specified sections for consistency
        section = standardise_section_name(config, section)
        section_defaults = dict(config.items(section))
        section_args, args_from_cmdline = \
            _parse_arguments_by_section([],
                                        section,
                                        section_defaults,
                                        args_from_cmdline,
                                        app_module.REQUIRED_CONFIG_SECTION)
        all_args[section] = section_args
    # command line parameters should be valid
    assert not args_from_cmdline, \
        '\nUnknown parameter: {}{}'.format(args_from_cmdline, epilog_string)

    # split parsed results in all_args
    # into dictionaries of system_args and input_data_args
    system_args = {}
    input_data_args = {}

    # copy system default sections to ``system_args``
    for section in all_args:
        if section in SYSTEM_SECTIONS:
            system_args[section] = all_args[section]
        elif section == app_module.REQUIRED_CONFIG_SECTION:
            system_args['CUSTOM'] = all_args[section]
            vars(system_args['CUSTOM'])['name'] = module_name

    if all_args['SYSTEM'].model_dir is None:
        all_args['SYSTEM'].model_dir = os.path.join(
            os.path.dirname(meta_args.conf), 'model')

    # copy non-default sections to ``input_data_args``
    for section in all_args:
        if section in SYSTEM_SECTIONS:
            continue
        if section == app_module.REQUIRED_CONFIG_SECTION:
            continue
        input_data_args[section] = all_args[section]
        # set the output path of csv list if not exists
        csv_path = input_data_args[section].csv_file
        if os.path.isfile(csv_path):
            # don't search files if csv specified in config
            try:
                delattr(input_data_args[section], 'path_to_search')
            except AttributeError:
                pass
        else:
            input_data_args[section].csv_file = ''

    # preserve ``config_file`` and ``action parameter`` from the meta_args
    system_args['CONFIG_FILE'] = argparse.Namespace(path=meta_args.conf)
    system_args['SYSTEM'].action = meta_args.action
    return system_args, input_data_args
def run():
    """
    meta_parser is first used to find out location
    of the configuration file. Based on the application_name
    or meta_parser.prog name, the section parsers are organised
    to find system parameters and application specific
    parameters.

    :return: system parameters is a group of parameters including
        SYSTEM_SECTIONS and app_module.REQUIRED_CONFIG_SECTION
        input_data_args is a group of input data sources to be
        used by niftynet.io.ImageReader
    """
    meta_parser = argparse.ArgumentParser(
        description="Launch a NiftyNet application.",
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog=textwrap.dedent(EPILOG_STRING))
    version_string = get_niftynet_version_string()
    meta_parser.add_argument("action",
                             help="train networks, run inferences "
                                  "or evaluate inferences",
                             metavar='ACTION',
                             choices=['train', 'inference', 'evaluation'])
    meta_parser.add_argument("-v", "--version",
                             action='version',
                             version=version_string)
    meta_parser.add_argument("-c", "--conf",
                             help="specify configurations from a file",
                             metavar="CONFIG_FILE")
    meta_parser.add_argument("-a", "--application_name",
                             help="specify an application module name",
                             metavar='APPLICATION_NAME',
                             default="")

    meta_args, args_from_cmdline = meta_parser.parse_known_args()
    print(version_string)

    # read configurations, to be parsed by sections
    config_file_name = __resolve_config_file_path(meta_args.conf)
    config = configparser.ConfigParser()
    config.read([config_file_name])

    # infer application name from command
    app_name = None
    try:
        parser_prog = meta_parser.prog.replace('.py', '')
        app_name = parser_prog if parser_prog in SUPPORTED_APP \
            else meta_args.application_name
        assert app_name
    except (AttributeError, AssertionError):
        raise ValueError(
            "\nUnknown application {}, or did you forget '-a' "
            "command argument?{}".format(app_name, EPILOG_STRING))

    # load application by name
    app_module = ApplicationFactory.create(app_name)
    try:
        assert app_module.REQUIRED_CONFIG_SECTION, \
            "\nREQUIRED_CONFIG_SECTION should be static variable " \
            "in {}".format(app_module)
        has_section_in_config(config, app_module.REQUIRED_CONFIG_SECTION)
    except AttributeError:
        raise AttributeError(
            "Application code doesn't have REQUIRED_CONFIG_SECTION property. "
            "{} should be an instance of "
            "niftynet.application.base_application".format(app_module))
    except ValueError:
        raise ValueError(
            "\n{} requires [{}] section in the config file.{}".format(
                app_name, app_module.REQUIRED_CONFIG_SECTION, EPILOG_STRING))

    # check keywords in configuration file
    _check_config_file_keywords(config)

    # using configuration as default, and parsing all command line arguments
    # command line args override the configure file options
    all_args = {}
    for section in config.sections():
        # try to rename user-specified sections for consistency
        section = standardise_section_name(config, section)
        section_defaults = dict(config.items(section))
        section_args, args_from_cmdline = \
            _parse_arguments_by_section([],
                                        section,
                                        section_defaults,
                                        args_from_cmdline,
                                        app_module.REQUIRED_CONFIG_SECTION)
        all_args[section] = section_args

    # check if any args from command line not recognised
    _check_cmd_remaining_keywords(list(args_from_cmdline))

    # split parsed results in all_args
    # into dictionaries of system_args and input_data_args
    system_args, input_data_args = {}, {}
    for section in all_args:

        # copy system default sections to ``system_args``
        if section in SYSTEM_SECTIONS:
            system_args[section] = all_args[section]
            continue

        # copy application specific sections to ``system_args``
        if section == app_module.REQUIRED_CONFIG_SECTION:
            system_args['CUSTOM'] = all_args[section]
            vars(system_args['CUSTOM'])['name'] = app_name
            continue

        # copy non-default sections to ``input_data_args``
        input_data_args[section] = all_args[section]

        # set the output path of csv list if not exists
        try:
            csv_path = resolve_file_name(
                input_data_args[section].csv_file,
                (os.path.dirname(config_file_name), NIFTYNET_HOME))
            input_data_args[section].csv_file = csv_path
            # don't search files if csv specified in config
            try:
                delattr(input_data_args[section], 'path_to_search')
            except AttributeError:
                pass
        except (IOError, TypeError):
            input_data_args[section].csv_file = ''

    # preserve ``config_file`` and ``action parameter`` from the meta_args
    system_args['CONFIG_FILE'] = argparse.Namespace(path=config_file_name)
    system_args['SYSTEM'].action = meta_args.action
    if not system_args['SYSTEM'].model_dir:
        system_args['SYSTEM'].model_dir = os.path.join(
            os.path.dirname(config_file_name), 'model')
    return system_args, input_data_args