#VMD --- start of VMD description block #Name: # Metal Environment #Synopsis: # Finds the propensity of residues near given ions #Version: # 1.0 #Uses VMD version: # 1.7 or later #Ease of use: # 4 #Procedures: #
# vmd> analyze_ion_propensity {1trz 1lnd 1ezm} ZN # ALA :**** # ARG :*** # ASN :**** # ASP :*** # CYS :** # GLN : # GLU :****** # GLY : # HIS :*********** # ILE : # LEU :* # LYS :** # MET : # PHE :* # PRO : # SER :**** # THR : # TRP : # TYR :*** # VAL :**** ##Comments: # Assumes the ions can be determined by name and lack of bonds. # The output only works for standard residues within 7A of Zn. # This script must be modified to be of more general use. #Files: # metal_environment.vmd #See also: # The VMD User's manual #Author: # Andrew Dalke <dalke@ks.uiuc.edu> #\VMD --- end of block # adds the given (floating point) value to the value # if the value doesn't exist, sets it to 0 # This procedure is used because "incr" fails if the variable doesn't exist proc myincr {var val} { regexp {^[^(]*} $var prefix global $prefix if {![info exists $var]} { set $var 0 } set $var [eval "expr \$$var + $val"] } # given the atom index, find the ions within the given distance # return proc find_nearby_residues {index ion distance} { set nearby [atomselect top "(within $distance of index $index) \ and not index $index"] # I need to count each residue once, but I need to distinguish # two successive residues, so using just the residue name is not # enough. "resname residue" is unique and, since atoms on the # same residue have successive indicies, the luniq gets just one # of them. foreach res_pair [lsort -unique [$nearby get {resname residue}]] { lassign $res_pair resname myincr count($ion,$distance,$resname) 1 } } proc analyze_ion_propensity {pdblist metals} { global count # get each of the entries from the list of PDB files foreach entry $pdblist { # load them from the PDB ftp site mol pdbload $entry # go through the search list of metal names foreach ion $metals { set sel [atomselect top "name $ion and numbonds == 0"] foreach atom [$sel list] { # find neighbors for each of the test ranges find_nearby_residues $atom $ion 3 find_nearby_residues $atom $ion 5 find_nearby_residues $atom $ion 7 } # save memory space by forcing the deletion of the # temporary selection. (Otherwise they wouldn't be purged # until the end of the procedure.) $sel delete } mol delete top } # the array ``count'' contains the data in the form # (ion name,distance,residue name) # For now just print the values for the normal residues within # 7A of a Zn. Use a histogram of '*' set resnames {ALA ARG ASN ASP CYS GLN GLU GLY HIS ILE LEU LYS MET \ PHE PRO SER THR TRP TYR VAL} foreach resname $resnames { puts -nonewline "$resname :" myincr count(ZN,7,$resname) 0 for {set strcnt 0} {$strcnt < $count(ZN,7,$resname)} {incr strcnt 1} { puts -nonewline "*"; } puts ""; } }