# finds a center of mass of the molecure (ubquitin), place a shpere of water
# around it.
# To run execute: vmd -dispdev text -e waterSphere.tcl
proc center_of_mass {selection} {
# some error checking
if {[$selection num] <= 0} {
error "center_of_mass: needs a selection with atoms"
}
# set the center of mass to 0
set com [veczero]
# set the total mass to 0
set mass 0
# [$selection get {x y z}] returns the coordinates {x y z}
# [$selection get {mass}] returns the masses
# so the following says "for each pair of {coordinates} and masses,
# do the computation ..."
foreach coord [$selection get {x y z}] m [$selection get mass] {
# sum of the masses
set mass [expr $mass + $m]
# sum up the product of mass and coordinate
set com [vecadd $com [vecscale $m $coord]]
}
# and scale by the inverse of the number of atoms
if {$mass == 0} {
error "center_of_mass: total mass is zero"
}
# The "1.0" can't be "1", since otherwise integer division is done
return [vecscale [expr 1.0/$mass] $com]
}
################################################################
# MAIN PART STARTS HERE
################################################################
set psf ubq.psf
set pdb ubq.pdb
set box ubq_box
set psfDrop ubq_ws.psf
set pdbDrop ubq_ws.pdb
package require psfgen
resetpsf
mol load psf $psf pdb $pdb
set sel [atomselect top all]
# find mass center
set center [center_of_mass $sel]
puts "center of mas is at $center"
foreach {xmass ymass zmass} $center { break }
set num0 9999
set Rmin 0.0
while {$num0 != 0} {
set Rmin [expr $Rmin +1.0]
set probSel [atomselect top "not (sqr(x-$xmass) + sqr(y-$ymass) +
sqr(z-$zmass) <= sqr($Rmin))"]
set num0 [$probSel num]
puts "$num0 $Rmin"
}
package require solvate
set xmin [expr $xmass -$Rmin]
set xmax [expr $xmass +$Rmin]
set ymin [expr $ymass -$Rmin]
set ymax [expr $ymass +$Rmin]
set zmin [expr $zmass -$Rmin]
set zmax [expr $zmass +$Rmin]
puts " $xmin $ymin $zmin $xmax $ymax $zmax"
#solvate $psf $pdb -o $box -minmax {{15.4399995804 12.8879995346
-0.365999996662} {46.125 45.2680015564 36.2509994507} }
set min "$xmin $ymin $zmin"
set max "$xmax $ymax $zmax"
set minmax [list $min $max]
solvate $psf $pdb -o $box -minmax $minmax
mol delete top
resetpsf
mol load psf ${box}.psf pdb ${box}.pdb
readpsf ${box}.psf
coordpdb ${box}.pdb
set selDel [atomselect top "not (sqr(x-$xmass) + sqr(y-$ymass) + sqr(z-$zmass)
<= sqr($Rmin))" ]
puts " not within [$selDel num]"
set testSel [atomselect top "not (sqr(x-$xmass) + sqr(y-$ymass) +
sqr(z-$zmass) <= sqr($Rmin)) and (not water)"]
puts " not within and not water [$testSel num]"
if { [$testSel num] != 0} {
puts "ERROR: there are [$testSel num] non water molecules outside the shell"
puts "EXIT"
exit
}
set delList [$selDel get {segid resid}]
set delList [lsort -unique $delList]
foreach record $delList {
foreach {segid resid} $record { break }
delatom $segid $resid
}
writepsf $psfDrop
writepdb $pdbDrop
# remove temprorary files generated by the script
file delete ${box}.psf ${box}.pdb combine.pdb combine.psf
puts "CENTER OF MASS IS AT: $center"
puts "SPHERE RADIUS: $Rmin"
exit