Geometry Restraints
Geometry restraints maintain chemically reasonable geometry during refinement.
Overview
The Restraints class handles:
Bond length restraints
Bond angle restraints
Torsion angle restraints
Planarity restraints
Restraint Setup
Restraints are automatically generated from the monomer library:
from torchref.restraints import Restraints
# Automatic setup from model
restraints = Restraints(model, cif_file=None, verbose=1)
# Or with custom CIF file for ligands
restraints = Restraints(model, cif_file="ligand.cif", verbose=1)
Restraint Storage
Restraints are stored in a nested dictionary structure. We store the indices needed to access the atoms involved, along with ideal values and sigma values.
restraints.restraints = {
'bond': {
'intra': {
'indices': Tensor of shape (N_bonds, 2),
'ideal_values': Tensor of shape (N_bonds,),
'weights': Tensor of shape (N_bonds,),
},
'inter': { ... },
},
'angle': {
'intra': { ... },
'inter': { ... },
},
'torsion': { ... },
'planarity': { ... },
}
Restraint Types
Bond Restraints
Penalize deviations from ideal bond lengths:
\[E_{bond} = \sum_i w_i \left( d_i - d_i^{ideal} \right)^2\]
where \(d_i\) is the observed distance and \(d_i^{ideal}\) is the target.
Angle Restraints
Penalize deviations from ideal bond angles:
\[E_{angle} = \sum_i w_i \left( \theta_i - \theta_i^{ideal} \right)^2\]
Torsion Restraints
Periodic restraints for dihedral angles.
Planarity Restraints
Restrain groups of atoms to lie in a plane (aromatic rings, peptide bonds).
Accessing Restraint Statistics
# RMSD values
bond_rmsd = restraints.get_bond_rmsd()
angle_rmsd = restraints.get_angle_rmsd()
# Number of restraints
n_bonds = len(restraints.bond_restraints)
n_angles = len(restraints.angle_restraints)