Source code for cgexplore._internal.forcefields.martini

# Distributed under the terms of the MIT License.

"""Module for Martini topology.

Contains class in https://github.com/maccallumlab/martini_openmm/tree/master

"""

import contextlib
import logging
import pathlib

from openmm import app, openmm

with contextlib.suppress(ModuleNotFoundError):
    import martini_openmm as martini

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

_martini_dir = pathlib.Path(__file__).resolve().parent / "data"


[docs] class MartiniTopology: """Contains the :class:`MartiniTopFile`.""" def __init__(self, itp_file: pathlib.Path) -> None: """Initialze MartiniTopology.""" self._itp_file = itp_file self._molecule_name = itp_file.name.replace(".itp", "") self._top_file = pathlib.Path(str(itp_file).replace(".itp", ".top")) self._write_top_file() self._topology = martini.MartiniTopFile( file=self._top_file, periodicBoxVectors=((20.0, 0, 0), (0, 20.0, 0), (0, 0, 20.0)), defines=None, epsilon_r=15, ) def _write_top_file(self) -> None: string = ( f'#include "{_martini_dir}/martini_v3.0.0.itp"\n' # '#include "martini/martini_v3.0.0_ions_v1.itp"\n' # '#include "martini/martini_v3.0.0_solvents_v1.itp"\n' f'#include "{self._itp_file.name}"\n' "\n" "[ system ]\n" "A single molecule\n" "\n" "[ molecules ]\n" f"{self._molecule_name} 1\n" # 'W 8819\n' # 'NA 97\n' # 'CL 97\n' ) with self._top_file.open("w") as f: f.write(string)
[docs] def get_openmm_topology(self) -> app.topology.Topology: """Return OpenMM.Topology object.""" return self._topology.topology
[docs] def get_openmm_system(self) -> openmm.System: """Return OpenMM.System object.""" return self._topology.create_system()
[docs] def get_martini_mass_by_type(bead_type: str) -> float: """Get the mass of martini types.""" bead_size = bead_type[0] return { "P": 72.0, "N": 72.0, "C": 72.0, "X": 72.0, "S": 54.0, "T": 36.0, }[bead_size]