def __init__(self, system, positions, velocities=None, box_vectors=None, platform=None): self.system = copy.deepcopy(system) self.positions = positions self.velocities = velocities self.box_vectors = box_vectors # Create Context. context = self.createContext(platform=platform) # Get state. openmm_state = context.getState(getPositions=True, getVelocities=True, getEnergy=True) # Populate context. self.positions = openmm_state.getPositions(asNumpy=True) self.velocities = openmm_state.getVelocities(asNumpy=True) self.box_vectors = openmm_state.getPeriodicBoxVectors(asNumpy=False) self.potential_energy = openmm_state.getPotentialEnergy() self.kinetic_energy = openmm_state.getKineticEnergy() self.total_energy = self.potential_energy + self.kinetic_energy self.volume = thermodynamics.volume(self.box_vectors) # Clean up. del context
def createFromContext(cls, context): """ Create an SamplerState object from the information in a current OpenMM Context object. Parameters ---------- context : simtk.openmm.Context The Context object from which to create a sampler state. Returns ------- sampler_state : SamplerState The sampler state containing positions, velocities, and box vectors. Examples -------- >>> # Create a test system >>> import testsystems >>> test = testsystems.AlanineDipeptideVacuum() >>> # Create a Context. >>> import simtk.openmm as mm >>> import simtk.unit as u >>> integrator = mm.VerletIntegrator(1.0 * u.femtoseconds) >>> platform = mm.Platform.getPlatformByName('Reference') >>> context = mm.Context(test.system, integrator, platform) >>> # Set positions and velocities. >>> context.setPositions(test.positions) >>> context.setVelocitiesToTemperature(298 * u.kelvin) >>> # Create a sampler state from the Context. >>> sampler_state = SamplerState.createFromContext(context) >>> # Clean up. >>> del context, integrator """ # Get state. openmm_state = context.getState(getPositions=True, getVelocities=True, getEnergy=True) # Create new object, bypassing init. self = SamplerState.__new__(cls) # Populate context. self.system = copy.deepcopy(context.getSystem()) self.positions = openmm_state.getPositions(asNumpy=True) self.velocities = openmm_state.getVelocities(asNumpy=True) self.box_vectors = openmm_state.getPeriodicBoxVectors(asNumpy=True) self.potential_energy = openmm_state.getPotentialEnergy() self.kinetic_energy = openmm_state.getKineticEnergy() self.total_energy = self.potential_energy + self.kinetic_energy self.volume = thermodynamics.volume(self.box_vectors) return self