From 817951ed9f8c753627bde6b06a63318fe63bd4fe Mon Sep 17 00:00:00 2001 From: Chris Maffeo <cmaffeo2@illinois.edu> Date: Wed, 5 Sep 2018 17:35:23 -0500 Subject: [PATCH] Made segmentmodel_from_lists reader create splines from more than two points --- mrdna/readers/segmentmodel_from_lists.py | 41 +++++++++++++----------- mrdna/segmentmodel.py | 8 +++-- 2 files changed, 28 insertions(+), 21 deletions(-) diff --git a/mrdna/readers/segmentmodel_from_lists.py b/mrdna/readers/segmentmodel_from_lists.py index d63e44f..c81e616 100644 --- a/mrdna/readers/segmentmodel_from_lists.py +++ b/mrdna/readers/segmentmodel_from_lists.py @@ -81,6 +81,22 @@ def SegmentModelFromPdb(*args,**kwargs): ## Build map from residue index to helix index +def set_splines(seg, coordinates, hid, hmap, hrank): + maxrank = np.max( hrank[hmap==hid] ) + if maxrank == 0: + ids = np.where((hmap == hid))[0] + pos = np.mean( [coordinates[r,:] for r in ids ], axis=0 ) + coords = [pos,pos] + contours = [0,1] + else: + coords,contours = [[],[]] + for rank in range(int(maxrank)+1): + ids = np.where((hmap == hid) * (hrank == rank))[0] + coords.append(np.mean( [coordinates[r,:] for r in ids ], axis=0 )) + contours.append( float(rank)/maxrank ) + coords = np.array(coords) + seg.set_splines(coords,contours) + def model_from_basepair_stack_3prime(coordinates, basepair, stack, three_prime, sequence=None): """ @@ -160,32 +176,20 @@ def model_from_basepair_stack_3prime(coordinates, basepair, stack, three_prime, ## Create double-stranded segments doubleSegments = [] for hid in double_stranded_helices: - maxrank = np.max( hrank[hmap==hid] ) - start = np.where((hmap == hid) * (hrank == 0))[0] - end = np.where((hmap == hid) * (hrank == maxrank))[0] - - start_pos = np.mean( [coordinates[r,:] for r in start], axis=0 ) - end_pos = np.mean( [coordinates[r,:] for r in end], axis=0 ) seg = DoubleStrandedSegment(name=str(hid), - num_bp = np.sum(hmap==hid)//2, - start_position = start_pos, - end_position = end_pos) + num_bp = np.sum(hmap==hid)//2) + set_splines(seg, coordinates, hid, hmap, hrank) + assert(hid == len(doubleSegments)) doubleSegments.append(seg) ## Create single-stranded segments singleSegments = [] for hid in single_stranded_helices: - maxrank = np.max( hrank[hmap==hid] ) - start = np.where((hmap == hid) * (hrank == 0))[0] - end = np.where((hmap == hid) * (hrank == maxrank))[0] - - start_pos = np.mean( [coordinates[r,:] for r in start], axis=0 ) - end_pos = np.mean( [coordinates[r,:] for r in end], axis=0 ) seg = SingleStrandedSegment(name=str(hid), - num_nt = np.sum(hmap==hid), - start_position = start_pos, - end_position = end_pos) + num_nt = np.sum(hmap==hid)) + set_splines(seg, coordinates, hid, hmap, hrank) + assert(hid == len(doubleSegments) + len(singleSegments)) singleSegments.append(seg) @@ -230,6 +234,7 @@ def model_from_basepair_stack_3prime(coordinates, basepair, stack, three_prime, local_twist = False, dimensions=(5000,5000,5000)) + if sequence is None: model.randomize_unset_sequence() diff --git a/mrdna/segmentmodel.py b/mrdna/segmentmodel.py index f14c4c4..7c7b47d 100644 --- a/mrdna/segmentmodel.py +++ b/mrdna/segmentmodel.py @@ -385,12 +385,14 @@ class Segment(ConnectableElement, Group): def __repr__(self): return "<{} {}[{:d}]>".format( type(self), self.name, self.num_nt ) + def set_splines(self, coords, contours): + tck, u = interpolate.splprep( coords.T, u=contours, s=0, k=1) + self.position_spline_params = tck def _set_splines_from_ends(self): - a = np.array([self.start_position,self.end_position]).T - tck, u = interpolate.splprep( a, u=[0,1], s=0, k=1) - self.position_spline_params = tck self.quaternion_spline_params = None + self.set_splines(np.array([self.start_position, + self.end_position]), [0,1]) def clear_all(self): -- GitLab