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, 8 months ago) by gezelter
File size: 11981 byte(s)
Log Message:
Another md2md fix

File Contents

# User Rev Content
1 gezelter 1782 #!@PYTHON_EXECUTABLE@
2 gezelter 1227 """MetaData file remapper
3    
4     Takes a MetaData file and maps all StuntDoubles back to the periodic box.
5 gezelter 1383 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 gezelter 1227
8     Usage: md2md
9    
10     Options:
11 gezelter 1383 -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 gezelter 1227
21     Example:
22 gezelter 1383 md2md -m lipidSystem.md -o bigLipidSystem.md -x 2 -y 2 -z 1 -v 35.0
23 gezelter 1227
24     """
25    
26     __author__ = "Dan Gezelter (gezelter@nd.edu)"
27 gezelter 1442 __version__ = "$Revision$"
28     __date__ = "$Date$"
29 gezelter 1383 __copyright__ = "Copyright (c) 2009 by the University of Notre Dame"
30 gezelter 1390 __license__ = "OpenMD"
31 gezelter 1227
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 gezelter 1390 # Find OpenMD version info first
56 gezelter 1227 line = mdFile.readline()
57     while 1:
58 gezelter 1390 if '<OOPSE version=' in line or '<OpenMD version=' in line:
59     OpenMDversion = line
60 gezelter 1227 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 gezelter 2043 i = 2
123 gezelter 2041 if 'p' in L[1]:
124 gezelter 2043 x = float(L[i])
125     y = float(L[i+1])
126     z = float(L[i+2])
127 gezelter 2041 p.append([x, y, z])
128 gezelter 2043 i = i+3
129 gezelter 2041 else:
130     p.append([0.0, 0.0, 0.0])
131     if 'v' in L[1]:
132 gezelter 2043 vx = float(L[i])
133     vy = float(L[i+1])
134     vz = float(L[i+2])
135 gezelter 2041 v.append([vx, vy, vz])
136 gezelter 2043 i = i+3
137 gezelter 2041 else:
138     v.append([0.0, 0.0, 0.0])
139     if 'q' in L[1]:
140 gezelter 2043 qw = float(L[i])
141     qx = float(L[i+1])
142     qy = float(L[i+2])
143     qz = float(L[i+3])
144 gezelter 1227 q.append([qw, qx, qy, qz])
145 gezelter 2043 i = i+4
146 gezelter 2041 else:
147     q.append([0.0, 0.0, 0.0, 0.0])
148     if 'j' in L[1]:
149 gezelter 2043 jx = float(L[i])
150     jy = float(L[i+1])
151     jz = float(L[i+2])
152 gezelter 1227 j.append([jx, jy, jz])
153 gezelter 2043 i = i+3
154 gezelter 1227 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 gezelter 1383 def writeFile(outputFileName,repeatX,repeatY,repeatZ):
167 gezelter 1227 outputFile = open(outputFileName, 'w')
168    
169 gezelter 1390 outputFile.write("<OpenMD version=1>\n");
170 gezelter 1227
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 xsun 1243 print repeatX, repeatY, repeatZ
199    
200 gezelter 1383 deco = [ (index, i) for i, index in enumerate(indices) ]
201     deco.sort()
202     whichSD = 0
203 gezelter 1390 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 gezelter 1383 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 gezelter 2041
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 gezelter 1383 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 gezelter 1227
225     outputFile.write(" </StuntDoubles>\n")
226     outputFile.write(" </Snapshot>\n")
227 gezelter 1390 outputFile.write("</OpenMD>\n")
228 gezelter 1227 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 gezelter 1383 def mapToBox(translateX, translateY, translateZ):
267     print "translating by %f\t%f\t%f" % (translateX, translateY, translateZ)
268 gezelter 1227 for i in range(len(indices)):
269 gezelter 1383 dpos = []
270     dpos.append(p[i][0] + translateX)
271     dpos.append(p[i][1] + translateY)
272     dpos.append(p[i][2] + translateZ)
273 gezelter 1227 p[i] = wrapVector(dpos)
274    
275     def main(argv):
276 gezelter 1383 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 gezelter 1227 try:
285 gezelter 1383 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 gezelter 1227 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 xsun 1243 elif opt in ("-x", "--repeatX"):
300 gezelter 1227 repeatX = int(arg)
301     elif opt in ("-y", "--repeatY"):
302     repeatY = int(arg)
303     elif opt in ("-z", "--repeatZ"):
304     repeatZ = int(arg)
305 gezelter 1383 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 gezelter 1227 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 chuckv 1293
320 gezelter 1227 readFile(mdFileName)
321 gezelter 1383 mapToBox(translateX, translateY, translateZ)
322     writeFile(outputFileName, repeatX, repeatY, repeatZ)
323 gezelter 1227
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