|
8 | 8 | from ..utilities.constants import FST_D, TAG_ALIASES |
9 | 9 | from ..utilities.datatypes import AtomIndex, ThreeByThreeMatrix, ThreeVector |
10 | 10 | 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 |
12 | 12 |
|
13 | 13 |
|
14 | 14 | class MDAtomProps(TypedDict): |
@@ -120,14 +120,35 @@ def parse_md_geom_file(md_geom_file: TextIO) -> list[MDGeomTimestepInfo]: |
120 | 120 | ------- |
121 | 121 | list[MDGeomTimestepInfo] |
122 | 122 | Step-by-step Parsed info. |
| 123 | +
|
| 124 | + Raises |
| 125 | + ------ |
| 126 | + ValueError |
| 127 | + Potentially invalid MD/Geom file provided. |
123 | 128 | """ |
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 | + |
127 | 144 | steps = [] |
128 | 145 | while block := Block.from_re("", md_geom_file, "", "^$", eof_possible=True): |
129 | 146 | steps.append(parse_md_geom_frame(block)) |
130 | 147 |
|
| 148 | + if not steps: |
| 149 | + logger("Invalid or empty md/geom file.", level="error") |
| 150 | + raise ValueError("Invalid or empty md/geom file.") |
| 151 | + |
131 | 152 | return steps |
132 | 153 |
|
133 | 154 |
|
|
0 commit comments