def trajectory_from_mdtraj(mdtrajectory, simple_topology=False): """ Construct a Trajectory object from an mdtraj.Trajectory object Parameters ---------- mdtrajectory : mdtraj.Trajectory Input mdtraj.Trajectory simple_topology : bool if `True` only a simple topology with n_atoms will be created. This cannot be used with complex CVs but loads and stores very fast Returns ------- openpathsampling.engines.Trajectory the constructed Trajectory instance """ trajectory = Trajectory() empty_kinetics = Snapshot.KineticContainer(velocities=u.Quantity( np.zeros(mdtrajectory.xyz[0].shape), u.nanometer / u.picosecond)) if simple_topology: topology = Topology(*mdtrajectory.xyz[0].shape) else: topology = MDTrajTopology(mdtrajectory.topology) engine = TopologyEngine(topology) for frame_num in range(len(mdtrajectory)): # mdtraj trajectories only have coordinates and box_vectors coord = u.Quantity(mdtrajectory.xyz[frame_num], u.nanometers) if mdtrajectory.unitcell_vectors is not None: box_v = u.Quantity(mdtrajectory.unitcell_vectors[frame_num], u.nanometers) else: box_v = None statics = Snapshot.StaticContainer(coordinates=coord, box_vectors=box_v) snap = Snapshot(statics=statics, kinetics=empty_kinetics, engine=engine) trajectory.append(snap) return trajectory