Source code for qmmm_pme.hamiltonians.mm_hamiltonian
#! /usr/bin/env python3
"""A module defining the :class:`MMHamiltonian` class.
"""
from __future__ import annotations
from dataclasses import asdict
from dataclasses import dataclass
from typing import TYPE_CHECKING
from .hamiltonian import MMHamiltonianInterface
from .hamiltonian import QMHamiltonianInterface
from .qmmm_hamiltonian import QMMMHamiltonian
from qmmm_pme.calculators import StandaloneCalculator
from qmmm_pme.interfaces import mm_factories
from qmmm_pme.interfaces import MMSettings
if TYPE_CHECKING:
from qmmm_pme import System
from .qm_hamiltonian import QMHamiltonian
[docs]@dataclass
class MMHamiltonian(MMHamiltonianInterface):
"""A wrapper class to store settings for MM calculations.
:param nonbonded_method: |nonbonded_method|
:param nonbonded_cutoff: |nonbonded_cutoff|
:param pme_gridnumber: |pme_gridnumber|
:param pme_alpha: |pme_alpha|
"""
nonbonded_method: str = "PME"
nonbonded_cutoff: float | int = 14.
pme_gridnumber: int = 60
pme_alpha: float | int = 5.0
[docs] def build_calculator(self, system: System) -> StandaloneCalculator:
mm_atoms = self.parse_atoms(system)
system.topology.mm_atoms.update(mm_atoms)
settings = MMSettings(system=system, **asdict(self))
interface = mm_factories[self.system_type](settings)
calculator = StandaloneCalculator(system=system, interface=interface)
return calculator
def __add__(self, other: QMHamiltonian) -> QMMMHamiltonian:
if not isinstance(other, QMHamiltonianInterface):
raise TypeError("...")
return QMMMHamiltonian(other, self)
def __str__(self) -> str:
return "H^{MM}" + super().__str__()