imdclient 0.1.2__py3-none-any.whl → 0.1.4__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 (50) hide show
  1. imdclient/{IMDREADER.py → IMD.py} +5 -4
  2. imdclient/IMDClient.py +118 -15
  3. imdclient/IMDProtocol.py +1 -0
  4. imdclient/data/gromacs/md/gromacs_v3_nst1.mdp +3 -3
  5. imdclient/data/gromacs/md/gromacs_v3_nst8.mdp +58 -0
  6. imdclient/data/lammps/md/{lammps_v3.in → lammps_v3_nst_1.in} +3 -3
  7. imdclient/data/lammps/md/lammps_v3_nst_8.in +71 -0
  8. imdclient/data/namd/md/{namd_v3.namd → namd_v3_nst_1.namd} +17 -5
  9. imdclient/data/namd/md/namd_v3_nst_8.namd +59 -0
  10. imdclient/tests/base.py +179 -45
  11. imdclient/tests/conftest.py +0 -39
  12. imdclient/tests/datafiles.py +33 -10
  13. imdclient/tests/docker_testing/docker.md +25 -0
  14. imdclient/tests/hpc_testing/gromacs/README.md +112 -0
  15. imdclient/tests/hpc_testing/gromacs/gmx_gpu_test.mdp +58 -0
  16. imdclient/tests/hpc_testing/gromacs/gmx_gpu_test.top +11764 -0
  17. imdclient/tests/hpc_testing/gromacs/struct.gro +21151 -0
  18. imdclient/tests/hpc_testing/gromacs/validate_gmx.sh +90 -0
  19. imdclient/tests/hpc_testing/lammps/README.md +62 -0
  20. imdclient/tests/hpc_testing/lammps/lammps_v3_nst_1.in +71 -0
  21. imdclient/tests/hpc_testing/lammps/topology_after_min.data +8022 -0
  22. imdclient/tests/hpc_testing/lammps/validate_lmp.sh +66 -0
  23. imdclient/tests/hpc_testing/namd/README.md +73 -0
  24. imdclient/tests/hpc_testing/namd/alanin.params +402 -0
  25. imdclient/tests/hpc_testing/namd/alanin.pdb +77 -0
  26. imdclient/tests/hpc_testing/namd/alanin.psf +206 -0
  27. imdclient/tests/hpc_testing/namd/namd_v3_nst_1.namd +59 -0
  28. imdclient/tests/hpc_testing/namd/validate_namd.sh +71 -0
  29. imdclient/tests/server.py +2 -11
  30. imdclient/tests/test_gromacs.py +32 -10
  31. imdclient/tests/test_imdclient.py +69 -0
  32. imdclient/tests/test_imdreader.py +74 -1
  33. imdclient/tests/test_lammps.py +57 -12
  34. imdclient/tests/test_manual.py +223 -65
  35. imdclient/tests/test_namd.py +101 -14
  36. imdclient/tests/test_stream_analysis.py +1 -1
  37. imdclient/tests/utils.py +0 -1
  38. imdclient-0.1.4.dist-info/LICENSE +5 -0
  39. imdclient-0.1.4.dist-info/METADATA +132 -0
  40. imdclient-0.1.4.dist-info/RECORD +57 -0
  41. {imdclient-0.1.2.dist-info → imdclient-0.1.4.dist-info}/WHEEL +1 -1
  42. imdclient/data/gromacs/md/gromacs_v3_nst1.tpr +0 -0
  43. imdclient/data/gromacs/md/gromacs_v3_nst1.trr +0 -0
  44. imdclient/data/lammps/md/lammps_trj.h5md +0 -0
  45. imdclient/data/namd/md/alanin.dcd +0 -0
  46. imdclient-0.1.2.dist-info/LICENSE +0 -674
  47. imdclient-0.1.2.dist-info/METADATA +0 -795
  48. imdclient-0.1.2.dist-info/RECORD +0 -42
  49. {imdclient-0.1.2.dist-info → imdclient-0.1.4.dist-info}/AUTHORS.md +0 -0
  50. {imdclient-0.1.2.dist-info → imdclient-0.1.4.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,206 @@
1
+ PSF
2
+
3
+ 11 !NTITLE
4
+ REMARKS FILENAME="/usr/people/nonella/xplor/benchmark1/ALANIN.PSF"
5
+ REMARKS PARAM11.PRO ( from PARAM6A )
6
+ REMARKS ===========
7
+ REMARKS PROTEIN PARAMETERS:
8
+ REMARKS PEPTIDE GEOMETRY FROM RAMACHANDRAN ET AL BBA 359:298 (1974)
9
+ REMARKS TORSIONS FROM HAGLER ET AL JACS 98:4600 (1976)
10
+ REMARKS LENNARD-JONES NONBONDED PARAMETERS WITH SPECIAL TREATMENT OF 1:4
11
+ REMARKS CARBON-CARBON INTERACTIONS: JORGENSON ET. AL.
12
+ REMARKS JACS 103:3976-3985 WITH 1-4 RC=1.80/0.1
13
+ REMARKS
14
+ REMARKS DATE:16-Feb-89 11:21:29 created by user: nonella
15
+
16
+ 66 !NATOM
17
+ 1 MAIN 1 ACE CA CH3E 0.000000E+00 15.0350 0
18
+ 2 MAIN 1 ACE C C 0.450000 12.0110 0
19
+ 3 MAIN 1 ACE O O -0.450000 15.9994 0
20
+ 4 MAIN 2 ALA N NH1 -0.350000 14.0067 0
21
+ 5 MAIN 2 ALA H H 0.250000 1.00800 0
22
+ 6 MAIN 2 ALA CA CH1E 0.100000 13.0190 0
23
+ 7 MAIN 2 ALA CB CH3E 0.000000E+00 15.0350 0
24
+ 8 MAIN 2 ALA C C 0.450000 12.0110 0
25
+ 9 MAIN 2 ALA O O -0.450000 15.9994 0
26
+ 10 MAIN 3 ALA N NH1 -0.350000 14.0067 0
27
+ 11 MAIN 3 ALA H H 0.250000 1.00800 0
28
+ 12 MAIN 3 ALA CA CH1E 0.100000 13.0190 0
29
+ 13 MAIN 3 ALA CB CH3E 0.000000E+00 15.0350 0
30
+ 14 MAIN 3 ALA C C 0.450000 12.0110 0
31
+ 15 MAIN 3 ALA O O -0.450000 15.9994 0
32
+ 16 MAIN 4 ALA N NH1 -0.350000 14.0067 0
33
+ 17 MAIN 4 ALA H H 0.250000 1.00800 0
34
+ 18 MAIN 4 ALA CA CH1E 0.100000 13.0190 0
35
+ 19 MAIN 4 ALA CB CH3E 0.000000E+00 15.0350 0
36
+ 20 MAIN 4 ALA C C 0.450000 12.0110 0
37
+ 21 MAIN 4 ALA O O -0.450000 15.9994 0
38
+ 22 MAIN 5 ALA N NH1 -0.350000 14.0067 0
39
+ 23 MAIN 5 ALA H H 0.250000 1.00800 0
40
+ 24 MAIN 5 ALA CA CH1E 0.100000 13.0190 0
41
+ 25 MAIN 5 ALA CB CH3E 0.000000E+00 15.0350 0
42
+ 26 MAIN 5 ALA C C 0.450000 12.0110 0
43
+ 27 MAIN 5 ALA O O -0.450000 15.9994 0
44
+ 28 MAIN 6 ALA N NH1 -0.350000 14.0067 0
45
+ 29 MAIN 6 ALA H H 0.250000 1.00800 0
46
+ 30 MAIN 6 ALA CA CH1E 0.100000 13.0190 0
47
+ 31 MAIN 6 ALA CB CH3E 0.000000E+00 15.0350 0
48
+ 32 MAIN 6 ALA C C 0.450000 12.0110 0
49
+ 33 MAIN 6 ALA O O -0.450000 15.9994 0
50
+ 34 MAIN 7 ALA N NH1 -0.350000 14.0067 0
51
+ 35 MAIN 7 ALA H H 0.250000 1.00800 0
52
+ 36 MAIN 7 ALA CA CH1E 0.100000 13.0190 0
53
+ 37 MAIN 7 ALA CB CH3E 0.000000E+00 15.0350 0
54
+ 38 MAIN 7 ALA C C 0.450000 12.0110 0
55
+ 39 MAIN 7 ALA O O -0.450000 15.9994 0
56
+ 40 MAIN 8 ALA N NH1 -0.350000 14.0067 0
57
+ 41 MAIN 8 ALA H H 0.250000 1.00800 0
58
+ 42 MAIN 8 ALA CA CH1E 0.100000 13.0190 0
59
+ 43 MAIN 8 ALA CB CH3E 0.000000E+00 15.0350 0
60
+ 44 MAIN 8 ALA C C 0.450000 12.0110 0
61
+ 45 MAIN 8 ALA O O -0.450000 15.9994 0
62
+ 46 MAIN 9 ALA N NH1 -0.350000 14.0067 0
63
+ 47 MAIN 9 ALA H H 0.250000 1.00800 0
64
+ 48 MAIN 9 ALA CA CH1E 0.100000 13.0190 0
65
+ 49 MAIN 9 ALA CB CH3E 0.000000E+00 15.0350 0
66
+ 50 MAIN 9 ALA C C 0.450000 12.0110 0
67
+ 51 MAIN 9 ALA O O -0.450000 15.9994 0
68
+ 52 MAIN 10 ALA N NH1 -0.350000 14.0067 0
69
+ 53 MAIN 10 ALA H H 0.250000 1.00800 0
70
+ 54 MAIN 10 ALA CA CH1E 0.100000 13.0190 0
71
+ 55 MAIN 10 ALA CB CH3E 0.000000E+00 15.0350 0
72
+ 56 MAIN 10 ALA C C 0.450000 12.0110 0
73
+ 57 MAIN 10 ALA O O -0.450000 15.9994 0
74
+ 58 MAIN 11 ALA N NH1 -0.350000 14.0067 0
75
+ 59 MAIN 11 ALA H H 0.250000 1.00800 0
76
+ 60 MAIN 11 ALA CA CH1E 0.100000 13.0190 0
77
+ 61 MAIN 11 ALA CB CH3E 0.000000E+00 15.0350 0
78
+ 62 MAIN 11 ALA C C 0.450000 12.0110 0
79
+ 63 MAIN 11 ALA O O -0.450000 15.9994 0
80
+ 64 MAIN 12 CBX N NH1 -0.350000 14.0067 0
81
+ 65 MAIN 12 CBX H H 0.250000 1.00800 0
82
+ 66 MAIN 12 CBX CA CH3E 0.100000 15.0350 0
83
+
84
+ 65 !NBOND: bonds
85
+ 1 2 2 3 4 6 6 8
86
+ 8 9 4 5 6 7 2 4
87
+ 10 12 12 14 14 15 10 11
88
+ 12 13 8 10 16 18 18 20
89
+ 20 21 16 17 18 19 14 16
90
+ 22 24 24 26 26 27 22 23
91
+ 24 25 20 22 28 30 30 32
92
+ 32 33 28 29 30 31 26 28
93
+ 34 36 36 38 38 39 34 35
94
+ 36 37 32 34 40 42 42 44
95
+ 44 45 40 41 42 43 38 40
96
+ 46 48 48 50 50 51 46 47
97
+ 48 49 44 46 52 54 54 56
98
+ 56 57 52 53 54 55 50 52
99
+ 58 60 60 62 62 63 58 59
100
+ 60 61 56 58 64 66 64 65
101
+ 62 64
102
+
103
+ 96 !NTHETA: angles
104
+ 1 2 3 4 6 8 6 4 5
105
+ 4 6 7 6 8 9 8 6 7
106
+ 1 2 4 3 2 4 2 4 6
107
+ 2 4 5 10 12 14 12 10 11
108
+ 10 12 13 12 14 15 14 12 13
109
+ 6 8 10 9 8 10 8 10 12
110
+ 8 10 11 16 18 20 18 16 17
111
+ 16 18 19 18 20 21 20 18 19
112
+ 12 14 16 15 14 16 14 16 18
113
+ 14 16 17 22 24 26 24 22 23
114
+ 22 24 25 24 26 27 26 24 25
115
+ 18 20 22 21 20 22 20 22 24
116
+ 20 22 23 28 30 32 30 28 29
117
+ 28 30 31 30 32 33 32 30 31
118
+ 24 26 28 27 26 28 26 28 30
119
+ 26 28 29 34 36 38 36 34 35
120
+ 34 36 37 36 38 39 38 36 37
121
+ 30 32 34 33 32 34 32 34 36
122
+ 32 34 35 40 42 44 42 40 41
123
+ 40 42 43 42 44 45 44 42 43
124
+ 36 38 40 39 38 40 38 40 42
125
+ 38 40 41 46 48 50 48 46 47
126
+ 46 48 49 48 50 51 50 48 49
127
+ 42 44 46 45 44 46 44 46 48
128
+ 44 46 47 52 54 56 54 52 53
129
+ 52 54 55 54 56 57 56 54 55
130
+ 48 50 52 51 50 52 50 52 54
131
+ 50 52 53 58 60 62 60 58 59
132
+ 58 60 61 60 62 63 62 60 61
133
+ 54 56 58 57 56 58 56 58 60
134
+ 56 58 59 66 64 65 60 62 64
135
+ 63 62 64 62 64 66 62 64 65
136
+
137
+ 31 !NPHI: dihedrals
138
+ 2 4 6 8 1 2 4 6
139
+ 8 10 12 14 4 6 8 10
140
+ 6 8 10 12 14 16 18 20
141
+ 10 12 14 16 12 14 16 18
142
+ 20 22 24 26 16 18 20 22
143
+ 18 20 22 24 26 28 30 32
144
+ 22 24 26 28 24 26 28 30
145
+ 32 34 36 38 28 30 32 34
146
+ 30 32 34 36 38 40 42 44
147
+ 34 36 38 40 36 38 40 42
148
+ 44 46 48 50 40 42 44 46
149
+ 42 44 46 48 50 52 54 56
150
+ 46 48 50 52 48 50 52 54
151
+ 56 58 60 62 52 54 56 58
152
+ 54 56 58 60 58 60 62 64
153
+ 60 62 64 66
154
+
155
+ 32 !NIMPHI: impropers
156
+ 6 4 8 7 2 1 4 3
157
+ 4 2 6 5 12 10 14 13
158
+ 8 6 10 9 10 8 12 11
159
+ 18 16 20 19 14 12 16 15
160
+ 16 14 18 17 24 22 26 25
161
+ 20 18 22 21 22 20 24 23
162
+ 30 28 32 31 26 24 28 27
163
+ 28 26 30 29 36 34 38 37
164
+ 32 30 34 33 34 32 36 35
165
+ 42 40 44 43 38 36 40 39
166
+ 40 38 42 41 48 46 50 49
167
+ 44 42 46 45 46 44 48 47
168
+ 54 52 56 55 50 48 52 51
169
+ 52 50 54 53 60 58 62 61
170
+ 56 54 58 57 58 56 60 59
171
+ 62 60 64 63 64 62 66 65
172
+
173
+ 11 !NDON: donors
174
+ 4 5 10 11 16 17 22 23
175
+ 28 29 34 35 40 41 46 47
176
+ 52 53 58 59 64 65
177
+
178
+ 11 !NACC: acceptors
179
+ 3 2 9 8 15 14 21 20
180
+ 27 26 33 32 39 38 45 44
181
+ 51 50 57 56 63 62
182
+
183
+ 0 !NNB
184
+
185
+ 0 0 0 0 0 0 0 0
186
+ 0 0 0 0 0 0 0 0
187
+ 0 0 0 0 0 0 0 0
188
+ 0 0 0 0 0 0 0 0
189
+ 0 0 0 0 0 0 0 0
190
+ 0 0 0 0 0 0 0 0
191
+ 0 0 0 0 0 0 0 0
192
+ 0 0 0 0 0 0 0 0
193
+ 0 0
194
+
195
+ 33 0 !NGRP
196
+ 0 0 0 1 0 0 3 0 0
197
+ 6 0 0 7 0 0 9 0 0
198
+ 12 0 0 13 0 0 15 0 0
199
+ 18 0 0 19 0 0 21 0 0
200
+ 24 0 0 25 0 0 27 0 0
201
+ 30 0 0 31 0 0 33 0 0
202
+ 36 0 0 37 0 0 39 0 0
203
+ 42 0 0 43 0 0 45 0 0
204
+ 48 0 0 49 0 0 51 0 0
205
+ 54 0 0 55 0 0 57 0 0
206
+ 60 0 0 61 0 0 63 0 0
@@ -0,0 +1,59 @@
1
+ # This is a test namd configuration file
2
+
3
+ timestep 0.5
4
+ numsteps 10
5
+ structure alanin.psf
6
+ parameters alanin.params
7
+ coordinates alanin.pdb
8
+ exclude scaled1-4
9
+ 1-4scaling 0.4
10
+ outputname output[myReplica]
11
+ margin 1.0
12
+ stepspercycle 3
13
+ temperature 0
14
+
15
+ switching on
16
+ switchdist 7.0
17
+ cutoff 8.0
18
+ pairlistdist 9.0
19
+
20
+ # Add box dimensions
21
+ cellBasisVector1 32.76 0.0 0.0
22
+ cellBasisVector2 0.0 31.66 0.0
23
+ cellBasisVector3 0.0 0.0 32.89
24
+
25
+ DCDfile alanin.dcd
26
+ DCDfreq 1
27
+ DCDUnitCell yes
28
+ velDcdFile alanin.vel.dcd
29
+ velDcdFreq 1
30
+ forceDcdFile alanin.force.dcd
31
+ forceDcdFreq 1
32
+ XSTFile alanin.xst
33
+ xstFreq 1
34
+
35
+ #restartname alanin.restart
36
+ #restartfreq 10
37
+
38
+ #langevin on
39
+ #langevinTemp 300.0
40
+ #langevincol O
41
+
42
+ #constraints on
43
+
44
+ #fma on
45
+
46
+ seed 12345
47
+
48
+ IMDon yes
49
+ IMDport 8888
50
+ IMDfreq 1
51
+ IMDwait on
52
+ IMDversion 3
53
+ IMDsendPositions yes
54
+ IMDsendEnergies yes
55
+ IMDsendTime yes
56
+ IMDsendBoxDimensions yes
57
+ IMDsendVelocities yes
58
+ IMDsendForces yes
59
+ IMDwrapPositions yes
@@ -0,0 +1,71 @@
1
+ #!/bin/bash
2
+
3
+ NAMD_BINARY="namd3"
4
+ CONFIG_FILE="namd_v3_nst_1.namd"
5
+ OUTPUT_FILE="namd_output.log"
6
+ TOPOL_PATH="alanin.pdb"
7
+ TRAJ_PATH="alanin.dcd"
8
+ VEL_PATH="alanin.vel.dcd"
9
+ FORCE_PATH="alanin.force.dcd"
10
+
11
+ # Parse args
12
+ while [[ $# -gt 0 ]]; do
13
+ case $1 in
14
+ --namd_binary)
15
+ NAMD_BINARY="$2"
16
+ shift 2
17
+ ;;
18
+ --config_file)
19
+ CONFIG_FILE="$2"
20
+ shift 2
21
+ ;;
22
+ --topol_path)
23
+ TOPOL_PATH="$2"
24
+ shift 2
25
+ ;;
26
+ --traj_path)
27
+ TRAJ_PATH="$2"
28
+ shift 2
29
+ ;;
30
+ --vel_path)
31
+ VEL_PATH="$2"
32
+ shift 2
33
+ ;;
34
+ --force_path)
35
+ FORCE_PATH="$2"
36
+ shift 2
37
+ ;;
38
+ *)
39
+ echo "Unknown argument: $1"
40
+ exit 1
41
+ ;;
42
+ esac
43
+ done
44
+
45
+ # Start the simulation
46
+ $NAMD_BINARY $CONFIG_FILE &> "$OUTPUT_FILE" &
47
+
48
+ # Wait for the simulation to be ready
49
+ await_namd_imd() {
50
+ grep -q "INTERACTIVE MD AWAITING CONNECTION" $OUTPUT_FILE
51
+ }
52
+
53
+ while ! await_namd_imd; do
54
+ echo "Waiting for NAMD IMD readiness in $OUTPUT_FILE..."
55
+ sleep 5
56
+ done
57
+
58
+ # Run the test
59
+
60
+ echo "Running test with the following parameters:"
61
+ echo " Topology file: $TOPOL_PATH"
62
+ echo " Trajectory file: $TRAJ_PATH"
63
+ echo " Velocity file: $VEL_PATH"
64
+ echo " Force file: $FORCE_PATH"
65
+
66
+ python ../../test_manual.py \
67
+ --topol_path "$TOPOL_PATH" \
68
+ --traj_path "$TRAJ_PATH" \
69
+ --vel_path "$VEL_PATH" \
70
+ --force_path "$FORCE_PATH" \
71
+ --first_frame 0
imdclient/tests/server.py CHANGED
@@ -93,7 +93,7 @@ class InThreadIMDServer:
93
93
  positions,
94
94
  wrapped_coords,
95
95
  velocities,
96
- forces
96
+ forces,
97
97
  )
98
98
  logger.debug(f"InThreadIMDServer: Sending session info")
99
99
  self.conn.sendall(sinfo)
@@ -101,14 +101,6 @@ class InThreadIMDServer:
101
101
  def join_accept_thread(self):
102
102
  self.accept_thread.join()
103
103
 
104
- def _expect_go(self):
105
- logger.debug(f"InThreadIMDServer: Waiting for go")
106
- head_buf = bytearray(IMDHEADERSIZE)
107
- read_into_buf(self.conn, head_buf)
108
- header = IMDHeader(head_buf)
109
- if header.type != IMDHeaderType.IMD_GO:
110
- raise ValueError("Expected IMD_GO packet, got something else")
111
-
112
104
  def send_frames(self, start, end):
113
105
  for i in range(start, end):
114
106
  self.send_frame(i)
@@ -126,7 +118,7 @@ class InThreadIMDServer:
126
118
  )
127
119
 
128
120
  self.conn.sendall(time_header + time)
129
-
121
+
130
122
  if self.imdsinfo.energies:
131
123
  energy_header = create_header_bytes(IMDHeaderType.IMD_ENERGIES, 1)
132
124
  energies = create_energy_bytes(
@@ -183,7 +175,6 @@ class InThreadIMDServer:
183
175
 
184
176
  self.conn.sendall(force_header + force)
185
177
 
186
-
187
178
  def expect_packet(self, packet_type, expected_length=None):
188
179
  head_buf = bytearray(IMDHEADERSIZE)
189
180
  read_into_buf(self.conn, head_buf)
@@ -2,10 +2,16 @@ import MDAnalysis as mda
2
2
  import pytest
3
3
  import logging
4
4
  from .base import IMDv3IntegrationTest
5
- from .datafiles import GROMACS_TOPOL, GROMACS_TRAJ, GROMACS_TPR
5
+ from .datafiles import (
6
+ GROMACS_GRO,
7
+ GROMACS_TOP,
8
+ GROMACS_MDP_NST_1,
9
+ GROMACS_MDP_NST_8,
10
+ )
11
+ from pathlib import Path
6
12
 
7
13
  logger = logging.getLogger("imdclient.IMDClient")
8
- file_handler = logging.FileHandler("test.log")
14
+ file_handler = logging.FileHandler("gromacs_test.log")
9
15
  formatter = logging.Formatter(
10
16
  "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
11
17
  )
@@ -16,18 +22,34 @@ logger.setLevel(logging.DEBUG)
16
22
 
17
23
  class TestIMDv3Gromacs(IMDv3IntegrationTest):
18
24
 
25
+ @pytest.fixture(params=[GROMACS_MDP_NST_1, GROMACS_MDP_NST_8])
26
+ def mdp(self, request):
27
+ return request.param
28
+
19
29
  @pytest.fixture()
20
- def command(self):
21
- return f". /usr/local/gromacs/bin/GMXRC && gmx mdrun -s {GROMACS_TPR} -imdport 8888 -imdwait"
30
+ def setup_command(self, mdp):
31
+ return f"gmx grompp -f {Path(mdp).name} -c {Path(GROMACS_GRO).name} -p {Path(GROMACS_TOP).name} -o topol.tpr"
22
32
 
23
33
  @pytest.fixture()
24
- def match_string(self):
25
- return "IMD: Will wait until I have a connection and IMD_GO orders."
34
+ def simulation_command(self):
35
+ return f"gmx mdrun -s topol.tpr -o ci.trr -imdport 8888 -imdwait"
26
36
 
27
37
  @pytest.fixture()
28
- def first_frame(self):
29
- return 0
38
+ def input_files(self, mdp):
39
+ return [GROMACS_TOP, mdp, GROMACS_GRO]
40
+
41
+ @pytest.fixture()
42
+ def traj(self):
43
+ return "ci.trr"
30
44
 
31
45
  @pytest.fixture()
32
- def universe(self):
33
- return mda.Universe(GROMACS_TOPOL, GROMACS_TRAJ)
46
+ def topol(self):
47
+ return Path(GROMACS_GRO).name
48
+
49
+ # @pytest.fixture()
50
+ # def match_string(self):
51
+ # return "IMD: Will wait until I have a connection and IMD_GO orders."
52
+
53
+ @pytest.fixture()
54
+ def first_frame(self):
55
+ return 0
@@ -69,6 +69,7 @@ class TestIMDClientV3:
69
69
  buffer_size=imdframe_memsize(universe.trajectory.n_atoms, imdsinfo)
70
70
  * 2,
71
71
  )
72
+ server.join_accept_thread()
72
73
  yield server, client
73
74
  client.stop()
74
75
  server.cleanup()
@@ -84,6 +85,7 @@ class TestIMDClientV3:
84
85
  port,
85
86
  universe.trajectory.n_atoms,
86
87
  )
88
+ server.join_accept_thread()
87
89
  yield server, client
88
90
  client.stop()
89
91
  server.cleanup()
@@ -148,3 +150,70 @@ class TestIMDClientV3:
148
150
  client.get_imdframe()
149
151
  # server should receive disconnect from client (though it doesn't have to do anything)
150
152
  server.expect_packet(IMDHeaderType.IMD_DISCONNECT)
153
+
154
+ @pytest.mark.parametrize("cont", [True, False])
155
+ def test_continue_after_disconnect(self, universe, imdsinfo, port, cont):
156
+ server = InThreadIMDServer(universe.trajectory)
157
+ server.set_imdsessioninfo(imdsinfo)
158
+ server.handshake_sequence("localhost", port, first_frame=False)
159
+ client = IMDClient(
160
+ f"localhost",
161
+ port,
162
+ universe.trajectory.n_atoms,
163
+ continue_after_disconnect=cont,
164
+ )
165
+ server.join_accept_thread()
166
+ server.expect_packet(
167
+ IMDHeaderType.IMD_WAIT, expected_length=(int)(not cont)
168
+ )
169
+
170
+
171
+ class TestIMDClientV3ContextManager:
172
+ @pytest.fixture
173
+ def port(self):
174
+ return get_free_port()
175
+
176
+ @pytest.fixture
177
+ def universe(self):
178
+ return mda.Universe(COORDINATES_TOPOLOGY, COORDINATES_H5MD)
179
+
180
+ @pytest.fixture
181
+ def imdsinfo(self):
182
+ return create_default_imdsinfo_v3()
183
+
184
+ @pytest.fixture
185
+ def server(self, universe, imdsinfo, port):
186
+ server = InThreadIMDServer(universe.trajectory)
187
+ server.set_imdsessioninfo(imdsinfo)
188
+ yield server
189
+ server.cleanup()
190
+
191
+ def test_context_manager_traj_unchanged(self, server, port, universe):
192
+ server.handshake_sequence("localhost", port, first_frame=False)
193
+
194
+ i = 0
195
+ with IMDClient(
196
+ "localhost",
197
+ port,
198
+ universe.trajectory.n_atoms,
199
+ ) as client:
200
+ server.send_frames(0, 5)
201
+ while i < 5:
202
+
203
+ imdf = client.get_imdframe()
204
+ assert_allclose(universe.trajectory[i].time, imdf.time)
205
+ assert_allclose(universe.trajectory[i].dt, imdf.dt)
206
+ assert_allclose(universe.trajectory[i].data["step"], imdf.step)
207
+ assert_allclose(
208
+ universe.trajectory[i].positions, imdf.positions
209
+ )
210
+ assert_allclose(
211
+ universe.trajectory[i].velocities, imdf.velocities
212
+ )
213
+ assert_allclose(universe.trajectory[i].forces, imdf.forces)
214
+ assert_allclose(
215
+ universe.trajectory[i].triclinic_dimensions, imdf.box
216
+ )
217
+ i += 1
218
+ server.expect_packet(IMDHeaderType.IMD_DISCONNECT)
219
+ assert i == 5
@@ -31,7 +31,7 @@ import pytest
31
31
  from MDAnalysis.transformations import translate
32
32
  import pickle
33
33
 
34
- from imdclient.IMDREADER import IMDReader
34
+ from imdclient.IMD import IMDReader
35
35
 
36
36
  logger = logging.getLogger("imdclient.IMDClient")
37
37
  file_handler = logging.FileHandler("test.log")
@@ -642,3 +642,76 @@ class TestStreamIteration:
642
642
  with pytest.raises(RuntimeError):
643
643
  for ts in sub_sliced_reader:
644
644
  pass
645
+
646
+
647
+ def test_n_atoms_mismatch():
648
+ universe = mda.Universe(COORDINATES_TOPOLOGY, COORDINATES_H5MD)
649
+ port = get_free_port()
650
+ server = InThreadIMDServer(universe.trajectory)
651
+ server.set_imdsessioninfo(create_default_imdsinfo_v3())
652
+ server.handshake_sequence("localhost", port, first_frame=True)
653
+ with pytest.raises(
654
+ EOFError,
655
+ match="IMDProducer: Expected n_atoms value 6, got 5. Ensure you are using the correct topology file.",
656
+ ):
657
+ IMDReader(
658
+ f"imd://localhost:{port}",
659
+ n_atoms=universe.trajectory.n_atoms + 1,
660
+ )
661
+
662
+ # raise errors for incompatible methods
663
+ class TestIMDReaderBaseAPIExceptions():
664
+
665
+ @pytest.fixture
666
+ def reader(self):
667
+ universe = mda.Universe(COORDINATES_TOPOLOGY, COORDINATES_H5MD)
668
+ imdsinfo = create_default_imdsinfo_v3()
669
+ port = get_free_port()
670
+ server = InThreadIMDServer(universe.trajectory)
671
+ server.set_imdsessioninfo(imdsinfo)
672
+ server.handshake_sequence("localhost", port, first_frame=True)
673
+
674
+ reader = IMDReader(
675
+ f"imd://localhost:{port}", n_atoms=universe.trajectory.n_atoms
676
+ )
677
+ server.send_frames(1, 5)
678
+ yield reader
679
+ server.cleanup()
680
+
681
+ # test copy method
682
+ def test_copy_raises_notimplemented_error(self, reader):
683
+ with pytest.raises(NotImplementedError):
684
+ reader.copy()
685
+
686
+ # test _reopen method
687
+ def test_reopen_raises_runtime_error_on_second_call(self, reader):
688
+ # First call should be fine
689
+ reader._reopen()
690
+ # Second call should raise RuntimeError
691
+ with pytest.raises(RuntimeError):
692
+ reader._reopen()
693
+
694
+ # test n_frames
695
+ def test_n_frames_raises_runtime_error(self, reader):
696
+ with pytest.raises(RuntimeError):
697
+ reader.n_frames()
698
+
699
+ # test __len__
700
+ def test_len_raises_runtime_error(self, reader):
701
+ with pytest.raises(RuntimeError):
702
+ reader.__len__()
703
+
704
+ # test rewind method
705
+ def test_rewind_raises_error(self, reader):
706
+ with pytest.raises(RuntimeError):
707
+ reader.rewind()
708
+
709
+ # Test __getstate__ method
710
+ def test_getstate_raises_notimplemented_error(self, reader):
711
+ with pytest.raises(NotImplementedError):
712
+ reader.__getstate__()
713
+
714
+ # Test __setstate__ method
715
+ def test_setstate_raises_notimplemented_error(self, reader):
716
+ with pytest.raises(NotImplementedError):
717
+ reader.__setstate__(None)