Skip to content
Snippets Groups Projects
Select Git revision
  • 18514b4473a16ac6ce48c0e7098b1cd4a4d684bf
  • master default protected
2 results

configfiles.py

Blame
  • configfiles.py 3.67 KiB
    """
    Provide functions for reading and parsing configuration files.
    """
    
    # -----------------------------------------------------------------------------
    # IMPORTS
    # -----------------------------------------------------------------------------
    
    import json
    import os
    
    from pycbc.workflow import WorkflowConfigParser
    from pycbc.distributions import read_params_from_config
    
    from .staticargs import amend_static_args, typecast_static_args
    
    
    # -----------------------------------------------------------------------------
    # FUNCTION DEFINITIONS
    # -----------------------------------------------------------------------------
    
    def read_ini_config(file_path):
        """
        Read in a `*.ini` config file, which is used mostly to specify the
        waveform simulation (for example, the waveform model, the parameter
        space for the binary black holes, etc.) and return its contents.
        
        Args:
            file_path (str): Path to the `*.ini` config file to be read in.
    
        Returns:
            A tuple `(variable_arguments, static_arguments)` where
            
            * `variable_arguments` should simply be a list of all the
              parameters which get randomly sampled from the specified
              distributions, usually using an instance of
              :class:`utils.waveforms.WaveformParameterGenerator`.
            * `static_arguments` should be a dictionary containing the keys
              and values of the parameters that are the same for each
              example that is generated (i.e., the non-physical parameters
              such as the waveform model and the sampling rate).
        """
        
        # Make sure the config file actually exists
        if not os.path.exists(file_path):
            raise IOError('Specified configuration file does not exist: '
                          '{}'.format(file_path))
        
        # Set up a parser for the PyCBC config file
        workflow_config_parser = WorkflowConfigParser(configFiles=[file_path])
        
        # Read the variable_arguments and static_arguments using the parser
        variable_arguments, static_arguments = \
            read_params_from_config(workflow_config_parser)
        
        # Typecast and amend the static arguments
        static_arguments = typecast_static_args(static_arguments)
        static_arguments = amend_static_args(static_arguments)
        
        return variable_arguments, static_arguments
    
    
    def read_json_config(file_path):
        """
        Read in a `*.json` config file, which is used to specify the
        sample generation process itself (for example, the number of
        samples to generate, the number of concurrent processes to use,
        etc.) and return its contents.
        
        Args:
            file_path (str): Path to the `*.json` config file to be read in.
    
        Returns:
            A `dict` containing the contents of the given JSON file.
        """
        
        # Make sure the config file actually exists
        if not os.path.exists(file_path):
            raise IOError('Specified configuration file does not exist: '
                          '{}'.format(file_path))
        
        # Open the config while and load the JSON contents as a dict
        with open(file_path, 'r') as json_file:
            config = json.load(json_file)
    
        # Define the required keys for the config file in a set
        required_keys = {'background_data_directory', 'dq_bits', 'inj_bits',
                         'waveform_params_file_name', 'max_runtime',
                         'n_injection_samples', 'n_noise_samples', 'n_processes',
                         'random_seed', 'output_file_name'}
        
        # Make sure no required keys are missing
        missing_keys = required_keys.difference(set(config.keys()))
        if missing_keys:
            raise KeyError('Missing required key(s) in JSON configuration file: '
                           '{}'.format(', '.join(list(missing_keys))))
    
        return config