Skip to content

Commit effc2fd

Browse files
committed
lgscore
1 parent 1cdfa62 commit effc2fd

File tree

12 files changed

+2019
-0
lines changed

12 files changed

+2019
-0
lines changed

lightdock/scoring/lgscore/__init__.py

Whitespace-only changes.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+

lightdock/scoring/lgscore/data/amber.py

Lines changed: 1587 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import numpy as np
2+
3+
default_energy = 0.0
4+
5+
energies = {'ILE': {'C': 0.019177, 'CB': 0.019177, 'CA': 0.019177, 'O': -0.03128, 'N': -0.0391, 'CD1': 0.019177, 'CG1': 0.019177, 'CG2': 0.019177},
6+
'GLN': {'C': 0.019177, 'CB': 0.019177, 'CA': 0.019177, 'CG': 0.019177, 'O': -0.03128, 'CD': 0.019177, 'N': -0.0391, 'NE2': -0.0391, 'OE1': -0.03128},
7+
'GLY': {'C': 0.019177, 'CA': 0.019177, 'O': -0.03128, 'N': -0.0391,},
8+
'GLU': {'C': 0.019177, 'CB': 0.019177, 'CA': 0.019177, 'CG': 0.019177, 'O': -0.03128, 'CD': 0.019177, 'OE2': -0.06877, 'N': -0.0391, 'OE1': -0.06877},
9+
'CYS': {'C': 0.019177, 'CB': 0.019177, 'CA': 0.019177, 'O': -0.03128, 'N': -0.0391, 'SG': 0.02576},
10+
'CYX': {'C': 0.019177, 'CB': 0.019177, 'CA': 0.019177, 'O': -0.03128, 'N': -0.0391, 'SG': 0.00506},
11+
'ASP': {'C': 0.019177, 'CB': 0.019177, 'CA': 0.019177, 'CG': 0.019177, 'O': -0.03128, 'N': -0.0391, 'OD1': -0.06877, 'OD2': -0.06877},
12+
'SER': {'C': 0.019177, 'OG': -0.04255, 'CB': 0.019177, 'CA': 0.019177, 'O': -0.03128, 'N': -0.0391,},
13+
'LYS': {'C': 0.019177, 'CB': 0.019177, 'CA': 0.019177, 'CG': 0.019177, 'CE': 0.019177, 'CD': 0.019177, 'NZ': -0.12604, 'O': -0.03128, 'N': -0.0391},
14+
'PRO': {'C': 0.019177, 'CB': 0.019177, 'CA': 0.019177, 'CG': 0.019177, 'O': -0.03128, 'CD': 0.019177, 'N': -0.0391},
15+
'HIS': {'C': 0.019177, 'CE1': 0.110176, 'CB': 0.019177, 'CA': 0.019177, 'CG': 0.110176, 'O': -0.03128, 'N': -0.0391, 'CD2': 0.110176, 'ND1': -0.0391, 'NE2': -0.0391},
16+
'HID': {'C': 0.019177, 'CE1': 0.110176, 'CB': 0.019177, 'CA': 0.019177, 'CG': 0.110176, 'O': -0.03128, 'N': -0.0391, 'CD2': 0.110176, 'ND1': -0.06279, 'NE2': -0.0391},
17+
'HIE': {'C': 0.019177, 'CE1': 0.110176, 'CB': 0.019177, 'CA': 0.019177, 'CG': 0.110176, 'O': -0.03128, 'N': -0.0391, 'CD2': 0.110176, 'ND1': -0.0391, 'NE2': -0.06279},
18+
'ASN': {'C': 0.019177, 'CB': 0.019177, 'CA': 0.019177, 'CG': 0.019177, 'O': -0.03128, 'N': -0.0391, 'OD1': -0.03128, 'ND2': -0.0391},
19+
'VAL': {'C': 0.019177, 'CB': 0.019177, 'CA': 0.019177, 'O': -0.03128, 'N': -0.0391, 'CG1': 0.019177, 'CG2': 0.019177},
20+
'THR': {'C': 0.019177, 'CB': 0.019177, 'CA': 0.019177, 'OG1': -0.04255, 'O': -0.03128, 'N': -0.0391, 'CG2': 0.019177},
21+
'TRP': {'C': 0.019177, 'CZ2': 0.110176, 'CB': 0.019177, 'CA': 0.019177, 'CG': 0.110176, 'CH2': 0.110176, 'O': -0.03128, 'N': -0.0391, 'CE2': 0.110176, 'CE3': 0.110176, 'CD1': 0.110176, 'CD2': 0.110176, 'CZ3': 0.110176, 'NE1': -0.0391},
22+
'PHE': {'C': 0.019177, 'CE1': 0.110176, 'CB': 0.019177, 'CA': 0.019177, 'CG': 0.110176, 'O': -0.03128, 'N': -0.0391, 'CZ': 0.110176, 'CD1': 0.110176, 'CD2': 0.110176, 'CE2': 0.110176},
23+
'ALA': {'CB': 0.019177, 'CA': 0.019177, 'C': 0.019177, 'O': -0.03128, 'N': -0.0391},
24+
'MET': {'C': 0.019177, 'CB': 0.019177, 'CA': 0.019177, 'CG': 0.019177, 'CE': 0.019177, 'N': -0.0391, 'O': -0.03128, 'SD': 0.00506},
25+
'AHP': {'C': 0.019177, 'CB': 0.019177, 'CA': 0.019177, 'CG': 0.019177, 'CE': 0.019177, 'CD': 0.019177, 'CZ': 0.019177, 'O': -0.03128, 'N': -0.0391},
26+
'LEU': {'C': 0.019177, 'CB': 0.019177, 'CA': 0.019177, 'CG': 0.019177, 'O': -0.03128, 'N': -0.0391, 'CD1': 0.019177, 'CD2': 0.019177},
27+
'ARG': {'C': 0.019177, 'CB': 0.019177, 'CA': 0.019177, 'CG': 0.019177, 'NE': -0.0391, 'O': -0.03128, 'CD': 0.019177, 'CZ': 0.019177, 'NH1': -0.06279, 'NH2': -0.06279, 'N': -0.0391},
28+
'AHX': {'C': 0.019177, 'CB': 0.019177, 'CA': 0.019177, 'CG': 0.019177, 'CE': 0.019177, 'CD': 0.019177, 'O': -0.03128, 'N': -0.0391,},
29+
'TYR': {'C': 0.019177, 'CE1': 0.110176, 'OH': -0.04255, 'CB': 0.019177, 'CA': 0.019177, 'CG': 0.110176, 'O': -0.03128, 'N': -0.0391, 'CZ': 0.110176, 'CD1': 0.110176, 'CD2': 0.110176, 'CE2': 0.110176},
30+
'APE': {'C': 0.019177, 'CB': 0.019177, 'CA': 0.019177, 'CG': 0.019177, 'O': -0.03128, 'CD': 0.019177, 'N': -0.0391}}
31+
32+
33+
def get_solvation(protein):
34+
"""Get the solvation score for a given molecule"""
35+
energy_per_atom = []
36+
for atom in protein.atoms:
37+
if not atom.is_hydrogen():
38+
residue_name = atom.residue_name
39+
atom_name = atom.name
40+
41+
# Special cases
42+
if atom_name == "OXT":
43+
residue_name = "ASP"
44+
atom_name = "OD1"
45+
if residue_name == 'HSD':
46+
residue_name = 'HID'
47+
if residue_name == 'HSP':
48+
residue_name = 'HIP'
49+
if residue_name == 'HSE':
50+
residue_name = 'HIE'
51+
if residue_name == 'HID':
52+
residue_name = 'HIP'
53+
try:
54+
energy_per_atom.append(energies[residue_name][atom_name])
55+
except KeyError:
56+
energy_per_atom.append(default_energy)
57+
else:
58+
energy_per_atom.append(default_energy)
59+
60+
return np.array(energy_per_atom)

lightdock/scoring/lgscore/data/vdw.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
"""Van der Waals charges and parameters"""
2+
3+
vdw_energy = {'IP': 0.00277, 'HS': 0.0157, 'HP': 0.0157, 'Na': 0.00277, 'N*': 0.17, 'Li': 0.0183, 'HO': 0.0,
4+
'Rb': 0.00017, 'HC': 0.0157, 'HA': 0.015, 'O3': 0.21, 'CQ': 0.086, 'C*': 0.086, 'NA': 0.17, 'NB': 0.17,
5+
'NC': 0.17, 'O2': 0.21, 'I': 0.4, 'Br': 0.32, 'H': 0.0157, 'HW': 0.0, 'C0': 0.459789, 'K': 0.000328,
6+
'CK': 0.086, 'Cs': 8.06e-05, 'C': 0.086, 'Cl': 0.1, 'CN': 0.086, 'CM': 0.086, 'F': 0.061, 'CC': 0.086,
7+
'CB': 0.086, 'CA': 0.086, 'Zn': 0.0125, 'O': 0.21, 'N': 0.17, 'P': 0.2, 'S': 0.25, 'CR': 0.086,
8+
'N2': 0.17, 'N3': 0.17, 'CW': 0.086, 'CV': 0.086, 'CT': 0.1094, 'MG': 0.8947, 'OH': 0.2104, 'H2': 0.0157,
9+
'H3': 0.0157, 'H1': 0.0157, 'H4': 0.015, 'H5': 0.015, 'SH': 0.25, 'OW': 0.152, 'OS': 0.17}
10+
11+
vdw_radii = {'IP': 1.868, 'HS': 0.6, 'HP': 1.1, 'Na': 1.868, 'N*': 1.824, 'Li': 1.137, 'HO': 0.0001, 'Rb': 2.956,
12+
'HC': 1.487, 'HA': 1.459, 'O3': 1.6612, 'CQ': 1.908, 'C*': 1.908, 'NA': 1.824, 'NB': 1.824, 'NC': 1.824,
13+
'O2': 1.6612, 'I': 2.35, 'Br': 2.22, 'H': 0.6, 'HW': 0.0001, 'C0': 1.7131, 'K': 2.658, 'CK': 1.908,
14+
'Cs': 3.395, 'C': 1.908, 'Cl': 2.47, 'CN': 1.908, 'CM': 1.908, 'F': 1.75, 'CC': 1.908, 'CB': 1.908,
15+
'CA': 1.908, 'Zn': 1.1, 'O': 1.6612, 'N': 1.824, 'P': 2.1, 'S': 2.0, 'CR': 1.908, 'N2': 1.824, 'N3': 1.875,
16+
'CW': 1.908, 'CV': 1.908, 'CT': 1.908, 'MG': 0.7926, 'OH': 1.721, 'H2': 1.287, 'H3': 1.187, 'H1': 1.387,
17+
'H4': 1.409, 'H5': 1.359, 'SH': 2.0, 'OW': 1.7683, 'OS': 1.6837}

lightdock/scoring/lgscore/driver.py

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
"""Implementation of the lgscore scoring function.
2+
3+
C-implementation of the lgscore scoring function and using the freesasa library:
4+
https://github.com/mittinatten/freesasa
5+
"""
6+
7+
import numpy as np
8+
import freesasa
9+
from freesasa import Structure
10+
from lightdock.scoring.functions import ScoringFunction, ModelAdapter
11+
from lightdock.structure.model import DockingModel
12+
import lightdock.scoring.lgscore.energy.c.clgscore as clgscore
13+
import lightdock.scoring.lgscore.energy.parameters as parameters
14+
import lightdock.scoring.lgscore.data.amber as amber
15+
import lightdock.scoring.lgscore.data.vdw as vdw
16+
import lightdock.scoring.lgscore.data.solvation as solvation
17+
from lightdock.util.logger import LoggingManager
18+
19+
20+
log = LoggingManager.get_logger('lgscore')
21+
freesasa.setVerbosity(freesasa.silent)
22+
23+
24+
class LgScoreModel(DockingModel):
25+
"""Prepares the structure necessary for the C-implementation of the lgscore scoring function"""
26+
def __init__(self, objects, coordinates, restraints, charges,
27+
vdw_energy, vdw_radii, des_energy, sasa, desolvation, hydrogens,
28+
reference_points=None, n_modes=None):
29+
super(LgScoreModel, self).__init__(objects, coordinates, restraints, reference_points)
30+
self.charges = charges
31+
self.vdw_energy = vdw_energy
32+
self.vdw_radii = vdw_radii
33+
self.des_energy = des_energy
34+
self.sasa = sasa
35+
self.desolvation = desolvation
36+
self.hydrogens = hydrogens
37+
self.n_modes = n_modes
38+
39+
def clone(self):
40+
"""Creates a copy of the current model"""
41+
return LgScoreModel(self.objects, self.coordinates.copy(), self.restraints,
42+
self.charges, self.vdw_energy, self.vdw_radii,
43+
self.des_energy, self.sasa, self.desolvation, self.hydrogens,
44+
reference_points=self.reference_points.copy())
45+
46+
47+
class LgScoreAdapter(ModelAdapter):
48+
"""Adapts a given Complex to a DockingModel object suitable for this
49+
scoring function.
50+
"""
51+
def _get_docking_model(self, molecule, restraints):
52+
atoms = molecule.atoms
53+
parsed_restraints = {}
54+
# Assign properties to atoms
55+
for atom_index, atom in enumerate(atoms):
56+
res_id = "%s.%s.%s" % (atom.chain_id, atom.residue_name, str(atom.residue_number))
57+
if restraints and res_id in restraints:
58+
try:
59+
parsed_restraints[res_id].append(atom_index)
60+
except:
61+
parsed_restraints[res_id] = [atom_index]
62+
res_name = atom.residue_name
63+
atom_name = atom.name
64+
if res_name == "HIS":
65+
res_name = 'HID'
66+
if atom_name in amber.translate:
67+
atom_name = amber.translate[atom.name]
68+
atom_id = "%s-%s" % (res_name, atom_name)
69+
atom.amber_type = amber.amber_types[atom_id]
70+
atom.charge = amber.charges[atom_id]
71+
atom.mass = amber.masses[atom.amber_type]
72+
atom.vdw_energy = vdw.vdw_energy[atom.amber_type]
73+
atom.vdw_radius = vdw.vdw_radii[atom.amber_type]
74+
75+
# Prepare common model information
76+
elec_charges = np.array([atom.charge for atom in atoms])
77+
vdw_energies = np.array([atom.vdw_energy for atom in atoms])
78+
vdw_radii = np.array([atom.vdw_radius for atom in atoms])
79+
coordinates = molecule.copy_coordinates()
80+
des_energy = solvation.get_solvation(molecule)
81+
82+
# Calculate desolvation reference energy
83+
log.info('Calculating reference SASA...')
84+
structure = Structure()
85+
for i, atom in enumerate(atoms):
86+
if not atom.is_hydrogen():
87+
structure.addAtom(atom.name, atom.residue_name, atom.residue_number, atom.chain_id,
88+
atom.x, atom.y, atom.z)
89+
sasa_result = freesasa.calc(structure)
90+
sasa = []
91+
j = 0
92+
for i, atom in enumerate(atoms):
93+
if not atom.is_hydrogen():
94+
sasa.append(sasa_result.atomArea(j))
95+
j += 1
96+
else:
97+
sasa.append(-1.0)
98+
sasa = np.array(sasa)
99+
hydrogens = np.array([0 if atom.is_hydrogen() else 1 for atom in atoms])
100+
log.info('Done.')
101+
102+
desolvation = np.sum(sasa * des_energy)
103+
104+
reference_points = ModelAdapter.load_reference_points(molecule)
105+
try:
106+
return LgScoreModel(atoms, coordinates, parsed_restraints, elec_charges, vdw_energies, vdw_radii, des_energy,
107+
sasa, desolvation, hydrogens, reference_points=reference_points, n_modes=molecule.n_modes.copy())
108+
except AttributeError:
109+
return LgScoreModel(atoms, coordinates, parsed_restraints, elec_charges, vdw_energies, vdw_radii, des_energy,
110+
sasa, desolvation, hydrogens, reference_points=reference_points)
111+
112+
113+
class LgScore(ScoringFunction):
114+
def __init__(self, weight=1.0):
115+
super(LgScore, self).__init__(weight)
116+
self.scoring_vdw_weight = parameters.scoring_vdw_weight
117+
118+
def __call__(self, receptor, receptor_coordinates, ligand, ligand_coordinates):
119+
"""Computes the lgscore scoring energy using receptor and ligand which are
120+
instances of DockingModel.
121+
"""
122+
elec, vdw, solv, interface_receptor, interface_ligand = clgscore.calculate_energy(receptor_coordinates, ligand_coordinates,
123+
receptor.charges, ligand.charges,
124+
receptor.vdw_energy, ligand.vdw_energy,
125+
receptor.vdw_radii, ligand.vdw_radii,
126+
receptor.hydrogens, ligand.hydrogens,
127+
receptor.sasa, ligand.sasa,
128+
receptor.des_energy, ligand.des_energy,
129+
3.9)
130+
solvation = solv - (receptor.desolvation + ligand.desolvation)
131+
energy = (elec + parameters.scoring_vdw_weight * vdw + solvation)*-1.
132+
perc_receptor_restraints = ScoringFunction.restraints_satisfied(receptor.restraints, set(interface_receptor))
133+
perc_ligand_restraints = ScoringFunction.restraints_satisfied(ligand.restraints, set(interface_ligand))
134+
return energy + perc_receptor_restraints * energy + perc_ligand_restraints * energy
135+
136+
137+
# Needed to dynamically load the scoring functions from command line
138+
DefinedScoringFunction = LgScore
139+
DefinedModelAdapter = LgScoreAdapter
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+

lightdock/scoring/lgscore/energy/c/__init__.py

Whitespace-only changes.

0 commit comments

Comments
 (0)