QM/MM documentation in user guide
[namd.git] / lib / qmmm / orcaviewer.tcl
1 package provide orcaviewer 1.0
2 package require tablelist
3
4 proc enabletrace {} {
5   global vmd_frame;
6   trace variable vmd_frame([molinfo top]) w updateFrame
7 }
8
9 proc disabletrace {} {
10   global vmd_frame;
11   trace vdelete vmd_frame([molinfo top]) w updateFrame
12 }
13
14
15 namespace eval OrcaViewer:: {
16   namespace export orcaviewer
17
18   variable w                                          ;# handle to main window
19   variable orcaFile   ""                  ;# output file
20   variable fileLoaded 0
21   variable orcaMol ""
22   variable orbitals {}
23   variable orbitalsInTable 0
24   variable lowestOrbitalIndex 0
25   variable reps {}
26   variable orbSpan 10
27 }
28
29 #
30 # Create the window
31 #
32 proc OrcaViewer::orcaviewer {} {
33   variable w
34   variable orcaFile
35   variable fileLoaded
36   variable ::OrcaViewer::orbSpan
37
38   # If already initialized, just turn on
39   if { [winfo exists .orcaviewer] } {
40     wm deiconify $w
41     return
42   }
43
44   set w [toplevel ".orcaviewer"]
45   wm title $w "OrcaViewer"
46   wm resizable $w 0 0
47
48   frame $w.menubar -relief raised -bd 2 ;# frame for menubar
49   pack $w.menubar -padx 1 -fill x
50
51   menubutton $w.menubar.help -text Help -underline 0 -menu $w.menubar.help.menu
52   menubutton $w.menubar.file -text File -underline 0 -menu $w.menubar.file.menu
53
54   ## help menu
55   # menu $w.menubar.help.menu -tearoff no
56   # $w.menubar.help.menu add command -label "Help..." -command "vmd_open_url [string trimright [vmdinfo www] /]/plugins/textview"
57   # XXX - set menubutton width to avoid truncation in OS X
58   # $w.menubar.help config -width 5
59
60   menu $w.menubar.file.menu -tearoff no
61   $w.menubar.file.menu add command -label "Load" -command  OrcaViewer::loadFile
62   $w.menubar.file.menu add command -label "Clean" -command OrcaViewer::cleanUp
63   # $w.menubar.file.menu add command -label "Save" -command  TextView::savefile
64   # $w.menubar.file.menu add command -label "Save As" -command  TextView::saveasfile
65   $w.menubar.file config -width 5
66   pack $w.menubar.file -side left
67   pack $w.menubar.help -side right
68
69
70   ##
71   ## main window area
72   ##
73   wm resizable $w 1 1
74   wm geometry $w 500x200
75   # frame $w.main
76   scrollbar $w.scr -orient vertical -command [list $w.main  yview]
77   tablelist::tablelist $w.main -columns {0 "Orb. Number" 0 "Descr." 0 "Energy"} -stretch all -background white \
78     -selectmode extended \
79     -exportselection true \
80     -state normal -selectmode extended \
81     -labelrelief groove \
82     -labelbd 1 \
83     -yscrollcommand [list $w.scr set] \
84     -editstartcommand OrcaViewer::startOrbitalClick -editendcommand OrcaViewer::updateOrbitals
85
86     bind $w.main <<TablelistSelect>> {
87         set col [tablelist::getTablelistColumn %W]
88         set row [%W curselection]
89         puts $row
90         OrcaViewer::updateOrbitals $row $col
91     }
92   pack $w.main -fill both -expand 1 -side top
93   #$w.main insert end [list "first row" "another value"]
94   #$w.main insert end [list "another row" "bla bla"]
95
96   # label $w.txt.label -width 80 -relief sunken -bg White -textvariable TextView::textfile
97   # text $w.txt.text -bg White -bd 2 -yscrollcommand "$::TextView::w.txt.vscr set"
98   # scrollbar $w.txt.vscr -command "$::TextView::w.txt.text yview"
99   # pack $w.txt.label
100   # pack $w.txt.text $w.txt.vscr -side left -fill y
101   pack $w.menubar $w.main -side top -expand 1
102   entry $w.span -textvariable ::OrcaViewer::orbSpan -width 10
103   bind $w.span <Return> { OrcaViewer::fillOrblist }
104   label $w.spanLabel -text "Orbitals around HOMO: "
105   pack $w.main $w.span -expand 1 -side bottom
106   pack $w.spanLabel $w.span -expand 1 -side right
107 }
108
109 proc OrcaViewer::updateOrbitals {row col} \
110 {
111   variable orbitals
112   variable orcaMol
113   variable lowestOrbitalIndex
114   variable reps
115   set orb [expr $row+$lowestOrbitalIndex+1]
116
117   if {[llength $orbitals] && ![llength $reps]} {
118     #puts "update orbital $row"
119     puts [lindex $orbitals [expr $row]]
120     mol color ColorID 0
121     mol representation Orbital 0.050000 $orb 0 0 0.125 1 0 0 0 1
122     mol selection all
123     mol material Glossy
124     mol addrep $orcaMol
125     mol color ColorID 3
126     mol representation Orbital -0.050000 $orb 0 0 0.125 1 0 0 0 1
127     mol addrep $orcaMol
128     set nr [molinfo $orcaMol get numreps]
129     set reps [list [mol repname $orcaMol [expr $nr - 1]] [mol repname $orcaMol [expr $nr - 2]]]
130   } elseif {[llength $orbitals] && [llength $reps]} {
131     set idx1 [mol repindex $orcaMol [lindex $reps 0]]
132     set idx2 [mol repindex $orcaMol [lindex $reps 1]]
133     mol modstyle $idx1 $orcaMol Orbital 0.050000 $orb 0 0 0.125 1 0 0 0 1
134     mol modstyle $idx2 $orcaMol Orbital -0.050000 $orb 0 0 0.125 1 0 0 0 1
135   }
136
137 }
138
139 proc OrcaViewer::getOrbitalDescr {index hindex} \
140 {
141   set diff [expr $hindex-$index]
142   if {$diff == 0} {
143       return "HOMO"
144   } elseif {$diff > 0} {
145       return "HOMO-$diff"
146   } elseif {$diff < 0} {
147     if {$diff == -1} {
148       return "LUMO"
149     } else {
150       return "LUMO+[expr -$diff-1]"
151     }
152   }
153
154 }
155
156 proc OrcaViewer::assignPCtoUserField { method } {
157   variable orcaMol
158   set nf [molinfo $orcaMol get numframes]
159   set sel [atomselect $orcaMol all]
160   for {set i 0} {$i < $nf} {incr i} {
161     $sel frame $i
162     animate goto $i
163     set qmcharges [molinfo $orcaMol get qmcharges]
164     foreach var $qmcharges {
165       if {[lindex $var 0 0] == $method} {
166         $sel set user [lindex $var 0 1]
167         break
168       }
169     }
170   }
171   $sel delete
172 }
173
174 proc updateFrame { name element op } {
175   OrcaViewer::fillOrblist
176 }
177
178 proc OrcaViewer::fillOrblist { } \
179 {
180   variable w
181   variable orcaMol
182   variable orbitals
183   variable orbitalsInTable
184   variable lowestOrbitalIndex
185   variable ::OrcaViewer::orbSpan
186   global vmd_frame
187
188   #puts $orbitalsInTable
189   $w.main delete 0 $orbitalsInTable
190   set orbitals {}
191
192   set energies [lindex [molinfo $orcaMol get orbenergies] 0 0]
193   set norbs [llength $energies]
194   #puts "norbs: $norbs"
195   set homo [molinfo $orcaMol get homo]
196
197   set orbitalsInTable 0
198   set lowestOrbitalIndex [expr $homo - $::OrcaViewer::orbSpan]
199   if {$lowestOrbitalIndex < 0} {
200     set lowestOrbitalIndex 0
201   }
202   set limit [expr $homo + $::OrcaViewer::orbSpan]
203   if {$limit > $norbs} {
204     set limit [expr $norbs - 1]
205   }
206   for {set i $lowestOrbitalIndex} {$i <= $limit} {incr i} {
207     lappend orbitals [list $i [OrcaViewer::getOrbitalDescr $i $homo] [lindex $energies $i]]
208     incr orbitalsInTable
209   }
210
211   foreach orbital $orbitals {
212     $w.main insert end $orbital
213   }
214
215 }
216
217
218 proc OrcaViewer::loadFile { } {
219   variable w
220   variable orcaFile
221   variable fileLoaded
222   variable orcaMol
223
224   set file_types {
225     {"All Files" * }
226   }
227
228   set orcaFile [tk_getOpenFile -filetypes $file_types \
229                 -initialdir pwd \
230                 -defaultextension .txt]
231
232   set rc [ catch { set fd [open $orcaFile "r"] } ]
233   if { $rc == 1} {
234     return
235   }
236
237   set fileLoaded 1
238   puts $orcaFile
239   puts $fileLoaded
240
241   set orcaMol [mol load orca $orcaFile]
242   puts $orcaMol
243   #OrcaViewer::fillOrblist
244
245   enabletrace
246   OrcaViewer::assignPCtoUserField "Mulliken"
247   color scale method BWR
248   animate goto 0
249
250   close $fd
251 }
252
253 proc OrcaViewer::cleanUp { } \
254 {
255   variable w
256   variable orcaFile
257   variable fileLoaded
258   variable orcaMol
259   variable orbitalsInTable
260   variable reps
261   variable orbitals
262   variable lowestOrbitalIndex
263
264   mol delete $orcaMol
265   $w.main delete 0 $orbitalsInTable
266   set fileLoaded 0
267   set orcaMol ""
268   set orcaFile ""
269   set reps {}
270   set orbitals {}
271   set orbitalsInTable 0
272   set lowestOrbitalIndex 0
273 }
274
275 proc orcaviewer_tk {} {
276   OrcaViewer::orcaviewer
277   return $OrcaViewer::w
278 }
279
280 vmd_install_extension orcaviewer orcaviewer_tk "Visualization/Orca"
281 orcaviewer_tk
282 enabletrace