Source code for molsysmt.thirds.openmm.reporters.MolSys

import openmm.unit as unit
from molsysmt.native.molsys import MolSys
import molsysmt as msm
from molsysmt._private.variables import is_all
import time

[docs] class MolSysReporter(): def __init__(self, reportInterval, topology, selection='all', syntax='MolSysMT', id=True, time=True, coordinates=True, boxVectors=True, potentialEnergy=False, kineticEnergy=False, temperature=False, runningTime=False): if not is_all(selection): self._atom_indices = msm.selection(topology, selection=selection, syntax=syntax) self.topology = msm.convert(topology, to_form='molsysmt.Topology', selection=self._atom_indices) else: self._atom_indices = 'all' self.topology = msm.convert(topology, to_form='molsysmt.Topology') self._reportInterval = reportInterval self._id = id self._time = time self._coordinates = coordinates self._boxVectors = boxVectors self._potentialEnergy = potentialEnergy self._kineticEnergy = kineticEnergy self._temperature = temperature self._runningTime = runningTime self.id = [] self.time = [] self.coordinates = [] self.box = [] self.potential_energy = [] self.kinetic_energy = [] self.temperature = [] self.starting_time = None self.running_time = None self._initialized=False self._dof = None def _initialize(self, simulation, state): if self._temperature: dof = 0 for i in range(system.getNumParticles()): if system.getParticleMass(i) > 0*unit.dalton: dof += 3 for i in range(system.getNumConstraints()): p1, p2, distance = system.getConstraintParameters(i) if system.getParticleMass(p1) > 0*unit.dalton or system.getParticleMass(p2) > 0*unit.dalton: dof -= 1 if any(type(system.getForce(i)) == mm.CMMotionRemover for i in range(system.getNumForces())): dof -= 3 self._dof = dof if self._runningTime: self.starting_time = time.time()
[docs] def end(self): if self._runningTime: self.running_time = self.starting_time - time.time()
[docs] def report(self, simulation, state): if self._id: value = simulation.currentStep self.id.append(value) if self._time: value = state.getTime().value_in_unit(unit.picosecond) self.time.append(value) if self._coordinates: value=state.getPositions(asNumpy=True) self.coordinates.append(value) if self._boxVectors: value=state.getPeriodicBoxVectors(asNumpy=True) self.box.append(value) if self._potentialEnergy: value=state.getPotentialEnergy().value_in_unit(unit.kilojoules_per_mole) self.potential_energy.append(value) if self._kineticEnergy: value=state.getKineticEnergy().value_in_unit(unit.kilojoules_per_mole) self.kinetic_energy.append(value) if self._temperature: value=(2*state.getKineticEnergy()/(self._dof*unit.MOLAR_GAS_CONSTANT_R)).value_in_unit(unit.kelvin)