%extend OpenMM::OpenMMContext { PyObject *getState(int getPositions=0, int getVelocities=0, int getForces=0) { int types; double simTime; double pEnergy; double kEnergy; PyObject *pPositions; PyObject *pVelocities; PyObject *pForces; PyObject *pyTuple; types = State::Energy; if (getPositions) types |= State::Positions; if (getVelocities) types |= State::Velocities; if (getForces) types |= State::Forces; State state = self->getState(types); simTime=state.getTime(); kEnergy=state.getKineticEnergy(); pEnergy=state.getPotentialEnergy(); if (getPositions) { pPositions = copyVVec3ToTargetLang(state.getPositions()); } else { pPositions = Py_None; } if (getVelocities) { pVelocities = copyVVec3ToTargetLang(state.getVelocities()); } else { pVelocities = Py_None; } if (getForces) { pForces = copyVVec3ToTargetLang(state.getForces()); } else { pForces = Py_None; } pyTuple=Py_BuildValue("(d,d,d,O,O,O)", simTime, kEnergy, pEnergy, pPositions, pVelocities, pForces); return pyTuple; } }