Source code for mdtraj.formats.openmmxml

##############################################################################
# MDTraj: A Python Library for Loading, Saving, and Manipulating
#         Molecular Dynamics Trajectories.
# Copyright 2012-2013 Stanford University and the Authors
#
# Authors: Robert McGibbon
# Contributors:
#
# MDTraj is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as
# published by the Free Software Foundation, either version 2.1
# of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with MDTraj. If not, see <http://www.gnu.org/licenses/>.
##############################################################################

import numpy as np

from mdtraj.formats.registry import FormatRegistry

__all__ = ["load_xml"]


[docs] @FormatRegistry.register_loader(".xml") def load_xml(filename, top=None): """Load a single conformation from an OpenMM XML file. The OpenMM serialized state XML format contains additional information that is not read by this method, including forces, energies, and velocities. Here, we just read the positions and the box vectors. Parameters ---------- filename : path-like The path on disk to the XML file top : {str, Trajectory, Topology} The XML format does not contain topology information. Pass in either the path to a pdb file, a trajectory, or a topology to supply this information. Returns ------- trajectory : md.Trajectory The resulting trajectory, as an md.Trajectory object. """ import xml.etree.ElementTree as etree from mdtraj.core.trajectory import Trajectory, _parse_topology topology = _parse_topology(top) tree = etree.parse(filename) # get all of the positions from the XML into a list of tuples # then convert to a numpy array positions = [] for position in tree.getroot().find("Positions"): positions.append( ( float(position.attrib["x"]), float(position.attrib["y"]), float(position.attrib["z"]), ), ) box = [] vectors = tree.getroot().find("PeriodicBoxVectors") for name in ["A", "B", "C"]: box.append( ( float(vectors.find(name).attrib["x"]), float(vectors.find(name).attrib["y"]), float(vectors.find(name).attrib["z"]), ), ) traj = Trajectory(xyz=np.array(positions), topology=topology) traj.unitcell_vectors = np.array(box).reshape(1, 3, 3) return traj