4Opens two omd files, one with a solute structure and one with a
5solvent structure. Deletes any solvent molecules that overlap with
6solute molecules and produces a new combined omd file. The output omd
7file must be edited to run properly in OpenMD. Note that the two
8boxes must have identical box geometries (specified on the Hmat line).
13 -h, --help show this help
14 -u, --solute=... use specified OpenMD (.omd) file as the solute
15 -v, --solvent=... use specified OpenMD (.omd) file as the solvent
16 -r, --rcut=... specify the cutoff radius for deleting solvent
17 -o, --output-file=... use specified output (.omd) file
18 -n, --nSoluteAtoms=... Number of atoms in solute molecule,
20 -p, --nSolventAtoms=... Number of atoms in solvent molecule,
24 omd-solvator -u solute.omd -v solvent.omd -n 3 -p 3 -r 4.0 -o combined.omd
28__author__ = "Charles Vardeman (cvardema@nd.edu)"
29__version__ = "$Revision$"
31__copyright__ = "Copyright (c) 2004-present The University of Notre Dame. All Rights Reserved."
43_haveOutputFileName = 0
72solventTypeLine = str()
79def readFile1(mdFileName):
80 mdFile = open(mdFileName, 'r')
81 # Find OpenMD version info first
82 line = mdFile.readline()
84 if '<OpenMD version=' in line or '<OOPSE version=' in line:
87 line = mdFile.readline()
89 # Rewind file and find start of MetaData block
92 line = mdFile.readline()
94 print("reading solute MetaData")
96 if '<MetaData>' in line:
98 metaData1.append(line)
99 line = mdFile.readline()
101 global soluteTypeLine
102 soluteTypeLine = line
106 if '</MetaData>' in line:
107 metaData1.append(line)
110 line = mdFile.readline()
113 print("reading solute Snapshot")
114 line = mdFile.readline()
116 if '<Snapshot>' in line:
117 line = mdFile.readline()
119 print("reading solute FrameData")
120 if '<FrameData>' in line:
122 frameData1.append(line)
125 Hxx = float(L[2].strip(','))
126 Hxy = float(L[3].strip(','))
127 Hxz = float(L[4].strip(','))
128 Hyx = float(L[7].strip(','))
129 Hyy = float(L[8].strip(','))
130 Hyz = float(L[9].strip(','))
131 Hzx = float(L[12].strip(','))
132 Hzy = float(L[13].strip(','))
133 Hzz = float(L[14].strip(','))
134 Hmat1.append([Hxx, Hxy, Hxz])
135 Hmat1.append([Hyx, Hyy, Hyz])
136 Hmat1.append([Hzx, Hzy, Hzz])
137 BoxInv1.append(1.0/Hxx)
138 BoxInv1.append(1.0/Hyy)
139 BoxInv1.append(1.0/Hzz)
140 line = mdFile.readline()
141 if '</FrameData>' in line:
142 frameData1.append(line)
146 line = mdFile.readline()
148 if '<StuntDoubles>' in line:
149 line = mdFile.readline()
153 indices1.append(myIndex)
158 positions1.append([x, y, z])
162 velocities1.append([vx, vy, vz])
168 quaternions1.append([qw, qx, qy, qz])
172 angVels1.append([jx, jy, jz])
174 quaternions1.append([0.0, 0.0, 0.0, 0.0])
175 angVels1.append([0.0, 0.0, 0.0])
177 line = mdFile.readline()
178 if '</StuntDoubles>' in line:
181 line = mdFile.readline()
186def readFile2(mdFileName):
187 mdFile = open(mdFileName, 'r')
188 # Find OpenMD version info first
189 line = mdFile.readline()
191 if '<OpenMD version=' in line or '<OOPSE version=':
194 line = mdFile.readline()
196 # Rewind file and find start of MetaData block
199 line = mdFile.readline()
200 print("reading solvent MetaData")
202 if '<MetaData>' in line:
205 global solventTypeLine
206 solventTypeLine = line
207 metaData2.append(line)
208 line = mdFile.readline()
209 if '</MetaData>' in line:
210 metaData2.append(line)
213 line = mdFile.readline()
216 print("reading solvent Snapshot")
217 line = mdFile.readline()
219 if '<Snapshot>' in line:
220 line = mdFile.readline()
222 print("reading solvent FrameData")
223 if '<FrameData>' in line:
225 frameData2.append(line)
228 Hxx = float(L[2].strip(','))
229 Hxy = float(L[3].strip(','))
230 Hxz = float(L[4].strip(','))
231 Hyx = float(L[7].strip(','))
232 Hyy = float(L[8].strip(','))
233 Hyz = float(L[9].strip(','))
234 Hzx = float(L[12].strip(','))
235 Hzy = float(L[13].strip(','))
236 Hzz = float(L[14].strip(','))
237 Hmat2.append([Hxx, Hxy, Hxz])
238 Hmat2.append([Hyx, Hyy, Hyz])
239 Hmat2.append([Hzx, Hzy, Hzz])
240 BoxInv2.append(1.0/Hxx)
241 BoxInv2.append(1.0/Hyy)
242 BoxInv2.append(1.0/Hzz)
243 line = mdFile.readline()
244 if '</FrameData>' in line:
245 frameData2.append(line)
249 line = mdFile.readline()
251 if '<StuntDoubles>' in line:
252 line = mdFile.readline()
256 indices2.append(myIndex)
263 positions2.append([x, y, z])
266 positions2.append([0.0, 0.0, 0.0])
271 velocities2.append([vx, vy, vz])
274 velocities2.append([0.0, 0.0, 0.0])
280 quaternions2.append([qw, qx, qy, qz])
283 quaternions2.append([0.0, 0.0, 0.0, 0.0])
288 angVels2.append([jx, jy, jz])
291 angVels2.append([0.0, 0.0, 0.0])
293 line = mdFile.readline()
294 if '</StuntDoubles>' in line:
297 line = mdFile.readline()
302def writeFile(outputFileName):
303 outputFile = open(outputFileName, 'w')
305 outputFile.write("<OpenMD version=1>\n")
307# for metaline in metaData1:
308# outputFile.write(metaline)
309 outputFile.write(" <MetaData>\n")
310 outputFile.write("\n\n")
311 outputFile.write("component{\n")
312 outputFile.write(soluteTypeLine)
313 outputFile.write(soluteMolLine)
314 outputFile.write("}\n")
316 outputFile.write("component{\n")
317 outputFile.write(solventTypeLine)
318 outputFile.write("nMol = %d;\n" % (nSolvents))
319 outputFile.write("}\n")
320 outputFile.write("\n\n")
321 outputFile.write(" </MetaData>\n")
322 outputFile.write(" <Snapshot>\n")
324 for frameline in frameData1:
325 outputFile.write(frameline)
327 outputFile.write(" <StuntDoubles>\n")
330 for i in range(len(indices1)):
331 if ('p' in pvqj1[i]):
332 outputFile.write("%10d %7s %18.10g %18.10g %18.10g " % (newIndex, pvqj1[i], positions1[i][0], positions1[i][1], positions1[i][2]))
333 if ('v' in pvqj1[i]):
334 outputFile.write("%13e %13e %13e " % (velocities1[i][0], velocities1[i][1], velocities1[i][2]))
336 outputFile.write("%13e %13e %13e %13e " % (quaternions1[i][0], quaternions1[i][1], quaternions1[i][2], quaternions1[i][3]))
338 outputFile.write("%13e %13e %13e " % (angVels1[i][0], angVels1[i][1], angVels1[i][2]))
339 outputFile.write("\n")
341 newIndex = newIndex + 1
343 outputFile.write(" </StuntDoubles>\n")
344 outputFile.write(" </Snapshot>\n")
345 outputFile.write("</OpenMD>\n")
349 boxTolerance = 1.0e-3
353 diff = math.fabs( Hmat1[i][j] - Hmat2[i][j])
356 if (maxDiff > boxTolerance):
357 print("The solute and solvent boxes have different geometries:")
358 print(" Solute | Solvent")
359 print(" -------------------------------------|------------------------------------")
361 print(( "| %10.4g %10.4g %10.4g | %10.4g %10.4g %10.4g |" % (Hmat1[i][0], Hmat1[i][1], Hmat1[i][2], Hmat2[i][0], Hmat2[i][1], Hmat2[i][2])))
363 print(" -------------------------------------|------------------------------------")
369 return math.floor(x + 0.5)
371 return math.ceil(x - 0.5)
373def frange(start,stop,step=1.0):
379def wrapVector(myVect):
380 scaled = [0.0, 0.0, 0.0]
382 scaled[i] = myVect[i] * BoxInv1[i]
383 scaled[i] = scaled[i] - roundMe(scaled[i])
384 myVect[i] = scaled[i] * Hmat1[i][i]
389 for i in range(len(L1)):
390 myDot = myDot + L1[i]*L2[i]
395 myLength = math.sqrt(dot(L1, L1))
396 for i in range(len(L1)):
397 L2.append(L1[i] / myLength)
401 # don't call this with anything other than length 3 lists please
404 L3[0] = L1[1]*L2[2] - L1[2]*L2[1]
405 L3[1] = L1[2]*L2[0] - L1[0]*L2[2]
406 L3[2] = L1[0]*L2[1] - L1[1]*L2[0]
409def removeOverlaps(rcut, nSolventAtoms, nSoluteAtoms):
413 for i in range(0, len(indices2), nSolventAtoms):
415 for atom1 in range (i, (i+nSolventAtoms)):
417 iPos = positions2[atom1]
418 for j in range(0, len(indices1)):
419 for atom2 in range (j, (j+nSoluteAtoms), nSoluteAtoms):
420 jPos = positions1[atom2]
421 dpos = [jPos[0]-iPos[0], jPos[1]-iPos[1], jPos[2]-iPos[2]]
422 dpos = wrapVector(dpos)
423 dist2 = dot(dpos, dpos)
429 if (keepThisMolecule == 0):
432 keepers.append(keepThisMolecule)
436 myIndex = len(indices2) - 1
437 for i in range(0, len(keepers)):
439 if (keepers[i] == 1):
440 nSolvents = nSolvents + 1
441 atomStartIndex = i * nSolventAtoms
442 for j in range (atomStartIndex, (atomStartIndex+nSolventAtoms)):
443 indices1.append(myIndex)
444 pvqj1.append(pvqj2[j])
445 if ("p" in pvqj2[j]):
446 positions1.append(positions2[j])
448 positions1.append([0.0, 0.0, 0.0])
449 if ("v" in pvqj2[j]):
450 velocities1.append(velocities2[j])
452 velocities1.append([0.0, 0.0, 0.0])
453 if ("q" in pvqj2[j]):
454 quaternions1.append(quaternions2[j])
456 quaternions1.append([0.0, 0.0, 0.0, 0.0])
457 if ("j" in pvqj2[j]):
458 angVels1.append(angVels2[j])
460 angVels1.append([0.0, 0.0, 0.0])
466 opts, args = getopt.getopt(argv, "hu:v:n:p:r:o:", ["help", "solute=", "solvent=", "nSoluteAtoms=", "nSolventAtoms=", "rcut=" "output-file="])
467 except getopt.GetoptError:
470 for opt, arg in opts:
471 if opt in ("-h", "--help"):
474 elif opt in ("-u", "--solute"):
476 global _haveMDFileName1
478 elif opt in ("-v", "--solvent"):
480 global _haveMDFileName2
482 elif opt in ("-n", "--nSoluteAtoms"):
483 nSoluteAtoms = int(arg)
484 global _haveNSoluteAtoms
485 _haveNSoluteAtoms = 1
486 elif opt in ("-p", "--nSolventAtoms"):
487 nSolventAtoms = int(arg)
488 global _haveNSolventAtoms
489 _haveNSolventAtoms = 1
490 elif opt in ("-r", "--rcut"):
494 elif opt in ("-o", "--output-file"):
496 global _haveOutputFileName
497 _haveOutputFileName = 1
499 if (_haveMDFileName1 != 1):
501 print("No OpenMD (omd) file was specified for the solute")
504 if (_haveMDFileName2 != 1):
506 print("No OpenMD (omd) file was specified for the solvent")
509 if (_haveOutputFileName != 1):
511 print("No output file was specified")
515 print("No cutoff radius was specified, using 4 angstroms")
518 if (_haveNSoluteAtoms != 1):
519 print("Number of solute atoms was not specified. Using 1 atom.")
522 if (_haveNSolventAtoms != 1):
523 print("Number of solute atoms was not specified. Using 1 atom.")
526 readFile1(mdFileName1)
527 readFile2(mdFileName2)
529 removeOverlaps(rcut, nSolventAtoms, nSoluteAtoms)
530 writeFile(outputFileName)
532if __name__ == "__main__":
533 if len(sys.argv) == 1: