Compare commits

...

6 Commits

4 changed files with 89 additions and 24 deletions

View File

@ -1,23 +1,25 @@
import numpy as np
# Ideal geometry. Angstroms for lengths, degrees for angles. # Ideal geometry. Angstroms for lengths, degrees for angles. Engh & Huber parameters
GEO = { GEO = {
'N_CA_len': 1.46, 'N_CA_length': 1.46,
'CA_C_len': 1.51, 'CA_C_length': 1.51,
'C_N_len': 1.33, 'C_N_length': 1.33,
'N_H_len': 1.01, 'N_H_length': 1.01,
'C_O_length': 1.23,
'N_CA_C_angle': 111.0, 'N_CA_C_angle': 111.0,
'CA_C_N_angle': 116.0, 'CA_C_N_angle': 116.0,
'C_N_CA_angle': 122.0, 'C_N_CA_angle': 122.0,
'C_N_H_angle': 119.0, 'C_N_H_angle': 119.0,
'CA_C_O_angle': 121.0,
} }
# First residue backbone hardcoded. From 6G4A MET1 # First residue backbone hardcoded. From 6G4A MET1
ORI = { ORI = {
'N': [ -17.396, -12.153, -13.987 ], 'N': np.array([ -17.396, -12.153, -13.987 ]),
'CA': [ -16.295, -12.486, -13.259 ], 'CA': np.array([ -16.295, -12.486, -13.259 ]),
'C': [ -16.534, -10.993, -13.428 ], 'C': np.array([ -16.534, -10.993, -13.428 ]),
'O': [ -16.891, -10.572, -14.520 ], 'O': np.array([ -16.891, -10.572, -14.520 ]),
} }
if __name__ == "__main__": if __name__ == "__main__":

View File

@ -0,0 +1,8 @@
GEO = {
'CA_CB_length': 1.53,
'N_CA_CB_angle': 109.5,
'C_CA_CB_angle': 109.5,
'L_torsion': 122.55
}

View File

@ -29,12 +29,15 @@ class Residue():
self.name = name self.name = name
self.backbone = { self.backbone = {
atoms: { "N": None, "CA": None, "C": None, "O": None }, "atoms": { "N": None, "CA": None, "C": None, "O": None },
phi: None, "phi": None,
psi: None "psi": None
} }
self.sidechain = { self.sidechain = {
atoms: {}, "atoms": {},
chis: [] "chis": []
} }
def summary(self):
return f"ResidueName: {self.name.value}"

View File

@ -1,17 +1,69 @@
from backbone.ramachandran import RamachandranSampler from backbone.ramachandran import RamachandranSampler
from rotamers.dunbrack import DunbrackRotamerLibrary from rotamers.dunbrack import DunbrackRotamerLibrary
from geometry.backbone import GEO as BACKBONE_GEO, ORI
from geometry.sidechain import GEO as SIDECHAIN_GEO
from geometry.nerf import nerf
from protein.residue import ResidueName, Residue
rs = RamachandranSampler() rs = RamachandranSampler()
rl = DunbrackRotamerLibrary() rl = DunbrackRotamerLibrary()
res_name = "PHE" ghost_residue = Residue(ResidueName.GLY)
backbone_atoms = ["N", "CA", "C", "O"]
for atom in backbone_atoms:
ghost_residue.backbone["atoms"][atom] = ORI[atom]
print(f"Backbone torsion angles for {res_name}:") primary_sequence = ["PHE", "SER", "THR"]
phi, psi = rs.sample(res_name)
print(f"phi: {phi}, psi: {psi}")
print(" ")
print(f"Sidechain rotamers for {res_name} (top 5):") residues = [ ghost_residue ]
for rotamer in rl.rotamer_params(res_name, 100, 100)[:5]:
print(rotamer.p, rotamer.chis) # First 2 residues of the sequence
print(" ") for residue_index, residue_name in enumerate(primary_sequence[:2]):
residue = Residue(ResidueName(residue_name))
residue.backbone["phi"], residue.backbone["psi"] = rs.sample(residue.name.value)
residue.backbone["atoms"]["N"] = nerf(
residues[residue_index].backbone["atoms"]["N"],
residues[residue_index].backbone["atoms"]["CA"],
residues[residue_index].backbone["atoms"]["C"],
BACKBONE_GEO["C_N_length"],
BACKBONE_GEO["CA_C_N_angle"],
residues[residue_index].backbone["psi"],
)
residue.backbone["atoms"]["CA"] = nerf(
residues[residue_index].backbone["atoms"]["CA"],
residues[residue_index].backbone["atoms"]["C"],
residue.backbone["atoms"]["N"],
BACKBONE_GEO["N_CA_length"],
BACKBONE_GEO["C_N_CA_angle"],
180,
)
residue.backbone["atoms"]["C"] = nerf(
residues[residue_index].backbone["atoms"]["C"],
residue.backbone["atoms"]["N"],
residue.backbone["atoms"]["CA"],
BACKBONE_GEO["CA_C_length"],
BACKBONE_GEO["N_CA_C_angle"],
residue.backbone["phi"],
)
residue.backbone["atoms"]["O"] = nerf(
residue.backbone["atoms"]["N"],
residue.backbone["atoms"]["CA"],
residue.backbone["atoms"]["C"],
BACKBONE_GEO["C_O_length"],
BACKBONE_GEO["CA_C_O_angle"],
residue.backbone["psi"] + 180,
)
residue.sidechain
residues.append(residue)
residue.sidechain["chis"] = rl.rotamer_params(residue.name.value, residue.backbone["phi"], residue.backbone["psi"])
print(residue.summary())
# Generate a tripeptide backbone
# Populate the sidechain of the middle residue