Source code for cgexplore._internal.utilities.spindry_utilities

# Distributed under the terms of the MIT License.

"""Utilities for using Spindry module.

Author: Andrew Tarzia

"""

import logging

import openmm
import spindry as spd
import stk

from cgexplore._internal.forcefields.forcefield import ForceField

logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s | %(levelname)s | %(message)s",
)
logger = logging.getLogger(__name__)


[docs] def get_unforced_supramolecule( hgcomplex: stk.ConstructedMolecule, ) -> spd.Potential: return spd.SupraMolecule( atoms=( spd.Atom(id=atom.get_id(), element_string=atom.__class__.__name__) for atom in hgcomplex.get_atoms() ), bonds=( spd.Bond( id=i, atom_ids=( bond.get_atom1().get_id(), bond.get_atom2().get_id(), ), ) for i, bond in enumerate(hgcomplex.get_bonds()) ), position_matrix=hgcomplex.get_position_matrix(), )
[docs] def get_supramolecule( hgcomplex: stk.Molecule, forcefield: ForceField, ) -> spd.Potential: nonbonded_targets = forcefield.get_targets()["nonbondeds"] epsilons = [] sigmas = [] for atom in hgcomplex.get_atoms(): atom_estring = atom.__class__.__name__ cgbead = forcefield.get_bead_library().get_from_element(atom_estring) for target_term in nonbonded_targets: if target_term.bead_class != cgbead.bead_class: continue epsilons.append( target_term.epsilon.value_in_unit( openmm.unit.kilojoules_per_mole ) ) sigmas.append( target_term.sigma.value_in_unit(openmm.unit.angstrom) ) return spd.SupraMolecule( atoms=( spd.Atom( id=atom.get_id(), element_string=atom.__class__.__name__, epsilon=epsilons[atom.get_id()], sigma=sigmas[atom.get_id()], ) for atom in hgcomplex.get_atoms() ), bonds=( spd.Bond( id=i, atom_ids=( bond.get_atom1().get_id(), bond.get_atom2().get_id(), ), ) for i, bond in enumerate(hgcomplex.get_bonds()) ), position_matrix=hgcomplex.get_position_matrix(), )