imdclient 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- imdclient/IMDClient.py +896 -0
- imdclient/IMDProtocol.py +164 -0
- imdclient/IMDREADER.py +129 -0
- imdclient/__init__.py +14 -0
- imdclient/backends.py +352 -0
- imdclient/data/__init__.py +0 -0
- imdclient/data/gromacs/md/gromacs_struct.gro +21151 -0
- imdclient/data/gromacs/md/gromacs_v3.top +11764 -0
- imdclient/data/gromacs/md/gromacs_v3_nst1.mdp +58 -0
- imdclient/data/gromacs/md/gromacs_v3_nst1.tpr +0 -0
- imdclient/data/gromacs/md/gromacs_v3_nst1.trr +0 -0
- imdclient/data/lammps/md/lammps_topol.data +8022 -0
- imdclient/data/lammps/md/lammps_trj.h5md +0 -0
- imdclient/data/lammps/md/lammps_v3.in +71 -0
- imdclient/data/namd/md/alanin.dcd +0 -0
- imdclient/data/namd/md/alanin.params +402 -0
- imdclient/data/namd/md/alanin.pdb +77 -0
- imdclient/data/namd/md/alanin.psf +206 -0
- imdclient/data/namd/md/namd_v3.namd +47 -0
- imdclient/results.py +332 -0
- imdclient/streamanalysis.py +1056 -0
- imdclient/streambase.py +199 -0
- imdclient/tests/__init__.py +0 -0
- imdclient/tests/base.py +122 -0
- imdclient/tests/conftest.py +38 -0
- imdclient/tests/datafiles.py +34 -0
- imdclient/tests/server.py +212 -0
- imdclient/tests/test_gromacs.py +33 -0
- imdclient/tests/test_imdclient.py +150 -0
- imdclient/tests/test_imdreader.py +644 -0
- imdclient/tests/test_lammps.py +38 -0
- imdclient/tests/test_manual.py +70 -0
- imdclient/tests/test_namd.py +38 -0
- imdclient/tests/test_stream_analysis.py +61 -0
- imdclient/tests/utils.py +41 -0
- imdclient/utils.py +118 -0
- imdclient-0.1.0.dist-info/AUTHORS.md +23 -0
- imdclient-0.1.0.dist-info/LICENSE +21 -0
- imdclient-0.1.0.dist-info/METADATA +143 -0
- imdclient-0.1.0.dist-info/RECORD +42 -0
- imdclient-0.1.0.dist-info/WHEEL +5 -0
- imdclient-0.1.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,150 @@
|
|
1
|
+
"""Test for IMDClient functionality"""
|
2
|
+
|
3
|
+
from MDAnalysisTests.datafiles import (
|
4
|
+
COORDINATES_TOPOLOGY,
|
5
|
+
COORDINATES_H5MD,
|
6
|
+
)
|
7
|
+
import MDAnalysis as mda
|
8
|
+
from imdclient.IMDClient import imdframe_memsize, IMDClient
|
9
|
+
from imdclient.IMDProtocol import IMDHeaderType
|
10
|
+
from .utils import (
|
11
|
+
get_free_port,
|
12
|
+
create_default_imdsinfo_v3,
|
13
|
+
)
|
14
|
+
from .server import InThreadIMDServer
|
15
|
+
from MDAnalysisTests.coordinates.base import (
|
16
|
+
assert_allclose,
|
17
|
+
)
|
18
|
+
from MDAnalysisTests.coordinates.test_xdr import TRRReference
|
19
|
+
import logging
|
20
|
+
import pytest
|
21
|
+
|
22
|
+
|
23
|
+
logger = logging.getLogger("imdclient.IMDClient")
|
24
|
+
file_handler = logging.FileHandler("test.log")
|
25
|
+
formatter = logging.Formatter(
|
26
|
+
"%(asctime)s - %(name)s - %(levelname)s - %(message)s"
|
27
|
+
)
|
28
|
+
file_handler.setFormatter(formatter)
|
29
|
+
logger.addHandler(file_handler)
|
30
|
+
logger.setLevel(logging.DEBUG)
|
31
|
+
|
32
|
+
IMDENERGYKEYS = [
|
33
|
+
"step",
|
34
|
+
"temperature",
|
35
|
+
"total_energy",
|
36
|
+
"potential_energy",
|
37
|
+
"van_der_walls_energy",
|
38
|
+
"coulomb_energy",
|
39
|
+
"bonds_energy",
|
40
|
+
"angles_energy",
|
41
|
+
"dihedrals_energy",
|
42
|
+
"improper_dihedrals_energy",
|
43
|
+
]
|
44
|
+
|
45
|
+
|
46
|
+
class TestIMDClientV3:
|
47
|
+
|
48
|
+
@pytest.fixture
|
49
|
+
def port(self):
|
50
|
+
return get_free_port()
|
51
|
+
|
52
|
+
@pytest.fixture
|
53
|
+
def universe(self):
|
54
|
+
return mda.Universe(COORDINATES_TOPOLOGY, COORDINATES_H5MD)
|
55
|
+
|
56
|
+
@pytest.fixture
|
57
|
+
def imdsinfo(self):
|
58
|
+
return create_default_imdsinfo_v3()
|
59
|
+
|
60
|
+
@pytest.fixture
|
61
|
+
def server_client_two_frame_buf(self, universe, imdsinfo, port):
|
62
|
+
server = InThreadIMDServer(universe.trajectory)
|
63
|
+
server.set_imdsessioninfo(imdsinfo)
|
64
|
+
server.handshake_sequence("localhost", port, first_frame=False)
|
65
|
+
client = IMDClient(
|
66
|
+
f"localhost",
|
67
|
+
port,
|
68
|
+
universe.trajectory.n_atoms,
|
69
|
+
buffer_size=imdframe_memsize(universe.trajectory.n_atoms, imdsinfo)
|
70
|
+
* 2,
|
71
|
+
)
|
72
|
+
yield server, client
|
73
|
+
client.stop()
|
74
|
+
server.cleanup()
|
75
|
+
|
76
|
+
@pytest.fixture(params=[">", "<"])
|
77
|
+
def server_client(self, universe, imdsinfo, port, request):
|
78
|
+
server = InThreadIMDServer(universe.trajectory)
|
79
|
+
imdsinfo.endianness = request.param
|
80
|
+
server.set_imdsessioninfo(imdsinfo)
|
81
|
+
server.handshake_sequence("localhost", port, first_frame=False)
|
82
|
+
client = IMDClient(
|
83
|
+
f"localhost",
|
84
|
+
port,
|
85
|
+
universe.trajectory.n_atoms,
|
86
|
+
)
|
87
|
+
yield server, client
|
88
|
+
client.stop()
|
89
|
+
server.cleanup()
|
90
|
+
|
91
|
+
def test_traj_unchanged(self, server_client, universe):
|
92
|
+
server, client = server_client
|
93
|
+
server.send_frames(0, 5)
|
94
|
+
for i in range(5):
|
95
|
+
imdf = client.get_imdframe()
|
96
|
+
assert_allclose(universe.trajectory[i].time, imdf.time)
|
97
|
+
assert_allclose(universe.trajectory[i].dt, imdf.dt)
|
98
|
+
assert_allclose(universe.trajectory[i].data["step"], imdf.step)
|
99
|
+
assert_allclose(universe.trajectory[i].positions, imdf.positions)
|
100
|
+
assert_allclose(universe.trajectory[i].velocities, imdf.velocities)
|
101
|
+
assert_allclose(universe.trajectory[i].forces, imdf.forces)
|
102
|
+
assert_allclose(
|
103
|
+
universe.trajectory[i].triclinic_dimensions, imdf.box
|
104
|
+
)
|
105
|
+
|
106
|
+
def test_pause_resume_continue(self, server_client_two_frame_buf):
|
107
|
+
server, client = server_client_two_frame_buf
|
108
|
+
server.send_frames(0, 2)
|
109
|
+
# Client's buffer is filled. client should send pause
|
110
|
+
server.expect_packet(IMDHeaderType.IMD_PAUSE)
|
111
|
+
# Empty buffer
|
112
|
+
client.get_imdframe()
|
113
|
+
# only the second call actually frees buffer memory
|
114
|
+
client.get_imdframe()
|
115
|
+
# client has free memory. should send resume
|
116
|
+
server.expect_packet(IMDHeaderType.IMD_RESUME)
|
117
|
+
server.send_frame(1)
|
118
|
+
client.get_imdframe()
|
119
|
+
|
120
|
+
def test_pause_resume_disconnect(self, server_client_two_frame_buf):
|
121
|
+
"""Client pauses because buffer is full, empties buffer and attempt to resume, but
|
122
|
+
finds that simulation has already ended and raises EOF"""
|
123
|
+
server, client = server_client_two_frame_buf
|
124
|
+
server.send_frames(0, 2)
|
125
|
+
server.expect_packet(IMDHeaderType.IMD_PAUSE)
|
126
|
+
client.get_imdframe()
|
127
|
+
client.get_imdframe()
|
128
|
+
# client has free frame. should send resume
|
129
|
+
server.expect_packet(IMDHeaderType.IMD_RESUME)
|
130
|
+
# simulation is over. client should raise EOF
|
131
|
+
server.disconnect()
|
132
|
+
with pytest.raises(EOFError):
|
133
|
+
client.get_imdframe()
|
134
|
+
|
135
|
+
def test_pause_resume_no_disconnect(self, server_client_two_frame_buf):
|
136
|
+
"""Client pauses because buffer is full, empties buffer and attempt to resume, but
|
137
|
+
finds that simulation has already ended (but has not yet disconnected) and raises EOF
|
138
|
+
"""
|
139
|
+
server, client = server_client_two_frame_buf
|
140
|
+
server.send_frames(0, 2)
|
141
|
+
server.expect_packet(IMDHeaderType.IMD_PAUSE)
|
142
|
+
client.get_imdframe()
|
143
|
+
client.get_imdframe()
|
144
|
+
# client has free frame. should send resume
|
145
|
+
server.expect_packet(IMDHeaderType.IMD_RESUME)
|
146
|
+
# simulation is over. client should raise EOF
|
147
|
+
with pytest.raises(EOFError):
|
148
|
+
client.get_imdframe()
|
149
|
+
# server should receive disconnect from client (though it doesn't have to do anything)
|
150
|
+
server.expect_packet(IMDHeaderType.IMD_DISCONNECT)
|