# Import required packages
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.stats import pearsonr


# Basepairs possible in RNA and score
PAIRS = {
    "CG": 1,
    "GC": 1,
    "GU": 1,
    "UG": 1,
    "AU": 1,
    "UA": 1
}

# Minimum free energy table
#bp_scoring = pd.DataFrame([[2.4, 3.4, 3.5, 2.7, 2.2, 1.9],
#                           [3.4, 3.7, 4.6, 3.4, 3.4, 2.7],
#                           [3.5, 4.6, 4.7, 3.8, 3.7, 2.8],
#                           [2.7, 3.4, 3.8, 0.0, 2.6, 1.8],
#                           [2.2, 3.4, 3.7, 2.6, 2.6, 2.3],
#                           [1.9, 2.7, 2.8, 1.8, 2.3, 1.0]],
#                          index=["AU", "CG", "GC", "GU", "UA", "UG"],
#                          columns=["AU", "CG", "GC", "GU", "UA", "UG"])

# Minimum free energy table provided from https://rth.dk/resources/bioinf2024/basepair_stack_energy_score.py
energy_scores = {
    "CG": {
        "AA": 1.0,
        "AC": 1.0,
        "AG": 1.0,
        "CA": 1.0,
        "CC": 1.0,
        "CU": 1.0,
        "GA": 1.0,
        "GG": 1.0,
        "UC": 1.0,
        "UU": 1.0,
        "CG": 3.7,
        "GC": 4.6,
        "GU": 3.4,
        "UG": 2.7,
        "AU": 3.4,
        "UA": 3.4,
    },
    "GC": {
        "AA": 1.0,
        "AC": 1.0,
        "AG": 1.0,
        "CA": 1.0,
        "CC": 1.0,
        "CU": 1.0,
        "GA": 1.0,
        "GG": 1.0,
        "UC": 1.0,
        "UU": 1.0,
        "CG": 4.6,
        "GC": 4.7,
        "GU": 3.8,
        "UG": 2.8,
        "AU": 3.5,
        "UA": 3.7,
    },
    "GU": {
        "AA": 1.0,
        "AC": 1.0,
        "AG": 1.0,
        "CA": 1.0,
        "CC": 1.0,
        "CU": 1.0,
        "GA": 1.0,
        "GG": 1.0,
        "UC": 1.0,
        "UU": 1.0,
        "CG": 3.4,
        "GC": 3.8,
        "GU": 0.0,
        "UG": 1.8,
        "AU": 2.7,
        "UA": 2.6,
    },
    "UG": {
        "AA": 1.0,
        "AC": 1.0,
        "AG": 1.0,
        "CA": 1.0,
        "CC": 1.0,
        "CU": 1.0,
        "GA": 1.0,
        "GG": 1.0,
        "UC": 1.0,
        "UU": 1.0,
        "CG": 2.7,
        "GC": 2.8,
        "GU": 1.8,
        "UG": 1.0,
        "AU": 1.9,
        "UA": 2.3,
    },
    "AU": {
        "AA": 1.0,
        "AC": 1.0,
        "AG": 1.0,
        "CA": 1.0,
        "CC": 1.0,
        "CU": 1.0,
        "GA": 1.0,
        "GG": 1.0,
        "UC": 1.0,
        "UU": 1.0,
        "CG": 3.4,
        "GC": 3.5,
        "GU": 2.7,
        "UG": 1.9,
        "AU": 2.4,
        "UA": 2.2,
    },
    "UA": {
        "AA": 1.0,
        "AC": 1.0,
        "AG": 1.0,
        "CA": 1.0,
        "CC": 1.0,
        "CU": 1.0,
        "GA": 1.0,
        "GG": 1.0,
        "UC": 1.0,
        "UU": 1.0,
        "CG": 3.4,
        "GC": 3.7,
        "GU": 2.6,
        "UG": 2.3,
        "AU": 2.2,
        "UA": 2.6,
    },
}
bp_scoring = pd.DataFrame(energy_scores).T


def seq_to_matrix(text):
    """
    Make a zeroed matrix with dimensions of the string length as columns and rows

    Args:
        text (Str):  String used to determine matrix dimensions

    Returns:
        Zeroed matrix of dimensions determined by text length
    """

    # Determine amount of characters in text and create a zeroed matrix shaped with this information
    size = len(text)
    matrix = np.zeros((size, size))

    # Return the created matrix
    return matrix


def loop_matrix_diag(matrix, offset=3, min_loop=0):
    """
    Determine the upper diagonal path through a given matrix

    Args:
        matrix (Matrix): Zeroed matrix of dimensions matching the amount of characters in a string
        offset (Int): Skip the given amount of columns, default: 3
        min_loop (Int): Minimum basepairs in loop, default: 0

    Returns:
        Diagonal paths of given matrix as a list of tuples
    """

    # Remember that we're working with 0-index matrix
    offset -= 1

    # Quirky fix for minimum loop size
    if min_loop > 0:
        min_loop -= 1

    # Calculations for loop sizes
    matrix_length = len(matrix)
    limit = matrix_length - offset

    # Default values of where to start in column and row
    default_row = 0
    default_column = offset

    # List containing positions of diagonals
    positions = []

    # Loop for the amount of times determined to get all diagonals
    for i in range(min_loop, limit):

        # Reset row and column, but remember which iteration we're in
        row = default_row
        column = default_column + i

        # Loop for the amount of times determined to get all positions in current diagonal
        for j in range(matrix_length - column):
            # Append the current cell of diagonal
            positions.append((row, column))

            # Go to next cell of diagonal
            row += 1
            column += 1

    # Return list of positions to work with
    return positions


def basepairs_to_string(pairs, sequence):
    """
    Create a dot-bracket notation for a given string using its determined pairs

    Args:
        pairs (List): List containing tuples of pairs in sequence
        sequence (Str): RNA sequence which is to be converted to dot-bracket string

    Returns:
        A dot-bracket notation for the sequence given the list of pairs
    """

    # Create a list of dots with the same length of the sequence
    sequence = ["."] * len(sequence)

    # Loop through basepairs and replace dots in sequence with corresponding brackets for pairs
    for i, j in pairs:
        sequence[i] = "("
        sequence[j] = ")"

    # Concatenate list to a string
    dot_bracket_sequence = "".join(sequence)

    # Return sequence in dot-bracket format
    return dot_bracket_sequence


def nussinov(sequence, min_loop_size=0, use_scoring=False):
    """
    Implementation of the Nussinov algorithm to generate RNA secondary structure

    Args:
        sequence (Str): RNA sequence
        min_loop_size (Int): Minimum loop size, default: 0
        use_scoring (Bool): Use scoring matrix for stacked basepairs, default: False

    Returns:
        A matrix of Nussinov scores
    """

    # Get a zeroed matrix of the sequence in question
    seq_matrix = seq_to_matrix(sequence)

    # Loop through the cells of diagonals
    for i, j in loop_matrix_diag(seq_matrix, min_loop=min_loop_size):

        # Get the value of the cell to the left of the current cell (i, j-1)
        left_cell = seq_matrix[i, j - 1]

        # Get the value of the cell below the current cell (i+1, j)
        down_cell = seq_matrix[i + 1, j]

        # Check if the current cell is a basepair
        if sequence[i] + sequence[j] in PAIRS.keys():

            # Add score to value of cell diagonally down left
            if sequence[i + 1] + sequence[j - 1] in PAIRS.keys() and use_scoring:
                diagonal_down_left = seq_matrix[i + 1, j - 1] + bp_scoring.at[sequence[i] + sequence[j],
                                                                              sequence[i + 1] + sequence[j - 1]]

            else:
                diagonal_down_left = seq_matrix[i + 1, j - 1] + 1

        else:
            # Get value of the cell diagonally down left
            diagonal_down_left = seq_matrix[i + 1, j - 1]

        # Max value from bifurcation
        bifurcation = 0

        for k in range(i, j - 1):
            if (seq_matrix[i, k] + seq_matrix[k + 1, j]) > bifurcation:
                bifurcation = seq_matrix[i, k] + seq_matrix[k + 1, j]

        # Determine which value of the cells and bifurcation were biggest and write it to the current cell
        biggest_value = max(left_cell, down_cell, diagonal_down_left, bifurcation)
        seq_matrix[i, j] = biggest_value

    # Return the matrix of Nussinov values
    return seq_matrix


def backtrack(matrix, sequence):
    """
    Backtrack through a matrix using the same rules as in the Nussinov algorithm to predict a structure

    Args:
        matrix (Matrix): Matrix containing Nussinov scores
        sequence (Str): RNA sequence in interest

    Returns:
        A dot-bracket notation of RNA secondary structure
    """

    # Starting values of in the matrix depending on the sequence in question
    stack = [(0, len(sequence) - 1)]

    # Basepairs found
    basepairs = []

    # Continue to backtrack as long as the stack is not empty
    while len(stack) > 0:

        # Get first tuple values from stack
        i, j = stack.pop()

        # If i is equal to or bigger than j, move to next iteration
        if i >= j:
            continue

        # Check the value of the cell to the left of the current cell (i, j-1)
        if matrix[i, j - 1] == matrix[i, j]:
            stack.append((i, j - 1))  # Move one column to the left

        # Check the value of the cell below the current cell (i+1, j)
        elif matrix[i + 1, j] == matrix[i, j]:
            stack.append((i + 1, j))  # Move one row down

        # Check the value of the cell diagonally down left from the current cell (i+1, j-1)
        elif sequence[i] + sequence[j] in PAIRS.keys():
            basepairs.append((i, j))  # Add found basepair to list
            stack.append((i + 1, j - 1))  # Move diagonally down left

        # If none of above is true, check if bifurcation occurred
        else:
            for k in range(i + 1, j - 1):
                stack.append((k + 1, j))
                stack.append((i, k))
                break

    # Return dot-bracket string of found basepairs (predicted secondary structure)
    dot_bracket_string = basepairs_to_string(basepairs, sequence)
    return dot_bracket_string


def basepairs(sequence):
    """
    Find basepair positions of sequence given its dot-bracket notation

    Args:
        sequence (Str): Dot-bracket notation of sequence in interest

    Returns:
        List of basepair positions in the given dot-bracket notation
    """

    # List for basepair found and the stack
    found_basepairs = []
    stack = []

    # Loop through all characters in the sequence
    for i in range(len(sequence)):

        # If start of basepair found, add current index to stack
        if sequence[i] == "(":
            stack.append(i)

        # Else-if end of basepair found, remove first item from stack and add tuple of basepair position to found list
        elif sequence[i] == ")":
            first_base = stack.pop()
            found_basepairs.append((first_base, i))

    # Return a list of found basepairs
    return found_basepairs


def check_differences(list_1, list_2):
    """
    Find basepair positions of sequence given its dot-bracket notation

    Args:
        list_1 (List): List containing basepairs
        list_2 (List): List containing basepairs to compare with the first list

    Returns:
        Amount of differences between the first and second list
    """

    # Count of differences found between two list
    differences = 0

    # Loop through all basepairs (tuples) in list first list
    for item in list_1:

        # Check if basepair doesn't exist in the second list of basepairs
        if item not in list_2:
            differences += 1

    # Return amount of differences between list one and and two
    return differences


def basepair_distance(sequence_1, sequence_2):
    """
    Calculate the basepair distance between two sequences given their dot-bracket notation, must be equal sizes

    Args:
        sequence_1 (Str): Dot-bracket notation of one sequence of interest
        sequence_2 (Str): Dot-bracket notation of another sequence of interest

    Returns:
        Basepair distance (differences) between the two sequences
    """

    # Check if the sequences are of equal length; otherwise raise error
    if len(sequence_1) != len(sequence_2):
        raise ValueError("Sequences must be of equal length!")

    # Get the basepairs from both sequences
    basepairs_sequence_1 = basepairs(sequence_1)
    basepairs_sequence_2 = basepairs(sequence_2)

    # Calculate differences between the two sequence's basepairs
    differences_seq_1_2 = check_differences(basepairs_sequence_1, basepairs_sequence_2)
    differences_seq_2_1 = check_differences(basepairs_sequence_2, basepairs_sequence_1)

    # Find the total differences
    differences_total = differences_seq_1_2 + differences_seq_2_1

    # Return the total differences
    return differences_total


if __name__ == "__main__":
    # Sequences to go through, downloaded from https://rth.dk/resources/bioinf2024/submit.php using KUID pgt781
    rnafold = {
        "seq_pgt781_001": {
            "energy": -33.5,
            "seq": "CCUGGGCCUCAGGGAGUCGACACGUAUAGUACGCGACGUCCCAAGCGUGACGAUACGCCUGUGCAAUUGUGUGGUCCUGUGAAAGCAGAGCGUGCCAGCACAAACCUAUUCUGGUCAUCU",
            "struct": "...(((((.((((((((((...((((...)))))))).))))..(((((....)))))...........)).)))))((((...(((.....)))...)))).(((......))).....",
        },
        "seq_pgt781_002": {
            "energy": -30.0,
            "seq": "ACUAUUCAAACACGGAAGAAAUCUGCAUUGAGCAUCCUCCAGCCACUCUGUAUAGUCGGAGCUGCACUUAGUUGUAAGCAACACAACUUACGGCCCGGCGCCAGUAGCACAUGCGGGAUA",
            "struct": "....(((((...((((.....))))..))))).(((((.((....(((((....(((((.((((.....((((((.......))))))..)))))))))..))).))....)).))))).",
        },
        "seq_pgt781_003": {
            "energy": -23.0,
            "seq": "GAUAUCCACCAGUCCCUUAUGAUACCCCCGAUACAGACACUUCCCAACGAGAUGCGAUUGUCGGGCUUACUAGUUGCAUCGGACUUUUCGAGUUCACUAUACCCUUGUGAGUUGACGCGC",
            "struct": "..........(((((...(((..((.(((((((..(.(((((......))).)))...))))))).......))..))).)))))..((((.(((((.........))))))))).....",
        },
        "seq_pgt781_004": {
            "energy": -29.9,
            "seq": "UCCCUUCCGCGGAUGAAGAUAGCGCUAGAAUACGAAUCAGCACGGUUGGACGUGACCGAGCUUGAGUGGAGACAAGUCAGCAGCCCAUGCCGAGCUUAGGUGCGGCGCCAUCACUAGUAU",
            "struct": "((((....).)))....(((.(((((..............((((......))))((((((((((.((((...............))))..))))))).)))..))))).)))........",
        },
        "seq_pgt781_005": {
            "energy": -36.8,
            "seq": "GAAUGAACCGACCGAAAUAAAGGCGGCGGUGACGGUCGAAUAUCCAACAUUCCCACCGGUUAACGACUACAUUGGAUUAUCCAUAUGGAUCUGGCCGAUGUUAGGUGGCCGGGGAUCAGA",
            "struct": "(((((.((((.(((.........)))))))...((........))..)))))((.(((((((.(....(((((((...((((....))))....)))))))...))))))))))......",
        },
        "seq_pgt781_006": {
            "energy": -22.5,
            "seq": "GACAGCGUUUAGGUUCGCACACAGAUUGUGUUAUUAUAGUGUAAUGGAUGCUUAAGUGACUUCACUAAUUCCCCGACACACCUGACUUAACGUUUUAGCACUCUUUCACAAGGAGAACAG",
            "struct": "...(((((((((((..(((((.....))))).......((((...(((......((((....))))...)))...))))))))))....)))))......((((((...)))))).....",
        },
        "seq_pgt781_007": {
            "energy": -40.2,
            "seq": "UUGCUCUCCCUUCGAGCUCAGUAAAGAACGAAGCCGAUUGGGGGUGGACAACUAUGCGCGCAAUUGUUACCAGUACGGUGCCGCGGGAGAGUGGUCAGACUAUCCCCUGGUAUGGGGAGU",
            "struct": "..((((((((((((..((......))..))))).((((((.(.(((........))).).))))))..(((.....)))((((.((((.(((......))).)))).))))..)))))))",
        },
        "seq_pgt781_008": {
            "energy": -22.5,
            "seq": "UAACGCACCGACCAGACUAACGCGGACAAGCUUUACGACGCAAGGCAGGAAUAUUCGUAUACUGUUCUCGUACCAAUUUCUCCUUUUGCUCCAAAUCUAGGAUCCCGGAUUCGGGUCGCG",
            "struct": "........(((((.((....((.((((.((.(((..((.((((((.((((((....((((.........))))..)))))))))..))))).))).))..).)))))...)).)))))..",
        },
        "seq_pgt781_009": {
            "energy": -28.3,
            "seq": "CACCAGCUAAAUUCUGACUAUUAGCUUGGACCCGCAUACUAAUCAAGCGGGGCAAAUAAACUCGAUCCUCUGCAUCAGUCCUGACAGUGAUAUCGGAAACUUAUCAGGAAGUUGGCCGGG",
            "struct": "..((((((((..........))))).))).(((((...........)))))................(((.((.....((((((.(((..........)))..)))))).....)).)))",
        },
        "seq_pgt781_010": {
            "energy": -29.2,
            "seq": "GGAUGUGCUGAUAAGAUCCGAUAACAUACGGUUGUGUCGUCAGUUCCCACACCUUAUCCUAGUGACUUAGGGCCAUGCACCUCCACGUCUGAGUUAUUUCAGAUGAGCGAUGUCCUGAAG",
            "struct": "(((((((((((((....(((........)))...))))((((.(................).))))..(((((...)).)))...((((((((....))))))))))).)))))).....",
        },
        "seq_pgt781_011": {
            "energy": -23.6,
            "seq": "CGUGGGGUCGGACCAAAGUAUAAGUGUCUAAACAUAACCUCUAAAACAGGGACAAUCCGCUUUGGACCUUGCUGUUAAUUCAUUUACCUACCAACUUCGGGUGCAAACUUUUUUGUGCUG",
            "struct": ".(((((((....(((((((.....(((((....................)))))....))))))))))))))...........................((((((((....)))))))).",
        },
        "seq_pgt781_012": {
            "energy": -27.5,
            "seq": "AGGUAACUACUUCCCCUAAGAGAUAAAUGAUUCAACAUGCAAUAAUCGUGGGGAGCCCCGCAGACGCCUAGGUCUAUGAUCUCCCCAGGCUCACUGAGCGCGGUAUCCUCUUGAGUAAGA",
            "struct": ".......(((((.....(((((....((((((...........))))))((((((...((.((((......)))).))..))))))..((((...))))........))))))))))...",
        },
        "seq_pgt781_013": {
            "energy": -28.5,
            "seq": "CUGUACACUGUAGUUCAUUUGCAUGGCAAAAAAAUGGAUACAAUGAGCUAAUCUCGUGGUGGGCACGGACACUGAUUACCUCUUACCAUCCAUUGGCGUCGACGCUGCUGUGGCCCGCGU",
            "struct": ".....(((.(((((....(((.(((.((.....((((((.....(((.((((((((((.....))))).....))))).))).....)))))))).)))))).))))).)))........",
        },
        "seq_pgt781_014": {
            "energy": -25.5,
            "seq": "UGUCGUUCGAGUUCGUGUUGUUGCCUAUUAUCGUUUGUGCGUGAUACAGCGCUAUCGGUUUAUUCUCGCGUUGGCGACUCACCCUGUGAGCAUCUAUCAAAGCAUGCAUUCCGUCCAAUA",
            "struct": "........((((.((((((.(((......((((...((((........))))...))))......((((....))))(((((...))))).......))))))))).)))).........",
        },
        "seq_pgt781_015": {
            "energy": -29.0,
            "seq": "AUAAAAUGGUACAAGCGAGGUCCUGUAAAGAGCUAUAUGCACUUCAUUCAUCUGCUAGGACUUCCUCGAGUGGUCGCUCCUCUCGCAACAGUCCAGCGACGAGCCGGCAAUAAAUGCGCG",
            "struct": ".............((.((((((((((((((.((.....)).)))........))).))))))))))((..(.((((((...((......))...)))))).)..))(((.....)))...",
        },
        "seq_pgt781_016": {
            "energy": -22.8,
            "seq": "CGGGCCAUGUUAGGAUACAGAUUUGUGAACCUAGUAAGCUGACUCUCAAAUCGAAACCUCCUUACCCUCAGAUAGAUACAGCUGACAAUGGGAGCCUUGACCGAAUAAAUUCCUCAGGCC",
            "struct": "..((((.((..((((.....((((((.((((((...(((((..(((...(((..................))))))..))))).....))))....)).).)))))....))))))))))",
        },
        "seq_pgt781_017": {
            "energy": -26.2,
            "seq": "GAUGUACUGUUGUCAUACCUAGGGACACACCUUUAUACGUCGGAAGAUUGGAAAGGUAGGCUCUUGUUAAUUAGGACUUGACCAUCCUCUGACAUCUGCUUGACAAGCAAAAUUGUCAAA",
            "struct": ".(((.((....)))))....(((......)))......((((((.....(((..((((((.(((((.....)))))))).))).)))))))))......(((((((......))))))).",
        },
        "seq_pgt781_018": {
            "energy": -21.1,
            "seq": "GUCAUGAUGAAUCGUCAAACCCCCAUGCCCUAUCAACAGACGUGAUACAUGCCGGAUAUCACGACAAACAAUGCGCACGUCUCGCAGCGGGCUACCAUUGAAUUUACCGUAGACCUUAAC",
            "struct": "((((((.(((((..((((........((((.......(((((((.....((.((.......)).)).........)))))))......)))).....))))))))).))).)))......",
        },
        "seq_pgt781_019": {
            "energy": -40.0,
            "seq": "UAAGAAGAUCGUAUGGAAUGGUUUAGUUGAGGCAGCCUAGCUGCGAACGUCGGAGCGGGAUUCCAGGGAUCCAGAGCGAAGUCUAUCCCUAAGCAAACCGCUGCCUAACGUUCCAUUCUC",
            "struct": "..............(((((((....(((.(((((((...(((.(((...))).)))((....))((((((..(((......))))))))).........))))))))))...))))))).",
        },
        "seq_pgt781_020": {
            "energy": -17.5,
            "seq": "GCGAUGACUACCGAUAGAGAGCGCCUACUAAAUCUUAGAGCUAACUCAGUAUCUAUUAUUUAACUGAUAGAUCUAGUAAGGACUUGCCGACGUAAGAAUGAGAUACGCAGAAUACAAAAA",
            "struct": "(((....(((....)))....))).......((((((...((.(((.((.((((((((......))))))))))))).))..(((((....)))))..))))))................",
        },
        "seq_pgt781_021": {
            "energy": -27.4,
            "seq": "GAGAAAUUAUUUUUUGGGGGAUUAUAGGCUUCUAGUAGUAGGCCGCAUAGGAUGCCCUACAGCCGGGCCACUGUCGCCAGCAUAAGAAUUAUCGCACACCCUAAACGUGAUUAUAAUGGU",
            "struct": "....((((((..(((((((.......(((((((...)).)))))((((((...((((.......))))..)))).))..((((((...)))).))...))))))).))))))........",
        },
        "seq_pgt781_022": {
            "energy": -19.4,
            "seq": "UAAACACAUGGUAAUUGAUCCUUUGGGUGGCCCGGUGGAACCACCACUGAUAAAUAGCAAUAGAAGCAUCCUCGUUCAUACAGUCUAGUCAAGUUAUAAAAACGAGUCAAACAGGCUCAC",
            "struct": "......((.((........))..)).((((((((((((.....)))))).......((.......))...((((((..((.((.((.....)))).))..)))))).......))).)))",
        },
        "seq_pgt781_023": {
            "energy": -29.1,
            "seq": "CAUGACGUAAGAAAAAAUCCCAGUCCUCGUAGCACGCGGGAAUAUCAAUCCGUCGAGUUUAAGGCCUCCGGAUGGGCUUUAGAUUUACACGCACCCACUGCAGGAGAAGGACAUUGAGAA",
            "struct": ".................(((...((((.((((...((((((.......)))((.(((((((((((((......))))))))))))))).))).....))))))))...))).........",
        },
        "seq_pgt781_024": {
            "energy": -30.0,
            "seq": "UCUAGAGAGUAUUCGUGACGUCGAGGCUGAACAAACUUAAGCAUAAAAUGACCGAGCGUAUCGGUUCAUAUGGAGGUCAUGGUCUAGUGGCGCCUGUGGCUAGGGUCAUAACCAACACGU",
            "struct": "............(((((((.((.(.(((...........))).....((((((((.....)))).)))).).)).))))))).(((((.((....)).)))))(((....))).......",
        },
        "seq_pgt781_025": {
            "energy": -36.4,
            "seq": "CGUCUGAAGGAGGGCACGACUGCGGCCCGCCGGCGUCGACUUGGACGAUGAGAGACUCCUAGCUGAAUUCGAUAAAGGAAAAUUUGGCCCUCUGUCCGGGGACAGGGAUUGCCAUACGGC",
            "struct": ".((((...((.((((.((....)))))).))..((((......)))).....))))((((...............)))).....((((.(((((((....)))))))...))))......",
        },
        "seq_pgt781_026": {
            "energy": -23.5,
            "seq": "GUACGGUCGUUACAGAACGAAUUAAUGUCCGUCCUUGAGUCUCAGAUACGUCGAGAUCGGUUACGCCUAUGAAACAGCGUAUGUAGGAACGAGCAAUAUGGGCACAGGAAGUCGCUGGCU",
            "struct": "..((((.(((((..........))))).)))).((((..(((.(.((((((....((.(((...))).))......)))))).).))).)))).......(((.(((.......))))))",
        },
        "seq_pgt781_027": {
            "energy": -28.1,
            "seq": "CCAGGAACCUUGUAGCCCCGGCGUGUCUUCAAUCGCCUGCGAUGGUAAGUUUUUGUGCGGAACUUCAAACCCCGGUCGGGGCCUAGUACUCGAGUGCAGGCAUCAAUAUUGGCAUCACUG",
            "struct": ".((((...))))..((((((((.........((((....))))((((((((((.....)))))))...)))...))))))))..........((((..(.((.......)).)..)))).",
        },
        "seq_pgt781_028": {
            "energy": -41.8,
            "seq": "UUGACGCUCCGCGCGUGGGGACCCCGCCGCACAUGAAUUCCAGUCCUUAUGCUCAUUGACCUGAGGUGCGUGCUCAAAUGCGAUUGAGACGCAUCACACGGGCGCACCGUCUGUGUCAAU",
            "struct": "(((((((...(((.(((((...)))))))).(((((..........)))))((((......))))((((((.(((((......)))))))))))...((((.....))))..))))))).",
        },
        "seq_pgt781_029": {
            "energy": -20.6,
            "seq": "GCUACAUGACUUGUUCCUACUGAGCCGUUCAGUGCACACUCUCUAAUGCGAGACGCCGAGAAUCUAAGAACCGUCCCUAACUUCUAUCACAUUGUAGCGUUUUGUAGUACUAUGGCGGGC",
            "struct": ".......................(((((..(((((...........(((((((((((((.......((((...........))))......)))..))))))))))))))))))))....",
        },
        "seq_pgt781_030": {
            "energy": -24.1,
            "seq": "GAAGAGACAAUAUGUGAUUGGAGUUGAUCAAUCAGUUGGGACGUGCGACGUUAAACACGGUCGUGCGAGGUGCUAGGGAUCACGCAUAAAAAACGUAGGAAACAACAUGAAUCCGCGAAC",
            "struct": "..........((((((........(((((..(.(((.....((((((((..........))))))))....))))..))))))))))).....(((.(((..((...))..))))))...",
        },
        "seq_pgt781_031": {
            "energy": -35.1,
            "seq": "CGCGCCUAUGCUGGGCAUAGCUACUGGUCGCUCGCUAGUGGGCAAUUACGCGUGCUCGGAAAAUCACGUCAACGCCUCUAAGGGCGGCAAACCCGGAGAAAUACGCGCAGCCACCCGAUG",
            "struct": ".((((((((((...))))))((((((((.....))))))))........((((...((........))...)))).(((..(((.......)))..))).....))))............",
        },
        "seq_pgt781_032": {
            "energy": -27.5,
            "seq": "UUUUCCUGAUUCGCCGGACCAUACUCGGUUGCCGAAACGUCACUAUGCACUGCGGCCAUUAGAUCACAGGCUAGACCCUGCGGCGCUCAAGUCUAGCAGUGUAUACAUCGAGAUAAUCCA",
            "struct": "......((((....((((((......)))..)))....)))).(((((((((((((.....(.((.((((......)))).)))......)))..))))))))))...............",
        },
        "seq_pgt781_033": {
            "energy": -28.7,
            "seq": "UCGCUACUACGGGUAGCGAGGCUACGCGGGUAUGCUGGUCCGUUACCAUUAAACAAUCAAGCUCUUGUAUAGCUAGUCAGUCAUCUAUGAUAAUAUAGACCACGCCAAUUGCGCUUACCU",
            "struct": "((((((((...))))))))((.((.(((.(...(((((((.((((.(((...((...(.((((.......)))).)...)).....))).))))...))))).))....).))).)))).",
        },
        "seq_pgt781_034": {
            "energy": -19.3,
            "seq": "CUACAUUUUUGCAAAUCUAUGCAAGACUUAAGUUUACUCAGGAAUCGCUUCUUAGCAGGCCAUUUAUACAAUGUCACCGAGCCGUUUAAUAAUGGAUGGAACAAGGUAUCCCAAGAAGUU",
            "struct": "......(((((((......)))))))....................(((((((.(..((......((((..(((..(((..(((((....))))).))).)))..)))))))))))))).",
        },
        "seq_pgt781_035": {
            "energy": -34.2,
            "seq": "UUUUGUUUAGGGACUAGUCCGUGGAAUUGCAAACGAGAGGAUUAUUGUCCACACCAACCGGUGUGUCCCAGUAUCGGUCUCCCUGACUUUGUUGCAGUACACAGACUUCCAAACUACGAG",
            "struct": "..((((....(((..((((.(((..(((((((.(((...(((.((((..((((((....))))))...)))))))((((.....)))))))))))))).))).))))))).....)))).",
        },
        "seq_pgt781_036": {
            "energy": -27.8,
            "seq": "UCGCAUAGAAGAACACCCCGCAUCGUCUAAGCGUGCACAACGUAUAGCACCUGUAGUUAAGGAGCAUUGCGUCCUCGUGAUUGAGGAAGUUUCAGCUCUCAAUUUAAGCACUGGCGGUAC",
            "struct": ".................((((...(((((.((((.....)))).))).))((..((((..(((((...((.((((((....)))))).))....))))).))))..)).....))))...",
        },
        "seq_pgt781_037": {
            "energy": -25.8,
            "seq": "CAGUCGUGAGGGACCAUAAGAAGCCUCUUGUAAUCGCCUUGCAUGAGUGCAGUGCCACCGAUAGGUCCACCUCCCUGACCUUUUCGACCACCAAAACUAACUCCCUACAAGUCCGGGCAG",
            "struct": "((.((((((((((..((((((....))))))..)).)))..))))).))..(((....(((.(((((.........)))))..)))..))).........(((((.........))).))",
        },
        "seq_pgt781_038": {
            "energy": -25.8,
            "seq": "UUGGGGCUCAGAAUCGGACGACUGGUGGUGUGUGGUGUAUUUGGGAGUUCCAUAUCUAGUAAGGAACCUCUUUGAAGGUAGCCGGGAACCUUAUAGGGACGGAAGUAAAAACUCGAAAAU",
            "struct": ".((((((((.((((.(.((.((.........)).)).)))))..))))))))..............(((((((((((((........))))).)))))).))..................",
        },
        "seq_pgt781_039": {
            "energy": -31.7,
            "seq": "GGAUGUGUUCUAAUUGUCCCCUAUACGCCAUCUUGGUCCAAUAGUGAUCCUCAUGGAGCGCGCUGUGCGCGAUGUGCCGAUGGCCUAGGAGCUACGCCUUGUGACAGCUGGUACCUAUAG",
            "struct": "((.(((((..............))))))).....((((((...(((.(((....))).)))(((((.(((((.(((....((((......))))))).))))))))))))).))).....",
        },
        "seq_pgt781_040": {
            "energy": -29.0,
            "seq": "CUCCUUUGUACUCCGAUGGUCAGAUUUAUGUAGGGGACUUACUUUCAUGAGGAUACAGGCGAGUGAUCCACUACGGAUUAUCCCCUUAUACUGACACAGAGCAUGUGCAUGGCUACGGGU",
            "struct": "..((..(((((..(..(((((((...((((.(((((.((((......))))...........(((((((.....))))))))))))))))))))).))..)...))))).))........",
        },
        "seq_pgt781_041": {
            "energy": -27.9,
            "seq": "GAGAUGCGGAUAGAAGUGACUAUCAAUGAUUACAGCCCGAGGAACAUUUAGGUUCAGACGCAACGUUCGUGCUGCUGGGGCCAGGGCAUGUACAAGUGACGAGUUGUUGUGAUGGCUGGC",
            "struct": "........(((((......)))))........(((((....((((......))))...(((((((..((((((.(((....)))))))))..............)))))))..)))))..",
        },
        "seq_pgt781_042": {
            "energy": -31.4,
            "seq": "ACGACCGUGUGAGGUGAAAUUCCGCAGCAAUCGAAUGCUUCCAUAUCGCUAUUACACGGGCUCUGAACCGUCAGCACUACCCAUGUUUCGCGACACCAGUAGAUUAAUGAUAGUCCAGGC",
            "struct": "....(((((((((((((.((...(.((((......)))).).)).))))).))))))))((.(((.((.((((...((((...((((....))))...)))).....)))).)).)))))",
        },
        "seq_pgt781_043": {
            "energy": -25.4,
            "seq": "GGUGCUGAACAUUUGCAAACCGUAUGGGGAGGACCUGGCCCCAUGUACAGUAGAUGCACAAAAUAAUUGACGAGGCUUCUUACAAACUUCAUUGACUCGUAUUAUGCGUUUCUAUGAGGA",
            "struct": ".((((.....((((((......(((((((.........)))))))....))))))))))...........................((((((.((..((((...))))..)).)))))).",
        },
        "seq_pgt781_044": {
            "energy": -30.3,
            "seq": "CAGCCCGGAGUGCGACUCGAGUCGUGUGUGACUCGGAUCAGAUAAUAAUUCGCGGGCCUGUCCGUUUUAGCUGGGUCGCUGAAUUUGAAAUAGGUUUAUUGUCCAUAGUACCAGAUACAU",
            "struct": "..(((((((((..((.(((((((......))))))).))........)))).)))))............((((((.((.((((((((...)))))))).)).)).))))...........",
        },
        "seq_pgt781_045": {
            "energy": -27.8,
            "seq": "CGCGUCCGAGAUCCUUACUGCGUGAACCCAAGGCCUAGGUCGCAAUGGGUUUGUCUCCUUCUAUAAGUGUGAAAAUACUCCUAGUUCUAUCUUUCGCAGAUGGACGGAAAACCAACAACU",
            "struct": "....((((...(((.(.(((((.(((((((..((.......))..)))))))........(((..(((((....)))))..)))..........)))))).)))))))............",
        },
        "seq_pgt781_046": {
            "energy": -30.8,
            "seq": "GCUGGCCGACACGUAUUUCUAACGGGGUCCUCUAGCAGGUUGGCCCGCUGUCGAUAACUGAGAGAGUAUCGCGCCAUGAAGGAUAAAGGAGAUGGAAACGGUUCCUCCGCAGCGCCUAGU",
            "struct": "((((((((.....(((((((..((.(((.((((..(((((((((.....))))))..)))..)))).))).))((.....)).....)))))))....)))).......)))).......",
        },
        "seq_pgt781_047": {
            "energy": -21.2,
            "seq": "UUGCGCUCAUGGCGAUUUUACGAUUUGUCGAUUGAGUCAGCUCAACAUCUUUCCAAUAGAAGUCCCAUCUCAGCGAUUACUGGCGUUUUACACGUCAAAUUACUAUAAGAGUUUUUAUCA",
            "struct": "...((((.((((.((((((............(((((....))))).............))))))))))...)))).....((((((.....)))))).......................",
        },
        "seq_pgt781_048": {
            "energy": -39.9,
            "seq": "AUACUCCAAGGUACACAGUAGGUUUUAUACACAAACAUUACUUGACUUGUGGAUCGACGGGUCGCCGAUUAGGCGAAAUCCGCCCAGCCCGCUCGAGGGUAGAGCCUCGCGGAGUGCGGU",
            "struct": "....((((((((.((.(((((((((.......)))).))))))))))).))))....(((((((((.....)))))..))))((((..((((..((((......))))))))..)).)).",
        },
        "seq_pgt781_049": {
            "energy": -45.9,
            "seq": "GGGGGAGUGGAGUGGGACGCGGCCCUAGGGAUGAGACCCAUUUUCAGAUGGCCCUCCAUAUCCUCCACAUGCAUGAUGGCUCACGCUAGGAUGAGACCGCGUGUGGUUGGGGGGAGGCCC",
            "struct": "((((..(((........)))..)))).(((......)))..........((((((((....((.((((((((.....(((((((.....).)))).))))))))))..)))))).)))).",
        },
        "seq_pgt781_050": {
            "energy": -24.1,
            "seq": "CGAGAGGUUCCCACCCAAUCGCCUUGGUUUCGGACCCCGUGAAAUCUACUUUAGGUUCAGAGUGACUUACUCAACGGCGGUAGUACGUGAACCAUUUACAUGGCUCUUCCCAGACGCGUC",
            "struct": ".(((.(((((.......((((((..((((...))))...((((.((((...))))))))(((((...)))))...)))))).......))))).))).....(((((....))).))...",
        },
        "seq_pgt781_051": {
            "energy": -35.0,
            "seq": "GGCGUAAUCGGCUGUAUUGGCCAUCGGCGGCUUGAGAACCGCCAAUAUGAAAGCGCACAUCGAGCUGGCGAGGAUGUGACGGAUGAAAGUUAUACUAUGCACAUCUACCGCUCACCGGAC",
            "struct": "((((.....((((.....)))).(((.((((((((....(((..........)))....)))))))).)))(((((((.((................)))))))))..))))........",
        },
        "seq_pgt781_052": {
            "energy": -29.9,
            "seq": "CUUCCUAACAGCACUCAUGCACUGUAAGCGACCGGCUGUCUACCACGUCGGCGUGGAAUCCUAGCUUCAGUAUCUACGUGUGUGCCAGCAGCGAGAUCCAACCGGUCUAGGUACGUGUUG",
            "struct": "........((((((...(((.(((.....((((((.((....(((((....)))))...............((((.(((.(((....)))))))))).)).)))))))))))).))))))",
        },
        "seq_pgt781_053": {
            "energy": -29.9,
            "seq": "AAAGCCUGGUACAGACGUCCUGAUUAUAAUUGCAGGUCCGCUAGCGCCGGGGGAGGCUCCCUUGAUGCCAGUCCUUAGAAGUUCCCAGAAAUAGCUAAUAUGGACAGUGUCCCCGAGGAA",
            "struct": "...(((((((...((...((((..........)))))).))))).))((((((.(((((....)).))).((((.((..((((.........))))..)).))))....)))))).....",
        },
        "seq_pgt781_054": {
            "energy": -27.8,
            "seq": "AAGAGCGCAUCUCUGGAUUCAGCAGCAUAGGUAGGCUUUAUCGGAUUUAUUAUGGAAAGCGUUUGACCAAGGCUAGAUAUCGUUAAUGUACACCGGUGUCCGGUUUCGGUCACCAACUGG",
            "struct": "..((((((.(((.((((((((((.((....))..))).....)))))))....)))..))))))((((.(((((.(((((((...........))))))).))))).)))).........",
        },
        "seq_pgt781_055": {
            "energy": -23.6,
            "seq": "GUAGACGAUAGCAGCUCAGCGAAUUGCAGAGUCUACCACUACUGAACAUGCACCCCUUAUGCAAUACCCCGUGAUAAGAAGCUCCUGGGUGUAAUGACCCGCUUACCAGUCUAUCCAGAG",
            "struct": "((((((...(((.((((.((.....)).))))..............((((((((((((((((........)).)))))........)))))).)))....))).....))))))......",
        },
        "seq_pgt781_056": {
            "energy": -34.3,
            "seq": "CUGCCCUUUACAUCGACUGACAGUGGCGUUGGGGUCUCGCAACGGUGCCGAUUGUUGACGAAAUACUAUACGACUGUGGCCAGUAUGAGAUGCCCAUUCUGUCGGUCCGAGGCCUCUUCG",
            "struct": "..............(((((((((......((((((((((..((.(.(((.((.((((.............)))).)))))).)).)))))).))))..)))))))))(((((...)))))",
        },
        "seq_pgt781_057": {
            "energy": -36.7,
            "seq": "GCUGAUCGCUAGCACGGUAGCCUUUGACCUUACGAAGAGGAGGUUCUAUACUGACAUGAUGAGGCCUGAUUCUUCCUGUCCACGAGGACGAUGUUAGCGGGGGUCGAGUGCACCCCAAAG",
            "struct": "......((((((((..((..((((.(((.....((((((.(((((.(((.(......)))).)))))..))))))..)))...))))))..))))))))((((((....).)))))....",
        },
        "seq_pgt781_058": {
            "energy": -21.6,
            "seq": "CAUUACAGUAAACAAAUUUACUUAGCAAGCUAGGUGUACUUAGAUUGGCGGUACCUUCAGUUUUUGCGCCACUCCCAACAGCGGAAAGAAAGUUAUUGCAAAAAACCCGUGUUCCGGAAC",
            "struct": "......((((((....))))))...(((.(((((....))))).)))((((((.(((...(((((.(((...........))).)))))))).)))))).......(((.....)))...",
        },
        "seq_pgt781_059": {
            "energy": -40.2,
            "seq": "GACGUGUACUGUCUCGGUACUGGUUCACUCUAUGAAGCCUCGGAACACCUAUGCGAGUUGCCGAAUCUGAGAUCGGCCCGCCGCAAAGGUUUAAUUCGCGGGGGGUCCUCGCGCGUUUCG",
            "struct": ".....((((((...)))))).((((((.....)).)))).((((((((((.((((.((.(((((........)))))..)))))).))))......(((((((...))))))).))))))",
        },
        "seq_pgt781_060": {
            "energy": -34.4,
            "seq": "UCCGGCCACCAUACUCUUAGUUUACAGGUCCGCGAGAUGUGUGAACCCGUGGCUCAAAGGCGUGACCUGCACGAUUGGGUGUUGGAGAAGCAACCCGCGCUUGUCUGGCUUAGCUACCAU",
            "struct": "...................(((((((.(((.....))).)))))))..((((((...((((..(((..((.(....(((((((.....))).))))).))..)))..))))))))))...",
        },
        "seq_pgt781_061": {
            "energy": -36.4,
            "seq": "GACAGUGCCAACGAAAGCUAUGUCACCCACUCAGGGCUCGUGUGUCUUGCGAUAAUUGGAGGAUCACUAUGGCUCCCUUUCCGUAAAGUGAGAAUCUCCCAACGCGGCCCUGCUUCGUAU",
            "struct": "((((..((........))..)))).......((((((.((((((((....)))....(((((.(((((((((........))))..)))))...)))))..)))))))))))........",
        },
        "seq_pgt781_062": {
            "energy": -26.7,
            "seq": "UCGAUCGUACGGUGACGACAGGGCAGUCUAGCACGACCGCCAAAAGUAAAUCCUGGCAGUAUCGAAGAAUACAUGUGACAUAGGAAGCGGGAAGUUGCGUCACGGAUACCUGGCAUUUUC",
            "struct": "......((((.((((((.((((((.(((......))).))).........((((((((((((......)))).)))....))))).........))))))))).).)))...........",
        },
        "seq_pgt781_063": {
            "energy": -24.4,
            "seq": "GGACGGUGCAUUACAUGCUCCCCCUGUUAGCGACAUUACUGAGCUCUCCAUGCCACAGACCUGACAUAGGUAACUCCCCAUUAUACCGUCGGGCUUCCAUCUUUAGACUGAUUGUCUUCU",
            "struct": "(((..((((((.....((((....((((...)))).....)))).....))).)))((.((((((...((((...........)))))))))))))))......((((.....))))...",
        },
        "seq_pgt781_064": {
            "energy": -27.7,
            "seq": "GUGCCUCCAAACGUACCCAGCGCGUCCAUUGUAAAGGAGACACCUACACUUUGAGGUAAGUUAUGAGAAAGUCGGUUUAAACCCACUCUUCAGAUUGACGGCACGCGGGUAAGUAGGACU",
            "struct": ".....(((..((.(((((.(((.(((((..((..(((.....)))..))..))......((((...((((((.(((....))).))).)))....))))))).)))))))).)).)))..",
        },
        "seq_pgt781_065": {
            "energy": -28.0,
            "seq": "GGCAAUGGGGAGCUAAAUAUACACGUUAUAGCAACACGGAGGAGUCUCGAAGGGUGUUUUGAAGGACUCUGUCGAUGAUCGUACUGAUGUCGGUUGAUCUAAGUGAAUAUACGACACGGU",
            "struct": "...........(((((((......))).))))..(((((.((((((((((((....))))))..)))))).))).)).....((((.(((((..((.((.....)).))..)))))))))",
        },
        "seq_pgt781_066": {
            "energy": -28.3,
            "seq": "CAAGCAGGGGCCGCAUAGAGGCCUGCCACACGGACUUACAUACCAAGCCAUAGGAGCAUCUGCCAGUGUCAAGGUCAUCCACUGCAUACCCAUGGAUCAUAGCACUCGUGCUCCGUCGUU",
            "struct": "...(((..((((.......))))))).....((.(((.......)))))...(((((((.....(((((....((.(((((.((......))))))).)).))))).)))))))......",
        },
        "seq_pgt781_067": {
            "energy": -23.2,
            "seq": "CAGGCUCACCAAUGUGUUUGGGAUUAUUAAUGACAGCAGUUCUGUGGUGAUAUUUCCAGCACGAGAAAAGGCGAAGUAGUAAAAUAAAUCGAAAUCUUGGUAGUGAUGGCUCCUUACGGU",
            "struct": "...(((......((((((.((((.(((((.(.((((.....)))).)))))).))))))))))......))).(((.(((.......(((((....))))).......))).))).....",
        },
        "seq_pgt781_068": {
            "energy": -34.3,
            "seq": "CAGGUCUUUGAACCAAGGCCCGAGUAUAAAUUCUCGUCAGGCUGGAGGCGAUGUCAAGUGUGCGGCUCAGCUAGCAAGCCUGGGGGCAAACAAGCAAGGUGCUGUAUCGUUGUAUCAUUC",
            "struct": "(((..(((((.......(((((((........))).((((((((..(((...(((........)))...)))..).))))))))))).......)))))..)))................",
        },
        "seq_pgt781_069": {
            "energy": -29.9,
            "seq": "UCUCUGCGCUCGUCUCACUGUGAGGAGAGUACUUAUGAACACGAGAUGUUGUAUGCGUGCACUAGUGAAUGCUAGCCAUAGCGAAUCGGCUCCUGGCUAUAACGCCCGAGAAUUUCUUUC",
            "struct": "((((.((((((.(((((...))))).)))((((..((..((((............))))))..)))).....((((((.(((......)))..))))))...)))..)))).........",
        },
        "seq_pgt781_070": {
            "energy": -36.5,
            "seq": "AAAGGCGGCGGGAGAGGGAUUUUAGCUUUUGAUGAAGGGCUAUUACACAGCCCCGUCCCGGCUUGUAGAUUACAAUGUUUGGAGGACUUAACUACUGCCCUAUUAGUCUUAGGACUACAG",
            "struct": "...((((((((((..(((....((((((((....))))))))........)))..))))).(((.(((((......))))).))).........)))))....(((((....)))))...",
        },
        "seq_pgt781_071": {
            "energy": -22.2,
            "seq": "AGCUAUUUCCGCGUCUCUGCGCAGAAAUCGCGCCGGCAAACAAACGAAAUUGUAUGUUCAUCCCUUCGACACUGCAUGACAUGAUCGUGUUACCCUUGGUUUUACCUGACGCUUUUCCAU",
            "struct": "..........(((((...((((.......)))).((..(((..((((...(((((((...((.....))....)))).)))...)))))))..))..(((...))).)))))........",
        },
        "seq_pgt781_072": {
            "energy": -29.4,
            "seq": "UACAGGUCCAGACUUCGUAAGAAGCUGUCGCGUCUAUGAGCCUAAAAUUGAAUAUUGCGGCAUAGGAAGGAGUAUACACAGCGUCGAGCCGAGAUACUUUAGGAGGGGCGAUCCGCGCAU",
            "struct": "........(((.((((....)))))))..((((......((((....(((((((((.((((....((.(..((....))..).))..)))).)))).)))))...)))).....))))..",
        },
        "seq_pgt781_073": {
            "energy": -30.5,
            "seq": "UUUUUAGAGGCAACAGGACUGAAGGUGAGUCGGAAACGCGGCAGUAACAAUCUAUUCCACAGCGAUCGGGGGGUCGUUUCGAUGGCAAAUAGUCGUGCGGACUAACCACGCCUGCCUAGA",
            "struct": ".......(((((...(((..((..((..((((......))))....))..))...)))..(((((((....))))))).....(((...(((((.....))))).....))))))))...",
        },
        "seq_pgt781_074": {
            "energy": -29.6,
            "seq": "AGGACAGGAGAUGCUUUCGCGCUUGGUACGGCCCCACAAGUUGAAGCCUCUGACGUGACGUAAUAAUGGUGUUUCGGUGCGAAGAAAACUGUUGUAACCUGUGUCGGGUCACCCCGCUUU",
            "struct": "...((((((((.(((((...(((((...........))))).))))).))).(((...))).((((((((.((((........))))))))))))..)))))(.((((....)))))...",
        },
        "seq_pgt781_075": {
            "energy": -28.1,
            "seq": "CUGCCGAAGGUUAAGAGUGCGUCAUUGGAGGUAGAAGGACGCCCAGAAUUGGUAAUAAUCUCGGGUCCACUUACAGGGAUUCUAAACGGUCGGGACGCAGGAAGGCAUGACAGGUGUUAC",
            "struct": "...((((..(((.(((((.(....(((..(((....((((.((.(((.(((....)))))).)))))))))..)))).))))).)))..))))(((((.(..(....)..)..)))))..",
        },
        "seq_pgt781_076": {
            "energy": -27.2,
            "seq": "GAUCGCCGUAAUCGCUACGAGGUCAGGUAGCUGAAUCCAACGAUACUAAUACAUCCGACUUUAAGUCAAUGAGUAUUUUGCGUAACAGUCGGGCCAACGCUGUAUUGCUUCCAGCUUGCG",
            "struct": "((((..((((.....)))).))))..(((((((.......((((((.......((((((((((.(.(((........)))).))).)))))))........))))))....)))).))).",
        },
        "seq_pgt781_077": {
            "energy": -25.4,
            "seq": "GGUAUCACUCAUCUUACACUAAGCGCAACGAUAUCAGUAUGCAAUAUGGGGCUCCUCCUCCGCACGGACCCAUCGUACGCGUGGACUUUAUUCGCUGUUCAGUAGAUCCAGUGGUGUAUA",
            "struct": "..(((((((.((((.......((((....((((....(((((..(((((((.(((..........))))))..)))).))))).....)))))))).......))))..)))))))....",
        },
        "seq_pgt781_078": {
            "energy": -29.4,
            "seq": "AUCAACUGAUAUCGAUCAUAGCGACUAGAGGUGCAAUUUGUGGCACACGGGUUCAGCCGACUUAGAAGUGCUCAAUUAGCACGUAGGCUGGGCACGACAGAGACGUUAUCAUGGGACUAA",
            "struct": "............(.((.((((((.((....((((........)))).((.((((((((.((......(((((.....))))))).)))))))).))....)).)))))).)).)......",
        },
        "seq_pgt781_079": {
            "energy": -21.2,
            "seq": "GCGGUUCGUGAUGACCCGUUUUGACCGUGUGCAAGGGCCAAUCUGAGAGUAUUACAUGUGGAAGCCUUCUGUUCAGAAUACAAGCCAAGCCUAGAAAUCUCUCCGCACCCUUCGGGAUUA",
            "struct": "(((((.((.((((...)))).))))))).((.(((((.......((((..........(((.....((((....))))......)))..........))))......)))))))......",
        },
        "seq_pgt781_080": {
            "energy": -34.0,
            "seq": "CGAUACUGAGCUUAGGUGGUGUCGUCCCGAGGCAAUCUCGUUGUUUAGGAUUGUCAGUUUGAGCCAUGGUGCUUGUACGUGAGAAGGCGAAGUACUUAUACGUUGCCCGCGUGCUUUAGU",
            "struct": ".......((((....(((((.(((......(((((((.(........))))))))....))))))))...))))(((((((....(((((.(((....))).))))))))))))......",
        },
        "seq_pgt781_081": {
            "energy": -29.2,
            "seq": "CCAUGGGGAGCGCGGACGAGUCGGUCACUAUCUAAGCUGACUUGUACGGGUUGACAAUUGACACUGCAGAUAAAGAGCAUUGCAAGAUGGACUUGCUUAACAGGACGUCACUUCGAACUA",
            "struct": "....(((((((.((.((((((((((..........)))))))))).)).))).....(((.((.(((.........))).)))))((((..((........))..)))).))))......",
        },
        "seq_pgt781_082": {
            "energy": -25.4,
            "seq": "AGUGAACAAUCGCAGGGAAUAAUUGCACCAAGGCACGUGUGUAAUCAAGAGGGUGUUGCACGUCUGCAAGGGAUUUCCAACGAGUCUAUUGAUAAACCGCUUAAUAUAUCUCGCGUCGUG",
            "struct": ".((((....)))).((((((..(((((.....(.(((((((..(((.....)))..)))))))))))))...))))))..((((..((((((........))))))...)))).......",
        },
        "seq_pgt781_083": {
            "energy": -23.5,
            "seq": "CCGAACGCCACAAGGCUAAAGUCACACAUUCAUAACAUGUCGUUUUGCAUCCGGCGUCCCUACACUACCUCUGAUUCCAAGCUAAGUAAUUGGCGAUUCUGACGAUGUGAGGUGUGCAAU",
            "struct": "......(((....)))....(.(((((.(((((.....((((((..(.(((.((.(((..............))).))..(((((....)))))))).).)))))))))))))))))...",
        },
        "seq_pgt781_084": {
            "energy": -25.6,
            "seq": "GCUAAAACCCUCCAUAUCGUACAACGAGCUCCUAAAAAAGGGGCAUACUCCAUUGCUGAAGAGCCAUUAUCCAGUGCCUUCAGGGUUUGCCCCCAAAAUAAGUCAAUUAGACACUGUAGU",
            "struct": "................((((...))))............((((((.(((......((((((.(((........).))))))))))).))))))........(((.....)))........",
        },
        "seq_pgt781_085": {
            "energy": -31.1,
            "seq": "CGCGGACGUGCGUCGCAAGGAAAGAUUCUUACGACUAAUUUCGGCUUGGAACUAGUUUGCGUACACAUCAUUCGAUGCCAGCCCCGUCUGACGACAUACUGCUGUCAUAUCUCAGCGCGA",
            "struct": "((((((((.((...(((..(((.(((...((((((((.((((.....)))).))))...))))...))).)))..)))..))..)))))).))......(((((........)))))...",
        },
        "seq_pgt781_086": {
            "energy": -28.4,
            "seq": "UUGCCGAUCAAGAGAGCGGCAGGACCAUUUCAAACAGGUACAAUGUGUGGUUUCGUCAGGGCGUUAGUUGCAAAUCCCACCGGUUCGACUUGGGAAAAGCAGAAAUGCGGUAAAAUUACG",
            "struct": ".(((((.((....)).)))))(((((((.....(((.......)))))))))).......(((((..((((...(((((..(((...))))))))...)))).)))))............",
        },
        "seq_pgt781_087": {
            "energy": -21.3,
            "seq": "CUCGGACCACGUCCUCUUAUCCUACGUACAUCACGACCUGCUAGGACAUACCUUUCUGCAGUUAGAACUCAGUAGACGCUCAACAGACGAGUUUUUUUUCUAUUAUCGACACUGGUCGUG",
            "struct": "...((((...)))).................(((((((....(((.....))).((((((((....)))..))))).((((.......)))).....................)))))))",
        },
        "seq_pgt781_088": {
            "energy": -22.9,
            "seq": "CAUAACCCGGAUCCAUUUACGGAAGGCCCACCACAAGUCCAGACAGAAUAGCAAACAGAACGGAUCAGGUGGAGCAGGAUCUCGAAAGUUGUAACAGAAGAGAAAUUUCCUCCGUACAUA",
            "struct": ".......(((((((......)))..(((((((....((((.....................))))..))))).)).(((((((....((....))....))))....)))))))......",
        },
        "seq_pgt781_089": {
            "energy": -23.2,
            "seq": "GAUCUCCGUAGGCACCCGCGGCUCUCGACGGAACCUUAUCGCGGCAAAAAAGCACCGGAUUCCCAAGACCAAACCCUGCCUUUCGCAACUCUAUACCCGCAGGUCAGUCCUGCUUCCUAA",
            "struct": "......((.(((((.....((.(((....((((.....(((..((......))..))).))))..)))))......)))))..)).............(((((.....))))).......",
        },
        "seq_pgt781_090": {
            "energy": -33.6,
            "seq": "UCUGCUAAGGGCAGCGGCUUCAUGGUGGUUUGGCGCGUGACCCUUUUUGUGACGCUUAACCUUUUAGGUUUGCCGCCCGACCUAUUGGCGAUGUGCUUCCUUCCCCAGAAUCGUUGUUAC",
            "struct": ".........((((((((.(((.(((.((...(((((((.((.......)).))((..(((((...))))).))((((.........))))..))))).....))))))))))))))))..",
        },
        "seq_pgt781_091": {
            "energy": -19.8,
            "seq": "GAUCUUUCCAAAAACCUGGCGCCGUAGGAUUACAUACUAACAUGGGGUGAUAAUAGCUUGAAUACGAUCGCACUUGCAUUCUCUUUCCACUAGGGACGGAACAGGCUUAUUGGCAACGCG",
            "struct": ".......((((.((((((.((((.(((.............((.((.(((((..((.......))..))))).)))).............))).)).))...)))).)).)))).......",
        },
        "seq_pgt781_092": {
            "energy": -28.7,
            "seq": "UGGCCAAUACCCCAGCGAGCUUGGUGCUCAGAUCAGUCCGCGCACUGACCAAGGAAGCAUUUUGUGUCUGCAUAUAUGAGUAGUAUCCGUCCUUUGACAGUUCAGGCUGCUUGUGGGUCA",
            "struct": "........((((((((.((((((((((............))))((((.(.(((((........(((.((((........)))))))...))))).).)))).)))))))).)).))))..",
        },
        "seq_pgt781_093": {
            "energy": -21.0,
            "seq": "CGUCCAGCAUUUUCCGCGGAUUGCUACCGGAGGACUACCAAUCACUCUUCGCAAGAAUAAACGCCUUCCUAAUAUGCUGAGGUCGACUCGCAUGAAAGUAAAAACGAGAGCGAAACAUCC",
            "struct": ".((((.......((((.(........)))))))))............(((((..........((.(((.....((((.(((.....)))))))))).))..........)))))......",
        },
        "seq_pgt781_094": {
            "energy": -30.5,
            "seq": "AAACUAACUUCCGCCAUUUUUUCACCGGGCAACCGCCGGUGUUCUCCCAAGAAAGGCUUGAUUGGUGUGUUACACGGUGGGUAACAGCAGGGUUCACAUAAGACCCCGGUCAUCGGUUUA",
            "struct": "............(((.((((((((((((.......)))))).......)))))))))..((((((((((((((.(....)))))))((.(((.((......)).))).))))))))))..",
        },
        "seq_pgt781_095": {
            "energy": -39.0,
            "seq": "AAUUGGUUGGGUCUUACUAGUCGACCUUUAUGAUCAGUGGGUGGGUGCCCGACGCCGCGGUCCUCAUCGUUGCCACUUGUGGCCCACCCGGACUGUGCUUGGUUCUCGGAUCCGUGCUAU",
            "struct": "...(((((((((((.....(..((((.....(..((((((((((..((((((.((.(((((....))))).))...))).)))))))))..))))..)..))))..)))))))).)))).",
        },
        "seq_pgt781_096": {
            "energy": -32.0,
            "seq": "GUGACAGAAGCAUUCGAACAAAUCGGGGCAGGCGAGUGUGGCUUAAUGGAGGAGGAAAUCGUGUCGACCUUCUACUGUUACUGAUAAAUUCUACUUGCGUUAAGCACCGCGUGCACGGCC",
            "struct": ".............((((.....))))(((.((((.(((..((((((((.(((((((.((((.((.(((........)))))))))...)))).))).))))))))..))).))).).)))",
        },
        "seq_pgt781_097": {
            "energy": -27.2,
            "seq": "GGGCGGUCCUACAUUUGUUUAGUUGUAAGUAGCUCCAGGUCCCGUAAAGGCAGUGCCGGUAGCUAUUCUGUGUGCGGUACAUGAACCACGAGAAUCCAAUCUUUUCAUCCCAGCCGGGAA",
            "struct": "((((((..((((................))))..))..))))(((.....((((((((...((......))...)))))).))....))).................((((....)))).",
        },
        "seq_pgt781_098": {
            "energy": -26.1,
            "seq": "CCAUUCUGUUUGCGCUUAUUAUUGAAGGUCCCGGGCACUGUCACGAUAACCUGCUAUCGUUCUAUGGUGUCUCAUUGAGUUGGCUGUCUUAGCGCCUGACCGUACUAACGACGCUGGGCA",
            "struct": "(((....(((.(((((.........((.((..(((((((((.((((((......))))))...)))))))))....)).)).........)))))..)))(((....)))....)))...",
        },
        "seq_pgt781_099": {
            "energy": -37.5,
            "seq": "UGACUGACCCUAAAGCACUGCGAUAUUCCGGUGUCUACUGGCUUUCCGGGCCUCCUAGCGGGCCCAUAGAGCAGUUAUCGCGUAAUGAUCGCCACGAAACGUGAGUGGCAGUACCGACUA",
            "struct": "..............((((((.((...))))))))..((((.((((..((((((......))))))..))))))))..(((.(((.((.((((((((...)))).)))))).))))))...",
        },
        "seq_pgt781_100": {
            "energy": -35.6,
            "seq": "CCCUGCGGGCUGUGCGGACUAAAUACGCCCUUCCAACCACCGCGGAGGUGGAAAAAUUCGUAGCGGAGGCGAGGUAGGUGCUUAGCGGCGCGAUUCCCCGUCCAUUGCCAUGCAAACUAG",
            "struct": "(((((((((..(.(((.........))).)..))..(((((.....))))).......))))).)).((((.((...(((((....)))))....)).))))..((((...)))).....",
        },
    }

    # Loop through all sequences in dictionary of sequences
    for sequence in rnafold.keys():

        # Get the RNA sequence of the current iteration
        RNAseq = rnafold[sequence]["seq"]

        # Calculate Nussinov scoring matrix without and with stacked basepair scoring
        nussinov_result = nussinov(RNAseq)
        nussinov_scored_result = nussinov(RNAseq,
                                          use_scoring=True)

        # Backtrack the Nussinov scoring matrices to get structures in dot-bracket-notation
        backtrack_nussinov_result = backtrack(nussinov_result, RNAseq)
        backtrack_nussinov_scored_result = backtrack(nussinov_scored_result, RNAseq)

        # Save the determined structure in dot-bracket-notation to the dictionary of current iteration sequence
        rnafold[sequence]["nussinov"] = backtrack_nussinov_result
        rnafold[sequence]["nussinov_scored"] = backtrack_nussinov_scored_result

        # Calculate pairwise basepair distances
        # 1. Nussinov vs RNAfold
        # 2. Nussinov Scored vs RNAfold
        # 3. Nussinov Scored vs Nussinov
        rnafold[sequence]["bpdist_nus_rna"] = basepair_distance(rnafold[sequence]["nussinov"],
                                                                  rnafold[sequence]["struct"])
        rnafold[sequence]["bpdist_nus_scr_rna"] = basepair_distance(rnafold[sequence]["nussinov_scored"],
                                                                      rnafold[sequence]["struct"])
        rnafold[sequence]["bpdist_nus_scr_nus"] = basepair_distance(rnafold[sequence]["nussinov_scored"],
                                                                      rnafold[sequence]["nussinov"])

    # Lists which are going to contain all pairwise basepair distances
    # 1. Nussinov vs RNAfold
    # 2. Nussinov Scored vs RNAfold
    # 3. Nussinov Scored vs Nussinov
    comparison_nus_rna = []
    comparison_nus_scr_rna = []
    comparison_nus_scr_nus = []

    # Loop through all sequence and append pairwise basepair distances to the lists above
    # Could be implemented during the loop before, but for simplicity we loop a second time
    for sequence in rnafold:
        comparison_nus_rna.append(rnafold[sequence]["bpdist_nus_rna"])
        comparison_nus_scr_rna.append(rnafold[sequence]["bpdist_nus_scr_rna"])
        comparison_nus_scr_nus.append(rnafold[sequence]["bpdist_nus_scr_nus"])

    # Calculate Pearson correlation coefficients for comparisons
    # 1. Nussinov vs RNAfold and Nussinov Scored vs RNAfold
    # 2. Nussinov Scored vs RNAfold and Nussinov Scored vs Nussinov
    # 3. Nussinov Scored vs Nussinov and Nussinov vs RNAfold
    pearsoncorr_plot_1, _ = pearsonr(comparison_nus_rna, comparison_nus_scr_rna)
    pearsoncorr_plot_2, _ = pearsonr(comparison_nus_scr_rna, comparison_nus_scr_nus)
    pearsoncorr_plot_3, _ = pearsonr(comparison_nus_scr_nus, comparison_nus_rna)

    # Make a figure and set size and spacing
    plt.figure(1, figsize=(13, 9), layout="tight")
    plt.subplots_adjust(hspace=0.3)

    # Scatter plot of basepair distances of Nussinov vs RNAfold and Nussinov Scored vs RNAfold
    plt.subplot(2, 2, 1)
    plt.scatter(comparison_nus_rna, comparison_nus_scr_rna)
    plt.title("Comparison of pairwise base pair distances\nPearson correlation coefficient: %.2f" % pearsoncorr_plot_1)
    plt.xlabel('Unmodified Nussinov vs RNAfold')
    plt.ylabel('Modified Nussinov vs RNAfold')

    # Scatter plot of basepair distances of Nussinov Scored vs RNAfold and Nussinov Scored vs Nussinov
    plt.subplot(2, 2, 2)
    plt.scatter(comparison_nus_scr_rna, comparison_nus_scr_nus)
    plt.title("Comparison of pairwise base pair distances\nPearson correlation coefficient: %.2f" % pearsoncorr_plot_2)
    plt.xlabel('Modified Nussinov vs RNAfold')
    plt.ylabel('Modified Nussinov vs Unmodified Nussinov')

    # Scatter plot of basepair distances of Nussinov Scored vs Nussinov and Nussinov vs RNAfold
    plt.subplot(2, 2, 3)
    plt.scatter(comparison_nus_scr_nus, comparison_nus_rna)
    plt.title("Comparison of pairwise base pair distances\nPearson correlation coefficient: %.2f" % pearsoncorr_plot_3)
    plt.xlabel('Modified Nussinov vs Unmodified Nussinov')
    plt.ylabel('Unmodified Nussinov vs RNAfold')

    # Sort the lists of compairsons
    comparison_nus_rna = np.sort(comparison_nus_rna)
    comparison_nus_scr_rna = np.sort(comparison_nus_scr_rna)
    comparison_nus_scr_nus = np.sort(comparison_nus_scr_nus)

    # Cumulative distributions functions
    cdf_nussinov_rnafold = np.cumsum(comparison_nus_rna) / np.sum(comparison_nus_rna)
    cdf_nussinov_scored_rnafold = np.cumsum(comparison_nus_scr_rna) / np.sum(comparison_nus_scr_rna)
    cdf_nussinov_scored_nussinov = np.cumsum(comparison_nus_scr_nus) / np.sum(comparison_nus_scr_nus)

    # Plot of cumulative distribution of basepair distances
    plt.subplot(2, 2, 4)
    plt.plot(comparison_nus_rna, cdf_nussinov_rnafold, label="Unmodified Nussinov vs RNAfold")
    plt.plot(comparison_nus_scr_rna, cdf_nussinov_scored_rnafold, label="Modified Nussinov vs RNAfold")
    plt.plot(comparison_nus_scr_nus, cdf_nussinov_scored_nussinov, label="Modified Nussinov vs Unmodified Nussinov")
    plt.title("Cumulative distribution of base pair distances\n")
    plt.xlabel("Base pair distance")
    plt.ylabel("p")
    plt.legend()

    # Save plots
    plt.savefig("rna.png")
