def get_atoms_num(filepath, file_type, ext=None): if file_type == 'coor': if ext is None: traj = mdtraj_load(filepath) else: ext2 = ext.lower() if ext2 == 'pdb': traj = mdtraj_load_pdb(filepath) else: raise ValueError('Extension "' + ext2 + '" not implemented.') numatoms = traj.n_atoms elif file_type == 'traj': if ext is None: trajfile = mdtraj_open(filepath) else: ext2 = ext.lower() if ext2 == 'dcd': trajfile = DCDTrajectoryFile(filepath) elif ext2 == 'xtc': trajfile = XTCTrajectoryFile(filepath) else: raise ValueError('Extension "' + ext + '" not implemented.') res = trajfile.read(1) xyz = res[0] numatoms = xyz.shape[1] trajfile.close() return numatoms
def test_read_4(): "DCDReader: check streaming read followed by reading the 'rest'" xyz_ref, box_lengths_ref, box_angles_ref = DCDTrajectoryFile(fn_dcd).read() reader = DCDTrajectoryFile(fn_dcd) for i in range(int(len(xyz_ref) / 2)): xyz, box_lenths, box_angles = reader.read(1) eq(xyz_ref[np.newaxis, i], xyz) eq(box_lengths_ref[np.newaxis, i], box_lenths) eq(box_angles_ref[np.newaxis, i], box_angles) xyz_rest, box_rest, angles_rest = reader.read() yield lambda: eq(xyz_ref[i + 1 :], xyz_rest) yield lambda: eq(box_lengths_ref[i + 1 :], box_rest) yield lambda: eq(box_angles_ref[i + 1 :], angles_rest) yield lambda: len(xyz_ref) == i + len(xyz_rest)
def test_read_4(): "DCDReader: check streaming read followed by reading the 'rest'" xyz_ref, box_lengths_ref, box_angles_ref = DCDTrajectoryFile(fn_dcd).read() reader = DCDTrajectoryFile(fn_dcd) for i in range(int(len(xyz_ref) / 2)): xyz, box_lenths, box_angles = reader.read(1) eq(xyz_ref[np.newaxis, i], xyz) eq(box_lengths_ref[np.newaxis, i], box_lenths) eq(box_angles_ref[np.newaxis, i], box_angles) xyz_rest, box_rest, angles_rest = reader.read() yield lambda: eq(xyz_ref[i + 1:], xyz_rest) yield lambda: eq(box_lengths_ref[i + 1:], box_rest) yield lambda: eq(box_angles_ref[i + 1:], angles_rest) yield lambda: len(xyz_ref) == i + len(xyz_rest)
def test_read_4(get_fn): # Check streaming read followed by reading the 'rest' fn_dcd = get_fn('frame0.dcd') xyz_ref, box_lengths_ref, box_angles_ref = DCDTrajectoryFile(fn_dcd).read() reader = DCDTrajectoryFile(fn_dcd) for i in range(len(xyz_ref) // 2): xyz, box_lenths, box_angles = reader.read(1) eq(xyz_ref[np.newaxis, i], xyz) eq(box_lengths_ref[np.newaxis, i], box_lenths) eq(box_angles_ref[np.newaxis, i], box_angles) xyz_rest, box_rest, angles_rest = reader.read() i = len(xyz_ref) // 2 assert eq(xyz_ref[i:], xyz_rest) assert eq(box_lengths_ref[i:], box_rest) assert eq(box_angles_ref[i:], angles_rest) assert len(xyz_ref) == i + len(xyz_rest)
def test_read_3(): "DCDReader: check streaming read of frames 1 at a time" xyz_ref, box_lengths_ref, box_angles_ref = DCDTrajectoryFile(fn_dcd).read() reader = DCDTrajectoryFile(fn_dcd) for i in range(len(xyz_ref)): xyz, box_lenths, box_angles = reader.read(1) eq(xyz_ref[np.newaxis, i], xyz) eq(box_lengths_ref[np.newaxis, i], box_lenths) eq(box_angles_ref[np.newaxis, i], box_angles)
def test_read_3(): "DCDReader: check streaming read of frames 1 at a time" xyz_ref, box_lengths_ref, box_angles_ref = DCDTrajectoryFile(fn_dcd).read() reader = DCDTrajectoryFile(fn_dcd) for i in range(len(xyz_ref)): xyz, box_lenths, box_angles = reader.read(1) eq(xyz_ref[np.newaxis, i], xyz) eq(box_lengths_ref[np.newaxis, i], box_lenths) eq(box_angles_ref[np.newaxis, i], box_angles)
def test_read_4(get_fn): # Check streaming read followed by reading the 'rest' fn_dcd = get_fn('frame0.dcd') xyz_ref, box_lengths_ref, box_angles_ref = DCDTrajectoryFile(fn_dcd).read() reader = DCDTrajectoryFile(fn_dcd) for i in range(len(xyz_ref) // 2): xyz, box_lenths, box_angles = reader.read(1) eq(xyz_ref[np.newaxis, i], xyz) eq(box_lengths_ref[np.newaxis, i], box_lenths) eq(box_angles_ref[np.newaxis, i], box_angles) xyz_rest, box_rest, angles_rest = reader.read() i = len(xyz_ref) // 2 assert eq(xyz_ref[i:], xyz_rest) assert eq(box_lengths_ref[i:], box_rest) assert eq(box_angles_ref[i:], angles_rest) assert len(xyz_ref) == i + len(xyz_rest)
def test_read_3(get_fn): # Check streaming read of frames 1 at a time fn_dcd = get_fn('frame0.dcd') xyz_ref, box_lengths_ref, box_angles_ref = DCDTrajectoryFile(fn_dcd).read() reader = DCDTrajectoryFile(fn_dcd) for i in range(len(xyz_ref)): xyz, box_lenths, box_angles = reader.read(1) eq(xyz_ref[np.newaxis, i], xyz) eq(box_lengths_ref[np.newaxis, i], box_lenths) eq(box_angles_ref[np.newaxis, i], box_angles)
def test_read_3(get_fn): # Check streaming read of frames 1 at a time fn_dcd = get_fn('frame0.dcd') xyz_ref, box_lengths_ref, box_angles_ref = DCDTrajectoryFile(fn_dcd).read() reader = DCDTrajectoryFile(fn_dcd) for i in range(len(xyz_ref)): xyz, box_lenths, box_angles = reader.read(1) eq(xyz_ref[np.newaxis, i], xyz) eq(box_lengths_ref[np.newaxis, i], box_lenths) eq(box_angles_ref[np.newaxis, i], box_angles)
def test_write_2(): xyz = np.array(np.random.randn(500, 10, 3), dtype=np.float32) box_lengths = 25 * np.ones((500, 3), dtype=np.float32) box_angles = 90 * np.ones((500, 3), dtype=np.float32) box_lengths[0, 0] = 10.0 f = DCDTrajectoryFile(temp, "w") f.write(xyz, box_lengths, box_angles) f.close() f = DCDTrajectoryFile(temp) xyz2, box_lengths2, box_angles2 = f.read() f.close() yield lambda: eq(xyz, xyz2) yield lambda: eq(box_lengths, box_lengths2) yield lambda: eq(box_angles, box_angles2)
def test_write_2(): xyz = np.array(np.random.randn(500, 10, 3), dtype=np.float32) box_lengths = 25 * np.ones((500, 3), dtype=np.float32) box_angles = 90 * np.ones((500, 3), dtype=np.float32) box_lengths[0, 0] = 10.0 f = DCDTrajectoryFile(temp, 'w') f.write(xyz, box_lengths, box_angles) f.close() f = DCDTrajectoryFile(temp) xyz2, box_lengths2, box_angles2 = f.read() f.close() yield lambda: eq(xyz, xyz2) yield lambda: eq(box_lengths, box_lengths2) yield lambda: eq(box_angles, box_angles2)
def test_write_2(tmpdir): fn = '{}/x.dcd'.format(tmpdir) xyz = np.array(np.random.randn(500, 10, 3), dtype=np.float32) box_lengths = 25 * np.ones((500, 3), dtype=np.float32) box_angles = 90 * np.ones((500, 3), dtype=np.float32) box_lengths[0, 0] = 10.0 f = DCDTrajectoryFile(fn, 'w') f.write(xyz, box_lengths, box_angles) f.close() f = DCDTrajectoryFile(fn) xyz2, box_lengths2, box_angles2 = f.read() f.close() assert eq(xyz, xyz2) assert eq(box_lengths, box_lengths2) assert eq(box_angles, box_angles2)
def test_write_2(tmpdir): fn = '{}/x.dcd'.format(tmpdir) xyz = np.array(np.random.randn(500, 10, 3), dtype=np.float32) box_lengths = 25 * np.ones((500, 3), dtype=np.float32) box_angles = 90 * np.ones((500, 3), dtype=np.float32) box_lengths[0, 0] = 10.0 f = DCDTrajectoryFile(fn, 'w') f.write(xyz, box_lengths, box_angles) f.close() f = DCDTrajectoryFile(fn) xyz2, box_lengths2, box_angles2 = f.read() f.close() assert eq(xyz, xyz2) assert eq(box_lengths, box_lengths2) assert eq(box_angles, box_angles2)
def test_read_closed(get_fn): fn_dcd = get_fn('frame0.dcd') with pytest.raises(IOError): f = DCDTrajectoryFile(fn_dcd) f.close() f.read()
def test_read_closed(): f = DCDTrajectoryFile(fn_dcd) f.close() f.read()
def test_read_closed(get_fn): fn_dcd = get_fn('frame0.dcd') with pytest.raises(IOError): f = DCDTrajectoryFile(fn_dcd) f.close() f.read()
def test_read_closed(): f = DCDTrajectoryFile(fn_dcd) f.close() f.read()
class Dcd(TrjHandler): ''' Read and write cell and positions from/to DCD file. Velocities, step and time are ignored. Currently mstools use mdtraj to support DCD file. Therefore, appending is not supported. ''' def __init__(self, file, mode='r'): super().__init__() try: from mdtraj.formats import DCDTrajectoryFile except: raise ImportError('Currently mstools use mdtraj to parse DCD format. Cannot import mdtraj') if mode == 'r': self._dcd = DCDTrajectoryFile(file, mode='r') elif mode == 'w': self._dcd = DCDTrajectoryFile(file, mode='w') else: raise Exception('Appending not supported for DCD') def close(self): try: self._dcd.close() except: pass def get_info(self): self.n_frame = len(self._dcd) if self.n_frame == 0: raise Exception('Empty DCD file') positions, lengths, angles = self._dcd.read(1) _, self.n_atom, _ = positions.shape return self.n_atom, self.n_frame def read_frame(self, i_frame, frame): self._dcd.seek(i_frame) positions, box_lengths, box_angles = self._dcd.read(1) angle = box_angles[0] angle[np.abs(angle - 90) < 1E-4] = 90 # in case precision issue frame.positions = positions[0] / 10 # convert A to nm frame.cell.set_box([box_lengths[0] / 10, angle]) # convert A to nm def write_frame(self, frame, subset=None, **kwargs): ''' Write a frame into the opened DCD file Parameters ---------- frame : Frame subset : list of int, optional kwargs : dict Ignored ''' if subset is None: positions = frame.positions else: positions = frame.positions[subset] self._dcd.write(positions * 10, frame.cell.lengths * 10, frame.cell.angles) # convert nm to A