From 7bc1eb139a5c15a52cc6d500cd194cfb70b0e343 Mon Sep 17 00:00:00 2001 From: Chris Maffeo <cmaffeo2@illinois.edu> Date: Tue, 10 Jul 2018 17:53:08 -0500 Subject: [PATCH] Fixed issues with skips at crossovers, but needs testing --- cadnano_segments.py | 35 +++++++++++++++++++++++++---------- segmentmodel.py | 7 +++---- 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/cadnano_segments.py b/cadnano_segments.py index 35db031..e261920 100644 --- a/cadnano_segments.py +++ b/cadnano_segments.py @@ -247,7 +247,7 @@ class cadnano_part(SegmentModel): rev_idxs, rev_colors = rev_ss.dump(xover_list) strand_list.append((fwd_idxs, rev_idxs)) - + ## Get lists of 5/3prime ends strands5 = [o.strand5p() for o in part.oligos()] strands3 = [o.strand3p() for o in part.oligos()] @@ -401,7 +401,7 @@ class cadnano_part(SegmentModel): nt += self.insertions[hid][i].length() return nt - def _get_segment_nucleotide(self, hid, zid): + def _get_segment_nucleotide(self, hid, zid, get_forward_location=False): """ returns segments and zero-based nucleotide index """ seg = self._get_segment(hid,zid) sid = self.helices[hid].index(seg) @@ -409,23 +409,36 @@ class cadnano_part(SegmentModel): zMid = int(0.5*(zmin+zmax)) occ = self.strand_occupancies[hid] + ins = self.insertions[hid] ## TODO combine if/else when nested TODO is resolved + # if zid in self.insertions[hid]: + # import pdb + # pdb.set_trace() + if (zMid not in occ[0]) and (zMid in occ[1]): ## reversed ssDNA strand nt = zmax-zid # TODO: for i in range(zmin,zid+1): ? - for i in range(zid,zmax): + for i in range(zid,zmax+1): if i in self.insertions[hid]: nt += self.insertions[hid][i].length() else: ## normal condition + if get_forward_location: + while zid in ins and ins[zid].length() < 0 and zid <= zmax: + zid+=1 + # else: + # while zid in ins and ins[zid].length() > 0 and zid >= zmax: + # zid-=1 nt = zid-zmin - # TODO: for i in range(zmin,zid+1): ? for i in range(zmin,zid): - if i in self.insertions[hid]: - nt += self.insertions[hid][i].length() + if i in ins: + nt += ins[i].length() + if not get_forward_location and zid in ins: + nt += ins[zid].length() + ## Find insertions return seg, nt @@ -464,12 +477,14 @@ class cadnano_part(SegmentModel): def _add_crossovers(self): for h1,f1,z1,h2,f2,z2 in self.xover_list: # if (h1 == 52 or h2 == 52) and z1 == 221: - # import pdb - # pdb.set_trace() - seg1, nt1 = self._get_segment_nucleotide(h1,z1) - seg2, nt2 = self._get_segment_nucleotide(h2,z2) + if (h1 == 15 and z1 == 230) or h2 == 15 and z2 == 231: + import pdb + pdb.set_trace() + seg1, nt1 = self._get_segment_nucleotide(h1,z1,not f1) + seg2, nt2 = self._get_segment_nucleotide(h2,z2,f2) ## TODO: use different types of crossovers ## fwd? + ## 5'-to-3' direction seg1.add_crossover(nt1,seg2,nt2,[f1,f2]) def _add_prime_ends(self): diff --git a/segmentmodel.py b/segmentmodel.py index d8bb260..232aad6 100644 --- a/segmentmodel.py +++ b/segmentmodel.py @@ -1047,10 +1047,9 @@ class Strand(Group): ## TODO disambiguate names of functions def add_dna(self, segment, start, end, is_fwd): - # TODOTODO use nt pos ? - """ start/end should be provided expressed as contour_length, is_fwd tuples """ - if not (segment.contour_to_nt_pos(np.abs(start-end)) > 0.9): - print( "WARNING: segment constructed with a very small number of nts ({})".format(segment.contour_to_nt_pos(np.abs(start-end))) ) + """ start/end are given as nt """ + if np.abs(start-end) <= 0.9: + print( "WARNING: segment constructed with a very small number of nts ({})".format(np.abs(start-end)) ) # import pdb # pdb.set_trace() for s in self.strand_segments: -- GitLab