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.
Files changed (42) hide show
  1. imdclient/IMDClient.py +896 -0
  2. imdclient/IMDProtocol.py +164 -0
  3. imdclient/IMDREADER.py +129 -0
  4. imdclient/__init__.py +14 -0
  5. imdclient/backends.py +352 -0
  6. imdclient/data/__init__.py +0 -0
  7. imdclient/data/gromacs/md/gromacs_struct.gro +21151 -0
  8. imdclient/data/gromacs/md/gromacs_v3.top +11764 -0
  9. imdclient/data/gromacs/md/gromacs_v3_nst1.mdp +58 -0
  10. imdclient/data/gromacs/md/gromacs_v3_nst1.tpr +0 -0
  11. imdclient/data/gromacs/md/gromacs_v3_nst1.trr +0 -0
  12. imdclient/data/lammps/md/lammps_topol.data +8022 -0
  13. imdclient/data/lammps/md/lammps_trj.h5md +0 -0
  14. imdclient/data/lammps/md/lammps_v3.in +71 -0
  15. imdclient/data/namd/md/alanin.dcd +0 -0
  16. imdclient/data/namd/md/alanin.params +402 -0
  17. imdclient/data/namd/md/alanin.pdb +77 -0
  18. imdclient/data/namd/md/alanin.psf +206 -0
  19. imdclient/data/namd/md/namd_v3.namd +47 -0
  20. imdclient/results.py +332 -0
  21. imdclient/streamanalysis.py +1056 -0
  22. imdclient/streambase.py +199 -0
  23. imdclient/tests/__init__.py +0 -0
  24. imdclient/tests/base.py +122 -0
  25. imdclient/tests/conftest.py +38 -0
  26. imdclient/tests/datafiles.py +34 -0
  27. imdclient/tests/server.py +212 -0
  28. imdclient/tests/test_gromacs.py +33 -0
  29. imdclient/tests/test_imdclient.py +150 -0
  30. imdclient/tests/test_imdreader.py +644 -0
  31. imdclient/tests/test_lammps.py +38 -0
  32. imdclient/tests/test_manual.py +70 -0
  33. imdclient/tests/test_namd.py +38 -0
  34. imdclient/tests/test_stream_analysis.py +61 -0
  35. imdclient/tests/utils.py +41 -0
  36. imdclient/utils.py +118 -0
  37. imdclient-0.1.0.dist-info/AUTHORS.md +23 -0
  38. imdclient-0.1.0.dist-info/LICENSE +21 -0
  39. imdclient-0.1.0.dist-info/METADATA +143 -0
  40. imdclient-0.1.0.dist-info/RECORD +42 -0
  41. imdclient-0.1.0.dist-info/WHEEL +5 -0
  42. 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)