File: uff.py

package info (click to toggle)
viewmol 2.4.1-13
  • links: PTS
  • area: main
  • in suites: lenny
  • size: 7,212 kB
  • ctags: 2,054
  • sloc: ansic: 30,727; python: 1,849; sh: 921; awk: 433; makefile: 205
file content (133 lines) | stat: -rw-r--r-- 4,790 bytes parent folder | download | duplicates (8)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#!/usr/bin/python
#*******************************************************************************
#                                                                              *
#                                   Viewmol                                    *
#                                                                              *
#                                 U F F . P Y                                  *
#                                                                              *
#                 Copyright (c) Joerg-R. Hill, October 2003                    *
#                                                                              *
#*******************************************************************************
#
# $Id: uff.py,v 1.1 2003/11/07 13:20:17 jrh Exp $
# $Log: uff.py,v $
# Revision 1.1  2003/11/07 13:20:17  jrh
# Initial revision
#
#
import os
import string
import viewmol
import molecule
import atom
import label

class uff:
  def writeFiles(self, dir, mol):
    self.writeCoordinateFile(dir, mol)
    self.writeTopologyFile(dir, mol)
    self.writeControlFile(dir)

  def writeCoordinateFile(self, dir, mol):
    coordFile=open(dir+"/coord", "w")
    coordFile.write("$coord\n")
    for i in mol.getAtoms():
      coords=i.coordinates()
      name=i.getElement().getSymbol()
      line="%22.14f%22.14f%22.14f %s\n" % (coords[0]/0.52917706, coords[1]/0.52917706, coords[2]/0.52917706, name)
      coordFile.write(line)
    coordFile.write("$end\n")
    coordFile.close()

  def writeTopologyFile(self, dir, mol):
    # Build connectivity from bonds
    connectivity={}
    for i in mol.getBonds():
      if not connectivity.has_key(i[0]):
        connectivity[i[0]]=[]
      connectivity[i[0]].append(i[1])
      if not connectivity.has_key(i[1]):
        connectivity[i[1]]=[]
      connectivity[i[1]].append(i[0])
    # Write topology file
    topologyFile=open(dir+"/ufftopology", "w")
    topologyFile.write("$ufftopology\nnxtnei12\n")
    # Only the nxtnei12 data group is necessary, Turbomole's
    # UFF module can determine the other ones automatically
    for i in connectivity.keys():
      self.writeList(topologyFile, i, connectivity[i])

  def writeList(self, topologyFile, which, list):
    line=" %5d %5d\n" % (which+1, len(list))
    topologyFile.write(line)
    line="     "
    for i in list:
      word=" %5d" % (i+1)
      line=line + word
    line=line + "\n"
    topologyFile.write(line)

  def writeControlFile(self, dir):
    controlFile=open(dir+"/control", "w")
    controlFile.write("$title\n")
    controlFile.write("Test\n")
    controlFile.write("$operating system unix\n")
    controlFile.write("$symmetry c1\n")
    controlFile.write("$coord file=coord\n")
    controlFile.write("$uff\n")
    controlFile.write("       500         1          1 ! maxcycle,modus,nqeq\n")
    controlFile.write("    111111                      ! iterm\n")
    controlFile.write("  0.10D-07  0.10D-04            ! econv,gconv\n")
    controlFile.write("      0.00  1.10                ! qtot,dfac\n")
    controlFile.write("  0.10D+03  0.10D-04       0.30 ! epssteep,epssearch,dqmax\n")
    controlFile.write("        25      0.10       0.00 ! mxls,dhls,ahls\n")
    controlFile.write("      1.00      0.00       0.00 ! alpha,beta,gamma\n")
    controlFile.write("         F         F          F ! transform,lnumhess,lmd\n")
    controlFile.write("$ufftopology file=ufftopology\n")
    controlFile.write("$end\n")
    controlFile.close()

  def runUFF(self, dir):
    size=viewmol.getWindowSize()
    energy=label.label()
    energy.translate(20, size[1]-20, 0)
    energy.text("UFF energy")
    for line in os.popen("cd "+dir+"; uff").readlines():
      if line[0:10] == "UFF energy":
        energy.text(line)
    os.remove(dir+"/control")
    os.remove(dir+"/ufftopology")
    os.remove(dir+"/uffgradient")
    os.remove(dir+"/uffgradx")
    try:
      os.remove(dir+"/uffconverged")
      os.remove(dir+"/uffhessian0-0")
    except OSError:
      viewmol.write("uff did not converge")
    energy.delete()

  def readResults(self, dir, mol):
    coordFile=open(dir+"/coord", "r")
    line=coordFile.readline()
    for i in mol.getAtoms():
      line=coordFile.readline()
      if line[0:4] != "$end":
        words=string.split(line)
        i.coordinates(float(words[0])*0.52917706, float(words[1])*0.52917706, float(words[2])*0.52917706)
    coordFile.close()
    os.remove(dir+"/coord")

  def run(self):
    dir="/tmp"
    for i in viewmol.getMolecules():
      self.writeFiles(dir, i)
      self.runUFF(dir)
      self.readResults(dir, i)

  def register(self, language):
    viewmol.registerMenuItem("UFF optimization")

#-------------------------
if __name__ == '__main__':
  optimization=uff()
  uff.run(optimization)