IgFold / model /refine /openmm_ref.py
wuxing0105's picture
Upload folder using huggingface_hub
1fdc49a verified
Raw
History Blame Contribute Delete
1.65 kB
import pdbfixer
import openmm
ENERGY = openmm.unit.kilocalories_per_mole
LENGTH = openmm.unit.angstroms
def refine(pdb_file, stiffness=10., tolerance=2.39, use_gpu=False):
tolerance = tolerance * ENERGY
stiffness = stiffness * ENERGY / (LENGTH**2)
fixer = pdbfixer.PDBFixer(pdb_file)
fixer.findMissingResidues()
fixer.findMissingAtoms()
fixer.addMissingAtoms()
force_field = openmm.app.ForceField("amber14/protein.ff14SB.xml")
modeller = openmm.app.Modeller(fixer.topology, fixer.positions)
modeller.addHydrogens(force_field)
system = force_field.createSystem(modeller.topology)
force = openmm.CustomExternalForce("0.5 * k * ((x-x0)^2 + (y-y0)^2 + (z-z0)^2)")
force.addGlobalParameter("k", stiffness)
for p in ["x0", "y0", "z0"]:
force.addPerParticleParameter(p)
for residue in modeller.topology.residues():
for atom in residue.atoms():
if atom.name in ["N", "CA", "C", "CB"]:
force.addParticle(atom.index,
modeller.positions[atom.index])
system.addForce(force)
integrator = openmm.LangevinIntegrator(0, 0.01, 1.0)
platform = openmm.Platform.getPlatformByName("CUDA" if use_gpu else "CPU")
simulation = openmm.app.Simulation(modeller.topology, system, integrator, platform)
simulation.context.setPositions(modeller.positions)
simulation.minimizeEnergy(tolerance)
with open(pdb_file, "w") as f:
openmm.app.PDBFile.writeFile(
simulation.topology,
simulation.context.getState(getPositions=True).getPositions(),
f,
keepIds=True,)