| 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, and | 
| 6 | < | then writes out a new MetaData file. | 
| 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 | < | -d, --depthFirst        write out the replicated system depth-first | 
| 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 |  |  | 
| 19 | – |  | 
| 21 |  | Example: | 
| 22 | < | md2md -m lipidSystem.md -o bigLipidSystem.md -x 2 -y 2 -z 1 | 
| 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: 1.3 $" | 
| 28 | < | __date__ = "$Date: 2008-09-14 01:32:23 $" | 
| 29 | < | __copyright__ = "Copyright (c) 2008 by the University of Notre Dame" | 
| 30 | < | __license__ = "OOPSE" | 
| 27 | > | __version__ = "$Revision: 1.5 $" | 
| 28 | > | __date__ = "$Date: 2009-11-25 20:01:59 $" | 
| 29 | > | __copyright__ = "Copyright (c) 2009 by the University of Notre Dame" | 
| 30 | > | __license__ = "OpenMD" | 
| 31 |  |  | 
| 32 |  | import sys | 
| 33 |  | import getopt | 
| 36 |  | import random | 
| 37 |  | from sets import * | 
| 38 |  |  | 
| 38 | – | _haveMDFileName = 0 | 
| 39 | – | _haveOutputFileName = 0 | 
| 40 | – |  | 
| 41 | – | repeatX = 1 | 
| 42 | – | repeatY = 1 | 
| 43 | – | repeatZ = 1 | 
| 44 | – |  | 
| 39 |  | metaData = [] | 
| 40 |  | frameData = [] | 
| 41 |  | indices = [] | 
| 52 |  |  | 
| 53 |  | def readFile(mdFileName): | 
| 54 |  | mdFile = open(mdFileName, 'r') | 
| 55 | < | # Find OOPSE version info first | 
| 55 | > | # Find OpenMD version info first | 
| 56 |  | line = mdFile.readline() | 
| 57 |  | while 1: | 
| 58 | < | if '<OOPSE version=' in line: | 
| 59 | < | OOPSEversion = line | 
| 58 | > | if '<OOPSE version=' in line or '<OpenMD version=' in line: | 
| 59 | > | OpenMDversion = line | 
| 60 |  | break | 
| 61 |  | line = mdFile.readline() | 
| 62 |  |  | 
| 150 |  |  | 
| 151 |  | mdFile.close() | 
| 152 |  |  | 
| 153 | < | def writeFile(outputFileName,depthFirst): | 
| 153 | > | def writeFile(outputFileName,repeatX,repeatY,repeatZ): | 
| 154 |  | outputFile = open(outputFileName, 'w') | 
| 155 |  |  | 
| 156 | < | outputFile.write("<OOPSE version=4>\n"); | 
| 156 | > | outputFile.write("<OpenMD version=1>\n"); | 
| 157 |  |  | 
| 158 |  | print "writing MetaData" | 
| 159 |  | for metaline in metaData: | 
| 181 |  |  | 
| 182 |  | print "writing StuntDoubles" | 
| 183 |  | outputFile.write("    <StuntDoubles>\n") | 
| 190 | – | whichSD = 0 | 
| 184 |  |  | 
| 185 |  | print repeatX, repeatY, repeatZ | 
| 186 |  |  | 
| 187 | < |  | 
| 188 | < | if (depthFirst) : | 
| 189 | < | whichSD = 0 | 
| 190 | < | for i in range(len(indices)): | 
| 191 | < | for ii in range(repeatX): | 
| 192 | < | for jj in range(repeatY): | 
| 193 | < | for kk in range(repeatZ): | 
| 194 | < |  | 
| 195 | < | myP = [] | 
| 196 | < | myP.append(p[i][0] + ii*Hmat[0][0] + jj*Hmat[1][0] + kk*Hmat[2][0]) | 
| 197 | < | myP.append(p[i][1] + ii*Hmat[0][1] + jj*Hmat[1][1] + kk*Hmat[2][1]) | 
| 198 | < | myP.append(p[i][2] + ii*Hmat[0][2] + jj*Hmat[1][2] + kk*Hmat[2][2]) | 
| 199 | < |  | 
| 207 | < | if (pvqj[i] == 'pv'): | 
| 208 | < | outputFile.write("%10d %7s %18.10g %18.10g %18.10g %14e %13e %13e\n" % (whichSD, pvqj[i], myP[0], myP[1], myP[2], v[i][0], v[i][1], v[i][2])) | 
| 209 | < | elif (pvqj[i] == 'pvqj'): | 
| 210 | < | 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])) | 
| 211 | < |  | 
| 212 | < | whichSD = whichSD + 1 | 
| 213 | < |  | 
| 214 | < | else: | 
| 215 | < | whichSD = 0 | 
| 216 | < | for ii in range(repeatX): | 
| 217 | < | for jj in range(repeatY): | 
| 218 | < | for kk in range(repeatZ): | 
| 219 | < | for i in range(len(indices)): | 
| 187 | > | deco = [ (index, i) for i, index in enumerate(indices) ] | 
| 188 | > | deco.sort() | 
| 189 | > | whichSD = 0 | 
| 190 | > | for ii in range(repeatX): | 
| 191 | > | for jj in range(repeatY): | 
| 192 | > | for kk in range(repeatZ): | 
| 193 | > | for index in range(len(deco)): | 
| 194 | > | (index,i) = deco[index] | 
| 195 | > | print i | 
| 196 | > | myP = [] | 
| 197 | > | myP.append(p[i][0] + ii*Hmat[0][0] + jj*Hmat[1][0] + kk*Hmat[2][0]) | 
| 198 | > | myP.append(p[i][1] + ii*Hmat[0][1] + jj*Hmat[1][1] + kk*Hmat[2][1]) | 
| 199 | > | myP.append(p[i][2] + ii*Hmat[0][2] + jj*Hmat[1][2] + kk*Hmat[2][2]) | 
| 200 |  |  | 
| 201 | < | myP = [] | 
| 202 | < | myP.append(p[i][0] + ii*Hmat[0][0] + jj*Hmat[1][0] + kk*Hmat[2][0]) | 
| 203 | < | myP.append(p[i][1] + ii*Hmat[0][1] + jj*Hmat[1][1] + kk*Hmat[2][1]) | 
| 204 | < | myP.append(p[i][2] + ii*Hmat[0][2] + jj*Hmat[1][2] + kk*Hmat[2][2]) | 
| 205 | < |  | 
| 226 | < | if (pvqj[i] == 'pv'): | 
| 227 | < | outputFile.write("%10d %7s %18.10g %18.10g %18.10g %14e %13e %13e\n" % (whichSD, pvqj[i], myP[0], myP[1], myP[2], v[i][0], v[i][1], v[i][2])) | 
| 228 | < | elif (pvqj[i] == 'pvqj'): | 
| 229 | < | 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])) | 
| 230 | < |  | 
| 231 | < | whichSD = whichSD + 1 | 
| 201 | > | if (pvqj[i] == 'pv'): | 
| 202 | > | outputFile.write("%10d %7s %18.10g %18.10g %18.10g %14e %13e %13e\n" % (whichSD, pvqj[i], myP[0], myP[1], myP[2], v[i][0], v[i][1], v[i][2])) | 
| 203 | > | elif (pvqj[i] == 'pvqj'): | 
| 204 | > | 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])) | 
| 205 | > | whichSD = whichSD + 1 | 
| 206 |  |  | 
| 233 | – |  | 
| 207 |  | outputFile.write("    </StuntDoubles>\n") | 
| 208 |  | outputFile.write("  </Snapshot>\n") | 
| 209 | < | outputFile.write("</OOPSE>\n") | 
| 209 | > | outputFile.write("</OpenMD>\n") | 
| 210 |  | outputFile.close() | 
| 211 |  |  | 
| 212 |  | def roundMe(x): | 
| 245 |  | L3[2] = L1[0]*L2[1] - L1[1]*L2[0] | 
| 246 |  | return L3 | 
| 247 |  |  | 
| 248 | < | def mapToBox(): | 
| 248 | > | def mapToBox(translateX, translateY, translateZ): | 
| 249 | > | print "translating by %f\t%f\t%f" % (translateX, translateY, translateZ) | 
| 250 |  | for i in range(len(indices)): | 
| 251 | < | dpos = p[i] | 
| 251 | > | dpos = [] | 
| 252 | > | dpos.append(p[i][0] + translateX) | 
| 253 | > | dpos.append(p[i][1] + translateY) | 
| 254 | > | dpos.append(p[i][2] + translateZ) | 
| 255 |  | p[i] = wrapVector(dpos) | 
| 256 |  |  | 
| 280 | – |  | 
| 257 |  | def main(argv): | 
| 258 | < | depthFirst = 0 | 
| 258 | > | repeatX = 1 | 
| 259 | > | repeatY = 1 | 
| 260 | > | repeatZ = 1 | 
| 261 | > | translateX = 0.0 | 
| 262 | > | translateY = 0.0 | 
| 263 | > | translateZ = 0.0 | 
| 264 | > | _haveMDFileName = 0 | 
| 265 | > | _haveOutputFileName = 0 | 
| 266 |  | try: | 
| 267 | < | opts, args = getopt.getopt(argv, "hm:o:x:y:z:d", ["help", "meta-data=", "output-file=", "repeatX=", "repeatY=", "repeatZ=","depthFirst"]) | 
| 267 | > | opts, args = getopt.getopt(argv, "hm:o:x:y:z:t:u:v:", ["help", "meta-data=", "output-file=", "repeatX=", "repeatY=", "repeatZ=","translateX=","translateY=","translateZ="]) | 
| 268 |  | except getopt.GetoptError: | 
| 269 |  | usage() | 
| 270 |  | sys.exit(2) | 
| 274 |  | sys.exit() | 
| 275 |  | elif opt in ("-m", "--meta-data"): | 
| 276 |  | mdFileName = arg | 
| 294 | – | global _haveMDFileName | 
| 277 |  | _haveMDFileName = 1 | 
| 278 |  | elif opt in ("-o", "--output-file"): | 
| 279 |  | outputFileName = arg | 
| 298 | – | global _haveOutputFileName | 
| 280 |  | _haveOutputFileName = 1 | 
| 281 |  | elif opt in ("-x", "--repeatX"): | 
| 301 | – | global repeatX | 
| 282 |  | repeatX = int(arg) | 
| 283 |  | elif opt in ("-y", "--repeatY"): | 
| 304 | – | global repeatY | 
| 284 |  | repeatY = int(arg) | 
| 285 |  | elif opt in ("-z", "--repeatZ"): | 
| 307 | – | global repeatZ | 
| 286 |  | repeatZ = int(arg) | 
| 287 | < | elif opt in ("-d", "--depthFirst"): | 
| 288 | < | depthFirst = 1 | 
| 287 | > | elif opt in ("-t", "--translateX"): | 
| 288 | > | translateX = float(arg) | 
| 289 | > | elif opt in ("-u", "--translateY"): | 
| 290 | > | translateY = float(arg) | 
| 291 | > | elif opt in ("-v", "--translateZ"): | 
| 292 | > | translateZ = float(arg) | 
| 293 |  | if (_haveMDFileName != 1): | 
| 294 |  | usage() | 
| 295 |  | print "No meta-data file was specified" | 
| 300 |  | sys.exit() | 
| 301 |  |  | 
| 302 |  | readFile(mdFileName) | 
| 303 | < | mapToBox() | 
| 304 | < | writeFile(outputFileName, depthFirst) | 
| 303 | > | mapToBox(translateX, translateY, translateZ) | 
| 304 | > | writeFile(outputFileName, repeatX, repeatY, repeatZ) | 
| 305 |  |  | 
| 306 |  | if __name__ == "__main__": | 
| 307 |  | if len(sys.argv) == 1: |