Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add decrecaption warning when dpdata throws errors while parsing cp2k #558

Merged
merged 10 commits into from
Oct 30, 2023
8 changes: 8 additions & 0 deletions dpdata/cp2k/output.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,12 +76,14 @@
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
Expand All @@ -91,17 +93,23 @@
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")

Check warning on line 97 in dpdata/cp2k/output.py

View check run for this annotation

Codecov / codecov/patch

dpdata/cp2k/output.py#L97

Added line #L97 was not covered by tests
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")

Check warning on line 109 in dpdata/cp2k/output.py

View check run for this annotation

Codecov / codecov/patch

dpdata/cp2k/output.py#L109

Added line #L109 was not covered by tests
break
if p3.match(line):
yield_flag = True
atom_num = int(p3.match(line).group(1))
lines = []
lines.append(line)
Expand Down
53 changes: 36 additions & 17 deletions dpdata/plugins/cp2k.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Try use dpdata plugin from cp2kdata package,
Try to 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:
xyz_file = sorted(glob.glob(f"{file_name}/*pos*.xyz"))[0]
log_file = sorted(glob.glob(f"{file_name}/*.log"))[0]
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These two lines do not need to be inside the try...except block.

return tuple(Cp2kSystems(log_file, xyz_file, restart))
except (StopIteration, RuntimeError):

Check warning on line 24 in dpdata/plugins/cp2k.py

View check run for this annotation

Codecov / codecov/patch

dpdata/plugins/cp2k.py#L24

Added line #L24 was not covered by tests
# StopIteration is raised when pattern match is failed
print(string_warning)

Check warning on line 26 in dpdata/plugins/cp2k.py

View check run for this annotation

Codecov / codecov/patch

dpdata/plugins/cp2k.py#L26

Added line #L26 was not covered by tests


@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:
print(string_warning)

Check warning on line 51 in dpdata/plugins/cp2k.py

View check run for this annotation

Codecov / codecov/patch

dpdata/plugins/cp2k.py#L50-L51

Added lines #L50 - L51 were not covered by tests
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This ignores the error and does not exit the program. Is it expected?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There may be two codes acceptable:

except RuntimeError from e:
    raise PendingDeprecationWarning(string_warning) from e

or

except RuntimeError from e:
    warnings.warn(string_warning)
    raise e

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

not exactly. I was trying to find a decent way that raises errors without showing too much trace back. In that case, users are often distracted by the trace back. But except: print won't stop the code which would cause worse consequences. I will added them back.

Loading