Beispiel #1
0
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)
Beispiel #2
0
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)
Beispiel #3
0
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)
Beispiel #4
0
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)
Beispiel #5
0
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)
Beispiel #6
0
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)
Beispiel #7
0
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)
Beispiel #8
0
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)