def add_domains_for_barrel_seam(design: sc.Design) -> None: top_staples_5p = design.strands_starting_on_helix(2) top_staples_3p = design.strands_ending_on_helix(2) bot_staples_5p = design.strands_starting_on_helix(17) bot_staples_3p = design.strands_ending_on_helix(17) # remove scaffold top_staples_5p = [st for st in top_staples_5p if len(st.domains) <= 3] top_staples_3p = [st for st in top_staples_3p if len(st.domains) <= 3] bot_staples_5p = [st for st in bot_staples_5p if len(st.domains) <= 3] bot_staples_3p = [st for st in bot_staples_3p if len(st.domains) <= 3] top_staples_5p.sort(key=lambda stap: stap.offset_5p()) top_staples_3p.sort(key=lambda stap: stap.offset_3p()) bot_staples_5p.sort(key=lambda stap: stap.offset_5p()) bot_staples_3p.sort(key=lambda stap: stap.offset_3p()) for top_5p, top_3p, bot_5p, bot_3p in zip(top_staples_5p, top_staples_3p, bot_staples_5p, bot_staples_3p): ss_top = sc.Domain(helix=2, forward=False, start=top_5p.first_domain().end, end=top_3p.last_domain().start) ss_bot = sc.Domain(helix=17, forward=True, start=bot_3p.last_domain().end, end=bot_5p.first_domain().start) design.insert_domain(bot_5p, 0, ss_top) design.insert_domain(top_5p, 0, ss_bot)
def move_top_and_bottom_staples_within_column_boundaries(design: sc.Design): top_staples = design.strands_starting_on_helix(0) bot_staples = design.strands_starting_on_helix(15) bot_staples.remove(design.scaffold) for top_staple in top_staples: current_end = top_staple.domains[0].end design.set_end(top_staple.domains[0], current_end - 8) for bot_staple in bot_staples: current_start = bot_staple.domains[0].start design.set_start(bot_staple.domains[0], current_start + 8)
def assign_dna_to_unzipper_toeholds(design: sc.Design) -> None: uz_toes = [sc.wc(seq) for seq in uz_toes_wc] strands_h1 = design.strands_starting_on_helix(1) strands_h1.sort(key=lambda _strand: _strand.first_domain().offset_5p()) strands_h1.reverse() strands_h18 = design.strands_starting_on_helix(18) strands_h18.sort(key=lambda _strand: _strand.first_domain().offset_5p()) for strand, toe in zip(strands_h1 + strands_h18, uz_toes): seq = toe + sc.DNA_base_wildcard * (strand.dna_length() - 8) design.assign_dna(strand, seq)
def add_deletions(design: sc.Design): for helix in range(3, maxhelix): if not design.strands_starting_on_helix(helix): pass else: hel1 = helix #first starting helix break for helix in range(hel1, maxhelix, 2): for offset in range(block * cmax): if design.domains_at(helix, offset) and offset % 48 == 0: design.add_deletion(helix, offset)
def add_toeholds_for_seam_displacement(design: sc.Design) -> None: for helix in [2, 17]: staples_5p = design.strands_starting_on_helix(helix) # remove scaffold staples_5p = [st for st in staples_5p if len(st.domains) <= 3] staples_5p.sort(key=lambda stap: stap.offset_5p()) for stap_5p in staples_5p: toe_ss = sc.Domain(helix=1 if helix == 2 else 18, forward=helix == 2, start=stap_5p.first_bound_domain().start, end=stap_5p.first_bound_domain().end) design.insert_domain(stap_5p, 0, toe_ss)
def add_scaffold_nicks(design: sc.Design): crossovers = [] for helix in range(3, maxhelix, 2): if not design.strands_starting_on_helix(helix): pass else: hel1 = helix #first starting helix break for helix in range(hel1, maxhelix, 2): scafdom1 = design.strands_starting_on_helix(helix) scafdom2 = design.strands_starting_on_helix(helix + 1) if not (scafdom1 and scafdom2): #check for empty helix at the end of the design break imghelix = int((helix - 1) / 2) if (1 in img[imghelix]) and (1 in img[imghelix + 1]): interstarts = [] interends = [] for dom in range(1, len(img[imghelix])): if (bool(img[imghelix][dom] and img[imghelix+1][dom])) and \ (not bool(img[imghelix][dom-1] and img[imghelix+1][dom-1])): interstarts.append(dom) if (not bool(img[imghelix][dom] and img[imghelix+1][dom])) and \ (bool(img[imghelix][dom-1] and img[imghelix+1][dom-1])): interends.append(dom) interstarts = [x * block for x in interstarts] interends = [x * block for x in interends] for i in range(len(interstarts)): #finds the scaffold crossover offset position 'nickoff', for the square lattice, #closest to the center of the intersection of helices that are crossing over closestoff = int((interstarts[i] + interends[i]) / 2) - 2 closerem = (closestoff) % 32 if (closerem < 10): nickoff = 3 + 32 * int(closestoff / 32) if nickoff <= interstarts[i]: nickoff = 3 + 32 * int(closestoff / 32) + 10 elif nickoff >= interends[i]: nickoff = 3 + 32 * int(closestoff / 32) - 11 elif (closerem > 10) and (closerem < 21): nickoff = 3 + 32 * int(closestoff / 32) + 10 if nickoff <= interstarts[i]: nickoff = 3 + 32 * int(closestoff / 32) + 21 elif nickoff >= interends[i]: nickoff = 3 + 32 * int(closestoff / 32) elif (closerem > 21) and (closerem < 32): nickoff = 3 + 32 * int(closestoff / 32) + 21 if nickoff <= interstarts[i]: nickoff = 3 + 32 * int(closestoff / 32) + 32 elif nickoff >= interends[i]: nickoff = 3 + 32 * int(closestoff / 32) + 10 else: nickoff = 3 + 32 * int(closestoff / 32) + closerem design.add_nick(helix=helix, offset=nickoff, forward=helix % 2 == 0) design.add_nick(helix=helix + 1, offset=nickoff, forward=helix % 2 == 1) crossovers.append( sc.Crossover(helix=helix, helix2=helix + 1, offset=nickoff, forward=False)) design.add_nick(helix=helix, offset=nickoff, forward=helix % 2 == 0) design.add_crossovers(crossovers)
def add_staple_nicks(design: sc.Design): crossovers = [] for helix in range(3, maxhelix, 2): if not design.strands_starting_on_helix(helix): pass else: hel1 = helix #first starting helix break for helix in range(hel1, maxhelix, 2): scafdom1 = design.strands_starting_on_helix(helix) scafdom2 = design.strands_starting_on_helix(helix + 1) if not (scafdom1 and scafdom2): #check for empty helix at the end of the design break for helix in range(maxhelix): if helix % 2 == 0: for offset in range(block * cmax): if (offset % 32 == 0) and (design.domains_at(helix, offset)): if domain_end(design, helix, offset): #no nick if domain end continue #Prevent very short staples if (design.domains_at(helix, offset-16)) and \ (design.domains_at(helix, offset+16)): design.add_nick(helix=helix, offset=offset, forward=helix % 2 == 1) if 0<=(offset-8)<=block*cmax and \ (design.domains_at(helix, offset-16)) and \ (design.domains_at(helix, offset)) and \ (design.domains_at(helix+1, offset-8)) and \ (design.domains_at(helix+1, offset-9)) and \ not domain_end(design, helix, offset-8): crossovers.append(sc.Crossover(helix=helix, helix2=helix + 1, \ offset=offset-8, forward=helix % 2 == 1)) else: for offset in range(block * cmax): if ((offset + 16) % 32 == 0) and (design.domains_at( helix, offset)): if domain_end(design, helix, offset): continue #Prevent very short staples if (design.domains_at(helix, offset-16)) and \ (design.domains_at(helix, offset+16)): design.add_nick(helix=helix, offset=offset, forward=helix % 2 == 1) if 0<=(offset-8)<=block*cmax and \ (design.domains_at(helix, offset-16)) and \ (design.domains_at(helix, offset)) and \ (design.domains_at(helix+1, offset-8)) and \ (design.domains_at(helix+1, offset-9)) and \ not domain_end(design, helix, offset-8): crossovers.append(sc.Crossover(helix=helix, helix2=helix + 1, \ offset=offset-8, forward=helix % 2 == 1)) design.add_crossovers(crossovers)
def add_staple_nicks(design: sc.Design): crossovers = [] midgap = 3 state = 0 every = -1 #skip every xth crossover for helix in range(3, maxhelix, 2): if not design.strands_starting_on_helix(helix): pass else: hel1 = helix #first starting helix break for helix in range(hel1, maxhelix, 2): scafdom1 = design.strands_starting_on_helix(helix) scafdom2 = design.strands_starting_on_helix(helix + 1) if not (scafdom1 and scafdom2): #check for empty helix at the end of the design break for helix in range(maxhelix): if helix % 2 == 0: for offset in range(block * cmax): if (((offset-3)%32==0) or \ ((offset-3)%32==10) or \ ((offset-3)%32==21)) and \ (design.domains_at(helix, offset+midgap)): state = state + 1 if not every == -1: if state % every == 0: # print(str(helix)+' '+str(offset)) continue if domain_end(design, helix, offset + midgap): #no nick if domain end continue #Prevent very short staples if long_stap_cond(design, helix, offset + midgap) == True: design.add_nick(helix=helix, offset=offset + midgap, forward=helix % 2 == 1) if cross_conds(design, helix, offset): crossovers.append(sc.Crossover(helix=helix, helix2=helix + 1, \ offset=offset, forward=helix % 2 == 1)) elif helix == 2: print("not here " + str(offset)) else: for offset in range(block * cmax): if (((offset-8)%32==0) or \ ((offset-8)%32==11) or \ ((offset-8)%32==21)) and \ (design.domains_at(helix, offset+midgap)): state = state + 1 if not every == -1: if state % every == 0: # print(str(helix)+' '+str(offset)) continue if domain_end(design, helix, offset + midgap): #no nick if domain end continue # #Prevent very short staples # if long_stap_cond(design, helix, offset+midgap)==True: # design.add_nick(helix=helix, offset=offset+midgap, forward=helix % 2 == 1) if cross_conds(design, helix, offset): crossovers.append(sc.Crossover(helix=helix, helix2=helix + 1, \ offset=offset, forward=helix % 2 == 1)) design.add_crossovers(crossovers)