lammps/tools/eff/h2.vmd

216 lines
4.3 KiB
Plaintext

# module radii.vmd
# December, 2009 -(c)- Andres Jaramillo-Botero
# Script to load variable changing radii onto a pEFF lammpstrj file
# radii.vmd --
# Script to read and change electron radii in vmd dynamics traj
#
# openFile --
# Open the file and start looking for data
#
# Arguments:
# filename Name of the file to read
#
# Result:
# infile Handle to the opened file
#
# Side effects:
# A file in question is opened. Lines containing a * or# as
# the first non-blank character are considered comments. The
# first line without this is considered to be a line with the
# names of the columns.
#
proc openFile {filename} {
set infile [open $filename "r"]
return $infile
}
# readNames --
# Read the names of the columns
#
# Arguments:
# infile Handle to the file
#
# Result:
# names List of names, the number indicates the number of
# the snapshot frame
#
proc readNames {infile} {
#
# Skip the header - if any
#
set pos 0
while { [gets $infile line] >= 0 } {
if { [regexp {[ \t]*[*#]} $line] } {
incr pos
} else {
break
}
}
seek $infile 0 start
while { $pos > 0 } {
gets $infile line
incr pos -1
}
#
# Read the line with the column names
#
gets $infile line
# Force the line to be interpreted as a list
set nocols [llength $line]
return $line
}
# readData --
# Read the data per line
#
# Arguments:
# infile Handle to the file
#
# Result:
# values List of values, representing each column.
# A list of length zero indicates the end of file
#
proc readData {infile} {
while { [gets $infile values] == 0 } { ;# Just go on - skip empty lines }
set nocols [llength $values]
return $values
}
# readFile --
# Read the file and store the data in a (global) array
#
# Arguments:
# filename Name of the file
#
# Result:
# None
#
# Side effects:
# Filled array, ready for display
#
proc readFile {filename} {
global data_array
set infile [openFile $filename]
set data_array(names) [readNames $infile]
set i 0
foreach name $data_array(names) {
set data_array($i) {}
incr i
}
while 1 {
set values [readData $infile]
if { [llength $values] > 0 } {
set i 0
foreach value $values {
lappend data_array($i) $value
incr i
}
} else {
break
}
}
}
# makeXYData --
# Make a list useable by frame-electron
#
# Arguments:
# xindex Index of frame data
# yindex Index of electron data
#
# Result:
# None
#
# Side effects:
# A dataset for changing the electron radii, per trajectory frame
#
proc makeXYData {xindex yindex} {
global data_array
set xydata {}
foreach x $data_array($xindex) y $data_array($yindex) {
lappend xydata $x $y
}
return $xydata
}
proc returnXYPair {x y} {
global data_array
return [list $data_array($x) $data_array($y)]
}
# do_radii --
# Changes the radii of electrons per trajectory frame
#
# Arguments:
# xindex Index of frame data
# yindex Index of electron data
#
# Result:
# prints the frame:atomID:radius
#
proc do_radii {args} {
global molid data_array
#set n [molinfo $molid get numatoms]
set f [molinfo $molid get frame]
set fr [expr {$f+1}]
foreach elec $data_array(0) r $data_array($fr) {
set s [atomselect $molid "index [expr {$elec -1}]"]
#set nr [expr {exp($r)}]
set nr $r
$s set radius $nr
$s delete
#puts stderr "$fr $elec $nr"
}
}
# main --
# Main control flow
#
# Check input arguments
#for {set i 0} {$i<[llength $argv]} {incr i}
# puts " - $i: [lindex $argv $i]"
global data_array molid
# Set input files manually
set xyz h2.xyz
set data h2.out
# switch default rep to VDW.
mol default style VDW
# load nuclear and electron xyz trajectory
#set xyz [lindex $::argv 0]
# load electron radii information for trajectory
#set datafile [lindex $::argv 1]
set molid [mol new $xyz waitfor all]
mol modstyle 0 [molinfo top] VDW 1.0 32.0
puts "Starting ..."
readFile $data
puts "Read datafile and created array of radii ..."
puts "Visualize trajectory"
trace variable vmd_frame($molid) w do_radii
animate goto start
do_radii