diff --git a/package/CHANGELOG b/package/CHANGELOG index 87bef9ee407..fff2ea50198 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -20,6 +20,8 @@ mm/dd/yy richardjgowers, kain88-de, lilyminium, p-j-smith, bdice, joaomcteixeira * 0.21.0 Fixes + * fixed LammpsDumpParser failing on files with >5 fields in atom lines + (PR #2333) * Handle exception when PDBWriter is trying to remove an invalid StringIO (Issue #2512) * Clarifies density_from_Universe docs and adds user warning (Issue #2372) diff --git a/package/MDAnalysis/coordinates/LAMMPS.py b/package/MDAnalysis/coordinates/LAMMPS.py index 02c65898b26..2bf206903ff 100644 --- a/package/MDAnalysis/coordinates/LAMMPS.py +++ b/package/MDAnalysis/coordinates/LAMMPS.py @@ -459,6 +459,8 @@ class DumpReader(base.ReaderBase): """Reads the default `LAMMPS dump format`_ Expects trajectories produced by the default 'atom' style dump. + The id of the atom must be the first field, and the coordinates + must be the last 3 fields. Will automatically convert positions from their scaled/fractional representation to their real values. @@ -563,9 +565,10 @@ def _read_next_timestep(self): f.readline() # ITEM ATOMS etc for i in range(self.n_atoms): - idx, _, xs, ys, zs = f.readline().split() + fields = f.readline().split() - indices[i] = idx + indices[i] = fields[0] + xs, ys, zs = fields[-3:] ts.positions[i] = xs, ys, zs order = np.argsort(indices) diff --git a/package/MDAnalysis/topology/LAMMPSParser.py b/package/MDAnalysis/topology/LAMMPSParser.py index 164ed421c4a..37eb7848d40 100644 --- a/package/MDAnalysis/topology/LAMMPSParser.py +++ b/package/MDAnalysis/topology/LAMMPSParser.py @@ -593,9 +593,12 @@ def _parse_box(self, header): class LammpsDumpParser(TopologyReaderBase): - """Parses Lammps ascii dump files in 'atom' format + """Parses Lammps ascii dump files in 'atom' format. + + The id of the atom must be the first field, and the atom types + must be the second field. - Only reads atom ids. Sets all masses to 1.0. + Sets all masses to 1.0. .. versionadded:: 0.19.0 """ @@ -619,10 +622,10 @@ def parse(self, **kwargs): fin.readline() # ITEM ATOMS for i in range(natoms): - idx, atype, _, _, _ = fin.readline().split() + fields = fin.readline().split() - indices[i] = idx - types[i] = atype + indices[i] = fields[0] + types[i] = fields[1] order = np.argsort(indices) indices = indices[order] diff --git a/testsuite/MDAnalysisTests/data/lammps/wat.lammpstrj_long.bz2 b/testsuite/MDAnalysisTests/data/lammps/wat.lammpstrj_long.bz2 new file mode 100644 index 00000000000..9eac26d0f15 Binary files /dev/null and b/testsuite/MDAnalysisTests/data/lammps/wat.lammpstrj_long.bz2 differ diff --git a/testsuite/MDAnalysisTests/datafiles.py b/testsuite/MDAnalysisTests/datafiles.py index f6873c7a7f0..02606d89be8 100644 --- a/testsuite/MDAnalysisTests/datafiles.py +++ b/testsuite/MDAnalysisTests/datafiles.py @@ -129,6 +129,7 @@ "LAMMPShyd", "LAMMPShyd2", "LAMMPSdata_deletedatoms", # with deleted atoms "LAMMPSDUMP", + "LAMMPSDUMP_long", # lammpsdump file with extra columns "unordered_res", # pdb file with resids non sequential "GMS_ASYMOPT", # GAMESS C1 optimization "GMS_SYMOPT", # GAMESS D4h optimization @@ -440,6 +441,7 @@ LAMMPShyd2 = resource_filename(__name__, "data/lammps/hydrogen-class1.data2") LAMMPSdata_deletedatoms = resource_filename(__name__, 'data/lammps/deletedatoms.data') LAMMPSDUMP = resource_filename(__name__, "data/lammps/wat.lammpstrj.bz2") +LAMMPSDUMP_long = resource_filename(__name__, "data/lammps/wat.lammpstrj_long.bz2") unordered_res = resource_filename(__name__, "data/unordered_res.pdb") diff --git a/testsuite/MDAnalysisTests/topology/test_lammpsdata.py b/testsuite/MDAnalysisTests/topology/test_lammpsdata.py index fa8adabe3cc..739b7adf08d 100644 --- a/testsuite/MDAnalysisTests/topology/test_lammpsdata.py +++ b/testsuite/MDAnalysisTests/topology/test_lammpsdata.py @@ -37,6 +37,7 @@ LAMMPShyd2, LAMMPSdata_deletedatoms, LAMMPSDUMP, + LAMMPSDUMP_long, ) @@ -270,3 +271,7 @@ def test_id_ordering(self): u = mda.Universe(self.ref_filename, format='LAMMPSDUMP') # the 4th in file has id==13, but should have been sorted assert u.atoms[3].id == 4 + +class TestDumpParserLong(TestDumpParser): + + ref_filename = LAMMPSDUMP_long