def get_iterator_from_dslist(traj, mask, frame_indices, top, crdname='dataset_coords'): from pytraj import Trajectory, TrajectoryIterator from pytraj.datasets import CpptrajDatasetList dslist = CpptrajDatasetList() dslist.add("coords", crdname) # need to set "rmsout" to trick cpptraj not giving error # need " " (space) before crdset too if isinstance(traj, (Trajectory, TrajectoryIterator)): # we do atom stripping here before copying to DatasetCoordsCRD to save memory if # loading from TrajectoryIterator fi = traj.iterframe(mask=mask, frame_indices=frame_indices) command = '' # use Topology from fi (could be stripped to save memory) dslist[0].top = fi.top top_ = fi.top else: # ignore frame_indices fi = iterframe_master(traj) command = mask top_ = get_topology(traj, top) dslist[0].top = top_ for frame in fi: dslist[0].append(frame) return dslist, top_, command
def test_reference_with_different_topology_basic(self): traj1 = pt.iterload(filename=tc5b_trajin, top=tc5b_top) traj2 = pt.iterload(fn('tz2.nc'), fn('tz2.parm7')) # re-establish ActionList dslist = CpptrajDatasetList() dslist.add('reference', name='myref') dslist[0].top = traj2.top dslist[0].add_frame(traj2[0]) actlist = pt.ActionList(['rmsd @1-11 @CB ref myref'], top=traj1.top, dslist=dslist) for frame in traj1: actlist.compute(frame) # raise if ref_mask is given but not mask self.assertRaises(ValueError, lambda: pt.rmsd(traj1, ref=3, ref_mask='@CB')) self.assertRaises( ValueError, lambda: pt.rmsd(traj1, ref=traj2[:1], ref_mask='@CB')) # assert to cpptraj tc5b_traj = traj1[:] tz2_traj = traj2[:1] cm = ''' parm {} [tc5b] trajin {} parm {} [tz2] reference {} parm [tz2] 1 [myref] rms myrmsd ref [myref] @1-10 @11-20 '''.format(tc5b_top, tc5b_trajin, tz2_top, tz2_trajin) print(cm) state = pt.load_cpptraj_state(cm) with tempfolder(): state.run() expected_rmsd = state.data[-1].values rmsd_data = pt.rmsd(tc5b_traj, mask='@1-10', ref=tz2_traj, ref_mask='@11-20') aa_eq(expected_rmsd, rmsd_data)
def test_DatasetDouble(self): dslist = CpptrajDatasetList() d = dslist.add(dtype='double') a = range(8) # append for i in a: d.append(i) aa_eq(a, d) assert int(d[2]) == a[2] == 2, 'must be equal'
def worker_by_actlist(rank, n_cores=2, traj=None, lines=None, dtype='dict', ref=None, kwd=None): '''worker for cpptraj commands (string) ''' # need to make a copy if lines since python's list is dangerous # it's easy to mess up with mutable list # do not use lines.copy() since this is not available in py2.7 # Note: dtype is a dummy argument, it is always 'dict' if lines is None: lines = [] frame_indices = kwd.pop('frame_indices', None) new_lines, need_ref = check_valid_command(lines) if frame_indices is None: my_iter = traj._split_iterators(n_cores, rank=rank) else: my_iter = traj.iterframe( frame_indices=np.array_split(frame_indices, n_cores)[rank]) if ref is not None: if isinstance(ref, Frame): reflist = [ ref, ] else: # list/tuplex reflist = ref else: reflist = [ traj[0], ] if need_ref else [] dslist = CpptrajDatasetList() if reflist: for ref_ in reflist: ref_dset = dslist.add('reference') ref_dset.top = traj.top ref_dset.add_frame(ref_) # create Frame generator fi = pipe(my_iter, commands=new_lines, dslist=dslist) # just iterate Frame to trigger calculation. for _ in fi: pass # remove ref return (rank, dslist[len(reflist):].to_dict())
def test_reference_with_different_topology_basic(self): traj1 = pt.iterload(filename="./data/Tc5b.x", top="./data/Tc5b.top") traj2 = pt.iterload('data/tz2.nc', 'data/tz2.parm7') # re-establish ActionList dslist = CpptrajDatasetList() dslist.add('reference', name='myref') dslist[0].top = traj2.top dslist[0].add_frame(traj2[0]) actlist = pt.ActionList(['rmsd @1-11 @CB ref myref'], top=traj1.top, dslist=dslist) for frame in traj1: actlist.compute(frame) # raise if ref_mask is given but not mask self.assertRaises(ValueError, lambda: pt.rmsd(traj1, ref=3, ref_mask='@CB')) self.assertRaises(ValueError, lambda: pt.rmsd(traj1, ref=traj2[:1], ref_mask='@CB')) # assert to cpptraj tc5b_traj = traj1[:] tz2_traj = traj2[:1] cm = ''' parm data/Tc5b.top [tc5b] trajin data/Tc5b.x [tc5b] parm data/tz2.parm7 [tz2] reference data/tz2.nc parm [tz2] 1 [myref] rms myrmsd ref [myref] @1-10 @11-20 ''' state = pt.load_cpptraj_state(cm) state.run() expected_rmsd = state.data[-1].values rmsd_data = pt.rmsd(tc5b_traj, mask='@1-10', ref=tz2_traj, ref_mask='@11-20') aa_eq(expected_rmsd, rmsd_data)
def worker_by_actlist(rank, n_cores=2, traj=None, lines=None, dtype='dict', ref=None, kwd=None): '''worker for cpptraj commands (string) ''' # need to make a copy if lines since python's list is dangerous # it's easy to mess up with mutable list # do not use lines.copy() since this is not available in py2.7 # Note: dtype is a dummy argument, it is always 'dict' if lines is None: lines = [] frame_indices = kwd.pop('frame_indices', None) new_lines, need_ref = check_valid_command(lines) if frame_indices is None: my_iter = traj._split_iterators(n_cores, rank=rank) else: my_iter = traj.iterframe( frame_indices=np.array_split(frame_indices, n_cores)[rank]) if ref is not None: if isinstance(ref, Frame): reflist = [ref, ] else: # list/tuplex reflist = ref else: reflist = [traj[0],] if need_ref else [] dslist = CpptrajDatasetList() if reflist: for ref_ in reflist: ref_dset = dslist.add('reference') ref_dset.top = traj.top ref_dset.add_frame(ref_) # create Frame generator fi = pipe(my_iter, commands=new_lines, dslist=dslist) # just iterate Frame to trigger calculation. for _ in fi: pass # remove ref return (rank, dslist[len(reflist):].to_dict())
def test_add_for_CpptrajDatasetList(self): dslist = CpptrajDatasetList() # integer dslist.add(dtype='integer', name='my_int') dslist[-1].data = [2, 3] aa_eq(dslist[-1].values, [2, 3]) # double dslist.add(dtype='double', name='my_double') dslist[-1].data = [2, 3] aa_eq(dslist[-1].values, [2, 3]) # float dslist.add(dtype='float', name='my_float') dslist[-1].data = [2, 3] aa_eq(dslist[-1].values, [2, 3]) # string dslist.add(dtype='string', name='my_string') dslist[-1].data = ['H', 'T'] assert dslist[-1].values.tolist() == ['H', 'T'], 'string must be equal' # reference dslist.add(dtype='reference', name='my_reference') dslist[-1].data = self.traj[-2] aa_eq(dslist[-1].xyz, self.traj[-2].xyz) # matrix3x3 dslist.add(dtype='matrix3x3', name='my_mat3x3') mat = pt.calc_rotation_matrix(self.traj, ref=0, mask='@CA') # there is no assignment. Need to update by another method dslist[-1]._append_from_array(mat) aa_eq(dslist[-1].values, mat) # TRAJ dslist.add(dtype='traj', name='my_traj') dslist[-1].top = self.traj.top dslist[-1]._load(self.traj.filename) traj_new = dslist[-1] # CRD dslist.add(dtype='coords', name='my_crd') dslist[-1].top = self.traj.top dslist[-1].load(self.traj.filename) traj_new = dslist[-1] aa_eq(traj_new.xyz, self.traj.xyz) aa_eq(pt.rmsd(traj_new), pt.rmsd(self.traj)) # vector dslist.add(dtype='vector', name='my_vec') vecs = pt.vector.vector_mask(self.traj, ':3 :2') dslist[-1].data = vecs aa_eq(dslist[-1].values, vecs) # grid dslist.add(dtype='grid', name='my_grid') arr = np.random.rand(8, 9, 3).astype('f4') dslist[-1].data = arr aa_eq(dslist[-1].values, arr) # mesh dslist.add(dtype='xymesh', name='my_mesh') arr = np.random.rand(8, 2).astype('f8') # there is not easy method to update, use _append_from_array dslist[-1]._append_from_array(arr) aa_eq(dslist[-1].values, arr) # modes mat = pt.matrix.covar(self.traj, '@CA') modes = pt.matrix.diagonalize(mat, n_vecs=mat.shape[0], dtype='dataset')[0] modes2 = modes.__class__() # dummy test to set name and scalar_type # (prepare for pca) modes2.name = 'test_mode' modes2.scalar_type = 'covar' modes2._set_modes(False, mat.shape[0], modes.eigenvectors.shape[0], modes.eigenvalues, modes.eigenvectors.flatten()) aa_eq(modes.eigenvalues, modes2.eigenvalues) aa_eq(modes.eigenvectors, modes2.eigenvectors)