ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/trunk/src/applications/utilities/md2md
Revision: 2041
Committed: Fri Nov 14 14:31:47 2014 UTC (10 years, 5 months ago) by gezelter
File size: 11794 byte(s)
Log Message:
Modified md2md to deal with pvqj fields that don't have v or j.

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 if 'p' in L[1]:
123 x = float(L[2])
124 y = float(L[3])
125 z = float(L[4])
126 p.append([x, y, z])
127 else:
128 p.append([0.0, 0.0, 0.0])
129 if 'v' in L[1]:
130 vx = float(L[5])
131 vy = float(L[6])
132 vz = float(L[7])
133 v.append([vx, vy, vz])
134 else:
135 v.append([0.0, 0.0, 0.0])
136 if 'q' in L[1]:
137 qw = float(L[8])
138 qx = float(L[9])
139 qy = float(L[10])
140 qz = float(L[11])
141 q.append([qw, qx, qy, qz])
142 else:
143 q.append([0.0, 0.0, 0.0, 0.0])
144 if 'j' in L[1]:
145 jx = float(L[12])
146 jy = float(L[13])
147 jz = float(L[14])
148 j.append([jx, jy, jz])
149 else:
150 j.append([0.0, 0.0, 0.0])
151
152 line = mdFile.readline()
153 if '</StuntDoubles>' in line:
154 break
155 break
156 line = mdFile.readline()
157 if not line: break
158
159 mdFile.close()
160
161 def writeFile(outputFileName,repeatX,repeatY,repeatZ):
162 outputFile = open(outputFileName, 'w')
163
164 outputFile.write("<OpenMD version=1>\n");
165
166 print "writing MetaData"
167 for metaline in metaData:
168 if 'nMol' in metaline:
169 metasplit = metaline.split()
170 nMol = float(metasplit[2].strip(';'))
171 newNmol = nMol * repeatX * repeatY * repeatZ
172 outputFile.write(' nMol = %10d;\n' % (newNmol))
173 else:
174 outputFile.write(metaline)
175
176 print "writing Snapshot"
177 outputFile.write(" <Snapshot>\n")
178
179 print "writing FrameData"
180 for frameline in frameData:
181 if 'Hmat:' in frameline:
182 myH = []
183 myH.append([repeatX * Hmat[0][0], repeatX * Hmat[0][1], repeatX * Hmat[0][2]])
184 myH.append([repeatY * Hmat[1][0], repeatY * Hmat[1][1], repeatY * Hmat[1][2]])
185 myH.append([repeatZ * Hmat[2][0], repeatZ * Hmat[2][1], repeatZ * Hmat[2][2]])
186 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]))
187 else:
188 outputFile.write(frameline)
189
190 print "writing StuntDoubles"
191 outputFile.write(" <StuntDoubles>\n")
192
193 print repeatX, repeatY, repeatZ
194
195 deco = [ (index, i) for i, index in enumerate(indices) ]
196 deco.sort()
197 whichSD = 0
198 for ii in range(repeatX):
199 for jj in range(repeatY):
200 for kk in range(repeatZ):
201 for index in range(len(deco)):
202 (index,i) = deco[index]
203 print i
204 myP = []
205 myP.append(p[i][0] + ii*Hmat[0][0] + jj*Hmat[1][0] + kk*Hmat[2][0])
206 myP.append(p[i][1] + ii*Hmat[0][1] + jj*Hmat[1][1] + kk*Hmat[2][1])
207 myP.append(p[i][2] + ii*Hmat[0][2] + jj*Hmat[1][2] + kk*Hmat[2][2])
208
209 if (pvqj[i] == 'p'):
210 outputFile.write("%10d %7s %18.10g %18.10g %18.10g\n" % (whichSD, pvqj[i], myP[0], myP[1], myP[2]))
211
212 elif (pvqj[i] == 'pv'):
213 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]))
214 elif (pvqj[i] == 'pq'):
215 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]))
216 elif (pvqj[i] == 'pvqj'):
217 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]))
218 whichSD = whichSD + 1
219
220 outputFile.write(" </StuntDoubles>\n")
221 outputFile.write(" </Snapshot>\n")
222 outputFile.write("</OpenMD>\n")
223 outputFile.close()
224
225 def roundMe(x):
226 if (x >= 0.0):
227 return math.floor(x + 0.5)
228 else:
229 return math.ceil(x - 0.5)
230
231 def wrapVector(myVect):
232 scaled = [0.0, 0.0, 0.0]
233 for i in range(3):
234 scaled[i] = myVect[i] * BoxInv[i]
235 scaled[i] = scaled[i] - roundMe(scaled[i])
236 myVect[i] = scaled[i] * Hmat[i][i]
237 return myVect
238
239 def dot(L1, L2):
240 myDot = 0.0
241 for i in range(len(L1)):
242 myDot = myDot + L1[i]*L2[i]
243 return myDot
244
245 def normalize(L1):
246 L2 = []
247 myLength = math.sqrt(dot(L1, L1))
248 for i in range(len(L1)):
249 L2.append(L1[i] / myLength)
250 return L2
251
252 def cross(L1, L2):
253 # don't call this with anything other than length 3 lists please
254 # or you'll be sorry
255 L3 = [0.0, 0.0, 0.0]
256 L3[0] = L1[1]*L2[2] - L1[2]*L2[1]
257 L3[1] = L1[2]*L2[0] - L1[0]*L2[2]
258 L3[2] = L1[0]*L2[1] - L1[1]*L2[0]
259 return L3
260
261 def mapToBox(translateX, translateY, translateZ):
262 print "translating by %f\t%f\t%f" % (translateX, translateY, translateZ)
263 for i in range(len(indices)):
264 dpos = []
265 dpos.append(p[i][0] + translateX)
266 dpos.append(p[i][1] + translateY)
267 dpos.append(p[i][2] + translateZ)
268 p[i] = wrapVector(dpos)
269
270 def main(argv):
271 repeatX = 1
272 repeatY = 1
273 repeatZ = 1
274 translateX = 0.0
275 translateY = 0.0
276 translateZ = 0.0
277 _haveMDFileName = 0
278 _haveOutputFileName = 0
279 try:
280 opts, args = getopt.getopt(argv, "hm:o:x:y:z:t:u:v:", ["help", "meta-data=", "output-file=", "repeatX=", "repeatY=", "repeatZ=","translateX=","translateY=","translateZ="])
281 except getopt.GetoptError:
282 usage()
283 sys.exit(2)
284 for opt, arg in opts:
285 if opt in ("-h", "--help"):
286 usage()
287 sys.exit()
288 elif opt in ("-m", "--meta-data"):
289 mdFileName = arg
290 _haveMDFileName = 1
291 elif opt in ("-o", "--output-file"):
292 outputFileName = arg
293 _haveOutputFileName = 1
294 elif opt in ("-x", "--repeatX"):
295 repeatX = int(arg)
296 elif opt in ("-y", "--repeatY"):
297 repeatY = int(arg)
298 elif opt in ("-z", "--repeatZ"):
299 repeatZ = int(arg)
300 elif opt in ("-t", "--translateX"):
301 translateX = float(arg)
302 elif opt in ("-u", "--translateY"):
303 translateY = float(arg)
304 elif opt in ("-v", "--translateZ"):
305 translateZ = float(arg)
306 if (_haveMDFileName != 1):
307 usage()
308 print "No meta-data file was specified"
309 sys.exit()
310 if (_haveOutputFileName != 1):
311 usage()
312 print "No output file was specified"
313 sys.exit()
314
315 readFile(mdFileName)
316 mapToBox(translateX, translateY, translateZ)
317 writeFile(outputFileName, repeatX, repeatY, repeatZ)
318
319 if __name__ == "__main__":
320 if len(sys.argv) == 1:
321 usage()
322 sys.exit()
323 main(sys.argv[1:])

Properties

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