Source code for dockerasmus.score.components.screened_coulomb
# coding: utf-8
from __future__ import absolute_import
from __future__ import unicode_literals
from .base import BaseComponent
[docs]class ScreenedCoulomb(BaseComponent):
"""A scoring component modeling screened electrostatic forces.
Reference:
`Mehler, E. L., and G. Eichele.
“Electrostatic Effects in Water-Accessible Regions of Proteins.”
Biochemistry 23, no. 17 (August 1, 1984): 3887–91.
doi:10.1021/bi00312a015. <http://dx.doi.org/10.1021/bi00312a015>`_
"""
backends = ["theano", "numpy"]
def _setup_theano(self, theano):
### Dielectric constant
diel = theano.tensor.dscalar('diel')
### Screening parameters
A, k, l = theano.tensor.dscalars('A', 'k', 'l')
B = diel - A
### Charge matrix from protein vectors
v_q1, v_q2 = theano.tensor.dvectors('v_q1', 'v_q2')
mx_q = theano.tensor.outer(v_q1, v_q2)
### Atomwise distance matrix
mx_distance = theano.tensor.dmatrix('mx_distance')
### Effective dielectric permittivity
mx_perm = A + B / (1 + k * theano.tensor.exp(-l * B * mx_distance))
### Final function
self._call = theano.function(
[v_q1, v_q2, mx_distance, diel, A, k, l],
theano.tensor.sum(theano.tensor.triu(
mx_q/(mx_perm*mx_distance)
))
)
def _setup_numpy(self, numpy):
def call(v_q1, v_q2, mx_distance, diel, A, k, l):
B = diel - A
mx_perm = A + B / (1 + k * numpy.exp(-l * B * mx_distance))
mx_q = numpy.outer(v_q1, v_q2)
return numpy.sum(numpy.triu(mx_q/(mx_perm*mx_distance), 1))
self._call = call
def __call__(self, charge, distance, diel=65.0, A=-8.5525, k=7.7839, l=0.003627):
return self._call(
charge[0], charge[1], distance, diel, A, k, l,
)