ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/trunk/src/applications/utilities/md2md
Revision: 2043
Committed: Fri Nov 14 19:04:27 2014 UTC (10 years, 5 months ago) by gezelter
File size: 11981 byte(s)
Log Message:
Another md2md fix

File Contents

# Content
1 #!@PYTHON_EXECUTABLE@
2 """MetaData file remapper
3
4 Takes a MetaData file and maps all StuntDoubles back to the periodic box.
5 Will optionally replicate the system in the three box directions, or
6 translate every object in the box and before writing out a new MetaData file.
7
8 Usage: md2md
9
10 Options:
11 -h, --help show this help
12 -m, --meta-data=... use specified meta-data (.md, .eor) file
13 -o, --output-file=... use specified output file
14 -x, --repeatX=... make the system repeat in the x direction
15 -y, --repeatY=... make the system repeat in the y direction
16 -z, --repeatZ=... make the system repeat in the z direction
17 -t, --translateX=... translate all x coordinates by some amount
18 -u, --translateY=... translate all y coordinates by some amount
19 -v, --translateZ=... translate all z coordinates by some amount
20
21 Example:
22 md2md -m lipidSystem.md -o bigLipidSystem.md -x 2 -y 2 -z 1 -v 35.0
23
24 """
25
26 __author__ = "Dan Gezelter (gezelter@nd.edu)"
27 __version__ = "$Revision$"
28 __date__ = "$Date$"
29 __copyright__ = "Copyright (c) 2009 by the University of Notre Dame"
30 __license__ = "OpenMD"
31
32 import sys
33 import getopt
34 import string
35 import math
36 import random
37 from sets import *
38
39 metaData = []
40 frameData = []
41 indices = []
42 pvqj = []
43 p = []
44 v = []
45 q = []
46 j = []
47 Hmat = []
48 BoxInv = []
49
50 def usage():
51 print __doc__
52
53 def readFile(mdFileName):
54 mdFile = open(mdFileName, 'r')
55 # Find OpenMD version info first
56 line = mdFile.readline()
57 while 1:
58 if '<OOPSE version=' in line or '<OpenMD version=' in line:
59 OpenMDversion = line
60 break
61 line = mdFile.readline()
62
63 # Rewind file and find start of MetaData block
64
65 mdFile.seek(0)
66 line = mdFile.readline()
67 print "reading MetaData"
68 while 1:
69 if '<MetaData>' in line:
70 while 2:
71 metaData.append(line)
72 line = mdFile.readline()
73 if '</MetaData>' in line:
74 metaData.append(line)
75 break
76 break
77 line = mdFile.readline()
78
79 mdFile.seek(0)
80 print "reading Snapshot"
81 line = mdFile.readline()
82 while 1:
83 if '<Snapshot>' in line:
84 line = mdFile.readline()
85 while 1:
86 print "reading FrameData"
87 if '<FrameData>' in line:
88 while 2:
89 frameData.append(line)
90 if 'Hmat:' in line:
91 L = line.split()
92 Hxx = float(L[2].strip(','))
93 Hxy = float(L[3].strip(','))
94 Hxz = float(L[4].strip(','))
95 Hyx = float(L[7].strip(','))
96 Hyy = float(L[8].strip(','))
97 Hyz = float(L[9].strip(','))
98 Hzx = float(L[12].strip(','))
99 Hzy = float(L[13].strip(','))
100 Hzz = float(L[14].strip(','))
101 Hmat.append([Hxx, Hxy, Hxz])
102 Hmat.append([Hyx, Hyy, Hyz])
103 Hmat.append([Hzx, Hzy, Hzz])
104 BoxInv.append(1.0/Hxx)
105 BoxInv.append(1.0/Hyy)
106 BoxInv.append(1.0/Hzz)
107 line = mdFile.readline()
108 if '</FrameData>' in line:
109 frameData.append(line)
110 break
111 break
112
113 line = mdFile.readline()
114 while 1:
115 if '<StuntDoubles>' in line:
116 line = mdFile.readline()
117 while 2:
118 L = line.split()
119 myIndex = int(L[0])
120 indices.append(myIndex)
121 pvqj.append(L[1])
122 i = 2
123 if 'p' in L[1]:
124 x = float(L[i])
125 y = float(L[i+1])
126 z = float(L[i+2])
127 p.append([x, y, z])
128 i = i+3
129 else:
130 p.append([0.0, 0.0, 0.0])
131 if 'v' in L[1]:
132 vx = float(L[i])
133 vy = float(L[i+1])
134 vz = float(L[i+2])
135 v.append([vx, vy, vz])
136 i = i+3
137 else:
138 v.append([0.0, 0.0, 0.0])
139 if 'q' in L[1]:
140 qw = float(L[i])
141 qx = float(L[i+1])
142 qy = float(L[i+2])
143 qz = float(L[i+3])
144 q.append([qw, qx, qy, qz])
145 i = i+4
146 else:
147 q.append([0.0, 0.0, 0.0, 0.0])
148 if 'j' in L[1]:
149 jx = float(L[i])
150 jy = float(L[i+1])
151 jz = float(L[i+2])
152 j.append([jx, jy, jz])
153 i = i+3
154 else:
155 j.append([0.0, 0.0, 0.0])
156
157 line = mdFile.readline()
158 if '</StuntDoubles>' in line:
159 break
160 break
161 line = mdFile.readline()
162 if not line: break
163
164 mdFile.close()
165
166 def writeFile(outputFileName,repeatX,repeatY,repeatZ):
167 outputFile = open(outputFileName, 'w')
168
169 outputFile.write("<OpenMD version=1>\n");
170
171 print "writing MetaData"
172 for metaline in metaData:
173 if 'nMol' in metaline:
174 metasplit = metaline.split()
175 nMol = float(metasplit[2].strip(';'))
176 newNmol = nMol * repeatX * repeatY * repeatZ
177 outputFile.write(' nMol = %10d;\n' % (newNmol))
178 else:
179 outputFile.write(metaline)
180
181 print "writing Snapshot"
182 outputFile.write(" <Snapshot>\n")
183
184 print "writing FrameData"
185 for frameline in frameData:
186 if 'Hmat:' in frameline:
187 myH = []
188 myH.append([repeatX * Hmat[0][0], repeatX * Hmat[0][1], repeatX * Hmat[0][2]])
189 myH.append([repeatY * Hmat[1][0], repeatY * Hmat[1][1], repeatY * Hmat[1][2]])
190 myH.append([repeatZ * Hmat[2][0], repeatZ * Hmat[2][1], repeatZ * Hmat[2][2]])
191 outputFile.write(" Hmat: {{ %.10g, %.10g, %.10g }, { %.10g, %.10g, %.10g }, { %.10g, %.10g, %.10g }}\n" % (myH[0][0], myH[0][1], myH[0][2], myH[1][0], myH[1][1], myH[1][2], myH[2][0], myH[2][1], myH[2][2]))
192 else:
193 outputFile.write(frameline)
194
195 print "writing StuntDoubles"
196 outputFile.write(" <StuntDoubles>\n")
197
198 print repeatX, repeatY, repeatZ
199
200 deco = [ (index, i) for i, index in enumerate(indices) ]
201 deco.sort()
202 whichSD = 0
203 for ii in range(repeatX):
204 for jj in range(repeatY):
205 for kk in range(repeatZ):
206 for index in range(len(deco)):
207 (index,i) = deco[index]
208 print i
209 myP = []
210 myP.append(p[i][0] + ii*Hmat[0][0] + jj*Hmat[1][0] + kk*Hmat[2][0])
211 myP.append(p[i][1] + ii*Hmat[0][1] + jj*Hmat[1][1] + kk*Hmat[2][1])
212 myP.append(p[i][2] + ii*Hmat[0][2] + jj*Hmat[1][2] + kk*Hmat[2][2])
213
214 if (pvqj[i] == 'p'):
215 outputFile.write("%10d %7s %18.10g %18.10g %18.10g\n" % (whichSD, pvqj[i], myP[0], myP[1], myP[2]))
216
217 elif (pvqj[i] == 'pv'):
218 outputFile.write("%10d %7s %18.10g %18.10g %18.10g %13e %13e %13e\n" % (whichSD, pvqj[i], myP[0], myP[1], myP[2], v[i][0], v[i][1], v[i][2]))
219 elif (pvqj[i] == 'pq'):
220 outputFile.write("%10d %7s %18.10g %18.10g %18.10g %13e %13e %13e %13e\n" % (whichSD, pvqj[i], myP[0], myP[1], myP[2], q[i][0], q[i][1], q[i][2], q[i][3]))
221 elif (pvqj[i] == 'pvqj'):
222 outputFile.write("%10d %7s %18.10g %18.10g %18.10g %13e %13e %13e %13e %13e %13e %13e %13e %13e %13e\n" % (whichSD, pvqj[i], myP[0], myP[1], myP[2], v[i][0], v[i][1], v[i][2], q[i][0], q[i][1], q[i][2], q[i][3], j[i][0], j[i][1], j[i][2]))
223 whichSD = whichSD + 1
224
225 outputFile.write(" </StuntDoubles>\n")
226 outputFile.write(" </Snapshot>\n")
227 outputFile.write("</OpenMD>\n")
228 outputFile.close()
229
230 def roundMe(x):
231 if (x >= 0.0):
232 return math.floor(x + 0.5)
233 else:
234 return math.ceil(x - 0.5)
235
236 def wrapVector(myVect):
237 scaled = [0.0, 0.0, 0.0]
238 for i in range(3):
239 scaled[i] = myVect[i] * BoxInv[i]
240 scaled[i] = scaled[i] - roundMe(scaled[i])
241 myVect[i] = scaled[i] * Hmat[i][i]
242 return myVect
243
244 def dot(L1, L2):
245 myDot = 0.0
246 for i in range(len(L1)):
247 myDot = myDot + L1[i]*L2[i]
248 return myDot
249
250 def normalize(L1):
251 L2 = []
252 myLength = math.sqrt(dot(L1, L1))
253 for i in range(len(L1)):
254 L2.append(L1[i] / myLength)
255 return L2
256
257 def cross(L1, L2):
258 # don't call this with anything other than length 3 lists please
259 # or you'll be sorry
260 L3 = [0.0, 0.0, 0.0]
261 L3[0] = L1[1]*L2[2] - L1[2]*L2[1]
262 L3[1] = L1[2]*L2[0] - L1[0]*L2[2]
263 L3[2] = L1[0]*L2[1] - L1[1]*L2[0]
264 return L3
265
266 def mapToBox(translateX, translateY, translateZ):
267 print "translating by %f\t%f\t%f" % (translateX, translateY, translateZ)
268 for i in range(len(indices)):
269 dpos = []
270 dpos.append(p[i][0] + translateX)
271 dpos.append(p[i][1] + translateY)
272 dpos.append(p[i][2] + translateZ)
273 p[i] = wrapVector(dpos)
274
275 def main(argv):
276 repeatX = 1
277 repeatY = 1
278 repeatZ = 1
279 translateX = 0.0
280 translateY = 0.0
281 translateZ = 0.0
282 _haveMDFileName = 0
283 _haveOutputFileName = 0
284 try:
285 opts, args = getopt.getopt(argv, "hm:o:x:y:z:t:u:v:", ["help", "meta-data=", "output-file=", "repeatX=", "repeatY=", "repeatZ=","translateX=","translateY=","translateZ="])
286 except getopt.GetoptError:
287 usage()
288 sys.exit(2)
289 for opt, arg in opts:
290 if opt in ("-h", "--help"):
291 usage()
292 sys.exit()
293 elif opt in ("-m", "--meta-data"):
294 mdFileName = arg
295 _haveMDFileName = 1
296 elif opt in ("-o", "--output-file"):
297 outputFileName = arg
298 _haveOutputFileName = 1
299 elif opt in ("-x", "--repeatX"):
300 repeatX = int(arg)
301 elif opt in ("-y", "--repeatY"):
302 repeatY = int(arg)
303 elif opt in ("-z", "--repeatZ"):
304 repeatZ = int(arg)
305 elif opt in ("-t", "--translateX"):
306 translateX = float(arg)
307 elif opt in ("-u", "--translateY"):
308 translateY = float(arg)
309 elif opt in ("-v", "--translateZ"):
310 translateZ = float(arg)
311 if (_haveMDFileName != 1):
312 usage()
313 print "No meta-data file was specified"
314 sys.exit()
315 if (_haveOutputFileName != 1):
316 usage()
317 print "No output file was specified"
318 sys.exit()
319
320 readFile(mdFileName)
321 mapToBox(translateX, translateY, translateZ)
322 writeFile(outputFileName, repeatX, repeatY, repeatZ)
323
324 if __name__ == "__main__":
325 if len(sys.argv) == 1:
326 usage()
327 sys.exit()
328 main(sys.argv[1:])

Properties

Name Value
svn:executable *
svn:keywords Author Id Revision Date