Skip to content

Commit 642e87e

Browse files
committed
merged updates from PR #216 and PR #218
1 parent 29477ab commit 642e87e

File tree

4 files changed

+46
-24
lines changed

4 files changed

+46
-24
lines changed

mdpow/analysis/dihedral.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ def check_dihedral_inputs(selections):
7878
for group in selections:
7979
for k in group.keys():
8080
if len(group[k]) != 4:
81-
msg = ''''Dihedral calculations require AtomGroups with
81+
msg = '''Dihedral calculations require AtomGroups with
8282
only 4 atoms, %s selected''' % len(group)
8383
logger.error(msg)
8484
raise SelectionError(msg)
@@ -109,4 +109,4 @@ def _single_frame(self):
109109

110110
def _conclude_ensemble(self):
111111
for k in self._col:
112-
self.results[k] = self._res_dict[k]
112+
self.results[k] = self._res_dict[k]

mdpow/analysis/ensemble.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -469,14 +469,14 @@ def _single_universe(self):
469469
Run on each universe in the ensemble during when
470470
self.run in called.
471471
"""
472-
pass # pragma: no cover
472+
raise NotImplementedError
473473

474474
def _single_frame(self):
475475
"""Calculate data from a single frame of trajectory
476476
477477
Called on each frame for universes in the Ensemble.
478478
"""
479-
pass # pragma: no cover
479+
raise NotImplementedError
480480

481481
def _prepare_ensemble(self):
482482
"""For establishing data structures used in running
@@ -558,4 +558,4 @@ def check_groups_from_common_ensemble(groups: List[EnsembleAtomGroup]):
558558
'from the same Ensemble. '
559559
f'mismatch: group[{i}].ensemble != group[{j}].ensemble')
560560
logger.error(msg)
561-
raise ValueError(msg)
561+
raise ValueError(msg)

mdpow/tests/test_dihedral.py

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
from . import tempdir as td
44

5+
import sys
6+
57
import py.path
68

79
import pybol
@@ -23,9 +25,9 @@
2325

2426
class TestDihedral(object):
2527
DG48910_mean = -172.9849512527183
26-
DG491011_mean = -3.7300197060478695
27-
DG48910_var = 1490.6576365537262
28-
DG491011_var = 128.3805265432388
28+
DG491011_mean = 177.74725233051953
29+
DG48910_var = 0.20311120667628546
30+
DG491011_var = 0.006976126708773456
2931

3032
def setup(self):
3133
self.tmpdir = td.TempDir()
@@ -37,56 +39,61 @@ def teardown(self):
3739
self.tmpdir.dissolve()
3840

3941
def test_dataframe(self):
40-
dh1 = self.Ens.select_atoms('name C4 or name C17 or name S2 or name N3')
42+
dh1 = self.Ens.select_atoms('name C4', 'name C17', 'name S2', 'name N3')
4143
dh_run = DihedralAnalysis([dh1]).run(start=0, stop=4, step=1)
4244

4345
results = dh_run.results
4446

45-
assert results['selection'][0] == 'S2-N3-C4-C17'
47+
assert results['selection'][0] == 'C4-C17-S2-N3'
4648
for s in results['solvent']:
4749
assert s == 'water'
4850
for i in results['interaction'][:12]:
4951
assert i == 'Coulomb'
5052

5153
def test_selection_error(self):
52-
dh1 = self.Ens.select_atoms('name C17 or name S2 or name N3')
54+
dh1 = self.Ens.select_atoms('name C17', 'name S2', 'name N3')
5355
with pytest.raises(SelectionError):
5456
dh_run = DihedralAnalysis([dh1]).run(start=0, stop=4, step=1)
5557

5658
def test_results_recursive1(self):
57-
dh1 = self.Ens.select_atoms('name C11 or name C10 or name C9 or name C4')
58-
dh2 = self.Ens.select_atoms('name C11 or name C10 or name C9 or name C4')
59+
dh1 = self.Ens.select_atoms('name C11', 'name C10', 'name C9', 'name C4')
60+
dh2 = self.Ens.select_atoms('name C11', 'name C10', 'name C9', 'name C4')
5961

6062
dh_run1 = DihedralAnalysis([dh1]).run(start=0, stop=4, step=1)
6163
dh_run2 = DihedralAnalysis([dh2]).run(start=0, stop=4, step=1)
6264
assert len(dh_run1.results['dihedral']) == len(dh_run2.results['dihedral'])
6365
for i in range(len(dh_run1.results['dihedral'])):
6466
assert dh_run1.results['dihedral'][i] == dh_run2.results['dihedral'][i]
6567

68+
@pytest.mark.skipif(sys.version_info < (3, 8), reason="scipy circvar gives wrong answers")
6669
def test_results_recursive2(self):
67-
dh1 = self.Ens.select_atoms('name C11 or name C10 or name C9 or name C4')
68-
dh2 = self.Ens.select_atoms('name C8 or name C4 or name C9 or name C10')
70+
dh1 = self.Ens.select_atoms('name C11', 'name C10', 'name C9', 'name C4')
71+
dh2 = self.Ens.select_atoms('name C8', 'name C4', 'name C9', 'name C10')
6972

7073
dh_run = DihedralAnalysis([dh1, dh2]).run(start=0, stop=4, step=1)
7174

72-
dh1_result = dh_run.results.loc[dh_run.results['selection'] == 'C4-C9-C10-C11']['dihedral']
73-
dh2_result = dh_run.results.loc[dh_run.results['selection'] == 'C4-C8-C9-C10']['dihedral']
75+
dh1_result = dh_run.results.loc[dh_run.results['selection'] == 'C11-C10-C9-C4']['dihedral']
76+
dh2_result = dh_run.results.loc[dh_run.results['selection'] == 'C8-C4-C9-C10']['dihedral']
7477

7578
dh1_mean = circmean(dh1_result, high=180, low=-180)
7679
dh2_mean = circmean(dh2_result, high=180, low=-180)
7780
dh1_var = circvar(dh1_result, high=180, low=-180)
7881
dh2_var = circvar(dh2_result, high=180, low=-180)
7982

80-
assert_almost_equal(self.DG48910_mean, dh1_mean, 6)
81-
assert_almost_equal(self.DG48910_var, dh1_var, 6)
82-
assert_almost_equal(self.DG491011_mean, dh2_mean, 6)
83-
assert_almost_equal(self.DG491011_var, dh2_var, 6)
83+
assert_almost_equal(dh1_mean, self.DG48910_mean, 6)
84+
assert_almost_equal(dh1_var, self.DG48910_var, 6)
85+
assert_almost_equal(dh2_mean, self.DG491011_mean, 6)
86+
assert_almost_equal(dh2_var, self.DG491011_var, 6)
8487

8588
def test_ValueError_different_ensemble(self):
8689
other = Ensemble(dirname=self.tmpdir.name, solvents=['water'])
87-
dh1 = self.Ens.select_atoms('name C11 or name C10 or name C9 or name C4')
88-
dh2 = other.select_atoms('name C8 or name C4 or name C9 or name C10')
90+
dh1 = self.Ens.select_atoms('name C11', 'name C10', 'name C9', 'name C4')
91+
dh2 = other.select_atoms('name C8', 'name C4', 'name C9', 'name C10')
8992
with pytest.raises(ValueError,
9093
match='Dihedral selections from different Ensembles, '):
9194
DihedralAnalysis([dh1, dh2])
9295

96+
def test_single_universe(self):
97+
dh = self.Ens.select_atoms('name C4', 'name C17', 'name S2', 'name N3')
98+
with pytest.raises(NotImplementedError):
99+
DihedralAnalysis([dh])._single_universe()

mdpow/tests/test_ensemble.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,21 @@ def _conclude_universe(self):
149149
TestRun = TestAnalysis(Sim).run(start=0, step=1, stop=10)
150150
assert Sim.keys() == TestRun.key_list
151151

152+
def test_ensemble_analysis_run(self):
153+
class TestAnalysis(EnsembleAnalysis):
154+
def __init__(self, test_ensemble):
155+
super(TestAnalysis, self).__init__(test_ensemble)
156+
157+
def test_single_frame(self):
158+
with pytest.raises(NotImplementedError) as excinfo:
159+
TestAnalysis._single_frame(self)
160+
assert excinfo.type == 'NotImplementedError'
161+
162+
def test_single_universe(self):
163+
with pytest.raises(NotImplementedError) as excinfo:
164+
TestAnalysis._single_universe(self)
165+
assert excinfo.type == 'NotImplementedError'
166+
152167
def test_value_error(self):
153168
ens = Ensemble(dirname=self.tmpdir.name, solvents=['water'])
154169
copy_ens = Ensemble()
@@ -160,4 +175,4 @@ def test_value_error(self):
160175
dh3 = ens.select_atoms('name C4 or name C17 or name S2 or name N3')
161176
dh4 = ens.select_atoms('name C4 or name C17 or name S2 or name N3')
162177
with pytest.raises(ValueError):
163-
dh_run = DihedralAnalysis([dh1, dh2, dh4, dh3]).run(start=0, stop=4, step=1)
178+
dh_run = DihedralAnalysis([dh1, dh2, dh4, dh3]).run(start=0, stop=4, step=1)

0 commit comments

Comments
 (0)