Source code for matador.utils.castep_help_utils

#!/usr/bin/env python
# coding: utf-8
# Distributed under the terms of the MIT License.

""" This submodule is essentially a script to scrape CASTEP help strings
for all possible CASTEP parameters.

"""


[docs]def scrape_castep_params(executable): """Scan CASTEP help system for parameter file keywords. Parameters: executable (str): name of CASTEP executable Returns: list: list of cell keyword strings list: list of cell blocks names list: list of param keyword strings str: castep version number used """ import string import subprocess params = set() cell = set() for letter in string.ascii_lowercase: output = str( subprocess.check_output("{} -s {}".format(executable, letter), shell=True) ) for param in output.split("PARAMETERS")[-1].split("\\n")[1:]: try: if len(param) > 1: params.add(str(param.split()[0])) except Exception: pass for keyword in output.split("PARAMETERS")[0].split("\\n")[1:]: try: if len(keyword) > 1: cell.add(str(keyword.split()[0])) except Exception: pass output = str(subprocess.check_output("{} -s block".format(executable), shell=True)) blocks = set() for keyword in output.split("PARAMETERS")[0].split("\\n")[1:]: try: if len(keyword) > 1: blocks.add(str(keyword.split()[0])) except Exception: pass params = list(sorted(list(params))) cell = list(sorted(list(cell))) blocks = list(sorted(list(blocks))) cell = [keyword for keyword in cell if keyword not in blocks] version_string = ( str(subprocess.check_output("{} --version".format(executable), shell=True)) .split("\\n")[0] .split()[-1] .strip() ) return cell, blocks, params, version_string
[docs]def update_castep_param_list(executable): """Update the castep_params.py file. Parameters: executable (str): name of CASTEP executable """ cell, blocks, params, version = scrape_castep_params(executable) with open("castep_params.py", "w") as f: f.write('""" This file contains a Python list of all CASTEP parameters,\n') f.write('automatically generated with file_utils.scrape_castep_params().\n"""') f.write("\n\n") f.write("CASTEP_VERSION = {}".format(version)) f.write("\n\n") f.write("CASTEP_CELL_KEYWORDS = [\n") for keyword in cell: f.write(" '{}',\n".format(keyword.lower())) f.write(" ]\n") f.write("CASTEP_CELL_BLOCKS = [\n") for keyword in blocks: f.write(" '{}',\n".format(keyword.lower())) f.write(" ]\n") f.write("CASTEP_PARAMS = [\n") for param in params: f.write(" '{}',\n".format(param.lower())) f.write(" ]\n")
if __name__ == "__main__": from sys import argv if len(argv) > 1: executable = argv[1] else: executable = "castep" print("Updating castep_parameters.py with executable {}".format(executable)) update_castep_param_list(executable)