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
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
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