diff --git a/gmso/formats/gro.py b/gmso/formats/gro.py index 3c2c07aeb..bf21aef42 100644 --- a/gmso/formats/gro.py +++ b/gmso/formats/gro.py @@ -42,8 +42,8 @@ def read_gro(filename): Gro files do not specify connections between atoms, the returned topology will not have connections between sites either. - Currently this implementation does not support a gro file with more than 1 - frame. + Currently this implementation does not support parsing velocities from a gro file or gro file + with more than 1 frame. All residues and resid information from the gro file are currently lost when converting to `topology`. @@ -57,7 +57,6 @@ def read_gro(filename): coords = u.nm * np.zeros(shape=(n_atoms, 3)) for row, _ in enumerate(coords): line = gro_file.readline() - content = line.split() if not line: msg = ( "Incorrect number of lines in .gro file. Based on the " @@ -65,24 +64,29 @@ def read_gro(filename): "atoms were expected, but at least one fewer was found." ) raise ValueError(msg.format(n_atoms)) + res_id = int(line[:5].strip()) + res_name = line[5:10].strip() + atom_name = line[10:15].strip() + atom_id = line[15:20].strip() - res = content[0] - atom_name = content[1] - atom_id = content[2] + positions = line[20:].split() coords[row] = u.nm * np.array( [ - float(content[3]), - float(content[4]), - float(content[5]), + float(positions[0]), + float(positions[1]), + float(positions[2]), ] ) site = Atom(name=atom_name, position=coords[row]) - r = re.compile("([0-9]+)([a-zA-Z]+)") - m = r.match(res) - site.molecule = (m.group(2), int(m.group(1))) - site.residue = (m.group(2), int(m.group(1))) + site.molecule = (res_name, res_id) + site.residue = (res_name, res_id) top.add_site(site, update_types=False) + + if len(positions) == 6: + warnings.warn( + "Velocity information presents but will not be parsed." + ) top.update_topology() # Box information diff --git a/gmso/tests/test_gro.py b/gmso/tests/test_gro.py index 946d9f5dc..d19227dd2 100644 --- a/gmso/tests/test_gro.py +++ b/gmso/tests/test_gro.py @@ -39,7 +39,7 @@ def test_read_gro(self): ) def test_wrong_n_atoms(self): - with pytest.raises(IndexError): + with pytest.raises(ValueError): Topology.load(get_fn("too_few_atoms.gro")) with pytest.raises(ValueError): Topology.load(get_fn("too_many_atoms.gro"))