Source code for qmmm_pme.hamiltonians.qmmm_hamiltonian
#! /usr/bin/env python3
"""A module defining the :class:`QMMMHamiltonian` class.
"""
from __future__ import annotations
from copy import deepcopy
from dataclasses import dataclass
from typing import Any
from typing import TYPE_CHECKING
from .hamiltonian import QMMMHamiltonianInterface
from qmmm_pme.calculators import QMMMCalculator
from qmmm_pme.calculators.calculator import CalculatorType
from qmmm_pme.interfaces import SystemTypes
if TYPE_CHECKING:
from qmmm_pme import System
from .hamiltonian import Hamiltonian
from .qm_hamiltonian import QMHamiltonian
from .mm_hamiltonian import MMHamiltonian
[docs]@dataclass
class QMMMHamiltonian(QMMMHamiltonianInterface):
"""A wrapper class storing settings for QMMM calculations.
:param qm_hamiltonian: |hamiltonian| for calculations on the QM
subsystem.
:param mm_hamiltonian: |hamiltonian| for calculations on the MM
subsystem.
:param embedding_cutoff: |embedding_cutoff|
"""
qm_hamiltonian: QMHamiltonian
mm_hamiltonian: MMHamiltonian
embedding_cutoff: float | int = 14.
def __post_init__(self) -> None:
"""Perform modifications to QM and MM :class:`Hamiltonian`
objects immediately after initialization.
"""
self.qm_hamiltonian.system_type = SystemTypes.SUBSYSTEM
self.mm_hamiltonian.system_type = SystemTypes.SUBSYSTEM
self.me_hamiltonian = deepcopy(self.mm_hamiltonian)
self.me_hamiltonian.system_type = SystemTypes.EMBEDDING
def __or__(self, other: Any) -> Hamiltonian:
if not isinstance(other, (int, float)):
raise TypeError("...")
self.embedding_cutoff = other
return self
[docs] def build_calculator(self, system: System) -> QMMMCalculator:
qm_calculator = self.qm_hamiltonian.build_calculator(system)
mm_calculator = self.mm_hamiltonian.build_calculator(system)
me_calculator = self.me_hamiltonian.build_calculator(system)
calculators = {
CalculatorType.QM: qm_calculator,
CalculatorType.MM: mm_calculator,
CalculatorType.ME: me_calculator,
}
calculator = QMMMCalculator(
system=system,
calculators=calculators,
embedding_cutoff=self.embedding_cutoff,
)
return calculator
def __add__(self, other: Any) -> Any:
return other + self
def __str__(self) -> str:
string = (
"H^{QM/MM} = "
+ str(self.qm_hamiltonian) + " + "
+ str(self.mm_hamiltonian)
)
return string