From e64e8f159e7113d0f66ee1cb60f7e5cb69c30b9b Mon Sep 17 00:00:00 2001 From: Lily Wang Date: Thu, 22 Aug 2019 18:08:07 +1000 Subject: [PATCH 1/3] added explicit format to ChainReader --- package/MDAnalysis/coordinates/GRO.py | 5 ++++- package/MDAnalysis/coordinates/core.py | 4 ++-- package/MDAnalysis/core/universe.py | 2 +- testsuite/MDAnalysisTests/coordinates/test_chainreader.py | 5 +++-- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/package/MDAnalysis/coordinates/GRO.py b/package/MDAnalysis/coordinates/GRO.py index 25f42c409f3..d3b46784679 100644 --- a/package/MDAnalysis/coordinates/GRO.py +++ b/package/MDAnalysis/coordinates/GRO.py @@ -178,7 +178,10 @@ def _read_first_frame(self): with util.openany(self.filename, 'rt') as grofile: # Read first two lines to get number of atoms grofile.readline() - self.n_atoms = n_atoms = int(grofile.readline()) + try: + self.n_atoms = n_atoms = int(grofile.readline()) + except ValueError: + raise ValueError('Invalid GRO file: second line is not number of atoms.') self.ts = ts = self._Timestep(n_atoms, **self._ts_kwargs) # Always try, and maybe add them later velocities = np.zeros((n_atoms, 3), dtype=np.float32) diff --git a/package/MDAnalysis/coordinates/core.py b/package/MDAnalysis/coordinates/core.py index d36a3539879..12fbafed9a5 100644 --- a/package/MDAnalysis/coordinates/core.py +++ b/package/MDAnalysis/coordinates/core.py @@ -46,7 +46,7 @@ from ..core._get_readers import get_reader_for, get_writer_for -def reader(filename, **kwargs): +def reader(filename, format=None, **kwargs): """Provide a trajectory reader instance for *filename*. This function guesses the file format from the extension of *filename* and @@ -80,7 +80,7 @@ def reader(filename, **kwargs): format=filename[1]) return Reader(filename[0], **kwargs) else: - Reader = get_reader_for(filename) + Reader = get_reader_for(filename, format=format) return Reader(filename, **kwargs) diff --git a/package/MDAnalysis/core/universe.py b/package/MDAnalysis/core/universe.py index b02f462e69d..5594ce4a209 100644 --- a/package/MDAnalysis/core/universe.py +++ b/package/MDAnalysis/core/universe.py @@ -601,7 +601,7 @@ def load_new(self, filename, format=None, in_memory=False, **kwargs): # supply number of atoms for readers that cannot do it for themselves kwargs['n_atoms'] = self.atoms.n_atoms - self.trajectory = reader(filename, **kwargs) + self.trajectory = reader(filename, format=format, **kwargs) if self.trajectory.n_atoms != len(self.atoms): raise ValueError("The topology and {form} trajectory files don't" " have the same number of atoms!\n" diff --git a/testsuite/MDAnalysisTests/coordinates/test_chainreader.py b/testsuite/MDAnalysisTests/coordinates/test_chainreader.py index 0b41aed0eb0..10be3f8578f 100644 --- a/testsuite/MDAnalysisTests/coordinates/test_chainreader.py +++ b/testsuite/MDAnalysisTests/coordinates/test_chainreader.py @@ -205,8 +205,9 @@ def test_set_one_format_tuple(self): assert universe.trajectory.n_frames == 99 def test_set_all_formats(self): - universe = mda.Universe(PSF, [PDB_small, PDB_closed], format='pdb') - assert universe.trajectory.n_frames == 2 + with pytest.raises(ValueError) as errinfo: + mda.Universe(PDB, [PDB, GRO], format='gro') + assert str(errinfo.value) == 'Invalid GRO file: second line is not number of atoms.' def build_trajectories(folder, sequences, fmt='xtc'): From 36834a2be937d8e1927661d1e1fabe3503df100c Mon Sep 17 00:00:00 2001 From: Lily Wang Date: Thu, 22 Aug 2019 18:36:35 +1000 Subject: [PATCH 2/3] added general error --- package/MDAnalysis/coordinates/GRO.py | 5 +---- package/MDAnalysis/coordinates/core.py | 6 +++++- testsuite/MDAnalysisTests/coordinates/test_chainreader.py | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/package/MDAnalysis/coordinates/GRO.py b/package/MDAnalysis/coordinates/GRO.py index d3b46784679..25f42c409f3 100644 --- a/package/MDAnalysis/coordinates/GRO.py +++ b/package/MDAnalysis/coordinates/GRO.py @@ -178,10 +178,7 @@ def _read_first_frame(self): with util.openany(self.filename, 'rt') as grofile: # Read first two lines to get number of atoms grofile.readline() - try: - self.n_atoms = n_atoms = int(grofile.readline()) - except ValueError: - raise ValueError('Invalid GRO file: second line is not number of atoms.') + self.n_atoms = n_atoms = int(grofile.readline()) self.ts = ts = self._Timestep(n_atoms, **self._ts_kwargs) # Always try, and maybe add them later velocities = np.zeros((n_atoms, 3), dtype=np.float32) diff --git a/package/MDAnalysis/coordinates/core.py b/package/MDAnalysis/coordinates/core.py index 12fbafed9a5..6648e05e310 100644 --- a/package/MDAnalysis/coordinates/core.py +++ b/package/MDAnalysis/coordinates/core.py @@ -78,10 +78,14 @@ def reader(filename, format=None, **kwargs): if isinstance(filename, tuple): Reader = get_reader_for(filename[0], format=filename[1]) - return Reader(filename[0], **kwargs) + filename = filename[0] else: Reader = get_reader_for(filename, format=format) + try: return Reader(filename, **kwargs) + except ValueError: + raise ValueError('Unable to read {fn} with {r}.'.format(fn=filename, + r=Reader)) def writer(filename, n_atoms=None, **kwargs): diff --git a/testsuite/MDAnalysisTests/coordinates/test_chainreader.py b/testsuite/MDAnalysisTests/coordinates/test_chainreader.py index 10be3f8578f..19abbf876a7 100644 --- a/testsuite/MDAnalysisTests/coordinates/test_chainreader.py +++ b/testsuite/MDAnalysisTests/coordinates/test_chainreader.py @@ -207,7 +207,7 @@ def test_set_one_format_tuple(self): def test_set_all_formats(self): with pytest.raises(ValueError) as errinfo: mda.Universe(PDB, [PDB, GRO], format='gro') - assert str(errinfo.value) == 'Invalid GRO file: second line is not number of atoms.' + assert 'Unable to read' in str(errinfo.value) def build_trajectories(folder, sequences, fmt='xtc'): From 5db11b6af4676f447d284833ef6d06d3fe8f27f9 Mon Sep 17 00:00:00 2001 From: Lily Wang Date: Sun, 22 Sep 2019 15:46:44 +1000 Subject: [PATCH 3/3] added tests and typeerror --- package/CHANGELOG | 1 + package/MDAnalysis/coordinates/core.py | 2 +- .../coordinates/test_chainreader.py | 17 ++++++++++++++++- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index 278e6df0db3..28cbc78ae1b 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -79,6 +79,7 @@ Changes * changed the water bridge analysis output format (PR #2087) Fixes + * fixed ChainReader setting format with format keyword (Issue #2334) * fixed lack of check for scaling of NCDFReader velocities (Issue #2323) * fixed PDBReader and PDBWriter newlines for PDB header (Issue #2324) * fixes ProgressMeter issues with older Jupyter Lab versions (Issue #2078) diff --git a/package/MDAnalysis/coordinates/core.py b/package/MDAnalysis/coordinates/core.py index 6648e05e310..8f3c0b8aea4 100644 --- a/package/MDAnalysis/coordinates/core.py +++ b/package/MDAnalysis/coordinates/core.py @@ -84,7 +84,7 @@ def reader(filename, format=None, **kwargs): try: return Reader(filename, **kwargs) except ValueError: - raise ValueError('Unable to read {fn} with {r}.'.format(fn=filename, + raise TypeError('Unable to read {fn} with {r}.'.format(fn=filename, r=Reader)) diff --git a/testsuite/MDAnalysisTests/coordinates/test_chainreader.py b/testsuite/MDAnalysisTests/coordinates/test_chainreader.py index 19abbf876a7..05e78d5b3f1 100644 --- a/testsuite/MDAnalysisTests/coordinates/test_chainreader.py +++ b/testsuite/MDAnalysisTests/coordinates/test_chainreader.py @@ -200,15 +200,30 @@ def test_set_all_format_tuples(self): assert universe.trajectory.n_frames == 21 assert_equal(universe.trajectory.filenames, [PDB, XTC, TRR]) + def test_set_format_tuples_and_format(self): + universe = mda.Universe(GRO, [(PDB, 'pdb'), GRO, GRO, (XTC, 'xtc'), + (TRR, 'trr')], format='gro') + assert universe.trajectory.n_frames == 23 + assert_equal(universe.trajectory.filenames, [PDB, GRO, GRO, XTC, TRR]) + + with pytest.raises(TypeError) as errinfo: + mda.Universe(GRO, [(PDB, 'pdb'), GRO, GRO, (XTC, 'xtc'), + (TRR, 'trr')], format='pdb') + assert 'Unable to read' in str(errinfo.value) + + def test_set_one_format_tuple(self): universe = mda.Universe(PSF, [(PDB_small, 'pdb'), DCD]) assert universe.trajectory.n_frames == 99 def test_set_all_formats(self): - with pytest.raises(ValueError) as errinfo: + with pytest.raises(TypeError) as errinfo: mda.Universe(PDB, [PDB, GRO], format='gro') assert 'Unable to read' in str(errinfo.value) + universe = mda.Universe(GRO, [PDB, PDB, PDB], format='pdb') + assert_equal(universe.trajectory.filenames, [PDB, PDB, PDB]) + def build_trajectories(folder, sequences, fmt='xtc'): """