Skip to content

Commit 1139341

Browse files
committed
Make the MD/Geom reader slightly more defensive
1 parent 5aba313 commit 1139341

File tree

1 file changed

+25
-4
lines changed

1 file changed

+25
-4
lines changed

castep_outputs/parsers/md_geom_file_parser.py

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from ..utilities.constants import FST_D, TAG_ALIASES
99
from ..utilities.datatypes import AtomIndex, ThreeByThreeMatrix, ThreeVector
1010
from ..utilities.filewrapper import Block
11-
from ..utilities.utility import add_aliases, atreg_to_index, file_or_path, to_type
11+
from ..utilities.utility import add_aliases, atreg_to_index, file_or_path, log_factory, to_type
1212

1313

1414
class MDAtomProps(TypedDict):
@@ -120,14 +120,35 @@ def parse_md_geom_file(md_geom_file: TextIO) -> list[MDGeomTimestepInfo]:
120120
-------
121121
list[MDGeomTimestepInfo]
122122
Step-by-step Parsed info.
123+
124+
Raises
125+
------
126+
ValueError
127+
Potentially invalid MD/Geom file provided.
123128
"""
124-
while "END header" not in md_geom_file.readline():
125-
pass
126-
md_geom_file.readline()
129+
logger = log_factory(md_geom_file)
130+
131+
for line in md_geom_file:
132+
if line.strip() and line.strip() == "BEGIN header":
133+
while "END header" not in md_geom_file.readline():
134+
pass
135+
md_geom_file.readline()
136+
break
137+
else:
138+
logger("Non-standard md/geom file: missing header.", level="warning")
139+
md_geom_file.seek(0)
140+
while not md_geom_file.readline().strip():
141+
pass
142+
break
143+
127144
steps = []
128145
while block := Block.from_re("", md_geom_file, "", "^$", eof_possible=True):
129146
steps.append(parse_md_geom_frame(block))
130147

148+
if not steps:
149+
logger("Invalid or empty md/geom file.", level="error")
150+
raise ValueError("Invalid or empty md/geom file.")
151+
131152
return steps
132153

133154

0 commit comments

Comments
 (0)