"""Drones for parsing VASP calculations and related outputs."""from__future__importannotationsimportloggingimportosfrompathlibimportPathfrompymatgen.apps.borg.hiveimportAbstractDronefromatomate2.cp2k.schemas.taskimportTaskDocumentlogger=logging.getLogger(__name__)
[docs]classCp2kDrone(AbstractDrone):""" A CP2K drone to parse CP2K outputs. Parameters ---------- **task_document_kwargs Additional keyword args passed to :obj:`.TaskDocument.from_directory`. """def__init__(self,**task_document_kwargs)->None:self.task_document_kwargs=task_document_kwargs
[docs]defassimilate(self,path:str|Path|None=None)->TaskDocument:""" Parse CP2K output files and return the output document. Parameters ---------- path : str or Path or None Path to the directory containing CP2K outputs Returns ------- TaskDocument A CP2K task document. """path=pathorPath.cwd()try:doc=TaskDocument.from_directory(path,**self.task_document_kwargs)exceptException:importtracebacklogger.exception(f"Error in {Path(path).absolute()}\n{traceback.format_exc()}")raisereturndoc
[docs]defget_valid_paths(self,path:tuple[str,list[str],list[str]])->list[str]:"""Get valid paths to assimilate. There are some restrictions on the valid directory structures: 1. There can be only one cp2k.out in each directory. Nested directories are ok. 2. Directories designated "relax1"..."relax9" are considered to be parts of a multiple-optimization run. 3. Directories containing VASP output with ".relax1"...".relax9" are also considered as parts of a multiple-optimization run. Parameters ---------- path : tuple of (str, list of str, list of str) Input path as a tuple generated from ``os.walk``, i.e., (parent, subdirs, files). Returns ------- list of str A list of paths to assimilate. """parent,subdirs,_=pathtask_names=["precondition"]+[f"relax{i}"foriinrange(9)]ifset(task_names).intersection(subdirs):return[parent]if(notany(parent.endswith(os.sep+r)forrintask_names)andlen(list(Path(parent).glob("cp2k.out*")))>0):return[parent]return[]