diff --git a/dpdata/cp2k/output.py b/dpdata/cp2k/output.py index 0b08c51ef..0c8df6d78 100644 --- a/dpdata/cp2k/output.py +++ b/dpdata/cp2k/output.py @@ -76,12 +76,14 @@ def __next__(self): def get_log_block_generator(self): lines = [] delimiter_flag = False + yield_flag = False while True: line = self.log_file_object.readline() if line: lines.append(line) if any(p.match(line) for p in delimiter_patterns): if delimiter_flag is True: + yield_flag = True yield lines lines = [] delimiter_flag = False @@ -91,17 +93,23 @@ def get_log_block_generator(self): if any(p.match(line) for p in avail_patterns): delimiter_flag = True else: + if not yield_flag: + raise StopIteration("None of the delimiter patterns are matched") break if delimiter_flag is True: raise RuntimeError("This file lacks some content, please check") def get_xyz_block_generator(self): p3 = re.compile(r"^\s*(\d+)\s*") + yield_flag = False while True: line = self.xyz_file_object.readline() if not line: + if not yield_flag: + raise StopIteration("None of the xyz patterns are matched") break if p3.match(line): + yield_flag = True atom_num = int(p3.match(line).group(1)) lines = [] lines.append(line) diff --git a/dpdata/plugins/cp2k.py b/dpdata/plugins/cp2k.py index 1f09adaef..162098f70 100644 --- a/dpdata/plugins/cp2k.py +++ b/dpdata/plugins/cp2k.py @@ -4,29 +4,48 @@ from dpdata.cp2k.output import Cp2kSystems from dpdata.format import Format +string_warning = """ +Hi, you got an error from dpdata, +please check if your cp2k files include full information, +otherwise its version is not supported by dpdata. +Try use dpdata plugin from cp2kdata package, +for details, please refer to +https://robinzyb.github.io/cp2kdata/ +""" + @Format.register("cp2k/aimd_output") class CP2KAIMDOutputFormat(Format): def from_labeled_system(self, file_name, restart=False, **kwargs): xyz_file = sorted(glob.glob(f"{file_name}/*pos*.xyz"))[0] log_file = sorted(glob.glob(f"{file_name}/*.log"))[0] - return tuple(Cp2kSystems(log_file, xyz_file, restart)) + try: + return tuple(Cp2kSystems(log_file, xyz_file, restart)) + except (StopIteration, RuntimeError) as e: + # StopIteration is raised when pattern match is failed + raise PendingDeprecationWarning(string_warning) from e @Format.register("cp2k/output") class CP2KOutputFormat(Format): def from_labeled_system(self, file_name, restart=False, **kwargs): - data = {} - ( - data["atom_names"], - data["atom_numbs"], - data["atom_types"], - data["cells"], - data["coords"], - data["energies"], - data["forces"], - tmp_virial, - ) = dpdata.cp2k.output.get_frames(file_name) - if tmp_virial is not None: - data["virials"] = tmp_virial - return data + try: + data = {} + ( + data["atom_names"], + data["atom_numbs"], + data["atom_types"], + data["cells"], + data["coords"], + data["energies"], + data["forces"], + tmp_virial, + ) = dpdata.cp2k.output.get_frames(file_name) + if tmp_virial is not None: + data["virials"] = tmp_virial + return data + # TODO: in the future, we should add exact error type here + # TODO: when pattern match is failed + # TODO: For now just use RuntimeError as a placeholder. + except RuntimeError as e: + raise PendingDeprecationWarning(string_warning) from e