diff --git a/package/CHANGELOG b/package/CHANGELOG index fdb4d1dbcbe..bf3c0b724cf 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -68,6 +68,7 @@ Changes * bump minimum numpy version to 1.13.3 Fixes + * fixed reading bz2 compressed psf files (Issue #2232) * fixed mol2 comment header handling (Issue #2261) * fixed reading PDB files with partial CRYST lines (Issue #2252) * fixed transformation tests not being run (Issue #2241) diff --git a/package/MDAnalysis/topology/PSFParser.py b/package/MDAnalysis/topology/PSFParser.py index 3be3b89d4e6..798c5f22591 100644 --- a/package/MDAnalysis/topology/PSFParser.py +++ b/package/MDAnalysis/topology/PSFParser.py @@ -122,14 +122,14 @@ def parse(self, **kwargs): next(psffile) title = next(psffile).split() if not (title[1] == "!NTITLE"): - err = "{0} is not a valid PSF file".format(psffile.name) + err = "{0} is not a valid PSF file".format(self.filename) logger.error(err) raise ValueError(err) # psfremarks = [psffile.next() for i in range(int(title[0]))] for _ in range(int(title[0])): next(psffile) logger.debug("PSF file {0}: format {1}" - "".format(psffile.name, self._format)) + "".format(self.filename, self._format)) # Atoms first and mandatory top = self._parse_sec( diff --git a/testsuite/MDAnalysisTests/topology/test_psf.py b/testsuite/MDAnalysisTests/topology/test_psf.py index 51c809c73d7..c20077ba358 100644 --- a/testsuite/MDAnalysisTests/topology/test_psf.py +++ b/testsuite/MDAnalysisTests/topology/test_psf.py @@ -23,6 +23,8 @@ from __future__ import absolute_import from numpy.testing import assert_equal +import pytest +import bz2 import MDAnalysis as mda from MDAnalysisTests.topology.base import ParserBase @@ -50,6 +52,19 @@ class TestPSFParser(ParserBase): expected_n_residues = 214 expected_n_segments = 1 + @pytest.fixture(params=['uncompressed', 'bz2']) + def filename(self, request, tmpdir): + if request.param == 'uncompressed': + return self.ref_filename + else: + fn = str(tmpdir.join('file.psf.bz2')) + with open(self.ref_filename, 'rb') as f: + stuff = f.read() + buf = bz2.compress(stuff) + with open(fn, 'wb') as out: + out.write(buf) + return fn + def test_bonds_total_counts(self, top): assert len(top.bonds.values) == 3365