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
|
"""
Saltbridge extension
Find all salt bridges as determined by the cutoff distance below.
Uses PDB2PQR to determine atom identities and distances, and write
out all located salt bridges to stdout.
NOTE: A bond may be labeled BOTH hbond and salt-bridge if you use both
options in one pdb2pqr run. Look out for double counting.
NOTE: This extension currently does not support salt bridges with chain termini.
Author: Mike Bradley (heavily copied from Todd Dolinsky's hbond extension)
"""
__date__ = "25 August 2006"
__author__ = "Mike Bradley"
from src.utilities import distance
from src.routines import Cells
DIST_CUTOFF = 4.0 # maximum cation to anion atom distance in angstroms
def usage():
return 'Print a list of salt bridges to {output-path}.salt'
def run_extension(routines, outroot, options):
"""
Print a list of salt bridges.
Parameters
routines: A link to the routines object
outroot: The root of the output name
options: options object
"""
outname = outroot + ".salt"
outfile = open(outname, "w")
routines.write("Printing salt bridge list...\n")
# Define the potential salt bridge atoms here (the current lists are for the AMBER
# forcefield and are not necessarily exhaustive).
posresList = ["LYS","ARG","HIP"]
negresList = ["GLU","ASP","CYM"]
posatomList = ["NE","NH1","NH2","NZ","ND1","NE2",]
negatomList = ["SG","OE1","OE2","OD1","OD2"]
# Initialize - set nearby cells
# The cell size adds one for the salt bridge distance, and rounds up
cellsize = int(DIST_CUTOFF + 1.0 + 1.0)
protein = routines.protein
routines.cells = Cells(cellsize)
routines.cells.assignCells(protein)
# Loop over all the atoms
for cation in protein.getAtoms():
# check that we've found a cation
if cation.residue.name == "NMET":
print("YES NMET")
if cation.residue.name not in posresList:
continue
elif cation.name not in posatomList:
continue
# For each cation, grab all potential anions in nearby cells
closeatoms = routines.cells.getNearCells(cation)
for anion in closeatoms:
if cation.residue.name == anion.residue.name:
continue
if anion.residue.name not in negresList:
continue
elif anion.name not in negatomList:
continue
# Do distance check
dist = distance(cation.getCoords(), anion.getCoords())
if dist > DIST_CUTOFF:
continue
#routines.write("Cation: %s %s\tAnion: %s %s\tsaltdist: %.2f\n" % \
# (cation.residue, cation.name, anion.residue, anion.name, dist))
outfile.write("Cation: %s %s\tAnion: %s %s\tsaltdist: %.2f\n" % \
(cation.residue, cation.name, anion.residue, anion.name, dist))
#routines.write("\n")
outfile.close()
|