Source code for aiida_castep.calculations.helper.generate

"""
Module for generation HELP information using CASTEP
excutable.
"""
import re
import subprocess as sbp
import sys


[docs]def dot_proc(iterable): """Provide a primitive progress bar""" print("Processing keywords") m = len(iterable) - 1 print("=" * (m // 10)) for n, i in enumerate(iterable): if n % 10 == 0: print(".", end="") sys.stdout.flush() if n == m: print("\n") yield i
[docs]def progress(func, *args, **kwargs): try: from tqdm import tqdm except ImportError: return dot_proc(func) else: return tqdm(func, *args, **kwargs)
[docs]def get_castep_commands(castep_command="castep.serial", key="all"): outlines = sbp.check_output([castep_command, "-h", key], universal_newlines=True) lines = outlines.split("\n") cell = {} param = {} for i, line in enumerate(lines): # Skip empty lines if not line.strip(): continue if "Help information on CELL keywords" in line: continue if "Help information on PARAMETERS keywords" in line: next_section = i break key, helpinfo = line.strip().split(None, 1) cell[key] = helpinfo for line in lines[next_section:]: if not line.strip(): continue key, helpinfo = line.strip().split(None, 1) param[key] = helpinfo return cell, param
allowed_value_re = re.compile("Allow values: ([^.\n]+)[.\n]") default_value_re = re.compile("Default value: ([^.\n]+)[.\n]") type_re = re.compile(r"Type: (\w+)") level_re = re.compile(r"Level: (\w+)")
[docs]def parse_help_string(key, excutable="castep.serial"): """Capture help string, determine if it is for PARAM or CELL""" out = sbp.check_output([excutable, "-h", key], universal_newlines=True) lines = out.split("\n") value_type = None key_level = None for i, line in enumerate(lines): if "Help information on PARAMETERS keywords" in line: param_start = i match = type_re.search(line) if match and not value_type: value_type = match.group(1).lower() match = level_re.search(line) if match and not key_level: key_level = match.group(1).lower() cell_lines = lines[2:param_start] param_lines = lines[param_start + 2 :] if len(cell_lines) > len(param_lines): help_lines = cell_lines key_type = "CELL" else: help_lines = param_lines key_type = "PARAM" return help_lines, key_type, key_level, value_type