Commit beb8bf53 authored by cmaffeo2's avatar cmaffeo2
Browse files

Updated segmentmodel to work better for ssDNA modeled with 'sscrosover' connections

parent 7ccbb105
......@@ -286,7 +286,11 @@ class SegmentParticle(PointParticle):
ret_list = []
hist_list = []
## Find intrahelical locations in seg that we might pass through
for c,A,B in seg.get_connections_and_locations("intrahelical"):
conn_locs = seg.get_connections_and_locations("intrahelical")
if isinstance(target_seg, SingleStrandedSegment):
tmp = seg.get_connections_and_locations("sscrossover")
conn_locs = conn_locs + list(filter(lambda x: x[2].container == target_seg, tmp))
for c,A,B in conn_locs:
if B.container in visited_segs: continue
dx = seg.contour_to_nt_pos( A.address, round_nt=False ) - seg.contour_to_nt_pos( contour_in_seg, round_nt=False)
dx = np.abs(dx)
......@@ -742,7 +746,10 @@ class Segment(ConnectableElement, Group):
existing_beads0 = {l.particle for l in self.locations if l.particle is not None}
existing_beads = sorted( list(existing_beads0), key=lambda b: b.get_contour_position(self) )
if self.num_nt == 1 and all([l.particle is not None for l in self.locations]):
return
for b in existing_beads:
assert(b.parent is not None)
......@@ -1458,12 +1465,13 @@ class SegmentModel(ArbdModel):
# pdb.set_trace()
cabs = s.get_connections_and_locations("intrahelical")
if isinstance(s,SingleStrandedSegment):
cabs = cabs + [[c,A,B] for c,A,B in s.get_connections_and_locations("sscrossover") if A.address == 0 or A.address == 1]
if np.any( [B.particle is None for c,A,B in cabs] ):
print( "WARNING: none type found in connection, skipping" )
cabs = [e for e in cabs if e[2].particle is not None]
beads = set(s.beads + [A.particle for c,A,B in cabs])
if len(beads) <= 1:
pdb.set_trace()
## Add nearby beads
for c,A,B in cabs:
......@@ -1484,6 +1492,7 @@ class SegmentModel(ArbdModel):
beads = list(filter(lambda x: x.type_.name[0] == "D", beads))
contours = []
remove = []
for b in beads:
try:
# if s.name == "61-1" and b.parent.name == "60-1":
......@@ -1492,9 +1501,9 @@ class SegmentModel(ArbdModel):
contours.append(b.get_contour_position(s))
except:
## ignore failed attempts
beads.remove(b)
contours = [b.get_contour_position(s) for b in beads]
remove.append(b)
beads = list(filter(lambda x: x not in remove, beads))
contours = np.array(contours, dtype=np.float16) # deliberately use low precision
contours,ids = np.unique(contours, return_index=True)
if np.any( (contours[:-1] - contours[1:])**2 < 1e-8 ):
......@@ -1639,15 +1648,6 @@ class SegmentModel(ArbdModel):
## Loop through all connections, generating beads at appropriate locations
for c,A,B in self.get_connections("intrahelical"):
s1,s2 = [l.container for l in (A,B)]
# if s1.name in ("49-3","49-4") and s2.name in ("49-3","49-4"):
# if s1.name in ("51-2","51-3") and s2.name in ("51-2","51-3"):
# pdb.set_trace()
# print("Working on {}".format(c))
## TODO be more elegant!
# if isinstance(s1, DoubleStrandedSegment) and isinstance(s2, DoubleStrandedSegment) and A.on_fwd_strand == False: continue
# if isinstance(s1, DoubleStrandedSegment) and isinstance(s2, DoubleStrandedSegment) and A.on_fwd_strand == False: continue
## if A.on_fwd_strand == False: continue # TODO verify this avoids double-counting
## TODO determine whether any logic is needed to prevent double-counting
assert( A.particle is None )
assert( B.particle is None )
......@@ -1655,10 +1655,8 @@ class SegmentModel(ArbdModel):
## TODO: offload the work here to s1
# TODOTODO
a1,a2 = [l.address for l in (A,B)]
# a1,a2 = [a - s.nt_pos_to_contour(0.5) if a == 0 else a + s.nt_pos_to_contour(0.5) for a,s in zip((a1,a2),(s1,s2))]
for a in (a1,a2):
assert( np.isclose(a,0) or np.isclose(a,1) )
# a1,a2 = [a - s.nt_pos_to_contour(0) if a == 0 else a + s.nt_pos_to_contour(0) for a,s in zip((a1,a2),(s1,s2))]
## TODO improve this for combinations of ssDNA and dsDNA (maybe a1/a2 should be calculated differently)
......@@ -2364,7 +2362,6 @@ class SegmentModel(ArbdModel):
def add_strand_if_needed(seg,is_fwd):
history = []
if not strands_cover_segment(seg, is_fwd):
pdb.set_trace()
pos = nt = find_nt_not_in_strand(seg, is_fwd)
s = Strand(is_circular = True)
history = _recursively_build_strand(s, seg, pos, is_fwd)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment