Beispiel #1
0
def format_pairmap(struc):
    pm = get_pairmap_from_secstruct(struc)
    new = []
    for i in pm:
        if i == -1:
            new.append(i)
        else:
            i += 1
            new.append(i)

    return pm
Beispiel #2
0
def pairmap_from_sequence(
        seq,
        vienna_version,
        vienna_path='../../../EteRNABot/eternabot/./RNAfold'):
    new_struc = ''
    if vienna_version == 1:
        if sys.version_info[:3] > (3, 0):
            p = Popen([vienna_path, '-T', '37.0'],
                      stdout=PIPE,
                      stdin=PIPE,
                      stderr=STDOUT,
                      encoding='utf8')
        else:
            p = Popen([vienna_path, '-T', '37.0'],
                      stdout=PIPE,
                      stdin=PIPE,
                      stderr=STDOUT)
        pair = p.communicate(input=''.join(seq))[0]
        formatted = re.split('\s+| \(?\s?', pair)
        new_struc = formatted[1]
    elif vienna_version == 2:
        new_struc = RNA.fold(''.join(seq))[0]

    return get_pairmap_from_secstruct(new_struc)
Beispiel #3
0
def dsp(dot_bracket,
        seq_str,
        vienna_version='1',
        vienna_path='../../../EteRNABot/eternabot/./RNAfold'
        ):  # domain specific pipeline
    '''
    Adds player strategies via a MCTS

    :param dot_bracket: The target structure of the RNA in dot-bracket notation
    :param seq_str: The current RNA sequence
    :param vienna_version: Vienna 1.8.5 or Vienna 2
    :param vienna_path: Path to the Vienna 1.8.5 RNAfold
    :return: The updated RNA sequence after the DSP
    '''

    try:
        vienna_version = int(vienna_version)
    except TypeError:
        raise TypeError('Please pass in a valid Vienna version')
    assert (vienna_version <= 2, "Please pass in a valid Vienna version")
    assert (vienna_version >= 1, "Please pass in a valid Vienna version")

    seq = list(seq_str)
    m = []
    SOLVE = False

    current_struc, _ = RNA.fold(seq_str)
    target_struc = encode_struc(dot_bracket)
    target_pm = get_pairmap_from_secstruct(dot_bracket)
    current_pm = get_pairmap_from_secstruct(current_struc)

    pairs = find_parens(dot_bracket)

    #print target_pm
    #print current_pm
    """
    Correcting incorrect base pairings
    """
    ############ Comment out from here to remove this strategy #############
    for base1, base2 in pairs.items():  # corrects incorrect base pairings
        #print base1,base2
        if (seq[base1] == 'A'
                and seq[base2] == 'U') or (seq[base1] == 'U'
                                           and seq[base2] == 'A'):
            continue
        elif (seq[base1] == 'G'
              and seq[base2] == 'U') or (seq[base1] == 'U'
                                         and seq[base2] == 'G'):
            continue
        elif (seq[base1] == 'G'
              and seq[base2] == 'C') or (seq[base1] == 'C'
                                         and seq[base2] == 'G'):
            continue
        elif (seq[base1] == 'G' and seq[base2] == 'A'):
            seq[base1] = 'U'
            m.append([2, base1 + 1])
        elif (seq[base1] == 'A' and seq[base2] == 'G'):
            seq[base1] = 'C'
            m.append([4, base1 + 1])
        elif (seq[base1] == 'C' and seq[base2] == 'U'):
            seq[base1] = 'A'
            m.append([1, base1 + 1])
        elif (seq[base1] == 'U' and seq[base2] == 'C'):
            seq[base1] = 'G'
            m.append([3, base1 + 1])
        elif (seq[base1] == 'A' and seq[base2] == 'C'):
            seq[base1] = 'G'
            m.append([3, base1 + 1])
        elif (seq[base1] == 'C' and seq[base2] == 'A'):
            seq[base1] = 'U'
            m.append([2, base1 + 1])
        elif (seq[base1] == 'A' and seq[base2] == 'A'):
            seq[base1] = 'U'
            m.append([2, base1 + 1])
        elif (seq[base1] == 'U' and seq[base2] == 'U'):
            seq[base1] = 'A'
            m.append([1, base1 + 1])
        elif (seq[base1] == 'G' and seq[base2] == 'G'):
            seq[base1] = 'C'
            m.append([4, base1 + 1])
        elif (seq[base1] == 'C' and seq[base2] == 'C'):
            seq[base1] = 'G'
            m.append([3, base1 + 1])

    #print ''.join(seq)

    for i in range(len(target_pm)):
        if target_pm[i] == -1:
            seq[i] = 'A'
            m.append([1, i + 1])
        else:
            continue
    ######################################################################
    """
    End pairs to G-C
    """
    ############ Comment out from here to remove this strategy #############
    for i in range(len(dot_bracket)):
        try:
            if dot_bracket[i] == '(':  # or dot_bracket[i] == ')':
                #print dot_bracket[i]
                if dot_bracket[i - 1] == '.' or dot_bracket[
                        i - 1] == ')' or dot_bracket[
                            i + 1] == '.' or dot_bracket[i + 1] == ')':
                    #print i
                    if (seq[i] == 'G' and seq[target_pm[i]] == 'C') or (
                            seq[i] == 'C' and seq[target_pm[i]] == 'G'):
                        continue
                    else:
                        seq[i] = 'G'
                        seq[target_pm[i]] = 'C'
                        m.append([3, i + 1])
                        m.append([4, target_pm[i] + 1])

                # elif dot_bracket[i+1] == '.' and dot_bracket[i+2] == '.' and dot_bracket[i+3] == '.' and dot_bracket[i+4] == '.':
                #     seq[i+1] = 'G'

            elif dot_bracket[i] == ')':  # or dot_bracket[i] == ')':
                #print dot_bracket[i]
                if dot_bracket[i - 1] == '.' or dot_bracket[
                        i - 1] == '(' or dot_bracket[
                            i + 1] == '.' or dot_bracket[i + 1] == '(':
                    #print i
                    if (seq[i] == 'G' and seq[target_pm[i]] == 'C') or (
                            seq[i] == 'C' and seq[target_pm[i]] == 'G'):
                        continue
                    else:
                        seq[i] = 'G'
                        seq[target_pm[i]] = 'C'
                        m.append([3, i + 1])
                        m.append([4, target_pm[i] + 1])

        except IndexError:
            continue
    ######################################################################
    """
    G External Loop Boost
    """
    ############ Comment out from here to remove this strategy #############
    for i in range(len(dot_bracket)):
        if dot_bracket[i] == '(':
            if dot_bracket[i + 1] == '.' and dot_bracket[
                    i + 2] == '.' and dot_bracket[
                        i + 3] == '.' and dot_bracket[i + 4] == '.':
                seq[i + 1] = 'G'
                m.append([3, i + 2])
            # elif (dot_bracket[i+1] == '.' and dot_bracket[i+2] == '('):
            #     seq[i+1] = 'G'
    ########################################################################
    """
    G-A Internal Loop Boost
    """
    ############ Comment out ######################################################
    for i in range(len(dot_bracket)):
        #pairing = target_pm[i]
        if dot_bracket[i] == '(' and dot_bracket[
                i +
                1] == '.':  # and dot_bracket[target_pm[i]] == ")" and dot_bracket[target_pm[i-1]] == '.':
            leftdots = []
            starter = 0
            for j in range(i + 1, len(dot_bracket)):
                if dot_bracket[j] == '(':  # or dot_bracket[j] == ')':
                    starter = j
                    break
                leftdots.append(dot_bracket[j])

            rightdots = []
            idx = target_pm[i]
            ender = 0
            for k in range(idx - 1, -1, -1):
                if dot_bracket[k] == ')':  # or dot_bracket[k] == '(':
                    ender = k
                    break
                rightdots.append(dot_bracket[k])

            if len(leftdots) > 0 and len(rightdots) > 0:
                if (len(leftdots) != 2 or len(rightdots) != 2) and (
                        math.fabs(len(rightdots) - len(leftdots)) <= 5):
                    if target_pm[starter] == starter or target_pm[
                            starter] == ender:
                        seq[i + 1] = 'G'
                        seq[ender + 1] = 'G'
    ##############################################################################

    # if dot_bracket[i] == ')' and dot_bracket[i+1] == '.' and dot_bracket[target_pm[i]] == "(" and dot_bracket[target_pm[i+1]] == '.':
    #     dots = []
    #     starter = 0
    #     for j in range(i+1, len(dot_bracket)):
    #         if dot_bracket[j] == ')':
    #             starter = j
    #             break
    #         dots.append(dot_bracket[j])
    #
    #     idx = target_pm[i]
    #     ender = 0
    #     for k in range(idx-1,-1,-1):
    #         if dot_bracket[k] == '(':
    #             ender = k
    #             break
    #         dots.append(dot_bracket[k])
    #
    #     if dots.count(dots[0]) == len(dots) and target_pm[ender] == starter:
    #         seq[i+1] = 'G'
    #         seq[ender+1] = 'G'
        """
        U-G-U-G Superboost
        """
        ############ Comment out from here to remove this strategy #############
        if dot_bracket[i] == '(' and dot_bracket[i + 1] == '.' and dot_bracket[
                i + 2] == '.' and dot_bracket[i + 3] == '(':  # UGUG superboost
            idx = target_pm[i]
            dots = []
            starter = 0
            for j in range(i + 1, len(dot_bracket)):
                if dot_bracket[j] == '(':
                    starter = j
                    break
                dots.append(dot_bracket[j])

            idx = target_pm[i]
            ender = 0
            for k in range(idx - 1, -1, -1):
                if dot_bracket[k] == ')':
                    ender = k
                    break
                dots.append(dot_bracket[k])
            if dot_bracket[idx] == ')' and dot_bracket[
                    idx -
                    1] == '.' and dot_bracket[idx - 2] == '.' and dot_bracket[
                        idx - 3] == ')' and target_pm[ender] == starter:
                seq[i + 1] = 'U'
                seq[i + 2] = 'G'
                seq[idx - 2] = 'U'
                seq[idx - 1] = 'G'
                m.append([2, i + 2])
                m.append([3, i + 3])
                m.append([2, idx - 1])
                m.append([3, idx])

            elif dot_bracket[idx] == ')' and dot_bracket[
                    idx - 1] == '.' and dot_bracket[idx - 2] == ')':
                seq[i + 1] = 'G'
                seq[idx - 1] = 'G'
                m.append([3, i + 2])
                m.append([3, idx])
        ######################################################################
        # if dot_bracket[i] == '(' and dot_bracket[i+1] == '.' and dot_bracket[i+2] == '(': # G-G in 2 pair internal loop
        #     idx = target_pm[i]
        #     if dot_bracket[idx] == ')' and dot_bracket[idx-1] == '.' and dot_bracket[idx-2] == ')':
        #         seq[i+1] = 'G'
        #         seq[idx-1] = 'G'
        #         m.append([3,i+2])
        #         m.append([3,idx])
        #     elif dot_bracket[idx] == ')' and dot_bracket[idx-1] == '.' and dot_bracket[idx-2] == '.' and dot_bracket[idx-3] == ')':
        #         seq[i+1] = 'G'
        #         seq[idx-1] = 'G'
        #         m.append([3,i+2])
        #         m.append([3,idx])
        #
        # if dot_bracket[i] == '(' and dot_bracket[i+1] == '.' and dot_bracket[i+2] == '.' and dot_bracket[i+3] == '.' and dot_bracket[i+4] == '(': # G-G in 2 pair internal loop
        #     idx = target_pm[i]
        #     if dot_bracket[idx] == ')' and dot_bracket[idx-1] == '.' and dot_bracket[idx-2] == '.' and dot_bracket[idx-3] == '.' and dot_bracket[idx-4] == ')':
        #         seq[i+1] = 'G'
        #         seq[idx-3] = 'G'
        #         m.append([3,i+2])
        #         m.append([3,idx])
        # elif dot_bracket[idx] == ')' and dot_bracket[idx-1] == '.' and dot_bracket[idx-2] == '.' and dot_bracket[idx-3] == ')':
        #     seq[i+1] = 'G'
        #     seq[idx-1] = 'G'
        #     m.append([3,i+2])
        #     m.append([3,idx])
    '''
    Flips base pairs
    '''
    ############ Comment out from here to remove this strategy #############
    new_pm = pairmap_from_sequence(seq, vienna_version)
    match = SequenceMatcher(None, new_pm, target_pm).ratio()
    for j in range(5):
        for i in range(len(dot_bracket)):
            if new_pm == target_pm:
                print('puzzle solved')
                SOLVE = True
                break
            else:
                if new_pm[i] == target_pm[i]:
                    continue
                else:
                    paired = target_pm[i]
                    base1 = seq[i]
                    base2 = seq[paired]

                    if paired == -1: continue

                    seq[i] = base2
                    seq[paired] = base1
                    new_pm = pairmap_from_sequence(seq, vienna_version)

                    new_match = SequenceMatcher(None, new_pm,
                                                target_pm).ratio()

                    if new_match > match:
                        match = copy.deepcopy(new_match)
                        m.append([str_to_num(seq[i]), i + 1])
                        m.append([str_to_num(seq[paired]), paired + 1])
                    else:
                        seq[i] = base1
                        seq[paired] = base2
    ######################################################################

    for i in range(len(dot_bracket)):
        if new_pm[i] == target_pm[i]:
            continue
        else:
            paired = target_pm[i]
            seq[i] = 'G'
            seq[paired] = 'C'
            m.append([3, i + 1])
            m.append([4, paired + 1])

    for j in range(3):
        for i in range(len(dot_bracket)):
            if new_pm == target_pm:
                print('puzzle solved')
                SOLVE = True
                break
            else:
                if new_pm[i] == target_pm[i]:
                    continue
                else:
                    paired = target_pm[i]
                    base1 = seq[i]
                    base2 = seq[paired]

                    if paired == -1: continue

                    seq[i] = base2
                    seq[paired] = base1
                    new_pm = pairmap_from_sequence(seq, vienna_version)

                    new_match = SequenceMatcher(None, new_pm,
                                                target_pm).ratio()

                    if new_match > match:
                        match = copy.deepcopy(new_match)
                        m.append([str_to_num(seq[i]), i + 1])
                        m.append([str_to_num(seq[paired]), paired + 1])
                    else:
                        seq[i] = base1
                        seq[paired] = base2

    return ''.join(seq), m, SOLVE

    cs, _ = RNA.fold(''.join(seq))
    current_pm = get_pairmap_from_secstruct(cs)
Beispiel #4
0
def sbc(dot_bracket, seq):  # Monte Carlo Tree Search with Depth 1
    '''
    Mutates individual bases with MCTS

    :param dot_bracket: The target structure for the RNA in dot-bracket notation
    :param seq: The current RNA sequence
    :return: An updated RNA sequence after the SBC
    '''

    movesets = []
    target_struc = encode_struc(dot_bracket)
    pm = get_pairmap_from_secstruct(dot_bracket)
    SOLVE = False
    #cdb = '.((((....))))'
    #current_struc = encode_struc(cdb)
    #percent_match = similar(dot_bracket,cdb)
    len_puzzle = len(target_struc)
    len_puzzle_float = len(target_struc) * 1.0
    # GAACGCACCUGCCUGUUUGGGGAGUAUGAA   GAACGCACCUGCCUGUUUGGGUAGCAUGAA
    # GAACGCACCUGCCUGUCUGGGUAGCAUGAA  GAACUCACCUGCCUGUCUUGGUAGCAUCAA
    # global current_seq
    current_seq = convert_to_list(seq)
    cdb, _ = RNA.fold(seq)
    current_pm = get_pairmap_from_secstruct(cdb)
    for i in range(4):
        for location in range(len_puzzle):
            if dot_bracket == cdb:
                # print current_seq
                # print convert_to_str(current_seq)
                # print 'Puzzle Solved'
                SOLVE = True
                break
            else:
                #percent_match = similar(dot_bracket,cdb)

                A = 1
                U = 2
                G = 3
                C = 4

                a_change = hot_one_state(current_seq, location, A)
                u_change = hot_one_state(current_seq, location, U)
                g_change = hot_one_state(current_seq, location, G)
                c_change = hot_one_state(current_seq, location, C)

                a_struc = get_pairmap_from_secstruct(
                    convert_to_struc(a_change))
                u_struc = get_pairmap_from_secstruct(
                    convert_to_struc(u_change))
                g_struc = get_pairmap_from_secstruct(
                    convert_to_struc(g_change))
                c_struc = get_pairmap_from_secstruct(
                    convert_to_struc(c_change))
                # print '\n'
                # # print a_struc
                # # print u_struc
                # # print g_struc
                # # print c_struc
                # print dot_bracket

                # a_reward = SequenceMatcher(None,a_struc,pm)
                # u_reward = SequenceMatcher(None,u_struc,pm)
                # g_reward = SequenceMatcher(None,g_struc,pm)
                # c_reward = SequenceMatcher(None,c_struc,pm)

                a_reward = similar(a_struc, pm)
                u_reward = similar(u_struc, pm)
                g_reward = similar(g_struc, pm)
                c_reward = similar(c_struc, pm)

                # a_reward = eternabot_score(a_struc)
                # u_reward = eternabot_score(u_struc)
                # g_reward = eternabot_score(g_struc)
                # c_reward = eternabot_score(c_struc)
                # print a_reward,u_reward,g_reward,c_reward

                changes = [a_reward, u_reward, g_reward, c_reward]
                # total = sum(changes)
                # base_array = [x / total for x in changes]
                # best_move = (choice([1,2,3,4],1,p=base_array,replace=False))[0]
                if all_same(changes) != True:
                    indices = [
                        i for i, x in enumerate(changes) if x == max(changes)
                    ]
                    best_move = choice(indices) + 1
                    new_seq = hot_one_state(current_seq, location, best_move)

                    current_seq = new_seq
                    cdb = convert_to_struc(current_seq)
                    m = [best_move, location]
                    movesets.append(m)
                else:
                    pass
                # print current_seq
                reg = []
                # print convert_to_str(current_seq)
                # print cdb
                current_pm = get_pairmap_from_secstruct(cdb)
                # print len(list(set(current_pm) & set(pm)))/float((len(pm)))

    return convert_to_str(current_seq), movesets, SOLVE
Beispiel #5
0
def dsp(dot_bracket,seq_str): # domain specific pipeline
    '''
    Adds player strategies via a MCTS

    :param dot_bracket: The target structure of the RNA in dot-bracket notation
    :param seq_str: The current RNA sequence
    :return: The updated RNA sequence after the DSP
    '''
    seq = list(seq_str)
    m = []
    SOLVE = False

    current_struc,_ = RNA.fold(seq_str)
    target_struc = encode_struc(dot_bracket)
    target_pm = get_pairmap_from_secstruct(dot_bracket)
    current_pm = get_pairmap_from_secstruct(current_struc)

    pairs = find_parens(dot_bracket)

    #print target_pm
    #print current_pm

    for base1,base2 in pairs.iteritems(): # corrects incorrect base pairings
        #print base1,base2
        if (seq[base1] == 'A' and seq[base2] == 'U') or (seq[base1] == 'U' and seq[base2] == 'A'):
            continue
        elif (seq[base1] == 'G' and seq[base2] == 'U') or (seq[base1] == 'U' and seq[base2] == 'G'):
            continue
        elif (seq[base1] == 'G' and seq[base2] == 'C') or (seq[base1] == 'C' and seq[base2] == 'G'):
            continue
        elif (seq[base1] == 'G' and seq[base2] == 'A'):
            seq[base1] = 'U'
            m.append([2,base1+1])
        elif (seq[base1] == 'A' and seq[base2] == 'G'):
            seq[base1] = 'C'
            m.append([4,base1+1])
        elif (seq[base1] == 'C' and seq[base2] == 'U'):
            seq[base1] = 'A'
            m.append([1,base1+1])
        elif (seq[base1] == 'U' and seq[base2] == 'C'):
            seq[base1] = 'G'
            m.append([3,base1+1])
        elif (seq[base1] == 'A' and seq[base2] == 'C'):
            seq[base1] = 'G'
            m.append([3,base1+1])
        elif (seq[base1] == 'C' and seq[base2] == 'A'):
            seq[base1] = 'U'
            m.append([2,base1+1])
        elif (seq[base1] == 'A' and seq[base2] == 'A'):
            seq[base1] = 'U'
            m.append([2,base1+1])
        elif (seq[base1] == 'U' and seq[base2] == 'U'):
            seq[base1] = 'A'
            m.append([1,base1+1])
        elif (seq[base1] == 'G' and seq[base2] == 'G'):
            seq[base1] = 'C'
            m.append([4,base1+1])
        elif (seq[base1] == 'C' and seq[base2] == 'C'):
            seq[base1] = 'G'
            m.append([3,base1+1])

    #print ''.join(seq)

    for i in range(len(target_pm)):
        if target_pm[i] == -1:
            seq[i] = 'A'
            m.append([1,i+1])
        else:
            continue

    for i in range(len(dot_bracket)):
        try:
            if dot_bracket[i] == '(':# or dot_bracket[i] == ')':
                #print dot_bracket[i]
                if dot_bracket[i-1] == '.' or dot_bracket[i-1] == ')' or dot_bracket[i+1] == '.' or dot_bracket[i+1] == ')':
                    #print i
                    if (seq[i] == 'G' and seq[target_pm[i]] == 'C') or (seq[i] == 'C' and seq[target_pm[i]] == 'G'):
                        continue
                    else:
                        seq[i] = 'G'
                        seq[target_pm[i]] = 'C'
                        m.append([3,i+1])
                        m.append([4,target_pm[i]+1])

                # elif dot_bracket[i+1] == '.' and dot_bracket[i+2] == '.' and dot_bracket[i+3] == '.' and dot_bracket[i+4] == '.':
                #     seq[i+1] = 'G'

            elif dot_bracket[i] == ')':# or dot_bracket[i] == ')':
                #print dot_bracket[i]
                if dot_bracket[i-1] == '.' or dot_bracket[i-1] == '(' or dot_bracket[i+1] == '.' or dot_bracket[i+1] == '(':
                    #print i
                    if (seq[i] == 'G' and seq[target_pm[i]] == 'C') or (seq[i] == 'C' and seq[target_pm[i]] == 'G'):
                        continue
                    else:
                        seq[i] = 'G'
                        seq[target_pm[i]] = 'C'
                        m.append([3,i+1])
                        m.append([4,target_pm[i]+1])

        except IndexError:
            continue

    for i in range(len(dot_bracket)):
        if dot_bracket[i] == '(':
            if dot_bracket[i+1] == '.' and dot_bracket[i+2] == '.' and dot_bracket[i+3] == '.' and dot_bracket[i+4] == '.':
                seq[i+1] = 'G'
                m.append([3,i+2])
            # elif (dot_bracket[i+1] == '.' and dot_bracket[i+2] == '('):
            #     seq[i+1] = 'G'

    for i in range(len(dot_bracket)):

        if dot_bracket[i] == '(' and dot_bracket[i+1] == '.':
            dots = []
            starter = 0
            for j in range(i+1, len(dot_bracket)):
                if dot_bracket[j] == '(':
                    starter = j
                    break
                dots.append(dot_bracket[j])

            idx = target_pm[i]
            ender = 0
            for k in range(idx-1,-1,-1):
                if dot_bracket[k] == ')':
                    ender = k
                    break
                dots.append(dot_bracket[k])

            if dots.count(dots[0]) == len(dots) and target_pm[ender] == starter:
                seq[i+1] = 'G'
                seq[ender+1] = 'G'

        if dot_bracket[i] == '(' and dot_bracket[i+1] == '.' and dot_bracket[i+2] == '.' and dot_bracket[i+3] == '(': # UGUG superboost
            idx = target_pm[i]
            if dot_bracket[idx] == ')' and dot_bracket[idx-1] == '.' and dot_bracket[idx-2] == '.' and dot_bracket[idx-3] == ')':
                seq[i+1] = 'U'
                seq[i+2] = 'G'
                seq[idx-2] = 'U'
                seq[idx-1] = 'G'
                m.append([2,i+2])
                m.append([3,i+3])
                m.append([2,idx-1])
                m.append([3,idx])

            elif dot_bracket[idx] == ')' and dot_bracket[idx-1] == '.' and dot_bracket[idx-2] == ')':
                seq[i+1] = 'G'
                seq[idx-1] = 'G'
                m.append([3,i+2])
                m.append([3,idx])

        # if dot_bracket[i] == '(' and dot_bracket[i+1] == '.' and dot_bracket[i+2] == '(': # G-G in 2 pair internal loop
        #     idx = target_pm[i]
        #     if dot_bracket[idx] == ')' and dot_bracket[idx-1] == '.' and dot_bracket[idx-2] == ')':
        #         seq[i+1] = 'G'
        #         seq[idx-1] = 'G'
        #         m.append([3,i+2])
        #         m.append([3,idx])
        #     elif dot_bracket[idx] == ')' and dot_bracket[idx-1] == '.' and dot_bracket[idx-2] == '.' and dot_bracket[idx-3] == ')':
        #         seq[i+1] = 'G'
        #         seq[idx-1] = 'G'
        #         m.append([3,i+2])
        #         m.append([3,idx])
        #
        # if dot_bracket[i] == '(' and dot_bracket[i+1] == '.' and dot_bracket[i+2] == '.' and dot_bracket[i+3] == '.' and dot_bracket[i+4] == '(': # G-G in 2 pair internal loop
        #     idx = target_pm[i]
        #     if dot_bracket[idx] == ')' and dot_bracket[idx-1] == '.' and dot_bracket[idx-2] == '.' and dot_bracket[idx-3] == '.' and dot_bracket[idx-4] == ')':
        #         seq[i+1] = 'G'
        #         seq[idx-3] = 'G'
        #         m.append([3,i+2])
        #         m.append([3,idx])
            # elif dot_bracket[idx] == ')' and dot_bracket[idx-1] == '.' and dot_bracket[idx-2] == '.' and dot_bracket[idx-3] == ')':
            #     seq[i+1] = 'G'
            #     seq[idx-1] = 'G'
            #     m.append([3,i+2])
            #     m.append([3,idx])


    '''
    Randomly flips base pairs
    '''
    p = Popen(['../../../EteRNABot/eternabot/./RNAfold', '-T','37.0'], stdout=PIPE, stdin=PIPE, stderr=STDOUT)
    pair = p.communicate(input=''.join(seq))[0]
    formatted = re.split('\s+| \(?\s?',pair)
    new_struc = formatted[1]
    new_pm = get_pairmap_from_secstruct(new_struc)
    match = SequenceMatcher(None,new_pm,target_pm).ratio()
    for j in range(5):
        for i in range(len(dot_bracket)):
            if new_pm == target_pm:
                print 'puzzle solved'
                SOLVE = True
                break
            else:
                if new_pm[i] == target_pm[i]:
                    continue
                else:
                    paired = target_pm[i]
                    base1 = seq[i]
                    base2 = seq[paired]

                    if paired == -1: continue

                    seq[i] = base2
                    seq[paired] = base1
                    p = Popen(['../../../EteRNABot/eternabot/./RNAfold', '-T','37.0'], stdout=PIPE, stdin=PIPE, stderr=STDOUT)
                    pair = p.communicate(input=''.join(seq))[0]
                    formatted = re.split('\s+| \(?\s?',pair)
                    new_pm = get_pairmap_from_secstruct(formatted[1])

                    new_match = SequenceMatcher(None,new_pm,target_pm).ratio()

                    if new_match > match:
                        match = copy.deepcopy(new_match)
                        m.append([str_to_num(seq[i]),i+1])
                        m.append([str_to_num(seq[paired]),paired+1])
                    else:
                        seq[i] = base1
                        seq[paired] = base2



    for i in range(len(dot_bracket)):
        if new_pm[i] == target_pm[i]:
            continue
        else:
            paired = target_pm[i]
            seq[i] = 'G'
            seq[paired] = 'C'
            m.append([3,i+1])
            m.append([4,paired+1])

    for j in range(3):
        for i in range(len(dot_bracket)):
            if new_pm == target_pm:
                print 'puzzle solved'
                SOLVE = True
                break
            else:
                if new_pm[i] == target_pm[i]:
                    continue
                else:
                    paired = target_pm[i]
                    base1 = seq[i]
                    base2 = seq[paired]

                    if paired == -1: continue

                    seq[i] = base2
                    seq[paired] = base1
                    p = Popen(['../../../EteRNABot/eternabot/./RNAfold', '-T','37.0'], stdout=PIPE, stdin=PIPE, stderr=STDOUT)
                    pair = p.communicate(input=''.join(seq))[0]
                    formatted = re.split('\s+| \(?\s?',pair)
                    new_pm = get_pairmap_from_secstruct(formatted[1])

                    new_match = SequenceMatcher(None,new_pm,target_pm).ratio()

                    if new_match > match:
                        match = copy.deepcopy(new_match)
                        m.append([str_to_num(seq[i]),i+1])
                        m.append([str_to_num(seq[paired]),paired+1])
                    else:
                        seq[i] = base1
                        seq[paired] = base2

    return ''.join(seq),m,SOLVE

    cs,_ = RNA.fold(''.join(seq))
    current_pm = get_pairmap_from_secstruct(cs)