Commit 5cf9276c by cmaffeo2

### Sorta got something to work

parent 6194b684
 ... ... @@ -344,167 +344,6 @@ class cadnano_part(SegmentModel): endList.append(lastStrand[1]) return endLists def combineRegionLists(self,loHi1,loHi2,intersect=False): """Combines two lists of (lo,hi) pairs specifying integer regions a single list of regions. """ ## Validate input for l in (loHi1,loHi2): ## Assert each region in lists is sorted for pair in l: assert(len(pair) == 2) assert(pair[0] <= pair[1]) if len(loHi1) == 0: if intersect: return [] else: return loHi2 if len(loHi2) == 0: if intersect: return [] else: return loHi1 ## Break input into lists of compact regions compactRegions1,compactRegions2 = [[],[]] for compactRegions,loHi in zip( [compactRegions1,compactRegions2], [loHi1,loHi2]): tmp = [] lastHi = loHi[0][0]-1 for lo,hi in loHi: if lo-1 != lastHi: compactRegions.append(tmp) tmp = [] tmp.append((lo,hi)) lastHi = hi if len(tmp) > 0: compactRegions.append(tmp) ## Build result result = [] region = [] i,j = [0,0] compactRegions1.append([[1e10]]) compactRegions2.append([[1e10]]) while i < len(compactRegions1)-1 or j < len(compactRegions2)-1: cr1 = compactRegions1[i] cr2 = compactRegions2[j] ## initialize region if len(region) == 0: if cr1[0][0] <= cr2[0][0]: region = cr1 i += 1 continue else: region = cr2 j += 1 continue if region[-1][-1] >= cr1[0][0]: region = self.combineCompactRegionLists(region, cr1, intersect=False) i+=1 elif region[-1][-1] >= cr2[0][0]: region = self.combineCompactRegionLists(region, cr2, intersect=False) j+=1 else: result.extend(region) region = [] assert( len(region) > 0 ) result.extend(region) result = sorted(result) # print("loHi1:",loHi1) # print("loHi2:",loHi2) # print(result,"\n") if intersect: lo = max( [loHi1[0][0], loHi2[0][0]] ) hi = min( [loHi1[-1][1], loHi2[-1][1]] ) result = [r for r in result if r[0] >= lo and r[1] <= hi] return result def combineCompactRegionLists(self,loHi1,loHi2,intersect=False): """Combines two lists of (lo,hi) pairs specifying regions within a compact integer set into a single list of regions. examples: loHi1 = [[0,4],[5,7]] loHi2 = [[2,4],[5,9]] out = [(0, 1), (2, 4), (5, 7), (8, 9)] loHi1 = [[0,3],[5,7]] loHi2 = [[2,4],[5,9]] out = [(0, 1), (2, 3), (4, 4), (5, 7), (8, 9)] """ ## Validate input for l in (loHi1,loHi2): ## Assert each region in lists is sorted for pair in l: assert(len(pair) == 2) assert(pair[0] <= pair[1]) ## Assert lists are compact for pair1,pair2 in zip(l[::2],l[1::2]): assert(pair1[1]+1 == pair2[0]) if len(loHi1) == 0: if intersect: return [] else: return loHi2 if len(loHi2) == 0: if intersect: return [] else: return loHi1 ## Find the ends of the region lo = min( [loHi1[0][0], loHi2[0][0]] ) hi = max( [loHi1[-1][1], loHi2[-1][1]] ) ## Make a list of indices where each region will be split splitAfter = [] for l,h in loHi2: if l != lo: splitAfter.append(l-1) if h != hi: splitAfter.append(h) for l,h in loHi1: if l != lo: splitAfter.append(l-1) if h != hi: splitAfter.append(h) splitAfter = sorted(list(set(splitAfter))) # print("splitAfter:",splitAfter) split=[] last = -2 for s in splitAfter: split.append(s) last = s # print("split:",split) returnList = [(i+1,j) if i != j else (i,j) for i,j in zip([lo-1]+split,split+[hi])] if intersect: lo = max( [loHi1[0][0], loHi2[0][0]] ) hi = min( [loHi1[-1][1], loHi2[-1][1]] ) returnList = [r for r in returnList if r[0] >= lo and r[1] <= hi] # print("loHi1:",loHi1) # print("loHi2:",loHi2) # print(returnList,"\n") return returnList def _helix_strands_to_segment_ranges(self, helix_strands): """Utility method to convert cadnano strand lists into list of indices of terminal points""" ... ... @@ -595,24 +434,40 @@ class cadnano_part(SegmentModel): ## TODO: handle nicks that are at intrahelical connections(?) zmid1 = int(0.5*(r1[0]+r1[1])) zmid2 = int(0.5*(r2[0]+r2[1])) if seg1.name == "19-3" or seg2.name == "19-3": import pdb pdb.set_trace() # if zMid in strandOccupancies[0] and zMid in strandOccupancies[1]: # seg = DoubleStrandedSegment(**kwargs,**posargs1) # elif zMid in strandOccupancies[0]: # seg = SingleStrandedSegment(**kwargs,**posargs1) # elif zMid in strandOccupancies[1]: # seg = SingleStrandedSegment(**kwargs,**posargs2) ## TODO: validate if zmid1 in occ[0] and zmid2 in occ[0]: seg1.connect_end3(seg2.start5) if zmid1 in occ[1] and zmid2 in occ[1]: if zmid1 in occ[0]: seg2.connect_end3(seg1.end5) end = seg1.end5 else: end = seg1.start5 if zmid2 in occ[0]: seg2.connect_start3(end) else: seg2.connect_end3(seg1.start5) 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() # 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) ## TODO: use different types of crossovers ## fwd? seg1.add_crossover(nt1,seg2,nt2,[f1,f2]) def _add_prime_ends(self): ... ...