Module sprit.sprit_cli

This module/script is used to run sprit from the command line.

The arguments here should correspond to any of the keyword arguments that can be used with sprit.run() (or sprit_hvsr.run()). See the run() function's documentation for more information, or the individual functions that are run within it.

For list inputs, you should pass the argument multiple times(e.g., –report_format "csv" –report_format "print" –report_format "plot"). (In the case of –report_format, you can also just use "all" to get csv, print, and plot report types)

The input_data parameter of input_params() is the only required argument, though for your data processing to work correctly and to be formatted correctly, you may need to pass others as well.

Functions

def get_param_docstring(func, param_name)
Expand source code
def get_param_docstring(func, param_name):
    function_docstring = func.__doc__

    # Search for the parameter's docstring within the function's docstring
    param_docstring = None
    if function_docstring:
        param_start = function_docstring.find(f'{param_name} :')
        param_start = param_start + len(f'{param_name} :')
        if param_start != -1:
            param_end_line1 = function_docstring.find('\n', param_start + 1)
            param_end = function_docstring.find('\n', param_end_line1 + 1)
            if param_end != -1:
                param_docstring = function_docstring[param_start:param_end].strip()
    
    if param_docstring is None:
        param_docstring = ''
    return param_docstring
def main()
Expand source code
def main():
    parser = argparse.ArgumentParser(description='CLI for SPRIT HVSR package (specifically the sprit.run() function)')
    
    hvsrFunctions = [sprit.run,
                    sprit.input_params,
                     sprit.fetch_data,
                     sprit.calculate_azimuth,
                     sprit.remove_noise,
                     sprit.generate_psds,
                     sprit.process_hvsr,
                     sprit.remove_outlier_curves,
                     sprit.check_peaks,
                     sprit.get_report]#,
                     #sprit.plot_hvsr]

    hvsrFunDict = {sprit.run: inspect.signature(sprit.run).parameters,
                    sprit.input_params: inspect.signature(sprit.input_params).parameters,
                     sprit.fetch_data: inspect.signature(sprit.fetch_data).parameters,
                     sprit.calculate_azimuth: inspect.signature(sprit.calculate_azimuth).parameters,
                     sprit.remove_noise: inspect.signature(sprit.remove_noise).parameters,
                     sprit.generate_psds: inspect.signature(sprit.generate_psds).parameters,
                     sprit.process_hvsr: inspect.signature(sprit.process_hvsr).parameters,
                     sprit.remove_outlier_curves: inspect.signature(sprit.remove_outlier_curves).parameters,
                     sprit.check_peaks: inspect.signature(sprit.check_peaks).parameters,
                     sprit.get_report: inspect.signature(sprit.get_report).parameters     
                    }

    # Get default parameters from main functions
    parameters = []
    for f in hvsrFunctions:
        parameters.append(inspect.signature(f).parameters)
    #for f, p in hvsrFunDict.items():
        
    
    # Add argument and options to the parser
    intermediate_params_list = ['params', 'input', 'hvsr_data', 'hvsr_results']
    paramNamesList = []
    for i, param in enumerate(parameters):
        for name, parameter in param.items():
            # Add arguments and options here
            if name not in paramNamesList and name not in intermediate_params_list:
                paramNamesList.append(name)
                curr_doc_str = get_param_docstring(func=hvsrFunctions[i], param_name=name)
                if name == 'input_data':
                    parser.add_argument(name, help=f'{curr_doc_str}')
                elif name == 'verbose':
                    parser.add_argument('-v', '--verbose',  action='store_true', help='Print status and results to terminal.', default=parameter.default)
                else:
                    helpStr = f'Keyword argument {name} in function sprit.{hvsrFunctions[i].__name__}(). default={parameter.default}.\n\t{curr_doc_str}'
                    parser.add_argument(F'--{name}', help=helpStr, default=parameter.default)

    # Add more arguments/options as needed
    args = parser.parse_args()

    # Map command-line arguments/options to kwargs
    kwargs = {}
    for arg_name, arg_value in vars(args).items():      
        if isinstance(arg_value, str):
            if "=" in arg_value:
                arg_value = {arg_value.split('=')[0]: arg_value.split('=')[1]}

            if arg_value.lower() == 'true':
                arg_value = True
            elif arg_value.lower() == 'false':
                arg_value = False
            elif arg_value.lower() == 'none':
                arg_value = None
            elif "[" in arg_value:
                arg_value = arg_value.replace('[', '').replace(']', '')
                arg_value = arg_value.split(',')
            elif "," in arg_value:
                arg_value = arg_value.split(',')
        
        is_default = False    
        for k, v in hvsrFunDict.items():
            for param in v:
                if param == arg_name and arg_value == v[arg_name].default:
                    is_default = True
                    continue
                    
            if is_default:
                continue
            
        if not is_default:
            kwargs[arg_name] = arg_value
        
    # Call the sprit.run function with the generated kwargs
    kwargs['input_data'] = kwargs['input_data'].replace("'", "")  # Remove single quotes to reduce errors
    if str(kwargs['input_data']).lower() == 'gui':
        sprit.gui()
    else:
        #Print a summary if not verbose
        if 'verbose' not in kwargs or not kwargs['verbose']:
            print("\nRunning sprit.run() with the following arguments (use --verbose for more information):\n")
            print("\tsprit.run(", end='')
            for key, value in kwargs.items():
                if 'kwargs' in str(key):
                    pass
                else:
                    if type(value) is str:
                        print(f"{key}='{value}'", end=', ')
                    else:
                        print(f"{key}={value}", end=', ')
            print('**ppsd_kwargs, **kwargs', end='')
            print(')')

        print('\tNon-default kwargs:')
        [print(f"\t\t {k} = {v}") for k, v in kwargs.items()]
        print()
        
        sprit.run(**kwargs)