| import numpy as np |
| import openmm.unit as unit |
|
|
|
|
| class ForceReporter(object): |
| def __init__(self, reportInterval): |
| self._reportInterval = reportInterval |
| self.force_history = [] |
| self.position_history = [] |
| self.potontial_history = [] |
|
|
| self.max_potential = -np.inf |
| self.max_potential_step = 0 |
| self.step = 0 |
|
|
| def __del__(self): |
| return |
|
|
| def describeNextReport(self, simulation): |
| steps = self._reportInterval - simulation.currentStep%self._reportInterval |
| return (steps, True, False, True, True, None) |
|
|
| def report(self, simulation, state): |
| forces = state.getForces().value_in_unit(unit.kilojoules/unit.mole/unit.nanometer) |
| self.latest_forces = np.asarray(forces) |
| |
| pos = state.getPositions().value_in_unit(unit.nanometer) |
| self.latest_positions = np.asarray(pos) |
| |
| pot = state.getPotentialEnergy().value_in_unit(unit.kilojoules/unit.mole) |
| self.latest_potential = np.asarray(pot) |
|
|
| if self.latest_potential > self.max_potential: |
| self.max_potential_step = self.step |
| self.max_potential = self.latest_potential |
|
|
| self.step += 1 |
|
|
|
|