From b7526cba539942e7debb4267ae74e4a7e340fb1e Mon Sep 17 00:00:00 2001 From: Lily Wang Date: Wed, 21 Aug 2019 13:13:22 +1000 Subject: [PATCH 1/4] removed hardcoded atom line --- package/MDAnalysis/topology/LAMMPSParser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/MDAnalysis/topology/LAMMPSParser.py b/package/MDAnalysis/topology/LAMMPSParser.py index 164ed421c4a..9df7b950ea0 100644 --- a/package/MDAnalysis/topology/LAMMPSParser.py +++ b/package/MDAnalysis/topology/LAMMPSParser.py @@ -619,7 +619,7 @@ def parse(self, **kwargs): fin.readline() # ITEM ATOMS for i in range(natoms): - idx, atype, _, _, _ = fin.readline().split() + idx, atype, *_ = fin.readline().split() indices[i] = idx types[i] = atype From d45a8f11d1099ecb70cb43f5195f411150ea1478 Mon Sep 17 00:00:00 2001 From: Lily Wang Date: Wed, 21 Aug 2019 13:22:39 +1000 Subject: [PATCH 2/4] added PR2333 --- package/CHANGELOG | 1 + 1 file changed, 1 insertion(+) diff --git a/package/CHANGELOG b/package/CHANGELOG index 87bef9ee407..7ed03d7b2b7 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -20,6 +20,7 @@ mm/dd/yy richardjgowers, kain88-de, lilyminium, p-j-smith, bdice, joaomcteixeira * 0.21.0 Fixes + * fixed LammpsDumpParser failing on files >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) From aefbaf5eb658d53c755eb61b6b185f18fda59547 Mon Sep 17 00:00:00 2001 From: Lily Wang Date: Mon, 23 Sep 2019 03:47:25 +1000 Subject: [PATCH 3/4] rebased --- package/CHANGELOG | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index 7ed03d7b2b7..fff2ea50198 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -20,7 +20,8 @@ mm/dd/yy richardjgowers, kain88-de, lilyminium, p-j-smith, bdice, joaomcteixeira * 0.21.0 Fixes - * fixed LammpsDumpParser failing on files >5 fields in atom lines (PR #2333) + * 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) From d6e904d1b4d9fa5f41ef563e53f22f21965b6db0 Mon Sep 17 00:00:00 2001 From: Lily Wang Date: Fri, 14 Feb 2020 11:16:10 +1100 Subject: [PATCH 4/4] added docs and test --- package/MDAnalysis/coordinates/LAMMPS.py | 7 +++++-- package/MDAnalysis/topology/LAMMPSParser.py | 13 ++++++++----- .../data/lammps/wat.lammpstrj_long.bz2 | Bin 0 -> 1003 bytes testsuite/MDAnalysisTests/datafiles.py | 2 ++ .../MDAnalysisTests/topology/test_lammpsdata.py | 5 +++++ 5 files changed, 20 insertions(+), 7 deletions(-) create mode 100644 testsuite/MDAnalysisTests/data/lammps/wat.lammpstrj_long.bz2 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 9df7b950ea0..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 0000000000000000000000000000000000000000..9eac26d0f15a5a3da190c8fd4093f33396c0ea34 GIT binary patch literal 1003 zcmV!03t59LA2Bfhq4v>H(kZQ_^AVb+2ganMmWpP9xBa#W6U@5XTCep+ioPn5KRu(`> zxZ{SZ@n8!P1Ti2;ks<6tav;?QNPyHr5ebc;16c~wS1Q6zNgCrOttl3Zvk*lgS{d8B zvXslKl`m|P^;WTpn;T}WR+8=A9*-B2D@=N;O(ZLTf1BKnnBBR+r}k5W0CSUDg* z)soYa29rQb1oEK!{oxOkro<7*2O5->XNhTW-aDelN-4>(oO8_lE2&6zj zAliI>EDy(~91Cx}tk1BgFZL{dj8vzi>YGjJJddCVv&bxfe1IH-Zg$_Dj|`4?s$l%w z&BjX$rVe*Dq_>Q>s69uc)97hv!3iH7J;-7}4;jXv3eJ(R(r~aD4F;Tm+QO829yRPF zl1U_zSG)k{t9oaw>)VA}mLv+R50z1oY+Y;ZS2e6Se0<&NIQ>}yx0`e%5X_mw<-%eS zbBs2*q(HQ0LGI+UE4!XB_hv)xxx4Cn)^?3nqhCU%V2LIqeP~H?1+0<^h${$$6ak8A znxuvh0Bbt%J$QFfH;4?mbm5ku#77kw@7_9#7tvjH$J@^3gFkQqAUOfTLCFf0^WIL< z94!%i#oMq)jnViR;rEf(Q4b#QRRBGG^SkusDJXG9OIIZBtwnaI2vy|kYc68&V+Z>6SJk`Kv*Hi1J)X{kPQ!uJa5|4>ok9IMdk*KoecxBi@jQtu-RAUs Z9HH>i9p3Gm4|Wg8yOJrwgo2C*H~>f0(I)@^ literal 0 HcmV?d00001 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