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, 8 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

# 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 2041 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 gezelter 1227 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 gezelter 2041 else:
143     q.append([0.0, 0.0, 0.0, 0.0])
144     if 'j' in L[1]:
145 gezelter 1227 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 gezelter 1383 def writeFile(outputFileName,repeatX,repeatY,repeatZ):
162 gezelter 1227 outputFile = open(outputFileName, 'w')
163    
164 gezelter 1390 outputFile.write("<OpenMD version=1>\n");
165 gezelter 1227
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 xsun 1243 print repeatX, repeatY, repeatZ
194    
195 gezelter 1383 deco = [ (index, i) for i, index in enumerate(indices) ]
196     deco.sort()
197     whichSD = 0
198 gezelter 1390 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 gezelter 1383 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 gezelter 2041
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 gezelter 1383 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 gezelter 1227
220     outputFile.write(" </StuntDoubles>\n")
221     outputFile.write(" </Snapshot>\n")
222 gezelter 1390 outputFile.write("</OpenMD>\n")
223 gezelter 1227 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 gezelter 1383 def mapToBox(translateX, translateY, translateZ):
262     print "translating by %f\t%f\t%f" % (translateX, translateY, translateZ)
263 gezelter 1227 for i in range(len(indices)):
264 gezelter 1383 dpos = []
265     dpos.append(p[i][0] + translateX)
266     dpos.append(p[i][1] + translateY)
267     dpos.append(p[i][2] + translateZ)
268 gezelter 1227 p[i] = wrapVector(dpos)
269    
270     def main(argv):
271 gezelter 1383 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 gezelter 1227 try:
280 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="])
281 gezelter 1227 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 xsun 1243 elif opt in ("-x", "--repeatX"):
295 gezelter 1227 repeatX = int(arg)
296     elif opt in ("-y", "--repeatY"):
297     repeatY = int(arg)
298     elif opt in ("-z", "--repeatZ"):
299     repeatZ = int(arg)
300 gezelter 1383 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 gezelter 1227 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 chuckv 1293
315 gezelter 1227 readFile(mdFileName)
316 gezelter 1383 mapToBox(translateX, translateY, translateZ)
317     writeFile(outputFileName, repeatX, repeatY, repeatZ)
318 gezelter 1227
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