ionnich commited on
Commit
ac0ef66
1 Parent(s): 571b645

init hashtable commit

Browse files
app.y ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ from dotenv import load_dotenv
3
+ from subprocess import Popen
4
+ load_dotenv()
5
+
6
+ command = ["mercury", "run", f"0.0.0.0:{os.environ.get('PORT', 7860)}"]
7
+ worker = Popen(command)
8
+ worker.wait()
data_processing/__pycache__/distribution_parser.cpython-310.pyc ADDED
Binary file (2.22 kB). View file
 
data_processing/__pycache__/generate_kmers.cpython-310.pyc ADDED
Binary file (996 Bytes). View file
 
data_processing/__pycache__/graph_distribution.cpython-310.pyc ADDED
Binary file (2.74 kB). View file
 
data_processing/__pycache__/superfasthash.cpython-310.pyc ADDED
Binary file (1.9 kB). View file
 
data_processing/distribution_parser.py ADDED
@@ -0,0 +1,108 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from data_structures import hash_table as hashing
2
+
3
+
4
+ def get_unique_kmers(kmer_distribution):
5
+ """
6
+ Creates a kmer distribution composed of only unique kmers
7
+ """
8
+ unique_kmers = []
9
+ for kmer in kmer_distribution:
10
+ # if the kmer only appears once, add it to the list
11
+ if kmer[1] == 1:
12
+ unique_kmers.append(kmer)
13
+
14
+ return unique_kmers
15
+
16
+
17
+ def get_most_common_kmers(kmer_distribution, n):
18
+ """
19
+ Creates a list of the n most common kmers
20
+ """
21
+ most_common_kmers = []
22
+
23
+ for _ in range(n):
24
+ highest_count = 0
25
+ most_common_kmer = None
26
+ for kmer in kmer_distribution:
27
+ if kmer[1] > highest_count and kmer not in most_common_kmers:
28
+ highest_count = kmer[1]
29
+ most_common_kmer = kmer
30
+
31
+ if most_common_kmer:
32
+ most_common_kmers.append(most_common_kmer)
33
+
34
+ return most_common_kmers
35
+
36
+
37
+ def parse_table(table: hashing.hash_table, kmer_list):
38
+ """
39
+ Parses the hash table and returns a list of tuples containing the kmer and the count
40
+ """
41
+
42
+ kmer_distribution = []
43
+
44
+ unique_kmers = set(kmer_list)
45
+
46
+ for kmer in unique_kmers:
47
+ if table.search(kmer) is not None:
48
+ kmer_distribution.append((kmer, table.search(kmer)))
49
+
50
+ return kmer_distribution
51
+
52
+
53
+ def get_kmers_with_count(kmer_distribution, count):
54
+ """
55
+ Creates a list of kmers whose occurrences are equal to the count
56
+ """
57
+ kmers_with_count = []
58
+ for kmer in kmer_distribution:
59
+ if kmer[1] == count:
60
+ kmers_with_count.append(kmer)
61
+
62
+ return kmers_with_count
63
+
64
+
65
+ def parse_math_expression(expression):
66
+ """
67
+ Parses a math expression and returns the result
68
+ """
69
+
70
+ num = 0
71
+
72
+ # if expression contains ^, then it is a power
73
+ if "^" in expression:
74
+ # split the expression into the base and the exponent
75
+ base = int(expression.split("^")[0])
76
+ power = int(expression.split("^")[1])
77
+ return base ** power
78
+
79
+ # if expression contains *, then it is a multiplication
80
+ if "*" in expression:
81
+ # split the expression into the two factors
82
+ factor1 = int(expression.split("*")[0])
83
+ factor2 = int(expression.split("*")[1])
84
+ return factor1 * factor2
85
+
86
+ num = int(expression)
87
+ return num
88
+
89
+
90
+ def get_inputs():
91
+ """
92
+ Gets user input for kmer distribution generation
93
+ """
94
+
95
+ alphabet = input("Enter the dna alphabet: ")
96
+ dna_length = (input("Enter the length of the dna: "))
97
+ k_mer = input("Enter the length of the kmer: ")
98
+
99
+ dna_length = parse_math_expression(dna_length)
100
+ k_mer = parse_math_expression(k_mer)
101
+
102
+ # return an object containing the alphabet, dna length, and kmer length
103
+
104
+ return {
105
+ "alphabet": alphabet,
106
+ "dna_length": dna_length,
107
+ "kmer_length": k_mer
108
+ }
data_processing/generate_kmers.ipynb ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": 79,
6
+ "metadata": {},
7
+ "outputs": [],
8
+ "source": [
9
+ "# this function is a recursive function that imitates the factorial operation\n",
10
+ "def generate_kmers(dna_sequence, k):\n",
11
+ "\n",
12
+ " kmers = []\n",
13
+ " pivot = 0\n",
14
+ " def generate(kmers, dna_sequence, k, pivot):\n",
15
+ " if(len(dna_sequence) < k):\n",
16
+ " return kmers\n",
17
+ "\n",
18
+ " candidate = dna_sequence[pivot:pivot+k]\n",
19
+ " kmers.append(candidate)\n",
20
+ "\n",
21
+ " return generate(kmers, dna_sequence[1:], k, pivot)\n",
22
+ "\n",
23
+ " return generate(kmers, dna_sequence, k, pivot)"
24
+ ]
25
+ }
26
+ ],
27
+ "metadata": {
28
+ "kernelspec": {
29
+ "display_name": "Python 3.10.8 64-bit",
30
+ "language": "python",
31
+ "name": "python3"
32
+ },
33
+ "language_info": {
34
+ "codemirror_mode": {
35
+ "name": "ipython",
36
+ "version": 3
37
+ },
38
+ "file_extension": ".py",
39
+ "mimetype": "text/x-python",
40
+ "name": "python",
41
+ "nbconvert_exporter": "python",
42
+ "pygments_lexer": "ipython3",
43
+ "version": "3.10.8"
44
+ },
45
+ "orig_nbformat": 4,
46
+ "vscode": {
47
+ "interpreter": {
48
+ "hash": "b0fa6594d8f4cbf19f97940f81e996739fb7646882a419484c72d19e05852a7e"
49
+ }
50
+ }
51
+ },
52
+ "nbformat": 4,
53
+ "nbformat_minor": 2
54
+ }
data_processing/generate_kmers.py ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # %%
2
+ import random
3
+
4
+
5
+ def generate_kmers(dna_sequence, k):
6
+ """
7
+ A function that generates all the kmers of length k from a dna sequence
8
+ """
9
+
10
+ kmers = []
11
+ pivot = 0
12
+
13
+ def generate(kmers, dna_sequence, k, pivot):
14
+ while (pivot + k <= len(dna_sequence)):
15
+ candidate = dna_sequence[pivot:pivot+k]
16
+ kmers.append(candidate)
17
+ pivot += 1
18
+ return kmers
19
+
20
+ return generate(kmers, dna_sequence, k, pivot)
21
+
22
+
23
+ # %%
24
+ def create_dna_sequence(bases, length):
25
+ """
26
+ Generates a random dna sequence of the desired length using the bases provided
27
+ """
28
+ sequence = ""
29
+ for i in range(length):
30
+ # get a random base
31
+ sequence += bases[random.randint(0, len(bases) - 1)]
32
+
33
+ return sequence
34
+
35
+ # %%
data_processing/graph_distribution.py ADDED
@@ -0,0 +1,108 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import plotly.graph_objects as go
2
+ from matplotlib import pyplot as plt
3
+ from collections import Counter
4
+ from prettytable import PrettyTable
5
+
6
+
7
+ def print_hashing_statistics(tabulated_data, title):
8
+ """
9
+ Creates and prints the tabulated performance data for the hash table
10
+ """
11
+
12
+ table = PrettyTable(
13
+ ["Hash Function", "Insertion Time", "Parsing Time", "Collisions"])
14
+
15
+ table.title = title
16
+
17
+ table.add_row([tabulated_data["Hash Function"][0], tabulated_data["Insertion Time"]
18
+ [0], tabulated_data["Parsing Time"][0], tabulated_data["Collisions"][0]])
19
+ table.add_row([tabulated_data["Hash Function"][1], tabulated_data["Insertion Time"]
20
+ [1], tabulated_data["Parsing Time"][1], tabulated_data["Collisions"][1]])
21
+
22
+ print(table)
23
+
24
+
25
+ def py_bar_graph(kmer_distribution):
26
+ """
27
+ Creates a bar graph using matplotlib
28
+ """
29
+
30
+ kmer_len = len(kmer_distribution[0][0])
31
+ kmer_count = len(kmer_distribution)
32
+
33
+ title = str(kmer_count) + " Kmer Distribution for " + \
34
+ str(kmer_len) + "-mers"
35
+
36
+ x_title = "Kmer"
37
+ y_title = "Count"
38
+
39
+ x = list()
40
+ y = list()
41
+
42
+ for kmer in kmer_distribution:
43
+ x.append(kmer[0])
44
+ y.append(kmer[1])
45
+
46
+ plt.bar(x, y)
47
+ plt.title(title)
48
+ plt.xlabel(x_title)
49
+ plt.ylabel(y_title)
50
+ plt.show()
51
+
52
+
53
+ def bar_graph(kmer_distribution):
54
+ """
55
+ Creates a bar graph using plotly
56
+ """
57
+
58
+ kmer_len = len(kmer_distribution[0][0])
59
+ kmer_count = len(kmer_distribution)
60
+
61
+ title = str(kmer_count) + " Kmer Distribution for " + \
62
+ str(kmer_len) + "-mers"
63
+
64
+ x_title = "Kmer"
65
+ y_title = "Count"
66
+
67
+ x = list()
68
+ y = list()
69
+
70
+ for kmer in kmer_distribution:
71
+ x.append(kmer[0])
72
+ y.append(kmer[1])
73
+
74
+ fig = go.Figure(data=[go.Bar(x=x, y=y)])
75
+ fig = fig.update_layout(
76
+ title=title,
77
+ xaxis_title=x_title,
78
+ yaxis_title=y_title,
79
+ )
80
+ fig.show()
81
+
82
+
83
+ def pie_chart(kmer_distribution):
84
+ """
85
+ Creates a pie chart using plotly
86
+ """
87
+
88
+ x = list()
89
+ y = list()
90
+
91
+ for kmer in kmer_distribution:
92
+ x.append(kmer[0])
93
+ y.append(kmer[1])
94
+
95
+ fig = go.Figure(data=[go.Pie(labels=x, values=y)])
96
+ fig.show()
97
+
98
+
99
+ def histogram(kmer_distribution):
100
+ """
101
+ Prints the kmer distribution as a primitive vertical histogram
102
+ """
103
+
104
+ histogram = Counter([kmer[0] for kmer in kmer_distribution])
105
+ for key in sorted(histogram):
106
+ count = histogram[key]
107
+ padding = (max(histogram.values()) - count) * " "
108
+ print(f"{key:3} {'■' * count}{padding} ({count})")
data_structures/__pycache__/binary_search_tree.cpython-310.pyc ADDED
Binary file (3.11 kB). View file
 
data_structures/__pycache__/hash_table.cpython-310.pyc ADDED
Binary file (2.85 kB). View file
 
data_structures/binary_search_tree.ipynb ADDED
@@ -0,0 +1,209 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": 7,
6
+ "metadata": {},
7
+ "outputs": [],
8
+ "source": [
9
+ "class node:\n",
10
+ " # constructor\n",
11
+ " def __init__(self) -> None:\n",
12
+ " self.left = None\n",
13
+ " self.right = None\n",
14
+ " self.value = None\n",
15
+ " self.counter = 0\n",
16
+ "\n",
17
+ " def _display_aux(self):\n",
18
+ " \"\"\"Returns list of strings, width, height, and horizontal coordinate of the root.\"\"\"\n",
19
+ " # No child.\n",
20
+ " if self.right is None and self.left is None:\n",
21
+ " line = '%s : %s' % (self.counter, self.value)\n",
22
+ " width = len(line)\n",
23
+ " height = 1\n",
24
+ " middle = width // 2\n",
25
+ " return [line], width, height, middle\n",
26
+ "\n",
27
+ " # Only left child.\n",
28
+ " if self.right is None:\n",
29
+ " lines, n, p, x = self.left._display_aux() # type: ignore\n",
30
+ " s = '%s : %s' % (self.counter, self.value)\n",
31
+ " u = len(s)\n",
32
+ " first_line = (x + 1) * ' ' + (n - x - 1) * '_' + s\n",
33
+ " second_line = x * ' ' + '/' + (n - x - 1 + u) * ' '\n",
34
+ " shifted_lines = [line + u * ' ' for line in lines]\n",
35
+ " return [first_line, second_line] + shifted_lines, n + u, p + 2, n + u // 2\n",
36
+ "\n",
37
+ " # Only right child.\n",
38
+ " if self.left is None:\n",
39
+ " lines, n, p, x = self.right._display_aux()\n",
40
+ " s = '%s : %s' % (self.counter, self.value)\n",
41
+ " u = len(s)\n",
42
+ " first_line = s + x * '_' + (n - x) * ' '\n",
43
+ " second_line = (u + x) * ' ' + '\\\\' + (n - x - 1) * ' '\n",
44
+ " shifted_lines = [u * ' ' + line for line in lines]\n",
45
+ " return [first_line, second_line] + shifted_lines, n + u, p + 2, u // 2\n",
46
+ "\n",
47
+ " # Two children.\n",
48
+ " left, n, p, x = self.left._display_aux()\n",
49
+ " right, m, q, y = self.right._display_aux()\n",
50
+ " s = '%s : %s' % (self.counter, self.value)\n",
51
+ " u = len(s)\n",
52
+ " first_line = (x + 1) * ' ' + (n - x - 1) * \\\n",
53
+ " '_' + s + y * '_' + (m - y) * ' '\n",
54
+ " second_line = x * ' ' + '/' + \\\n",
55
+ " (n - x - 1 + u + y) * ' ' + '\\\\' + (m - y - 1) * ' '\n",
56
+ " if p < q:\n",
57
+ " left += [n * ' '] * (q - p)\n",
58
+ " elif q < p:\n",
59
+ " right += [m * ' '] * (p - q)\n",
60
+ " zipped_lines = zip(left, right)\n",
61
+ " lines = [first_line, second_line] + \\\n",
62
+ " [a + u * ' ' + b for a, b in zipped_lines]\n",
63
+ " return lines, n + m + u, max(p, q) + 2, n + u // 2\n",
64
+ "\n",
65
+ " \n"
66
+ ]
67
+ },
68
+ {
69
+ "cell_type": "code",
70
+ "execution_count": 8,
71
+ "metadata": {},
72
+ "outputs": [],
73
+ "source": [
74
+ "def add_node(root, value):\n",
75
+ "\n",
76
+ " # if root is null, this node must be the root\n",
77
+ " if root is None:\n",
78
+ " root = node()\n",
79
+ " root.value = value\n",
80
+ " root.counter += 1\n",
81
+ " return root\n",
82
+ " if root.value is None:\n",
83
+ " root.value = value\n",
84
+ " return\n",
85
+ " # if value is less than root.value go to left nodes\n",
86
+ " if value < root.value:\n",
87
+ " # if the left node does not exist\n",
88
+ " if(root.left is None):\n",
89
+ " root.left = node()\n",
90
+ " root.left.value = value\n",
91
+ " root.left.counter += 1\n",
92
+ " else:\n",
93
+ " root.left = add_node(root.left, value)\n",
94
+ " \n",
95
+ " if value > root.value:\n",
96
+ " if(root.right is None):\n",
97
+ " root.right = node()\n",
98
+ " root.right.value = value\n",
99
+ " root.right.counter += 1\n",
100
+ " else:\n",
101
+ " root.right = add_node(root.right, value)\n",
102
+ "\n",
103
+ " if value == root.value:\n",
104
+ " root.counter += 1\n",
105
+ "\n",
106
+ " return"
107
+ ]
108
+ },
109
+ {
110
+ "cell_type": "code",
111
+ "execution_count": 9,
112
+ "metadata": {},
113
+ "outputs": [],
114
+ "source": [
115
+ "# returns the counter of a node\n",
116
+ "def search_value(root, value):\n",
117
+ "\n",
118
+ " if root is None:\n",
119
+ " return 0\n",
120
+ " \n",
121
+ " if root == value:\n",
122
+ " return root.counter\n",
123
+ "\n",
124
+ " if value < root.value:\n",
125
+ " return search_value(root.left, value)\n",
126
+ " \n",
127
+ " if value > root.value:\n",
128
+ " return search_value(root.right, value)\n",
129
+ " \n",
130
+ " # if we are at the bottom of the tree and the value has still not been found, the value must not be within the tree"
131
+ ]
132
+ },
133
+ {
134
+ "cell_type": "code",
135
+ "execution_count": 10,
136
+ "metadata": {},
137
+ "outputs": [],
138
+ "source": [
139
+ "def destroy_tree(root):\n",
140
+ "\n",
141
+ " # if a left node exists\n",
142
+ " if root.left is not None:\n",
143
+ " # recursively destroy the left node\n",
144
+ " destroy_tree(root.left)\n",
145
+ "\n",
146
+ " # if a right node exists\n",
147
+ " if root.right is not None:\n",
148
+ " # recursively destroy the right node\n",
149
+ " destroy_tree(root.right)\n",
150
+ "\n",
151
+ " # delete the root node\n",
152
+ " del root"
153
+ ]
154
+ },
155
+ {
156
+ "cell_type": "code",
157
+ "execution_count": 11,
158
+ "metadata": {},
159
+ "outputs": [],
160
+ "source": [
161
+ "def create_tree():\n",
162
+ " return add_node(None, None)"
163
+ ]
164
+ },
165
+ {
166
+ "cell_type": "code",
167
+ "execution_count": 12,
168
+ "metadata": {},
169
+ "outputs": [],
170
+ "source": [
171
+ "def show_tree(root):\n",
172
+ "\n",
173
+ " if(root is None):\n",
174
+ " return\n",
175
+ "\n",
176
+ " lines, *_ = root._display_aux()\n",
177
+ " for line in lines:\n",
178
+ " print(line)"
179
+ ]
180
+ }
181
+ ],
182
+ "metadata": {
183
+ "kernelspec": {
184
+ "display_name": "Python 3.10.8 64-bit",
185
+ "language": "python",
186
+ "name": "python3"
187
+ },
188
+ "language_info": {
189
+ "codemirror_mode": {
190
+ "name": "ipython",
191
+ "version": 3
192
+ },
193
+ "file_extension": ".py",
194
+ "mimetype": "text/x-python",
195
+ "name": "python",
196
+ "nbconvert_exporter": "python",
197
+ "pygments_lexer": "ipython3",
198
+ "version": "3.10.8"
199
+ },
200
+ "orig_nbformat": 4,
201
+ "vscode": {
202
+ "interpreter": {
203
+ "hash": "b0fa6594d8f4cbf19f97940f81e996739fb7646882a419484c72d19e05852a7e"
204
+ }
205
+ }
206
+ },
207
+ "nbformat": 4,
208
+ "nbformat_minor": 2
209
+ }
data_structures/binary_search_tree.py ADDED
@@ -0,0 +1,157 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # %%
2
+ class node:
3
+ # constructor
4
+ def __init__(self) -> None:
5
+ self.left = None
6
+ self.right = None
7
+ self.value = None
8
+ self.counter = 0
9
+
10
+ def _display_aux(self):
11
+ """Returns list of strings, width, height, and horizontal coordinate of the root."""
12
+ # No child.
13
+ if self.right is None and self.left is None:
14
+ line = '%s : %s' % (self.counter, self.value)
15
+ width = len(line)
16
+ height = 1
17
+ middle = width // 2
18
+ return [line], width, height, middle
19
+
20
+ # Only left child.
21
+ if self.right is None:
22
+ lines, n, p, x = self.left._display_aux() # type: ignore
23
+ s = '%s : %s' % (self.counter, self.value)
24
+ u = len(s)
25
+ first_line = (x + 1) * ' ' + (n - x - 1) * '_' + s
26
+ second_line = x * ' ' + '/' + (n - x - 1 + u) * ' '
27
+ shifted_lines = [line + u * ' ' for line in lines]
28
+ return [first_line, second_line] + shifted_lines, n + u, p + 2, n + u // 2
29
+
30
+ # Only right child.
31
+ if self.left is None:
32
+ lines, n, p, x = self.right._display_aux()
33
+ s = '%s : %s' % (self.counter, self.value)
34
+ u = len(s)
35
+ first_line = s + x * '_' + (n - x) * ' '
36
+ second_line = (u + x) * ' ' + '\\' + (n - x - 1) * ' '
37
+ shifted_lines = [u * ' ' + line for line in lines]
38
+ return [first_line, second_line] + shifted_lines, n + u, p + 2, u // 2
39
+
40
+ # Two children.
41
+ left, n, p, x = self.left._display_aux()
42
+ right, m, q, y = self.right._display_aux()
43
+ s = '%s : %s' % (self.counter, self.value)
44
+ u = len(s)
45
+ first_line = (x + 1) * ' ' + (n - x - 1) * \
46
+ '_' + s + y * '_' + (m - y) * ' '
47
+ second_line = x * ' ' + '/' + \
48
+ (n - x - 1 + u + y) * ' ' + '\\' + (m - y - 1) * ' '
49
+ if p < q:
50
+ left += [n * ' '] * (q - p)
51
+ elif q < p:
52
+ right += [m * ' '] * (p - q)
53
+ zipped_lines = zip(left, right)
54
+ lines = [first_line, second_line] + \
55
+ [a + u * ' ' + b for a, b in zipped_lines]
56
+ return lines, n + m + u, max(p, q) + 2, n + u // 2
57
+
58
+
59
+ # %%
60
+ def add_node(root, value):
61
+
62
+ # if root is null, this node must be the root
63
+ if root is None:
64
+ root = node()
65
+ if value is not None:
66
+ root.value = value
67
+ root.counter += 1
68
+ return root
69
+
70
+ if root.value is None and value is not None:
71
+ root.value = value
72
+ root.counter += 1
73
+ return root
74
+
75
+ # if value is less than root.value go to left nodes
76
+ if value < root.value:
77
+ root.left = add_node(root.left, value)
78
+ # if the left node does not exist
79
+ # if root.left is None:
80
+ # root.left = node()
81
+ # root.left.value = value
82
+ # if value is not None:
83
+ # root.left.counter += 1
84
+ # else:
85
+ # root.left = add_node(root.left, value)
86
+
87
+ if value > root.value:
88
+ root.right = add_node(root.right, value)
89
+ # if root.right is None:
90
+ # root.right = node()
91
+ # root.right.value = value
92
+ # if value is not None:
93
+ # root.right.counter += 1
94
+ # else:
95
+ # root.right = add_node(root.right, value)
96
+
97
+ if value == root.value and value is not None:
98
+ root.counter += 1
99
+
100
+ return root
101
+
102
+ # %%
103
+
104
+
105
+ def search_value(root, value):
106
+
107
+ if value == root.value:
108
+ return root.counter
109
+
110
+ if root is None:
111
+ return 0
112
+
113
+ if value < root.value:
114
+ return search_value(root.left, value)
115
+
116
+ if value > root.value:
117
+ return search_value(root.right, value)
118
+
119
+ # if we are at the bottom of the tree and the value has still not been found, the value must not be within the tree
120
+
121
+ # %%
122
+
123
+
124
+ def destroy_tree(root):
125
+
126
+ # if a left node exists
127
+ if root.left is not None:
128
+ # recursively destroy the left node
129
+ destroy_tree(root.left)
130
+
131
+ # if a right node exists
132
+ if root.right is not None:
133
+ # recursively destroy the right node
134
+ destroy_tree(root.right)
135
+
136
+ # delete the root node
137
+ del root
138
+
139
+ # %%
140
+
141
+
142
+ def create_tree():
143
+ return add_node(None, None)
144
+
145
+ # %%
146
+
147
+
148
+ def show_tree(root):
149
+
150
+ if (root is None):
151
+ return
152
+
153
+ lines, *_ = root._display_aux()
154
+ for line in lines:
155
+ print(line)
156
+
157
+ # %%
data_structures/hash_table.ipynb ADDED
@@ -0,0 +1,125 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": 3,
6
+ "metadata": {},
7
+ "outputs": [],
8
+ "source": [
9
+ "from xxhash import xxh128 as xxhash\n",
10
+ "from mmh3 import hash128 as mmh3\n",
11
+ "\n",
12
+ "class hash_table:\n",
13
+ "\n",
14
+ " # this table is designed for counting kmers\n",
15
+ " # key : kmer\n",
16
+ " # value : count\n",
17
+ "\n",
18
+ " def __init__(self, size, hashing_flag):\n",
19
+ " # set python's default hashing function as the default\n",
20
+ " DEFAULT_HASH = self.__hash__\n",
21
+ " MMH3_FLAG = \"mmh\"\n",
22
+ " XXH_FLAG = \"xxh\"\n",
23
+ "\n",
24
+ " self.size = size\n",
25
+ " # a list of keys\n",
26
+ " self.keys = [None for i in range(size)]\n",
27
+ " # a list of values\n",
28
+ " self.values = [0 for i in range(size)]\n",
29
+ " self.hash = DEFAULT_HASH\n",
30
+ " self.collision_count = 0\n",
31
+ "\n",
32
+ " if hashing_flag == XXH_FLAG or hashing_flag == 1:\n",
33
+ " self.hash = self.xxhash\n",
34
+ " if hashing_flag == MMH3_FLAG or hashing_flag == 2:\n",
35
+ " self.hash = self.mmh3\n",
36
+ "\n",
37
+ " def __len__(self):\n",
38
+ " return self.size\n",
39
+ "\n",
40
+ " def insert(self, key):\n",
41
+ " hash_index = self.hash(key)\n",
42
+ " if self.keys[hash_index] is not None:\n",
43
+ " if self.keys[hash_index] == key:\n",
44
+ " self.values[hash_index] += 1\n",
45
+ " else:\n",
46
+ " # different keys have the same hash index\n",
47
+ " # this is a collision\n",
48
+ " self.collision_count += 1\n",
49
+ " self.handle_collision(hash_index, key)\n",
50
+ " else:\n",
51
+ " self.keys[hash_index] = key\n",
52
+ " self.values[hash_index] += 1\n",
53
+ " \n",
54
+ " def search(self, key):\n",
55
+ " hash_index = self.hash(key)\n",
56
+ " # return the value if the key is found\n",
57
+ " if self.keys[hash_index] == key:\n",
58
+ " return self.values[hash_index]\n",
59
+ "\n",
60
+ " return None\n",
61
+ "\n",
62
+ " def delete(self, key):\n",
63
+ " hash_index = self.hash(key)\n",
64
+ " # delete the key value pair if the key is found\n",
65
+ " if self.keys[hash_index] == key:\n",
66
+ " self.values[hash_index] = 0\n",
67
+ " self.keys[hash_index] = None\n",
68
+ "\n",
69
+ " def handle_collision(self, hash_index, key):\n",
70
+ " def linear_probing(key):\n",
71
+ " return (key + 1) % self.size\n",
72
+ "\n",
73
+ " while self.keys[hash_index] is not None:\n",
74
+ " hash_index = linear_probing(hash_index)\n",
75
+ " if hash_index > self.size:\n",
76
+ " return \n",
77
+ "\n",
78
+ " self.keys[hash_index] = key\n",
79
+ " self.values[hash_index] += 1\n",
80
+ " return\n",
81
+ "\n",
82
+ " def __hash__(self, key):\n",
83
+ " return hash(key) % self.size\n",
84
+ "\n",
85
+ " def xxhash(self, key):\n",
86
+ " return xxhash(key).intdigest() % self.size\n",
87
+ " \n",
88
+ " def mmh3(self, key):\n",
89
+ " return mmh3(key, signed=False) % self.size\n",
90
+ "\n",
91
+ " def print(self):\n",
92
+ " for i in range(self.size):\n",
93
+ " if self.keys[i] is not None:\n",
94
+ " print(f\"{self.keys[i]} : {self.values[i]}\")"
95
+ ]
96
+ }
97
+ ],
98
+ "metadata": {
99
+ "kernelspec": {
100
+ "display_name": "Python 3.10.8 64-bit",
101
+ "language": "python",
102
+ "name": "python3"
103
+ },
104
+ "language_info": {
105
+ "codemirror_mode": {
106
+ "name": "ipython",
107
+ "version": 3
108
+ },
109
+ "file_extension": ".py",
110
+ "mimetype": "text/x-python",
111
+ "name": "python",
112
+ "nbconvert_exporter": "python",
113
+ "pygments_lexer": "ipython3",
114
+ "version": "3.10.8"
115
+ },
116
+ "orig_nbformat": 4,
117
+ "vscode": {
118
+ "interpreter": {
119
+ "hash": "b0fa6594d8f4cbf19f97940f81e996739fb7646882a419484c72d19e05852a7e"
120
+ }
121
+ }
122
+ },
123
+ "nbformat": 4,
124
+ "nbformat_minor": 2
125
+ }
data_structures/hash_table.py ADDED
@@ -0,0 +1,87 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # %%
2
+ from xxhash import xxh128 as xxhash
3
+ from mmh3 import hash128 as mmh3
4
+
5
+
6
+ class hash_table:
7
+
8
+ # this table is designed for counting kmers
9
+ # key : kmer
10
+ # value : count
11
+
12
+ def __init__(self, size, hashing_flag):
13
+ # set python's default hashing function as the default
14
+ DEFAULT_HASH = self.hasher
15
+ MMH3_FLAG = "mmh"
16
+ XXH_FLAG = "xxh"
17
+
18
+ self.size = size
19
+ # a list of keys
20
+ self.keys = [None for i in range(size)]
21
+ # a list of values
22
+ self.values = [0 for i in range(size)]
23
+ self.hash = DEFAULT_HASH
24
+ self.collision_count = 0
25
+
26
+ if hashing_flag == XXH_FLAG or hashing_flag == 1:
27
+ self.hash = self.xxhash
28
+ if hashing_flag == MMH3_FLAG or hashing_flag == 2:
29
+ self.hash = self.mmh3
30
+
31
+ def __len__(self):
32
+ return self.size
33
+
34
+ def insert(self, key):
35
+ hash_index = self.hash(key)
36
+ if self.keys[hash_index] is not None:
37
+ if self.keys[hash_index] == key:
38
+ self.values[hash_index] += 1
39
+ else:
40
+ # different keys have the same hash index
41
+ # this is a collision
42
+ self.collision_count += 1
43
+ self.handle_collision(hash_index, key)
44
+ else:
45
+ self.keys[hash_index] = key
46
+ self.values[hash_index] += 1
47
+
48
+ def search(self, key):
49
+ hash_index = self.hash(key)
50
+ # return the value if the key is found
51
+ if self.keys[hash_index] == key:
52
+ return self.values[hash_index]
53
+
54
+ return None
55
+
56
+ def delete(self, key):
57
+ hash_index = self.hash(key)
58
+ # delete the key value pair if the key is found
59
+ if self.keys[hash_index] == key:
60
+ self.values[hash_index] = 0
61
+ self.keys[hash_index] = None
62
+
63
+ def handle_collision(self, hash_index, key):
64
+ def linear_probing(key):
65
+ return (key + 1) % self.size
66
+
67
+ while self.keys[hash_index] is not None:
68
+ hash_index = linear_probing(hash_index)
69
+ if hash_index > self.size:
70
+ return
71
+
72
+ self.keys[hash_index] = key
73
+ self.values[hash_index] += 1
74
+
75
+ def hasher(self, key):
76
+ return hash(key) % self.size
77
+
78
+ def xxhash(self, key):
79
+ return xxhash(key).intdigest() % self.size
80
+
81
+ def mmh3(self, key):
82
+ return mmh3(key, signed=False) % self.size
83
+
84
+ def print(self):
85
+ for i in range(self.size):
86
+ if self.keys[i] is not None:
87
+ print(f"{self.keys[i]} : {self.values[i]}")
hash_table_kmer_distribution.ipynb ADDED
@@ -0,0 +1,4186 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "raw",
5
+ "metadata": {},
6
+ "source": [
7
+ "---\n",
8
+ "title: K-mer distribution table Hash Table\n",
9
+ "description: Generate a k-mer distribution table using a binary search tree\n",
10
+ "show-code: False\n",
11
+ "format:\n",
12
+ " theme: night\n",
13
+ "params:\n",
14
+ " dna_string:\n",
15
+ " input: text\n",
16
+ " label: input dna_string\n",
17
+ " value: ACGT\n",
18
+ " dna_len:\n",
19
+ " input: numeric\n",
20
+ " label: input dna_length\n",
21
+ " value: 100\n",
22
+ " min: 5\n",
23
+ " max: 10000000000\n",
24
+ " step: 10\n",
25
+ " kmer_size:\n",
26
+ " input: numeric\n",
27
+ " label: input kmer_length\n",
28
+ " value: 7\n",
29
+ " min: 1\n",
30
+ " max: 1000\n",
31
+ " step: 1\n",
32
+ "---"
33
+ ]
34
+ },
35
+ {
36
+ "cell_type": "markdown",
37
+ "metadata": {},
38
+ "source": [
39
+ "Edit the cell below to input your desired values. You can also input values using the input scanner."
40
+ ]
41
+ },
42
+ {
43
+ "cell_type": "code",
44
+ "execution_count": 6,
45
+ "metadata": {},
46
+ "outputs": [],
47
+ "source": [
48
+ "dna_string = \"ACGT\"\n",
49
+ "dna_len = 10**6\n",
50
+ "kmer_size = 5"
51
+ ]
52
+ },
53
+ {
54
+ "cell_type": "code",
55
+ "execution_count": 7,
56
+ "metadata": {},
57
+ "outputs": [],
58
+ "source": [
59
+ "from data_processing import generate_kmers as generator\n",
60
+ "from data_processing import graph_distribution as graph\n",
61
+ "from data_structures import hash_table as hashing\n",
62
+ "from data_processing import distribution_parser as parse\n",
63
+ "\n",
64
+ "import time"
65
+ ]
66
+ },
67
+ {
68
+ "cell_type": "code",
69
+ "execution_count": 8,
70
+ "metadata": {},
71
+ "outputs": [],
72
+ "source": [
73
+ "def generate_table(kmer_list, hashing_function):\n",
74
+ " \"\"\"\n",
75
+ " Generates a hash table from a list of kmers and the desired hashing function\n",
76
+ " \"\"\"\n",
77
+ " list_len = len(kmer_list)\n",
78
+ " table = hashing.hash_table(list_len, hashing_function)\n",
79
+ " for kmer in kmer_list:\n",
80
+ " table.insert(kmer)\n",
81
+ "\n",
82
+ " return table"
83
+ ]
84
+ },
85
+ {
86
+ "cell_type": "code",
87
+ "execution_count": 9,
88
+ "metadata": {},
89
+ "outputs": [],
90
+ "source": [
91
+ "def test_hash_table(dna_string, dna_len, kmer_size):\n",
92
+ " \"\"\"\n",
93
+ " Utility function to test the hash table\n",
94
+ " \"\"\"\n",
95
+ " alphabet = dna_string\n",
96
+ " if dna_string is None:\n",
97
+ " alphabet = input(\"Enter the alphabet: \")\n",
98
+ " \n",
99
+ " dna_length = dna_len\n",
100
+ " if dna_len is None:\n",
101
+ " dna_length = (input(\"Enter the length of the DNA string: \"))\n",
102
+ " dna_length = parse.parse_math_expression(dna_length) \n",
103
+ "\n",
104
+ " k_mer = kmer_size\n",
105
+ " if kmer_size is None:\n",
106
+ " k_mer = input(\"Enter the length of the kmer: \")\n",
107
+ " k_mer = parse.parse_math_expression(k_mer)\n",
108
+ "\n",
109
+ " # generate the DNA sequence\n",
110
+ " DNA_SEQUENCE = generator.create_dna_sequence(alphabet, dna_length)\n",
111
+ "\n",
112
+ " # generate the list of k-mers\n",
113
+ " kmer_list = generator.generate_kmers(DNA_SEQUENCE, k_mer)\n",
114
+ "\n",
115
+ " # test the mmh3 hashing function\n",
116
+ " start = time.time()\n",
117
+ " mmh3_table = generate_table(kmer_list, \"mmh\")\n",
118
+ " end = time.time()\n",
119
+ "\n",
120
+ " mmh3_insertion_time = end - start\n",
121
+ "\n",
122
+ " # test the xxh hashing function\n",
123
+ " start = time.time()\n",
124
+ " xxh_table = generate_table(kmer_list, \"xxh\")\n",
125
+ " end = time.time()\n",
126
+ "\n",
127
+ " xxh_insertion_time = end - start\n",
128
+ " # generate the distributions\n",
129
+ " start = time.time()\n",
130
+ " mmh3_distribution = parse.parse_table(mmh3_table, kmer_list)\n",
131
+ " end = time.time()\n",
132
+ "\n",
133
+ " mmh_parsing_time = end - start\n",
134
+ "\n",
135
+ " start = time.time()\n",
136
+ " xxh_distribution = parse.parse_table(xxh_table, kmer_list)\n",
137
+ " end = time.time()\n",
138
+ "\n",
139
+ " xxh_parsing_time = end - start\n",
140
+ "\n",
141
+ " tabulated_data = {\n",
142
+ " \"Hash Function\": [\"mmh3\", \"xxh\"],\n",
143
+ " \"Insertion Time\": [mmh3_insertion_time, xxh_insertion_time],\n",
144
+ " \"Parsing Time\": [mmh_parsing_time, xxh_parsing_time],\n",
145
+ " \"Collisions\": [mmh3_table.collision_count, xxh_table.collision_count]\n",
146
+ " }\n",
147
+ "\n",
148
+ " graph.print_hashing_statistics(tabulated_data, alphabet + str(dna_length) + \" \" + str(k_mer) + \"mers\")\n",
149
+ " unique_kmers = parse.get_unique_kmers(xxh_distribution)\n",
150
+ " graph.bar_graph(xxh_distribution)\n",
151
+ "\n",
152
+ " if len(unique_kmers) == 0:\n",
153
+ " print(\"No unique k-mers found\")\n",
154
+ " else:\n",
155
+ " print(f\"Unique k-mers: {len(unique_kmers)}\")\n",
156
+ " graph.bar_graph(unique_kmers)\n",
157
+ "\n",
158
+ " if (len(xxh_distribution) > 100):\n",
159
+ " print(\"Most common 10% kmers: \")\n",
160
+ " most_common_kmers = parse.get_most_common_kmers(xxh_distribution, int(len(xxh_distribution) * 0.10))\n",
161
+ " graph.bar_graph(most_common_kmers)\n",
162
+ "\n",
163
+ " # the distribution of one is the same as the other\n",
164
+ " # graph.bar_graph(mmh3_distribution)\n"
165
+ ]
166
+ },
167
+ {
168
+ "cell_type": "code",
169
+ "execution_count": 10,
170
+ "metadata": {},
171
+ "outputs": [
172
+ {
173
+ "name": "stdout",
174
+ "output_type": "stream",
175
+ "text": [
176
+ "+------------------------------------------------------------------------+\n",
177
+ "| ACGT1000000 5mers |\n",
178
+ "+---------------+--------------------+----------------------+------------+\n",
179
+ "| Hash Function | Insertion Time | Parsing Time | Collisions |\n",
180
+ "+---------------+--------------------+----------------------+------------+\n",
181
+ "| mmh3 | 1.2975947856903076 | 0.06290507316589355 | 1935 |\n",
182
+ "| xxh | 0.805696964263916 | 0.026388883590698242 | 0 |\n",
183
+ "+---------------+--------------------+----------------------+------------+\n"
184
+ ]
185
+ },
186
+ {
187
+ "data": {
188
+ "application/vnd.plotly.v1+json": {
189
+ "config": {
190
+ "plotlyServerURL": "https://plot.ly"
191
+ },
192
+ "data": [
193
+ {
194
+ "type": "bar",
195
+ "x": [
196
+ "GCCGC",
197
+ "TTTGT",
198
+ "GCCGG",
199
+ "TAGCA",
200
+ "GGTTG",
201
+ "TACGG",
202
+ "CCCCA",
203
+ "GATGT",
204
+ "CACTA",
205
+ "CGTTA",
206
+ "CACCA",
207
+ "ACGAG",
208
+ "TGCAA",
209
+ "AAATC",
210
+ "AGATA",
211
+ "CGCAT",
212
+ "GGGTA",
213
+ "GTCAG",
214
+ "AGGTG",
215
+ "TACCA",
216
+ "TGGAG",
217
+ "TTTAT",
218
+ "CACGG",
219
+ "TATTC",
220
+ "TAATT",
221
+ "AGCGA",
222
+ "AGTTA",
223
+ "TGTTT",
224
+ "GCGAT",
225
+ "TTTGG",
226
+ "ACCTC",
227
+ "TTCAT",
228
+ "TGCGA",
229
+ "ATCGA",
230
+ "GAATA",
231
+ "GTGAG",
232
+ "GCTTG",
233
+ "CAGGT",
234
+ "AACCC",
235
+ "GGCAC",
236
+ "AAACT",
237
+ "GGATT",
238
+ "CTGTC",
239
+ "TCTAT",
240
+ "TTACC",
241
+ "CCGAT",
242
+ "ACAGA",
243
+ "ACTAT",
244
+ "CGGTT",
245
+ "CTTGT",
246
+ "ACTTT",
247
+ "CTTTT",
248
+ "TTAAA",
249
+ "CTCAT",
250
+ "GTCTA",
251
+ "GCTGG",
252
+ "CCAAG",
253
+ "TTGGC",
254
+ "AGCAA",
255
+ "GTTGA",
256
+ "CAAAT",
257
+ "CACCC",
258
+ "GCAGG",
259
+ "GTGTC",
260
+ "ACCTA",
261
+ "TTCAC",
262
+ "GCTAT",
263
+ "CTAGT",
264
+ "TTGGG",
265
+ "TCAGG",
266
+ "CAATA",
267
+ "ACGGT",
268
+ "CATGC",
269
+ "GATAC",
270
+ "TGGCT",
271
+ "GCGTC",
272
+ "ATTTC",
273
+ "GGTAC",
274
+ "CGTCA",
275
+ "CTATA",
276
+ "GAACG",
277
+ "GCGGG",
278
+ "ATCGC",
279
+ "AGCTG",
280
+ "CAACG",
281
+ "ATAAG",
282
+ "AGTCC",
283
+ "GTTTC",
284
+ "AAAAC",
285
+ "GCACC",
286
+ "ACATT",
287
+ "CTGGA",
288
+ "CTGTT",
289
+ "GCTCA",
290
+ "ATTCC",
291
+ "CCCTG",
292
+ "GTGGA",
293
+ "TCCCA",
294
+ "AATGG",
295
+ "CTCAA",
296
+ "CTATG",
297
+ "TCAAG",
298
+ "AGCTA",
299
+ "CGTCG",
300
+ "GGAGC",
301
+ "CCTCA",
302
+ "GTCGT",
303
+ "CGTAC",
304
+ "GACAT",
305
+ "GGGGG",
306
+ "AGGTC",
307
+ "TAGGG",
308
+ "TCGCA",
309
+ "CCTCG",
310
+ "ATACA",
311
+ "TTTAA",
312
+ "AACGA",
313
+ "TGCCA",
314
+ "GTGTA",
315
+ "AATAT",
316
+ "ATCGT",
317
+ "CCATG",
318
+ "TGACC",
319
+ "ATGGG",
320
+ "AATAC",
321
+ "AAATT",
322
+ "GGCGA",
323
+ "CCTCC",
324
+ "TGGAA",
325
+ "CGAGA",
326
+ "TCCAA",
327
+ "CTAGA",
328
+ "TCTCG",
329
+ "TGAAG",
330
+ "CACTG",
331
+ "TTTTT",
332
+ "AGGAA",
333
+ "TTAAT",
334
+ "ACAAG",
335
+ "GGGGA",
336
+ "CATGA",
337
+ "GGTGG",
338
+ "TTATA",
339
+ "CCACG",
340
+ "AGCGC",
341
+ "TCGAG",
342
+ "TAATC",
343
+ "TCCGG",
344
+ "CCAAT",
345
+ "TTTGA",
346
+ "TGAAC",
347
+ "ACACG",
348
+ "ACGTA",
349
+ "ACACT",
350
+ "TCAGT",
351
+ "CAAGT",
352
+ "CGTAG",
353
+ "CCCTA",
354
+ "GGCGC",
355
+ "GCCAC",
356
+ "TCCCG",
357
+ "AATCC",
358
+ "ACAAT",
359
+ "CGACT",
360
+ "GGTCT",
361
+ "TCCCT",
362
+ "CCGCC",
363
+ "AATTC",
364
+ "TGGCC",
365
+ "CTGTG",
366
+ "CCCCT",
367
+ "TAGAG",
368
+ "AATTA",
369
+ "CCCAG",
370
+ "CTCGT",
371
+ "TATGG",
372
+ "TGTCG",
373
+ "GTACG",
374
+ "GTTTA",
375
+ "TCTTA",
376
+ "TCACG",
377
+ "CATAT",
378
+ "AATCT",
379
+ "TTACA",
380
+ "CTTGC",
381
+ "CGACA",
382
+ "AACTG",
383
+ "TAATA",
384
+ "CAGTG",
385
+ "CCTGG",
386
+ "ATTAC",
387
+ "AATAG",
388
+ "GAGCT",
389
+ "CGACC",
390
+ "GAGAT",
391
+ "CGATC",
392
+ "ACTAG",
393
+ "GGATG",
394
+ "CGGGT",
395
+ "GGCGG",
396
+ "CCACA",
397
+ "AAAAG",
398
+ "CCAAA",
399
+ "GTTCG",
400
+ "CCCAC",
401
+ "GAGAG",
402
+ "CCGGC",
403
+ "ACAGT",
404
+ "AGTGG",
405
+ "CGTAA",
406
+ "CAATG",
407
+ "ACATC",
408
+ "ATATT",
409
+ "ATCTC",
410
+ "CATAA",
411
+ "AATAA",
412
+ "GATCG",
413
+ "GTGTG",
414
+ "CATTC",
415
+ "GGGAT",
416
+ "TAGCG",
417
+ "GGAGA",
418
+ "ATATA",
419
+ "GACAG",
420
+ "CCTAC",
421
+ "CACAC",
422
+ "ATCTT",
423
+ "ACGAA",
424
+ "ACCAC",
425
+ "TGTGT",
426
+ "CATAC",
427
+ "CCGGT",
428
+ "GGTAA",
429
+ "TGGTA",
430
+ "TGCAC",
431
+ "GAACA",
432
+ "CTGGG",
433
+ "GAGCG",
434
+ "CCATT",
435
+ "AACCG",
436
+ "TCATA",
437
+ "TCGTC",
438
+ "CCGTC",
439
+ "CCAGT",
440
+ "GTAAG",
441
+ "AGCGT",
442
+ "CCGCT",
443
+ "CCGTG",
444
+ "TCATG",
445
+ "TTAAC",
446
+ "TTGTT",
447
+ "ATCAT",
448
+ "CGCTT",
449
+ "AAGCT",
450
+ "ATCCA",
451
+ "CGGTG",
452
+ "GATGG",
453
+ "ACGAT",
454
+ "TATTA",
455
+ "CCTTG",
456
+ "TTGAT",
457
+ "CACCT",
458
+ "CCTGA",
459
+ "ATGAC",
460
+ "TATAC",
461
+ "TGGGG",
462
+ "AACTA",
463
+ "TCCTG",
464
+ "ATTAG",
465
+ "GGTCG",
466
+ "GAGGA",
467
+ "CCGGG",
468
+ "ACGGG",
469
+ "GGCGT",
470
+ "GTCCA",
471
+ "CATGT",
472
+ "TTCGA",
473
+ "GACCG",
474
+ "GCCCA",
475
+ "TGAGC",
476
+ "GCCGA",
477
+ "AACAG",
478
+ "GGGGT",
479
+ "GAAAC",
480
+ "TGTTA",
481
+ "GACCT",
482
+ "TCCAC",
483
+ "ATCTA",
484
+ "CTTCG",
485
+ "TCAGC",
486
+ "ATTGT",
487
+ "CTTTG",
488
+ "TGTCA",
489
+ "ACGGC",
490
+ "TACTG",
491
+ "TTCAA",
492
+ "GACCC",
493
+ "TACTA",
494
+ "GAATC",
495
+ "TCTTT",
496
+ "TTGTA",
497
+ "TCTAA",
498
+ "CATTG",
499
+ "ATTAA",
500
+ "GACAC",
501
+ "GAAGT",
502
+ "CACAG",
503
+ "GTATA",
504
+ "CAGTA",
505
+ "TGAAT",
506
+ "CGAAA",
507
+ "CCCGT",
508
+ "CTTCA",
509
+ "GTGGG",
510
+ "GAAGG",
511
+ "CACAA",
512
+ "GCTAG",
513
+ "AGCTC",
514
+ "AGGCC",
515
+ "GGAGG",
516
+ "GCGGC",
517
+ "TTCCC",
518
+ "TTTTC",
519
+ "AGAAA",
520
+ "TTTGC",
521
+ "ACAGG",
522
+ "CAGCC",
523
+ "ACTCA",
524
+ "CAGCG",
525
+ "GTTAC",
526
+ "GAAGA",
527
+ "CGCCG",
528
+ "AACAC",
529
+ "ACCCT",
530
+ "GCCTC",
531
+ "ATAAT",
532
+ "TACAG",
533
+ "AATTT",
534
+ "CGGTC",
535
+ "AAAGA",
536
+ "GACTT",
537
+ "CGAAG",
538
+ "AACTC",
539
+ "GCGTT",
540
+ "ACCGA",
541
+ "AGCCT",
542
+ "TCCAG",
543
+ "AAACA",
544
+ "GATCT",
545
+ "CACCG",
546
+ "CGTGT",
547
+ "TAGTA",
548
+ "TTTAG",
549
+ "CGAGG",
550
+ "GCAGT",
551
+ "AACGC",
552
+ "GGGTG",
553
+ "CTACC",
554
+ "GGGGC",
555
+ "TGACT",
556
+ "AATGA",
557
+ "ATGGT",
558
+ "AAGGT",
559
+ "ACGCT",
560
+ "ATGTT",
561
+ "GATGC",
562
+ "AGATG",
563
+ "CATCC",
564
+ "GACGG",
565
+ "AAACC",
566
+ "ATAGC",
567
+ "GTTTT",
568
+ "AGTTG",
569
+ "AAGAA",
570
+ "TACTT",
571
+ "CTACA",
572
+ "TCGGC",
573
+ "GCCCG",
574
+ "ACCAA",
575
+ "AAGAT",
576
+ "GACGA",
577
+ "ACGTT",
578
+ "CAACC",
579
+ "CAATC",
580
+ "CTCGA",
581
+ "ACCGT",
582
+ "GGACT",
583
+ "AATGT",
584
+ "GCATT",
585
+ "CTAGC",
586
+ "CTTTC",
587
+ "AGACC",
588
+ "TTTTG",
589
+ "TTAGC",
590
+ "AGTAT",
591
+ "CTCCC",
592
+ "GATAT",
593
+ "CTAAT",
594
+ "AAATA",
595
+ "ATTGG",
596
+ "AAAAT",
597
+ "TTTCT",
598
+ "TCGTA",
599
+ "ACTGT",
600
+ "TCACC",
601
+ "ACTCT",
602
+ "GAGTA",
603
+ "GTAGT",
604
+ "ACTAC",
605
+ "TTCTA",
606
+ "ATGCT",
607
+ "AGATC",
608
+ "CAAGC",
609
+ "CAAAA",
610
+ "TAACC",
611
+ "GCTTC",
612
+ "CCTGC",
613
+ "ATAAC",
614
+ "GTCGG",
615
+ "AGGCG",
616
+ "CCGCG",
617
+ "GAGTC",
618
+ "GGCTG",
619
+ "GTGCG",
620
+ "AGGCA",
621
+ "TCGCG",
622
+ "CTTAC",
623
+ "TGATG",
624
+ "TTCGC",
625
+ "TGAAA",
626
+ "TACGA",
627
+ "CCGCA",
628
+ "GCAAG",
629
+ "ACTAA",
630
+ "GGACA",
631
+ "TACTC",
632
+ "GGTCC",
633
+ "TTCTC",
634
+ "AGATT",
635
+ "GTGCC",
636
+ "GGGTC",
637
+ "AGCGG",
638
+ "TTCCT",
639
+ "CGTTG",
640
+ "GGGAC",
641
+ "CTTTA",
642
+ "AAGAG",
643
+ "ACTCC",
644
+ "TCGGG",
645
+ "GCTTA",
646
+ "GGCTC",
647
+ "TGATA",
648
+ "CACGT",
649
+ "CGGAA",
650
+ "ACCCG",
651
+ "GGCCA",
652
+ "GTATG",
653
+ "AAGCC",
654
+ "CGGGA",
655
+ "TCTTC",
656
+ "AGCAT",
657
+ "CTGAC",
658
+ "ATAAA",
659
+ "TAGCC",
660
+ "AATTG",
661
+ "GGCTT",
662
+ "TCTGT",
663
+ "GTAGA",
664
+ "AGTGA",
665
+ "ATTTA",
666
+ "ATATC",
667
+ "GCGTA",
668
+ "GGGAG",
669
+ "GGCCT",
670
+ "GCGTG",
671
+ "ACTGA",
672
+ "TCCCC",
673
+ "CAGCT",
674
+ "CAGCA",
675
+ "TCTCC",
676
+ "ATGGC",
677
+ "TAGTT",
678
+ "GGAAG",
679
+ "CCCGG",
680
+ "GAGAC",
681
+ "CCCAT",
682
+ "CATCA",
683
+ "CTCAC",
684
+ "CGGGG",
685
+ "GTCAT",
686
+ "TAGGA",
687
+ "TATAA",
688
+ "CTCCG",
689
+ "TAAAG",
690
+ "ATCAG",
691
+ "TTTCG",
692
+ "TATGT",
693
+ "GCCAA",
694
+ "AAACG",
695
+ "TCCTT",
696
+ "TATGC",
697
+ "GAGGC",
698
+ "GGCCC",
699
+ "TAAAA",
700
+ "TCTAC",
701
+ "TTGCA",
702
+ "CTCTG",
703
+ "TCTCT",
704
+ "TCTAG",
705
+ "CAGGG",
706
+ "ACCAG",
707
+ "GCTCC",
708
+ "GCACT",
709
+ "GAGTT",
710
+ "GCCTA",
711
+ "GAGCC",
712
+ "CCGAG",
713
+ "TGCGT",
714
+ "AGTGT",
715
+ "TCAAT",
716
+ "TAGGC",
717
+ "GGGTT",
718
+ "TAACG",
719
+ "CGGAT",
720
+ "AGGAT",
721
+ "TCGGA",
722
+ "TTGAG",
723
+ "CCCAA",
724
+ "ATGCA",
725
+ "CGTGC",
726
+ "CTGAT",
727
+ "CCGAC",
728
+ "TATTT",
729
+ "GTACC",
730
+ "ATTGA",
731
+ "TCAAA",
732
+ "CCCTC",
733
+ "GTTGT",
734
+ "CCAGA",
735
+ "GTCTC",
736
+ "CTATT",
737
+ "ATCCC",
738
+ "AAAGT",
739
+ "TAGTC",
740
+ "TCGGT",
741
+ "TTCTG",
742
+ "CGGCA",
743
+ "GGCAG",
744
+ "GAATT",
745
+ "TTACT",
746
+ "TACGC",
747
+ "TAAGC",
748
+ "AGCAC",
749
+ "TGCGC",
750
+ "ACGCC",
751
+ "CAATT",
752
+ "CGTTC",
753
+ "TGTAC",
754
+ "TGTGG",
755
+ "GACAA",
756
+ "TGTTG",
757
+ "AATCA",
758
+ "ACATA",
759
+ "TAGCT",
760
+ "GCTGC",
761
+ "CATTT",
762
+ "TTAGG",
763
+ "AAGTA",
764
+ "GGAAT",
765
+ "AAGAC",
766
+ "GACGT",
767
+ "AAGCA",
768
+ "AGAGA",
769
+ "AGTCA",
770
+ "GGGCG",
771
+ "ATATG",
772
+ "GGAAC",
773
+ "AGCCA",
774
+ "TCTCA",
775
+ "GTTCC",
776
+ "ACCGC",
777
+ "TGCTT",
778
+ "AGACG",
779
+ "GCGGA",
780
+ "CTTCC",
781
+ "GTCCG",
782
+ "CACAT",
783
+ "GCTCT",
784
+ "TACAT",
785
+ "ACACC",
786
+ "CTGCC",
787
+ "AACAT",
788
+ "GATAA",
789
+ "CGCGA",
790
+ "CAAAG",
791
+ "TCGAT",
792
+ "AGTGC",
793
+ "ATGAT",
794
+ "ACGCA",
795
+ "CTAAC",
796
+ "GCACA",
797
+ "CGGCT",
798
+ "ATCAC",
799
+ "TAAAC",
800
+ "CACGA",
801
+ "CCGGA",
802
+ "CTGTA",
803
+ "GTTGG",
804
+ "CGAAT",
805
+ "CTAGG",
806
+ "AACAA",
807
+ "GCGCC",
808
+ "CCGTT",
809
+ "GCATA",
810
+ "TAGAT",
811
+ "GGTGT",
812
+ "GAACT",
813
+ "CGCTA",
814
+ "GTCTT",
815
+ "ACTTA",
816
+ "CTGCT",
817
+ "CATCG",
818
+ "CACTC",
819
+ "CCTAG",
820
+ "TGCCT",
821
+ "GTAGC",
822
+ "ACATG",
823
+ "GGTGA",
824
+ "GGACG",
825
+ "AAATG",
826
+ "ATTTT",
827
+ "TGAGA",
828
+ "ATCCT",
829
+ "TATAG",
830
+ "CTGCG",
831
+ "AGTAC",
832
+ "TCCTC",
833
+ "TGCGG",
834
+ "ATGTC",
835
+ "ACCCC",
836
+ "GTCCT",
837
+ "CGGCG",
838
+ "ACGTC",
839
+ "CTTGA",
840
+ "GTTTG",
841
+ "AGAAT",
842
+ "CATCT",
843
+ "TGTGC",
844
+ "AGGGC",
845
+ "CAGAT",
846
+ "GTTCT",
847
+ "GTATC",
848
+ "TCCGT",
849
+ "GCATC",
850
+ "ATACT",
851
+ "GTTGC",
852
+ "GATCC",
853
+ "CCAAC",
854
+ "TTTAC",
855
+ "ACCCA",
856
+ "GCGGT",
857
+ "CTTAA",
858
+ "ACTTC",
859
+ "GATTA",
860
+ "TTGAA",
861
+ "TAGAC",
862
+ "CCGAA",
863
+ "GGTCA",
864
+ "CTCGC",
865
+ "TAGGT",
866
+ "AAAGC",
867
+ "GACCA",
868
+ "GTGGC",
869
+ "TGCCG",
870
+ "ACCTG",
871
+ "TAAGG",
872
+ "GCTGT",
873
+ "AGACA",
874
+ "CGCTC",
875
+ "GCATG",
876
+ "CGCTG",
877
+ "CAGAC",
878
+ "ATGCG",
879
+ "TTCTT",
880
+ "AGTCT",
881
+ "TTCCA",
882
+ "CCATC",
883
+ "GCCCT",
884
+ "TACAA",
885
+ "ACTGG",
886
+ "GGACC",
887
+ "CGTTT",
888
+ "AGCTT",
889
+ "GCTTT",
890
+ "GTCAA",
891
+ "TGTCT",
892
+ "GTAAC",
893
+ "CGTCC",
894
+ "GCGAC",
895
+ "TTCAG",
896
+ "GTAAA",
897
+ "GGATA",
898
+ "GTACT",
899
+ "CGACG",
900
+ "ACTTG",
901
+ "TCGCC",
902
+ "TCGAC",
903
+ "CTGAA",
904
+ "GAAAT",
905
+ "TTACG",
906
+ "ACCGG",
907
+ "CACGC",
908
+ "TTAAG",
909
+ "ATGAA",
910
+ "CTCCT",
911
+ "CGATT",
912
+ "GGCAA",
913
+ "CTGAG",
914
+ "GCCAG",
915
+ "CCAGG",
916
+ "TCGCT",
917
+ "CGCCA",
918
+ "GTGAT",
919
+ "ATCGG",
920
+ "TTTCA",
921
+ "AACCA",
922
+ "ATGTG",
923
+ "CGCGT",
924
+ "TATGA",
925
+ "TGTTC",
926
+ "TACCG",
927
+ "AGCCG",
928
+ "CAAAC",
929
+ "GTTCA",
930
+ "GGGAA",
931
+ "GATGA",
932
+ "CTGCA",
933
+ "ACAAC",
934
+ "GGAGT",
935
+ "CCGTA",
936
+ "GCAGC",
937
+ "ATGTA",
938
+ "GTCAC",
939
+ "TGCTG",
940
+ "CTCTA",
941
+ "AACCT",
942
+ "GCGAG",
943
+ "AGAAG",
944
+ "TAGTG",
945
+ "GAGGT",
946
+ "AAAAA",
947
+ "GTGGT",
948
+ "GTCGA",
949
+ "CCTCT",
950
+ "GCAAT",
951
+ "GATTG",
952
+ "GGTAT",
953
+ "ATAGA",
954
+ "CCCCG",
955
+ "AAGTG",
956
+ "GGCAT",
957
+ "TGCAG",
958
+ "CTGGT",
959
+ "GCTGA",
960
+ "GCTCG",
961
+ "CGGGC",
962
+ "CGTGA",
963
+ "AAGGC",
964
+ "TAGAA",
965
+ "TGCCC",
966
+ "TGTAG",
967
+ "TAAGA",
968
+ "AAGTC",
969
+ "CGAAC",
970
+ "GGTTA",
971
+ "TCACA",
972
+ "TGGTC",
973
+ "TGTGA",
974
+ "GTGAC",
975
+ "GCTAC",
976
+ "AGGTA",
977
+ "ACACA",
978
+ "GCGCA",
979
+ "CAGGA",
980
+ "AGACT",
981
+ "GAGGG",
982
+ "ATTCG",
983
+ "CGGAC",
984
+ "CATTA",
985
+ "CTACG",
986
+ "AGGGA",
987
+ "TCAAC",
988
+ "CGGTA",
989
+ "TTTCC",
990
+ "GTTAT",
991
+ "TAAAT",
992
+ "TGAGT",
993
+ "TTAGT",
994
+ "CGAGT",
995
+ "CAAGA",
996
+ "TCGAA",
997
+ "ACGCG",
998
+ "ATCCG",
999
+ "CTTCT",
1000
+ "CGATA",
1001
+ "CTCAG",
1002
+ "TAACT",
1003
+ "AGGTT",
1004
+ "CTCTT",
1005
+ "GCCCC",
1006
+ "ACGAC",
1007
+ "AGTAA",
1008
+ "TAATG",
1009
+ "ATTCA",
1010
+ "TGACA",
1011
+ "AAGTT",
1012
+ "CGCAC",
1013
+ "CGCCC",
1014
+ "ATGAG",
1015
+ "AGCCC",
1016
+ "TGGTG",
1017
+ "ATGCC",
1018
+ "TATTG",
1019
+ "AGAGC",
1020
+ "ATGGA",
1021
+ "GAAAA",
1022
+ "CTTAG",
1023
+ "GATTC",
1024
+ "ATACC",
1025
+ "TGACG",
1026
+ "GAAGC",
1027
+ "GCGAA",
1028
+ "CTCTC",
1029
+ "TGGCG",
1030
+ "CCTAT",
1031
+ "TTGGA",
1032
+ "TCCAT",
1033
+ "TATCA",
1034
+ "TCGTG",
1035
+ "GTTAA",
1036
+ "CTATC",
1037
+ "ATTAT",
1038
+ "GATAG",
1039
+ "GATTT",
1040
+ "TGGAT",
1041
+ "CAACT",
1042
+ "GTCCC",
1043
+ "GCTAA",
1044
+ "GTCTG",
1045
+ "TGGAC",
1046
+ "AGGGT",
1047
+ "AGGAC",
1048
+ "CAGTT",
1049
+ "AGAGT",
1050
+ "TCACT",
1051
+ "CCCGA",
1052
+ "AGCAG",
1053
+ "TTATC",
1054
+ "GCCTG",
1055
+ "TTATT",
1056
+ "CTTAT",
1057
+ "AGTTC",
1058
+ "AAGGG",
1059
+ "TTGGT",
1060
+ "TTGTG",
1061
+ "CCACT",
1062
+ "TCTGC",
1063
+ "GAGTG",
1064
+ "TATCT",
1065
+ "CGATG",
1066
+ "TTGCG",
1067
+ "CATGG",
1068
+ "ATAGT",
1069
+ "CGCGG",
1070
+ "GCCTT",
1071
+ "TCCGC",
1072
+ "ATTTG",
1073
+ "CAACA",
1074
+ "ACCAT",
1075
+ "GCGCT",
1076
+ "TGCTA",
1077
+ "TATAT",
1078
+ "GTTAG",
1079
+ "CTAAG",
1080
+ "GGGCA",
1081
+ "TGGTT",
1082
+ "CCTGT",
1083
+ "GGGCC",
1084
+ "TATCC",
1085
+ "GGCTA",
1086
+ "TCTTG",
1087
+ "AGTTT",
1088
+ "GGTTC",
1089
+ "AGAGG",
1090
+ "GAATG",
1091
+ "GTAAT",
1092
+ "AAGCG",
1093
+ "CCTTC",
1094
+ "TGTCC",
1095
+ "ACAGC",
1096
+ "TCATT",
1097
+ "GACTC",
1098
+ "TTCGT",
1099
+ "GTGCA",
1100
+ "CCCCC",
1101
+ "ATACG",
1102
+ "TTGCT",
1103
+ "GTATT",
1104
+ "TTAGA",
1105
+ "ATAGG",
1106
+ "AACGT",
1107
+ "CAGTC",
1108
+ "TTGTC",
1109
+ "CCCTT",
1110
+ "AGAAC",
1111
+ "TCCTA",
1112
+ "ATCTG",
1113
+ "CAGAG",
1114
+ "TGGCA",
1115
+ "GTGTT",
1116
+ "CCTAA",
1117
+ "CAGGC",
1118
+ "CTGGC",
1119
+ "GACGC",
1120
+ "GCGCG",
1121
+ "AGGGG",
1122
+ "TAACA",
1123
+ "GGAAA",
1124
+ "CCCGC",
1125
+ "ACGGA",
1126
+ "GTAGG",
1127
+ "GTCGC",
1128
+ "TCTGG",
1129
+ "TACAC",
1130
+ "TTCGG",
1131
+ "CCATA",
1132
+ "TGATC",
1133
+ "CGTGG",
1134
+ "ACCTT",
1135
+ "TGTAT",
1136
+ "GGTTT",
1137
+ "CAAGG",
1138
+ "AGTAG",
1139
+ "GAAAG",
1140
+ "TGATT",
1141
+ "TCCGA",
1142
+ "GACTG",
1143
+ "CGTAT",
1144
+ "ATTCT",
1145
+ "AAAGG",
1146
+ "ATCAA",
1147
+ "TTTTA",
1148
+ "TACCT",
1149
+ "TGAGG",
1150
+ "TAAGT",
1151
+ "ACTGC",
1152
+ "CGTCT",
1153
+ "GTGCT",
1154
+ "AGGAG",
1155
+ "CGGAG",
1156
+ "GAACC",
1157
+ "TGTAA",
1158
+ "GCAAC",
1159
+ "CGCAA",
1160
+ "TGGGA",
1161
+ "TTATG",
1162
+ "GCCAT",
1163
+ "CCTTT",
1164
+ "ACAAA",
1165
+ "GGTAG",
1166
+ "CATAG",
1167
+ "CCAGC",
1168
+ "CTTGG",
1169
+ "TACGT",
1170
+ "TTGCC",
1171
+ "TCATC",
1172
+ "GGGCT",
1173
+ "GAGAA",
1174
+ "ATTGC",
1175
+ "CTACT",
1176
+ "TTGAC",
1177
+ "GTGAA",
1178
+ "CAGAA",
1179
+ "ACGTG",
1180
+ "GGTGC",
1181
+ "CTCCA",
1182
+ "GATCA",
1183
+ "CACTT",
1184
+ "GCCGT",
1185
+ "CTAAA",
1186
+ "GCAAA",
1187
+ "TATCG",
1188
+ "TGGGC",
1189
+ "AGGCT",
1190
+ "AACTT",
1191
+ "TACCC",
1192
+ "CGCAG",
1193
+ "GGCCG",
1194
+ "GGATC",
1195
+ "AATCG",
1196
+ "CTCGG",
1197
+ "TCTGA",
1198
+ "TGCTC",
1199
+ "CGAGC",
1200
+ "TCGTT",
1201
+ "AACGG",
1202
+ "TCAGA",
1203
+ "CGCCT",
1204
+ "TGGGT",
1205
+ "TGCAT",
1206
+ "GCACG",
1207
+ "ACTCG",
1208
+ "GTACA",
1209
+ "CCACC",
1210
+ "CGCGC",
1211
+ "GAGCA",
1212
+ "AAGGA",
1213
+ "AATGC",
1214
+ "GCAGA",
1215
+ "CCTTA",
1216
+ "GACTA",
1217
+ "CGGCC",
1218
+ "TTCCG",
1219
+ "AGTCG"
1220
+ ],
1221
+ "y": [
1222
+ 960,
1223
+ 1032,
1224
+ 976,
1225
+ 1001,
1226
+ 1005,
1227
+ 999,
1228
+ 986,
1229
+ 1005,
1230
+ 993,
1231
+ 937,
1232
+ 988,
1233
+ 984,
1234
+ 1002,
1235
+ 989,
1236
+ 999,
1237
+ 991,
1238
+ 981,
1239
+ 917,
1240
+ 968,
1241
+ 977,
1242
+ 956,
1243
+ 946,
1244
+ 950,
1245
+ 1008,
1246
+ 928,
1247
+ 993,
1248
+ 1021,
1249
+ 959,
1250
+ 983,
1251
+ 963,
1252
+ 982,
1253
+ 965,
1254
+ 993,
1255
+ 1008,
1256
+ 974,
1257
+ 975,
1258
+ 947,
1259
+ 1000,
1260
+ 952,
1261
+ 1002,
1262
+ 982,
1263
+ 984,
1264
+ 969,
1265
+ 1000,
1266
+ 956,
1267
+ 936,
1268
+ 972,
1269
+ 935,
1270
+ 975,
1271
+ 1007,
1272
+ 1009,
1273
+ 987,
1274
+ 945,
1275
+ 999,
1276
+ 978,
1277
+ 974,
1278
+ 951,
1279
+ 965,
1280
+ 988,
1281
+ 1000,
1282
+ 981,
1283
+ 997,
1284
+ 1026,
1285
+ 991,
1286
+ 975,
1287
+ 915,
1288
+ 972,
1289
+ 954,
1290
+ 993,
1291
+ 945,
1292
+ 964,
1293
+ 1014,
1294
+ 991,
1295
+ 967,
1296
+ 995,
1297
+ 902,
1298
+ 999,
1299
+ 978,
1300
+ 910,
1301
+ 900,
1302
+ 1004,
1303
+ 984,
1304
+ 923,
1305
+ 1025,
1306
+ 989,
1307
+ 959,
1308
+ 980,
1309
+ 1001,
1310
+ 929,
1311
+ 1024,
1312
+ 962,
1313
+ 970,
1314
+ 959,
1315
+ 940,
1316
+ 955,
1317
+ 940,
1318
+ 925,
1319
+ 962,
1320
+ 1062,
1321
+ 981,
1322
+ 975,
1323
+ 984,
1324
+ 965,
1325
+ 973,
1326
+ 1002,
1327
+ 932,
1328
+ 991,
1329
+ 976,
1330
+ 1003,
1331
+ 969,
1332
+ 972,
1333
+ 992,
1334
+ 993,
1335
+ 986,
1336
+ 927,
1337
+ 915,
1338
+ 962,
1339
+ 967,
1340
+ 1013,
1341
+ 937,
1342
+ 949,
1343
+ 979,
1344
+ 1022,
1345
+ 1033,
1346
+ 969,
1347
+ 968,
1348
+ 994,
1349
+ 991,
1350
+ 976,
1351
+ 1018,
1352
+ 964,
1353
+ 1040,
1354
+ 1043,
1355
+ 968,
1356
+ 946,
1357
+ 932,
1358
+ 981,
1359
+ 949,
1360
+ 937,
1361
+ 924,
1362
+ 994,
1363
+ 950,
1364
+ 928,
1365
+ 1009,
1366
+ 981,
1367
+ 987,
1368
+ 906,
1369
+ 981,
1370
+ 1058,
1371
+ 1042,
1372
+ 977,
1373
+ 942,
1374
+ 973,
1375
+ 991,
1376
+ 936,
1377
+ 918,
1378
+ 1002,
1379
+ 933,
1380
+ 955,
1381
+ 1005,
1382
+ 1006,
1383
+ 966,
1384
+ 994,
1385
+ 996,
1386
+ 965,
1387
+ 928,
1388
+ 976,
1389
+ 961,
1390
+ 986,
1391
+ 1024,
1392
+ 991,
1393
+ 983,
1394
+ 959,
1395
+ 964,
1396
+ 943,
1397
+ 981,
1398
+ 1011,
1399
+ 984,
1400
+ 910,
1401
+ 969,
1402
+ 970,
1403
+ 962,
1404
+ 1020,
1405
+ 933,
1406
+ 983,
1407
+ 944,
1408
+ 982,
1409
+ 959,
1410
+ 1003,
1411
+ 943,
1412
+ 928,
1413
+ 960,
1414
+ 991,
1415
+ 968,
1416
+ 1029,
1417
+ 935,
1418
+ 1013,
1419
+ 982,
1420
+ 999,
1421
+ 958,
1422
+ 976,
1423
+ 988,
1424
+ 958,
1425
+ 1004,
1426
+ 994,
1427
+ 1005,
1428
+ 990,
1429
+ 1000,
1430
+ 975,
1431
+ 960,
1432
+ 1007,
1433
+ 974,
1434
+ 989,
1435
+ 958,
1436
+ 1005,
1437
+ 970,
1438
+ 999,
1439
+ 973,
1440
+ 916,
1441
+ 924,
1442
+ 985,
1443
+ 981,
1444
+ 1004,
1445
+ 930,
1446
+ 945,
1447
+ 982,
1448
+ 946,
1449
+ 981,
1450
+ 984,
1451
+ 1011,
1452
+ 951,
1453
+ 963,
1454
+ 984,
1455
+ 970,
1456
+ 1001,
1457
+ 932,
1458
+ 994,
1459
+ 1049,
1460
+ 995,
1461
+ 934,
1462
+ 957,
1463
+ 944,
1464
+ 959,
1465
+ 960,
1466
+ 962,
1467
+ 953,
1468
+ 982,
1469
+ 932,
1470
+ 1027,
1471
+ 979,
1472
+ 927,
1473
+ 969,
1474
+ 944,
1475
+ 975,
1476
+ 969,
1477
+ 951,
1478
+ 1005,
1479
+ 918,
1480
+ 981,
1481
+ 1042,
1482
+ 985,
1483
+ 964,
1484
+ 1000,
1485
+ 1038,
1486
+ 918,
1487
+ 978,
1488
+ 974,
1489
+ 972,
1490
+ 979,
1491
+ 980,
1492
+ 1000,
1493
+ 975,
1494
+ 933,
1495
+ 965,
1496
+ 965,
1497
+ 1039,
1498
+ 987,
1499
+ 993,
1500
+ 931,
1501
+ 1027,
1502
+ 964,
1503
+ 979,
1504
+ 1071,
1505
+ 964,
1506
+ 967,
1507
+ 974,
1508
+ 933,
1509
+ 1045,
1510
+ 975,
1511
+ 999,
1512
+ 951,
1513
+ 990,
1514
+ 991,
1515
+ 978,
1516
+ 940,
1517
+ 964,
1518
+ 992,
1519
+ 928,
1520
+ 1000,
1521
+ 1005,
1522
+ 1008,
1523
+ 941,
1524
+ 965,
1525
+ 945,
1526
+ 1026,
1527
+ 978,
1528
+ 1018,
1529
+ 1007,
1530
+ 992,
1531
+ 1022,
1532
+ 967,
1533
+ 999,
1534
+ 979,
1535
+ 1013,
1536
+ 1003,
1537
+ 982,
1538
+ 990,
1539
+ 974,
1540
+ 1012,
1541
+ 1002,
1542
+ 1018,
1543
+ 1023,
1544
+ 954,
1545
+ 932,
1546
+ 944,
1547
+ 898,
1548
+ 915,
1549
+ 1006,
1550
+ 979,
1551
+ 974,
1552
+ 974,
1553
+ 973,
1554
+ 988,
1555
+ 973,
1556
+ 982,
1557
+ 936,
1558
+ 933,
1559
+ 989,
1560
+ 998,
1561
+ 962,
1562
+ 983,
1563
+ 974,
1564
+ 1013,
1565
+ 1013,
1566
+ 966,
1567
+ 954,
1568
+ 1001,
1569
+ 1016,
1570
+ 950,
1571
+ 968,
1572
+ 954,
1573
+ 949,
1574
+ 1016,
1575
+ 998,
1576
+ 1048,
1577
+ 1022,
1578
+ 1084,
1579
+ 986,
1580
+ 997,
1581
+ 1006,
1582
+ 1014,
1583
+ 978,
1584
+ 970,
1585
+ 961,
1586
+ 1007,
1587
+ 975,
1588
+ 992,
1589
+ 947,
1590
+ 1022,
1591
+ 946,
1592
+ 920,
1593
+ 925,
1594
+ 957,
1595
+ 943,
1596
+ 962,
1597
+ 994,
1598
+ 935,
1599
+ 950,
1600
+ 1038,
1601
+ 997,
1602
+ 942,
1603
+ 935,
1604
+ 1049,
1605
+ 992,
1606
+ 1025,
1607
+ 935,
1608
+ 957,
1609
+ 972,
1610
+ 906,
1611
+ 955,
1612
+ 958,
1613
+ 984,
1614
+ 1006,
1615
+ 979,
1616
+ 967,
1617
+ 1009,
1618
+ 1050,
1619
+ 929,
1620
+ 939,
1621
+ 959,
1622
+ 1027,
1623
+ 940,
1624
+ 982,
1625
+ 946,
1626
+ 932,
1627
+ 1024,
1628
+ 933,
1629
+ 916,
1630
+ 978,
1631
+ 994,
1632
+ 990,
1633
+ 1028,
1634
+ 928,
1635
+ 964,
1636
+ 974,
1637
+ 952,
1638
+ 972,
1639
+ 964,
1640
+ 987,
1641
+ 969,
1642
+ 993,
1643
+ 1006,
1644
+ 957,
1645
+ 980,
1646
+ 1004,
1647
+ 968,
1648
+ 976,
1649
+ 1012,
1650
+ 957,
1651
+ 985,
1652
+ 939,
1653
+ 930,
1654
+ 939,
1655
+ 969,
1656
+ 994,
1657
+ 997,
1658
+ 977,
1659
+ 964,
1660
+ 980,
1661
+ 987,
1662
+ 1046,
1663
+ 1001,
1664
+ 963,
1665
+ 1009,
1666
+ 940,
1667
+ 1029,
1668
+ 978,
1669
+ 927,
1670
+ 1017,
1671
+ 962,
1672
+ 1006,
1673
+ 1008,
1674
+ 994,
1675
+ 1002,
1676
+ 1002,
1677
+ 1048,
1678
+ 1046,
1679
+ 954,
1680
+ 978,
1681
+ 1019,
1682
+ 969,
1683
+ 990,
1684
+ 973,
1685
+ 942,
1686
+ 989,
1687
+ 978,
1688
+ 1001,
1689
+ 992,
1690
+ 968,
1691
+ 929,
1692
+ 978,
1693
+ 970,
1694
+ 1006,
1695
+ 1005,
1696
+ 1011,
1697
+ 974,
1698
+ 1033,
1699
+ 993,
1700
+ 960,
1701
+ 909,
1702
+ 1032,
1703
+ 957,
1704
+ 1022,
1705
+ 986,
1706
+ 956,
1707
+ 960,
1708
+ 953,
1709
+ 946,
1710
+ 1019,
1711
+ 972,
1712
+ 1012,
1713
+ 901,
1714
+ 956,
1715
+ 942,
1716
+ 957,
1717
+ 978,
1718
+ 929,
1719
+ 997,
1720
+ 923,
1721
+ 985,
1722
+ 999,
1723
+ 1066,
1724
+ 969,
1725
+ 1000,
1726
+ 1038,
1727
+ 1006,
1728
+ 1019,
1729
+ 993,
1730
+ 1025,
1731
+ 1004,
1732
+ 940,
1733
+ 992,
1734
+ 1006,
1735
+ 1019,
1736
+ 976,
1737
+ 997,
1738
+ 1029,
1739
+ 980,
1740
+ 996,
1741
+ 933,
1742
+ 994,
1743
+ 1018,
1744
+ 984,
1745
+ 1015,
1746
+ 986,
1747
+ 981,
1748
+ 981,
1749
+ 963,
1750
+ 979,
1751
+ 1026,
1752
+ 1002,
1753
+ 931,
1754
+ 955,
1755
+ 959,
1756
+ 975,
1757
+ 959,
1758
+ 955,
1759
+ 960,
1760
+ 980,
1761
+ 1010,
1762
+ 999,
1763
+ 948,
1764
+ 966,
1765
+ 922,
1766
+ 975,
1767
+ 917,
1768
+ 926,
1769
+ 967,
1770
+ 1010,
1771
+ 973,
1772
+ 964,
1773
+ 908,
1774
+ 1012,
1775
+ 975,
1776
+ 995,
1777
+ 992,
1778
+ 1005,
1779
+ 997,
1780
+ 1007,
1781
+ 976,
1782
+ 995,
1783
+ 913,
1784
+ 942,
1785
+ 976,
1786
+ 1027,
1787
+ 992,
1788
+ 992,
1789
+ 935,
1790
+ 940,
1791
+ 988,
1792
+ 967,
1793
+ 951,
1794
+ 979,
1795
+ 911,
1796
+ 913,
1797
+ 985,
1798
+ 982,
1799
+ 949,
1800
+ 969,
1801
+ 1008,
1802
+ 991,
1803
+ 960,
1804
+ 980,
1805
+ 952,
1806
+ 977,
1807
+ 986,
1808
+ 954,
1809
+ 984,
1810
+ 962,
1811
+ 956,
1812
+ 939,
1813
+ 947,
1814
+ 956,
1815
+ 963,
1816
+ 970,
1817
+ 991,
1818
+ 991,
1819
+ 1014,
1820
+ 985,
1821
+ 976,
1822
+ 977,
1823
+ 959,
1824
+ 981,
1825
+ 946,
1826
+ 993,
1827
+ 1005,
1828
+ 959,
1829
+ 1003,
1830
+ 1036,
1831
+ 1019,
1832
+ 969,
1833
+ 945,
1834
+ 923,
1835
+ 1016,
1836
+ 979,
1837
+ 1030,
1838
+ 975,
1839
+ 977,
1840
+ 1012,
1841
+ 927,
1842
+ 996,
1843
+ 932,
1844
+ 960,
1845
+ 940,
1846
+ 987,
1847
+ 1050,
1848
+ 988,
1849
+ 1030,
1850
+ 927,
1851
+ 1033,
1852
+ 989,
1853
+ 961,
1854
+ 1009,
1855
+ 1013,
1856
+ 969,
1857
+ 930,
1858
+ 972,
1859
+ 994,
1860
+ 977,
1861
+ 937,
1862
+ 950,
1863
+ 1018,
1864
+ 986,
1865
+ 977,
1866
+ 998,
1867
+ 981,
1868
+ 973,
1869
+ 953,
1870
+ 948,
1871
+ 994,
1872
+ 989,
1873
+ 933,
1874
+ 926,
1875
+ 921,
1876
+ 905,
1877
+ 1003,
1878
+ 1006,
1879
+ 995,
1880
+ 932,
1881
+ 1002,
1882
+ 948,
1883
+ 1008,
1884
+ 932,
1885
+ 911,
1886
+ 975,
1887
+ 1019,
1888
+ 964,
1889
+ 1016,
1890
+ 1038,
1891
+ 955,
1892
+ 995,
1893
+ 944,
1894
+ 979,
1895
+ 905,
1896
+ 989,
1897
+ 1020,
1898
+ 967,
1899
+ 990,
1900
+ 904,
1901
+ 991,
1902
+ 1030,
1903
+ 967,
1904
+ 1011,
1905
+ 1004,
1906
+ 1009,
1907
+ 1010,
1908
+ 961,
1909
+ 940,
1910
+ 1005,
1911
+ 983,
1912
+ 929,
1913
+ 936,
1914
+ 971,
1915
+ 992,
1916
+ 965,
1917
+ 998,
1918
+ 999,
1919
+ 937,
1920
+ 956,
1921
+ 1062,
1922
+ 959,
1923
+ 961,
1924
+ 983,
1925
+ 922,
1926
+ 993,
1927
+ 971,
1928
+ 990,
1929
+ 971,
1930
+ 969,
1931
+ 948,
1932
+ 990,
1933
+ 989,
1934
+ 956,
1935
+ 1000,
1936
+ 913,
1937
+ 945,
1938
+ 969,
1939
+ 999,
1940
+ 973,
1941
+ 1002,
1942
+ 964,
1943
+ 979,
1944
+ 958,
1945
+ 975,
1946
+ 989,
1947
+ 1028,
1948
+ 960,
1949
+ 998,
1950
+ 1039,
1951
+ 986,
1952
+ 987,
1953
+ 970,
1954
+ 1028,
1955
+ 1002,
1956
+ 987,
1957
+ 1006,
1958
+ 969,
1959
+ 986,
1960
+ 1011,
1961
+ 1014,
1962
+ 922,
1963
+ 1001,
1964
+ 974,
1965
+ 1041,
1966
+ 987,
1967
+ 1045,
1968
+ 1015,
1969
+ 955,
1970
+ 980,
1971
+ 971,
1972
+ 911,
1973
+ 996,
1974
+ 960,
1975
+ 982,
1976
+ 970,
1977
+ 963,
1978
+ 986,
1979
+ 984,
1980
+ 970,
1981
+ 970,
1982
+ 935,
1983
+ 1021,
1984
+ 977,
1985
+ 1085,
1986
+ 966,
1987
+ 913,
1988
+ 952,
1989
+ 942,
1990
+ 982,
1991
+ 967,
1992
+ 988,
1993
+ 983,
1994
+ 943,
1995
+ 969,
1996
+ 941,
1997
+ 967,
1998
+ 922,
1999
+ 982,
2000
+ 993,
2001
+ 948,
2002
+ 981,
2003
+ 1016,
2004
+ 1040,
2005
+ 898,
2006
+ 976,
2007
+ 920,
2008
+ 989,
2009
+ 941,
2010
+ 962,
2011
+ 963,
2012
+ 943,
2013
+ 989,
2014
+ 976,
2015
+ 1005,
2016
+ 975,
2017
+ 952,
2018
+ 987,
2019
+ 972,
2020
+ 969,
2021
+ 987,
2022
+ 1012,
2023
+ 971,
2024
+ 933,
2025
+ 964,
2026
+ 943,
2027
+ 921,
2028
+ 1014,
2029
+ 975,
2030
+ 995,
2031
+ 977,
2032
+ 953,
2033
+ 956,
2034
+ 983,
2035
+ 936,
2036
+ 1007,
2037
+ 979,
2038
+ 997,
2039
+ 927,
2040
+ 1001,
2041
+ 935,
2042
+ 1002,
2043
+ 955,
2044
+ 996,
2045
+ 995,
2046
+ 966,
2047
+ 980,
2048
+ 939,
2049
+ 981,
2050
+ 994,
2051
+ 1039,
2052
+ 964,
2053
+ 989,
2054
+ 982,
2055
+ 972,
2056
+ 926,
2057
+ 1019,
2058
+ 987,
2059
+ 994,
2060
+ 976,
2061
+ 961,
2062
+ 959,
2063
+ 961,
2064
+ 938,
2065
+ 968,
2066
+ 971,
2067
+ 943,
2068
+ 949,
2069
+ 978,
2070
+ 943,
2071
+ 977,
2072
+ 1015,
2073
+ 949,
2074
+ 968,
2075
+ 968,
2076
+ 947,
2077
+ 976,
2078
+ 960,
2079
+ 954,
2080
+ 1011,
2081
+ 970,
2082
+ 912,
2083
+ 972,
2084
+ 985,
2085
+ 927,
2086
+ 996,
2087
+ 926,
2088
+ 934,
2089
+ 977,
2090
+ 954,
2091
+ 1005,
2092
+ 982,
2093
+ 961,
2094
+ 966,
2095
+ 949,
2096
+ 985,
2097
+ 963,
2098
+ 987,
2099
+ 989,
2100
+ 975,
2101
+ 948,
2102
+ 1001,
2103
+ 1007,
2104
+ 956,
2105
+ 999,
2106
+ 972,
2107
+ 984,
2108
+ 997,
2109
+ 1026,
2110
+ 940,
2111
+ 945,
2112
+ 964,
2113
+ 973,
2114
+ 1040,
2115
+ 976,
2116
+ 995,
2117
+ 962,
2118
+ 915,
2119
+ 992,
2120
+ 956,
2121
+ 990,
2122
+ 972,
2123
+ 977,
2124
+ 1035,
2125
+ 1009,
2126
+ 999,
2127
+ 979,
2128
+ 1025,
2129
+ 982,
2130
+ 947,
2131
+ 993,
2132
+ 956,
2133
+ 981,
2134
+ 1019,
2135
+ 1004,
2136
+ 973,
2137
+ 906,
2138
+ 948,
2139
+ 952,
2140
+ 971,
2141
+ 1014,
2142
+ 979,
2143
+ 969,
2144
+ 948,
2145
+ 937,
2146
+ 964,
2147
+ 995,
2148
+ 946,
2149
+ 1002,
2150
+ 967,
2151
+ 1006,
2152
+ 949,
2153
+ 978,
2154
+ 989,
2155
+ 909,
2156
+ 967,
2157
+ 955,
2158
+ 1025,
2159
+ 981,
2160
+ 995,
2161
+ 1014,
2162
+ 966,
2163
+ 978,
2164
+ 956,
2165
+ 973,
2166
+ 914,
2167
+ 954,
2168
+ 975,
2169
+ 1001,
2170
+ 986,
2171
+ 950,
2172
+ 955,
2173
+ 941,
2174
+ 958,
2175
+ 981,
2176
+ 965,
2177
+ 940,
2178
+ 971,
2179
+ 989,
2180
+ 1048,
2181
+ 986,
2182
+ 990,
2183
+ 982,
2184
+ 1000,
2185
+ 961,
2186
+ 1012,
2187
+ 942,
2188
+ 968,
2189
+ 958,
2190
+ 1015,
2191
+ 960,
2192
+ 952,
2193
+ 936,
2194
+ 979,
2195
+ 971,
2196
+ 945,
2197
+ 949,
2198
+ 946,
2199
+ 949,
2200
+ 1028,
2201
+ 966,
2202
+ 1053,
2203
+ 1006,
2204
+ 967,
2205
+ 994,
2206
+ 995,
2207
+ 941,
2208
+ 1002,
2209
+ 971,
2210
+ 968,
2211
+ 963,
2212
+ 1011,
2213
+ 936,
2214
+ 999,
2215
+ 986,
2216
+ 945,
2217
+ 973,
2218
+ 999,
2219
+ 1020,
2220
+ 969,
2221
+ 988,
2222
+ 979,
2223
+ 903,
2224
+ 998,
2225
+ 1030,
2226
+ 1016,
2227
+ 960,
2228
+ 977,
2229
+ 1008,
2230
+ 1044,
2231
+ 939,
2232
+ 1005,
2233
+ 990,
2234
+ 955,
2235
+ 1005,
2236
+ 986,
2237
+ 1017,
2238
+ 1054,
2239
+ 970,
2240
+ 951,
2241
+ 977,
2242
+ 1000,
2243
+ 1018,
2244
+ 949,
2245
+ 952
2246
+ ]
2247
+ }
2248
+ ],
2249
+ "layout": {
2250
+ "template": {
2251
+ "data": {
2252
+ "bar": [
2253
+ {
2254
+ "error_x": {
2255
+ "color": "#2a3f5f"
2256
+ },
2257
+ "error_y": {
2258
+ "color": "#2a3f5f"
2259
+ },
2260
+ "marker": {
2261
+ "line": {
2262
+ "color": "#E5ECF6",
2263
+ "width": 0.5
2264
+ },
2265
+ "pattern": {
2266
+ "fillmode": "overlay",
2267
+ "size": 10,
2268
+ "solidity": 0.2
2269
+ }
2270
+ },
2271
+ "type": "bar"
2272
+ }
2273
+ ],
2274
+ "barpolar": [
2275
+ {
2276
+ "marker": {
2277
+ "line": {
2278
+ "color": "#E5ECF6",
2279
+ "width": 0.5
2280
+ },
2281
+ "pattern": {
2282
+ "fillmode": "overlay",
2283
+ "size": 10,
2284
+ "solidity": 0.2
2285
+ }
2286
+ },
2287
+ "type": "barpolar"
2288
+ }
2289
+ ],
2290
+ "carpet": [
2291
+ {
2292
+ "aaxis": {
2293
+ "endlinecolor": "#2a3f5f",
2294
+ "gridcolor": "white",
2295
+ "linecolor": "white",
2296
+ "minorgridcolor": "white",
2297
+ "startlinecolor": "#2a3f5f"
2298
+ },
2299
+ "baxis": {
2300
+ "endlinecolor": "#2a3f5f",
2301
+ "gridcolor": "white",
2302
+ "linecolor": "white",
2303
+ "minorgridcolor": "white",
2304
+ "startlinecolor": "#2a3f5f"
2305
+ },
2306
+ "type": "carpet"
2307
+ }
2308
+ ],
2309
+ "choropleth": [
2310
+ {
2311
+ "colorbar": {
2312
+ "outlinewidth": 0,
2313
+ "ticks": ""
2314
+ },
2315
+ "type": "choropleth"
2316
+ }
2317
+ ],
2318
+ "contour": [
2319
+ {
2320
+ "colorbar": {
2321
+ "outlinewidth": 0,
2322
+ "ticks": ""
2323
+ },
2324
+ "colorscale": [
2325
+ [
2326
+ 0,
2327
+ "#0d0887"
2328
+ ],
2329
+ [
2330
+ 0.1111111111111111,
2331
+ "#46039f"
2332
+ ],
2333
+ [
2334
+ 0.2222222222222222,
2335
+ "#7201a8"
2336
+ ],
2337
+ [
2338
+ 0.3333333333333333,
2339
+ "#9c179e"
2340
+ ],
2341
+ [
2342
+ 0.4444444444444444,
2343
+ "#bd3786"
2344
+ ],
2345
+ [
2346
+ 0.5555555555555556,
2347
+ "#d8576b"
2348
+ ],
2349
+ [
2350
+ 0.6666666666666666,
2351
+ "#ed7953"
2352
+ ],
2353
+ [
2354
+ 0.7777777777777778,
2355
+ "#fb9f3a"
2356
+ ],
2357
+ [
2358
+ 0.8888888888888888,
2359
+ "#fdca26"
2360
+ ],
2361
+ [
2362
+ 1,
2363
+ "#f0f921"
2364
+ ]
2365
+ ],
2366
+ "type": "contour"
2367
+ }
2368
+ ],
2369
+ "contourcarpet": [
2370
+ {
2371
+ "colorbar": {
2372
+ "outlinewidth": 0,
2373
+ "ticks": ""
2374
+ },
2375
+ "type": "contourcarpet"
2376
+ }
2377
+ ],
2378
+ "heatmap": [
2379
+ {
2380
+ "colorbar": {
2381
+ "outlinewidth": 0,
2382
+ "ticks": ""
2383
+ },
2384
+ "colorscale": [
2385
+ [
2386
+ 0,
2387
+ "#0d0887"
2388
+ ],
2389
+ [
2390
+ 0.1111111111111111,
2391
+ "#46039f"
2392
+ ],
2393
+ [
2394
+ 0.2222222222222222,
2395
+ "#7201a8"
2396
+ ],
2397
+ [
2398
+ 0.3333333333333333,
2399
+ "#9c179e"
2400
+ ],
2401
+ [
2402
+ 0.4444444444444444,
2403
+ "#bd3786"
2404
+ ],
2405
+ [
2406
+ 0.5555555555555556,
2407
+ "#d8576b"
2408
+ ],
2409
+ [
2410
+ 0.6666666666666666,
2411
+ "#ed7953"
2412
+ ],
2413
+ [
2414
+ 0.7777777777777778,
2415
+ "#fb9f3a"
2416
+ ],
2417
+ [
2418
+ 0.8888888888888888,
2419
+ "#fdca26"
2420
+ ],
2421
+ [
2422
+ 1,
2423
+ "#f0f921"
2424
+ ]
2425
+ ],
2426
+ "type": "heatmap"
2427
+ }
2428
+ ],
2429
+ "heatmapgl": [
2430
+ {
2431
+ "colorbar": {
2432
+ "outlinewidth": 0,
2433
+ "ticks": ""
2434
+ },
2435
+ "colorscale": [
2436
+ [
2437
+ 0,
2438
+ "#0d0887"
2439
+ ],
2440
+ [
2441
+ 0.1111111111111111,
2442
+ "#46039f"
2443
+ ],
2444
+ [
2445
+ 0.2222222222222222,
2446
+ "#7201a8"
2447
+ ],
2448
+ [
2449
+ 0.3333333333333333,
2450
+ "#9c179e"
2451
+ ],
2452
+ [
2453
+ 0.4444444444444444,
2454
+ "#bd3786"
2455
+ ],
2456
+ [
2457
+ 0.5555555555555556,
2458
+ "#d8576b"
2459
+ ],
2460
+ [
2461
+ 0.6666666666666666,
2462
+ "#ed7953"
2463
+ ],
2464
+ [
2465
+ 0.7777777777777778,
2466
+ "#fb9f3a"
2467
+ ],
2468
+ [
2469
+ 0.8888888888888888,
2470
+ "#fdca26"
2471
+ ],
2472
+ [
2473
+ 1,
2474
+ "#f0f921"
2475
+ ]
2476
+ ],
2477
+ "type": "heatmapgl"
2478
+ }
2479
+ ],
2480
+ "histogram": [
2481
+ {
2482
+ "marker": {
2483
+ "pattern": {
2484
+ "fillmode": "overlay",
2485
+ "size": 10,
2486
+ "solidity": 0.2
2487
+ }
2488
+ },
2489
+ "type": "histogram"
2490
+ }
2491
+ ],
2492
+ "histogram2d": [
2493
+ {
2494
+ "colorbar": {
2495
+ "outlinewidth": 0,
2496
+ "ticks": ""
2497
+ },
2498
+ "colorscale": [
2499
+ [
2500
+ 0,
2501
+ "#0d0887"
2502
+ ],
2503
+ [
2504
+ 0.1111111111111111,
2505
+ "#46039f"
2506
+ ],
2507
+ [
2508
+ 0.2222222222222222,
2509
+ "#7201a8"
2510
+ ],
2511
+ [
2512
+ 0.3333333333333333,
2513
+ "#9c179e"
2514
+ ],
2515
+ [
2516
+ 0.4444444444444444,
2517
+ "#bd3786"
2518
+ ],
2519
+ [
2520
+ 0.5555555555555556,
2521
+ "#d8576b"
2522
+ ],
2523
+ [
2524
+ 0.6666666666666666,
2525
+ "#ed7953"
2526
+ ],
2527
+ [
2528
+ 0.7777777777777778,
2529
+ "#fb9f3a"
2530
+ ],
2531
+ [
2532
+ 0.8888888888888888,
2533
+ "#fdca26"
2534
+ ],
2535
+ [
2536
+ 1,
2537
+ "#f0f921"
2538
+ ]
2539
+ ],
2540
+ "type": "histogram2d"
2541
+ }
2542
+ ],
2543
+ "histogram2dcontour": [
2544
+ {
2545
+ "colorbar": {
2546
+ "outlinewidth": 0,
2547
+ "ticks": ""
2548
+ },
2549
+ "colorscale": [
2550
+ [
2551
+ 0,
2552
+ "#0d0887"
2553
+ ],
2554
+ [
2555
+ 0.1111111111111111,
2556
+ "#46039f"
2557
+ ],
2558
+ [
2559
+ 0.2222222222222222,
2560
+ "#7201a8"
2561
+ ],
2562
+ [
2563
+ 0.3333333333333333,
2564
+ "#9c179e"
2565
+ ],
2566
+ [
2567
+ 0.4444444444444444,
2568
+ "#bd3786"
2569
+ ],
2570
+ [
2571
+ 0.5555555555555556,
2572
+ "#d8576b"
2573
+ ],
2574
+ [
2575
+ 0.6666666666666666,
2576
+ "#ed7953"
2577
+ ],
2578
+ [
2579
+ 0.7777777777777778,
2580
+ "#fb9f3a"
2581
+ ],
2582
+ [
2583
+ 0.8888888888888888,
2584
+ "#fdca26"
2585
+ ],
2586
+ [
2587
+ 1,
2588
+ "#f0f921"
2589
+ ]
2590
+ ],
2591
+ "type": "histogram2dcontour"
2592
+ }
2593
+ ],
2594
+ "mesh3d": [
2595
+ {
2596
+ "colorbar": {
2597
+ "outlinewidth": 0,
2598
+ "ticks": ""
2599
+ },
2600
+ "type": "mesh3d"
2601
+ }
2602
+ ],
2603
+ "parcoords": [
2604
+ {
2605
+ "line": {
2606
+ "colorbar": {
2607
+ "outlinewidth": 0,
2608
+ "ticks": ""
2609
+ }
2610
+ },
2611
+ "type": "parcoords"
2612
+ }
2613
+ ],
2614
+ "pie": [
2615
+ {
2616
+ "automargin": true,
2617
+ "type": "pie"
2618
+ }
2619
+ ],
2620
+ "scatter": [
2621
+ {
2622
+ "fillpattern": {
2623
+ "fillmode": "overlay",
2624
+ "size": 10,
2625
+ "solidity": 0.2
2626
+ },
2627
+ "type": "scatter"
2628
+ }
2629
+ ],
2630
+ "scatter3d": [
2631
+ {
2632
+ "line": {
2633
+ "colorbar": {
2634
+ "outlinewidth": 0,
2635
+ "ticks": ""
2636
+ }
2637
+ },
2638
+ "marker": {
2639
+ "colorbar": {
2640
+ "outlinewidth": 0,
2641
+ "ticks": ""
2642
+ }
2643
+ },
2644
+ "type": "scatter3d"
2645
+ }
2646
+ ],
2647
+ "scattercarpet": [
2648
+ {
2649
+ "marker": {
2650
+ "colorbar": {
2651
+ "outlinewidth": 0,
2652
+ "ticks": ""
2653
+ }
2654
+ },
2655
+ "type": "scattercarpet"
2656
+ }
2657
+ ],
2658
+ "scattergeo": [
2659
+ {
2660
+ "marker": {
2661
+ "colorbar": {
2662
+ "outlinewidth": 0,
2663
+ "ticks": ""
2664
+ }
2665
+ },
2666
+ "type": "scattergeo"
2667
+ }
2668
+ ],
2669
+ "scattergl": [
2670
+ {
2671
+ "marker": {
2672
+ "colorbar": {
2673
+ "outlinewidth": 0,
2674
+ "ticks": ""
2675
+ }
2676
+ },
2677
+ "type": "scattergl"
2678
+ }
2679
+ ],
2680
+ "scattermapbox": [
2681
+ {
2682
+ "marker": {
2683
+ "colorbar": {
2684
+ "outlinewidth": 0,
2685
+ "ticks": ""
2686
+ }
2687
+ },
2688
+ "type": "scattermapbox"
2689
+ }
2690
+ ],
2691
+ "scatterpolar": [
2692
+ {
2693
+ "marker": {
2694
+ "colorbar": {
2695
+ "outlinewidth": 0,
2696
+ "ticks": ""
2697
+ }
2698
+ },
2699
+ "type": "scatterpolar"
2700
+ }
2701
+ ],
2702
+ "scatterpolargl": [
2703
+ {
2704
+ "marker": {
2705
+ "colorbar": {
2706
+ "outlinewidth": 0,
2707
+ "ticks": ""
2708
+ }
2709
+ },
2710
+ "type": "scatterpolargl"
2711
+ }
2712
+ ],
2713
+ "scatterternary": [
2714
+ {
2715
+ "marker": {
2716
+ "colorbar": {
2717
+ "outlinewidth": 0,
2718
+ "ticks": ""
2719
+ }
2720
+ },
2721
+ "type": "scatterternary"
2722
+ }
2723
+ ],
2724
+ "surface": [
2725
+ {
2726
+ "colorbar": {
2727
+ "outlinewidth": 0,
2728
+ "ticks": ""
2729
+ },
2730
+ "colorscale": [
2731
+ [
2732
+ 0,
2733
+ "#0d0887"
2734
+ ],
2735
+ [
2736
+ 0.1111111111111111,
2737
+ "#46039f"
2738
+ ],
2739
+ [
2740
+ 0.2222222222222222,
2741
+ "#7201a8"
2742
+ ],
2743
+ [
2744
+ 0.3333333333333333,
2745
+ "#9c179e"
2746
+ ],
2747
+ [
2748
+ 0.4444444444444444,
2749
+ "#bd3786"
2750
+ ],
2751
+ [
2752
+ 0.5555555555555556,
2753
+ "#d8576b"
2754
+ ],
2755
+ [
2756
+ 0.6666666666666666,
2757
+ "#ed7953"
2758
+ ],
2759
+ [
2760
+ 0.7777777777777778,
2761
+ "#fb9f3a"
2762
+ ],
2763
+ [
2764
+ 0.8888888888888888,
2765
+ "#fdca26"
2766
+ ],
2767
+ [
2768
+ 1,
2769
+ "#f0f921"
2770
+ ]
2771
+ ],
2772
+ "type": "surface"
2773
+ }
2774
+ ],
2775
+ "table": [
2776
+ {
2777
+ "cells": {
2778
+ "fill": {
2779
+ "color": "#EBF0F8"
2780
+ },
2781
+ "line": {
2782
+ "color": "white"
2783
+ }
2784
+ },
2785
+ "header": {
2786
+ "fill": {
2787
+ "color": "#C8D4E3"
2788
+ },
2789
+ "line": {
2790
+ "color": "white"
2791
+ }
2792
+ },
2793
+ "type": "table"
2794
+ }
2795
+ ]
2796
+ },
2797
+ "layout": {
2798
+ "annotationdefaults": {
2799
+ "arrowcolor": "#2a3f5f",
2800
+ "arrowhead": 0,
2801
+ "arrowwidth": 1
2802
+ },
2803
+ "autotypenumbers": "strict",
2804
+ "coloraxis": {
2805
+ "colorbar": {
2806
+ "outlinewidth": 0,
2807
+ "ticks": ""
2808
+ }
2809
+ },
2810
+ "colorscale": {
2811
+ "diverging": [
2812
+ [
2813
+ 0,
2814
+ "#8e0152"
2815
+ ],
2816
+ [
2817
+ 0.1,
2818
+ "#c51b7d"
2819
+ ],
2820
+ [
2821
+ 0.2,
2822
+ "#de77ae"
2823
+ ],
2824
+ [
2825
+ 0.3,
2826
+ "#f1b6da"
2827
+ ],
2828
+ [
2829
+ 0.4,
2830
+ "#fde0ef"
2831
+ ],
2832
+ [
2833
+ 0.5,
2834
+ "#f7f7f7"
2835
+ ],
2836
+ [
2837
+ 0.6,
2838
+ "#e6f5d0"
2839
+ ],
2840
+ [
2841
+ 0.7,
2842
+ "#b8e186"
2843
+ ],
2844
+ [
2845
+ 0.8,
2846
+ "#7fbc41"
2847
+ ],
2848
+ [
2849
+ 0.9,
2850
+ "#4d9221"
2851
+ ],
2852
+ [
2853
+ 1,
2854
+ "#276419"
2855
+ ]
2856
+ ],
2857
+ "sequential": [
2858
+ [
2859
+ 0,
2860
+ "#0d0887"
2861
+ ],
2862
+ [
2863
+ 0.1111111111111111,
2864
+ "#46039f"
2865
+ ],
2866
+ [
2867
+ 0.2222222222222222,
2868
+ "#7201a8"
2869
+ ],
2870
+ [
2871
+ 0.3333333333333333,
2872
+ "#9c179e"
2873
+ ],
2874
+ [
2875
+ 0.4444444444444444,
2876
+ "#bd3786"
2877
+ ],
2878
+ [
2879
+ 0.5555555555555556,
2880
+ "#d8576b"
2881
+ ],
2882
+ [
2883
+ 0.6666666666666666,
2884
+ "#ed7953"
2885
+ ],
2886
+ [
2887
+ 0.7777777777777778,
2888
+ "#fb9f3a"
2889
+ ],
2890
+ [
2891
+ 0.8888888888888888,
2892
+ "#fdca26"
2893
+ ],
2894
+ [
2895
+ 1,
2896
+ "#f0f921"
2897
+ ]
2898
+ ],
2899
+ "sequentialminus": [
2900
+ [
2901
+ 0,
2902
+ "#0d0887"
2903
+ ],
2904
+ [
2905
+ 0.1111111111111111,
2906
+ "#46039f"
2907
+ ],
2908
+ [
2909
+ 0.2222222222222222,
2910
+ "#7201a8"
2911
+ ],
2912
+ [
2913
+ 0.3333333333333333,
2914
+ "#9c179e"
2915
+ ],
2916
+ [
2917
+ 0.4444444444444444,
2918
+ "#bd3786"
2919
+ ],
2920
+ [
2921
+ 0.5555555555555556,
2922
+ "#d8576b"
2923
+ ],
2924
+ [
2925
+ 0.6666666666666666,
2926
+ "#ed7953"
2927
+ ],
2928
+ [
2929
+ 0.7777777777777778,
2930
+ "#fb9f3a"
2931
+ ],
2932
+ [
2933
+ 0.8888888888888888,
2934
+ "#fdca26"
2935
+ ],
2936
+ [
2937
+ 1,
2938
+ "#f0f921"
2939
+ ]
2940
+ ]
2941
+ },
2942
+ "colorway": [
2943
+ "#636efa",
2944
+ "#EF553B",
2945
+ "#00cc96",
2946
+ "#ab63fa",
2947
+ "#FFA15A",
2948
+ "#19d3f3",
2949
+ "#FF6692",
2950
+ "#B6E880",
2951
+ "#FF97FF",
2952
+ "#FECB52"
2953
+ ],
2954
+ "font": {
2955
+ "color": "#2a3f5f"
2956
+ },
2957
+ "geo": {
2958
+ "bgcolor": "white",
2959
+ "lakecolor": "white",
2960
+ "landcolor": "#E5ECF6",
2961
+ "showlakes": true,
2962
+ "showland": true,
2963
+ "subunitcolor": "white"
2964
+ },
2965
+ "hoverlabel": {
2966
+ "align": "left"
2967
+ },
2968
+ "hovermode": "closest",
2969
+ "mapbox": {
2970
+ "style": "light"
2971
+ },
2972
+ "paper_bgcolor": "white",
2973
+ "plot_bgcolor": "#E5ECF6",
2974
+ "polar": {
2975
+ "angularaxis": {
2976
+ "gridcolor": "white",
2977
+ "linecolor": "white",
2978
+ "ticks": ""
2979
+ },
2980
+ "bgcolor": "#E5ECF6",
2981
+ "radialaxis": {
2982
+ "gridcolor": "white",
2983
+ "linecolor": "white",
2984
+ "ticks": ""
2985
+ }
2986
+ },
2987
+ "scene": {
2988
+ "xaxis": {
2989
+ "backgroundcolor": "#E5ECF6",
2990
+ "gridcolor": "white",
2991
+ "gridwidth": 2,
2992
+ "linecolor": "white",
2993
+ "showbackground": true,
2994
+ "ticks": "",
2995
+ "zerolinecolor": "white"
2996
+ },
2997
+ "yaxis": {
2998
+ "backgroundcolor": "#E5ECF6",
2999
+ "gridcolor": "white",
3000
+ "gridwidth": 2,
3001
+ "linecolor": "white",
3002
+ "showbackground": true,
3003
+ "ticks": "",
3004
+ "zerolinecolor": "white"
3005
+ },
3006
+ "zaxis": {
3007
+ "backgroundcolor": "#E5ECF6",
3008
+ "gridcolor": "white",
3009
+ "gridwidth": 2,
3010
+ "linecolor": "white",
3011
+ "showbackground": true,
3012
+ "ticks": "",
3013
+ "zerolinecolor": "white"
3014
+ }
3015
+ },
3016
+ "shapedefaults": {
3017
+ "line": {
3018
+ "color": "#2a3f5f"
3019
+ }
3020
+ },
3021
+ "ternary": {
3022
+ "aaxis": {
3023
+ "gridcolor": "white",
3024
+ "linecolor": "white",
3025
+ "ticks": ""
3026
+ },
3027
+ "baxis": {
3028
+ "gridcolor": "white",
3029
+ "linecolor": "white",
3030
+ "ticks": ""
3031
+ },
3032
+ "bgcolor": "#E5ECF6",
3033
+ "caxis": {
3034
+ "gridcolor": "white",
3035
+ "linecolor": "white",
3036
+ "ticks": ""
3037
+ }
3038
+ },
3039
+ "title": {
3040
+ "x": 0.05
3041
+ },
3042
+ "xaxis": {
3043
+ "automargin": true,
3044
+ "gridcolor": "white",
3045
+ "linecolor": "white",
3046
+ "ticks": "",
3047
+ "title": {
3048
+ "standoff": 15
3049
+ },
3050
+ "zerolinecolor": "white",
3051
+ "zerolinewidth": 2
3052
+ },
3053
+ "yaxis": {
3054
+ "automargin": true,
3055
+ "gridcolor": "white",
3056
+ "linecolor": "white",
3057
+ "ticks": "",
3058
+ "title": {
3059
+ "standoff": 15
3060
+ },
3061
+ "zerolinecolor": "white",
3062
+ "zerolinewidth": 2
3063
+ }
3064
+ }
3065
+ },
3066
+ "title": {
3067
+ "text": "1024 Kmer Distribution for 5-mers"
3068
+ },
3069
+ "xaxis": {
3070
+ "title": {
3071
+ "text": "Kmer"
3072
+ }
3073
+ },
3074
+ "yaxis": {
3075
+ "title": {
3076
+ "text": "Count"
3077
+ }
3078
+ }
3079
+ }
3080
+ }
3081
+ },
3082
+ "metadata": {},
3083
+ "output_type": "display_data"
3084
+ },
3085
+ {
3086
+ "name": "stdout",
3087
+ "output_type": "stream",
3088
+ "text": [
3089
+ "No unique k-mers found\n",
3090
+ "Most common 10% kmers: \n"
3091
+ ]
3092
+ },
3093
+ {
3094
+ "data": {
3095
+ "application/vnd.plotly.v1+json": {
3096
+ "config": {
3097
+ "plotlyServerURL": "https://plot.ly"
3098
+ },
3099
+ "data": [
3100
+ {
3101
+ "type": "bar",
3102
+ "x": [
3103
+ "GCTGA",
3104
+ "GGGTG",
3105
+ "GGGGT",
3106
+ "GAGGC",
3107
+ "AATGG",
3108
+ "TTCAG",
3109
+ "CCAAT",
3110
+ "AAGGA",
3111
+ "TTGAC",
3112
+ "GATAT",
3113
+ "GTAGC",
3114
+ "GAGCG",
3115
+ "CAACC",
3116
+ "GCAGT",
3117
+ "GGCCA",
3118
+ "AGGAG",
3119
+ "GGGTC",
3120
+ "GTATG",
3121
+ "ATCTA",
3122
+ "AACCT",
3123
+ "TGGGT",
3124
+ "TCTCG",
3125
+ "TTTGA",
3126
+ "CCTTG",
3127
+ "TGCTG",
3128
+ "CTAGA",
3129
+ "GCGCA",
3130
+ "GGTTC",
3131
+ "CATGT",
3132
+ "TATGA",
3133
+ "TGACG",
3134
+ "ATGAC",
3135
+ "ACCAA",
3136
+ "TCTAC",
3137
+ "CTCGC",
3138
+ "CGAAT",
3139
+ "TTCGT",
3140
+ "ATGGG",
3141
+ "TCCCC",
3142
+ "AAATG",
3143
+ "TTTGT",
3144
+ "ATGGC",
3145
+ "GGTGT",
3146
+ "GGTGA",
3147
+ "CGCTG",
3148
+ "CGAGC",
3149
+ "GAGAT",
3150
+ "CTTTA",
3151
+ "CCGAG",
3152
+ "AGATC",
3153
+ "AACCA",
3154
+ "CAAAC",
3155
+ "ATTGC",
3156
+ "TCATG",
3157
+ "TGAGC",
3158
+ "AAAAT",
3159
+ "GCTGC",
3160
+ "GCAGG",
3161
+ "GACAC",
3162
+ "CGTGC",
3163
+ "GGGCC",
3164
+ "AGCTG",
3165
+ "CTCGA",
3166
+ "TCTAG",
3167
+ "TTGCT",
3168
+ "TGATC",
3169
+ "GCACC",
3170
+ "CTGTG",
3171
+ "ACTCT",
3172
+ "TTCCC",
3173
+ "TGACC",
3174
+ "TGAAT",
3175
+ "AACGC",
3176
+ "GACGG",
3177
+ "GGAAG",
3178
+ "AGTTA",
3179
+ "TGCAG",
3180
+ "AATCT",
3181
+ "TAAGG",
3182
+ "GGCCG",
3183
+ "TCTTC",
3184
+ "CGGGG",
3185
+ "CTCTG",
3186
+ "GAGTT",
3187
+ "CTAGG",
3188
+ "TAGAC",
3189
+ "TTGGA",
3190
+ "TTGTC",
3191
+ "CGAGA",
3192
+ "CACAG",
3193
+ "GCGGC",
3194
+ "GGGTT",
3195
+ "CGGCG",
3196
+ "CGGCC",
3197
+ "TCGGG",
3198
+ "GAGCA",
3199
+ "AAACA",
3200
+ "TTTAG",
3201
+ "GCATA",
3202
+ "GGTCA",
3203
+ "ACACA",
3204
+ "TCGTT"
3205
+ ],
3206
+ "y": [
3207
+ 1085,
3208
+ 1084,
3209
+ 1071,
3210
+ 1066,
3211
+ 1062,
3212
+ 1062,
3213
+ 1058,
3214
+ 1054,
3215
+ 1053,
3216
+ 1050,
3217
+ 1050,
3218
+ 1049,
3219
+ 1049,
3220
+ 1048,
3221
+ 1048,
3222
+ 1048,
3223
+ 1046,
3224
+ 1046,
3225
+ 1045,
3226
+ 1045,
3227
+ 1044,
3228
+ 1043,
3229
+ 1042,
3230
+ 1042,
3231
+ 1041,
3232
+ 1040,
3233
+ 1040,
3234
+ 1040,
3235
+ 1039,
3236
+ 1039,
3237
+ 1039,
3238
+ 1038,
3239
+ 1038,
3240
+ 1038,
3241
+ 1038,
3242
+ 1036,
3243
+ 1035,
3244
+ 1033,
3245
+ 1033,
3246
+ 1033,
3247
+ 1032,
3248
+ 1032,
3249
+ 1030,
3250
+ 1030,
3251
+ 1030,
3252
+ 1030,
3253
+ 1029,
3254
+ 1029,
3255
+ 1029,
3256
+ 1028,
3257
+ 1028,
3258
+ 1028,
3259
+ 1028,
3260
+ 1027,
3261
+ 1027,
3262
+ 1027,
3263
+ 1027,
3264
+ 1026,
3265
+ 1026,
3266
+ 1026,
3267
+ 1026,
3268
+ 1025,
3269
+ 1025,
3270
+ 1025,
3271
+ 1025,
3272
+ 1025,
3273
+ 1024,
3274
+ 1024,
3275
+ 1024,
3276
+ 1023,
3277
+ 1022,
3278
+ 1022,
3279
+ 1022,
3280
+ 1022,
3281
+ 1022,
3282
+ 1021,
3283
+ 1021,
3284
+ 1020,
3285
+ 1020,
3286
+ 1020,
3287
+ 1019,
3288
+ 1019,
3289
+ 1019,
3290
+ 1019,
3291
+ 1019,
3292
+ 1019,
3293
+ 1019,
3294
+ 1019,
3295
+ 1018,
3296
+ 1018,
3297
+ 1018,
3298
+ 1018,
3299
+ 1018,
3300
+ 1018,
3301
+ 1017,
3302
+ 1017,
3303
+ 1016,
3304
+ 1016,
3305
+ 1016,
3306
+ 1016,
3307
+ 1016,
3308
+ 1016
3309
+ ]
3310
+ }
3311
+ ],
3312
+ "layout": {
3313
+ "template": {
3314
+ "data": {
3315
+ "bar": [
3316
+ {
3317
+ "error_x": {
3318
+ "color": "#2a3f5f"
3319
+ },
3320
+ "error_y": {
3321
+ "color": "#2a3f5f"
3322
+ },
3323
+ "marker": {
3324
+ "line": {
3325
+ "color": "#E5ECF6",
3326
+ "width": 0.5
3327
+ },
3328
+ "pattern": {
3329
+ "fillmode": "overlay",
3330
+ "size": 10,
3331
+ "solidity": 0.2
3332
+ }
3333
+ },
3334
+ "type": "bar"
3335
+ }
3336
+ ],
3337
+ "barpolar": [
3338
+ {
3339
+ "marker": {
3340
+ "line": {
3341
+ "color": "#E5ECF6",
3342
+ "width": 0.5
3343
+ },
3344
+ "pattern": {
3345
+ "fillmode": "overlay",
3346
+ "size": 10,
3347
+ "solidity": 0.2
3348
+ }
3349
+ },
3350
+ "type": "barpolar"
3351
+ }
3352
+ ],
3353
+ "carpet": [
3354
+ {
3355
+ "aaxis": {
3356
+ "endlinecolor": "#2a3f5f",
3357
+ "gridcolor": "white",
3358
+ "linecolor": "white",
3359
+ "minorgridcolor": "white",
3360
+ "startlinecolor": "#2a3f5f"
3361
+ },
3362
+ "baxis": {
3363
+ "endlinecolor": "#2a3f5f",
3364
+ "gridcolor": "white",
3365
+ "linecolor": "white",
3366
+ "minorgridcolor": "white",
3367
+ "startlinecolor": "#2a3f5f"
3368
+ },
3369
+ "type": "carpet"
3370
+ }
3371
+ ],
3372
+ "choropleth": [
3373
+ {
3374
+ "colorbar": {
3375
+ "outlinewidth": 0,
3376
+ "ticks": ""
3377
+ },
3378
+ "type": "choropleth"
3379
+ }
3380
+ ],
3381
+ "contour": [
3382
+ {
3383
+ "colorbar": {
3384
+ "outlinewidth": 0,
3385
+ "ticks": ""
3386
+ },
3387
+ "colorscale": [
3388
+ [
3389
+ 0,
3390
+ "#0d0887"
3391
+ ],
3392
+ [
3393
+ 0.1111111111111111,
3394
+ "#46039f"
3395
+ ],
3396
+ [
3397
+ 0.2222222222222222,
3398
+ "#7201a8"
3399
+ ],
3400
+ [
3401
+ 0.3333333333333333,
3402
+ "#9c179e"
3403
+ ],
3404
+ [
3405
+ 0.4444444444444444,
3406
+ "#bd3786"
3407
+ ],
3408
+ [
3409
+ 0.5555555555555556,
3410
+ "#d8576b"
3411
+ ],
3412
+ [
3413
+ 0.6666666666666666,
3414
+ "#ed7953"
3415
+ ],
3416
+ [
3417
+ 0.7777777777777778,
3418
+ "#fb9f3a"
3419
+ ],
3420
+ [
3421
+ 0.8888888888888888,
3422
+ "#fdca26"
3423
+ ],
3424
+ [
3425
+ 1,
3426
+ "#f0f921"
3427
+ ]
3428
+ ],
3429
+ "type": "contour"
3430
+ }
3431
+ ],
3432
+ "contourcarpet": [
3433
+ {
3434
+ "colorbar": {
3435
+ "outlinewidth": 0,
3436
+ "ticks": ""
3437
+ },
3438
+ "type": "contourcarpet"
3439
+ }
3440
+ ],
3441
+ "heatmap": [
3442
+ {
3443
+ "colorbar": {
3444
+ "outlinewidth": 0,
3445
+ "ticks": ""
3446
+ },
3447
+ "colorscale": [
3448
+ [
3449
+ 0,
3450
+ "#0d0887"
3451
+ ],
3452
+ [
3453
+ 0.1111111111111111,
3454
+ "#46039f"
3455
+ ],
3456
+ [
3457
+ 0.2222222222222222,
3458
+ "#7201a8"
3459
+ ],
3460
+ [
3461
+ 0.3333333333333333,
3462
+ "#9c179e"
3463
+ ],
3464
+ [
3465
+ 0.4444444444444444,
3466
+ "#bd3786"
3467
+ ],
3468
+ [
3469
+ 0.5555555555555556,
3470
+ "#d8576b"
3471
+ ],
3472
+ [
3473
+ 0.6666666666666666,
3474
+ "#ed7953"
3475
+ ],
3476
+ [
3477
+ 0.7777777777777778,
3478
+ "#fb9f3a"
3479
+ ],
3480
+ [
3481
+ 0.8888888888888888,
3482
+ "#fdca26"
3483
+ ],
3484
+ [
3485
+ 1,
3486
+ "#f0f921"
3487
+ ]
3488
+ ],
3489
+ "type": "heatmap"
3490
+ }
3491
+ ],
3492
+ "heatmapgl": [
3493
+ {
3494
+ "colorbar": {
3495
+ "outlinewidth": 0,
3496
+ "ticks": ""
3497
+ },
3498
+ "colorscale": [
3499
+ [
3500
+ 0,
3501
+ "#0d0887"
3502
+ ],
3503
+ [
3504
+ 0.1111111111111111,
3505
+ "#46039f"
3506
+ ],
3507
+ [
3508
+ 0.2222222222222222,
3509
+ "#7201a8"
3510
+ ],
3511
+ [
3512
+ 0.3333333333333333,
3513
+ "#9c179e"
3514
+ ],
3515
+ [
3516
+ 0.4444444444444444,
3517
+ "#bd3786"
3518
+ ],
3519
+ [
3520
+ 0.5555555555555556,
3521
+ "#d8576b"
3522
+ ],
3523
+ [
3524
+ 0.6666666666666666,
3525
+ "#ed7953"
3526
+ ],
3527
+ [
3528
+ 0.7777777777777778,
3529
+ "#fb9f3a"
3530
+ ],
3531
+ [
3532
+ 0.8888888888888888,
3533
+ "#fdca26"
3534
+ ],
3535
+ [
3536
+ 1,
3537
+ "#f0f921"
3538
+ ]
3539
+ ],
3540
+ "type": "heatmapgl"
3541
+ }
3542
+ ],
3543
+ "histogram": [
3544
+ {
3545
+ "marker": {
3546
+ "pattern": {
3547
+ "fillmode": "overlay",
3548
+ "size": 10,
3549
+ "solidity": 0.2
3550
+ }
3551
+ },
3552
+ "type": "histogram"
3553
+ }
3554
+ ],
3555
+ "histogram2d": [
3556
+ {
3557
+ "colorbar": {
3558
+ "outlinewidth": 0,
3559
+ "ticks": ""
3560
+ },
3561
+ "colorscale": [
3562
+ [
3563
+ 0,
3564
+ "#0d0887"
3565
+ ],
3566
+ [
3567
+ 0.1111111111111111,
3568
+ "#46039f"
3569
+ ],
3570
+ [
3571
+ 0.2222222222222222,
3572
+ "#7201a8"
3573
+ ],
3574
+ [
3575
+ 0.3333333333333333,
3576
+ "#9c179e"
3577
+ ],
3578
+ [
3579
+ 0.4444444444444444,
3580
+ "#bd3786"
3581
+ ],
3582
+ [
3583
+ 0.5555555555555556,
3584
+ "#d8576b"
3585
+ ],
3586
+ [
3587
+ 0.6666666666666666,
3588
+ "#ed7953"
3589
+ ],
3590
+ [
3591
+ 0.7777777777777778,
3592
+ "#fb9f3a"
3593
+ ],
3594
+ [
3595
+ 0.8888888888888888,
3596
+ "#fdca26"
3597
+ ],
3598
+ [
3599
+ 1,
3600
+ "#f0f921"
3601
+ ]
3602
+ ],
3603
+ "type": "histogram2d"
3604
+ }
3605
+ ],
3606
+ "histogram2dcontour": [
3607
+ {
3608
+ "colorbar": {
3609
+ "outlinewidth": 0,
3610
+ "ticks": ""
3611
+ },
3612
+ "colorscale": [
3613
+ [
3614
+ 0,
3615
+ "#0d0887"
3616
+ ],
3617
+ [
3618
+ 0.1111111111111111,
3619
+ "#46039f"
3620
+ ],
3621
+ [
3622
+ 0.2222222222222222,
3623
+ "#7201a8"
3624
+ ],
3625
+ [
3626
+ 0.3333333333333333,
3627
+ "#9c179e"
3628
+ ],
3629
+ [
3630
+ 0.4444444444444444,
3631
+ "#bd3786"
3632
+ ],
3633
+ [
3634
+ 0.5555555555555556,
3635
+ "#d8576b"
3636
+ ],
3637
+ [
3638
+ 0.6666666666666666,
3639
+ "#ed7953"
3640
+ ],
3641
+ [
3642
+ 0.7777777777777778,
3643
+ "#fb9f3a"
3644
+ ],
3645
+ [
3646
+ 0.8888888888888888,
3647
+ "#fdca26"
3648
+ ],
3649
+ [
3650
+ 1,
3651
+ "#f0f921"
3652
+ ]
3653
+ ],
3654
+ "type": "histogram2dcontour"
3655
+ }
3656
+ ],
3657
+ "mesh3d": [
3658
+ {
3659
+ "colorbar": {
3660
+ "outlinewidth": 0,
3661
+ "ticks": ""
3662
+ },
3663
+ "type": "mesh3d"
3664
+ }
3665
+ ],
3666
+ "parcoords": [
3667
+ {
3668
+ "line": {
3669
+ "colorbar": {
3670
+ "outlinewidth": 0,
3671
+ "ticks": ""
3672
+ }
3673
+ },
3674
+ "type": "parcoords"
3675
+ }
3676
+ ],
3677
+ "pie": [
3678
+ {
3679
+ "automargin": true,
3680
+ "type": "pie"
3681
+ }
3682
+ ],
3683
+ "scatter": [
3684
+ {
3685
+ "fillpattern": {
3686
+ "fillmode": "overlay",
3687
+ "size": 10,
3688
+ "solidity": 0.2
3689
+ },
3690
+ "type": "scatter"
3691
+ }
3692
+ ],
3693
+ "scatter3d": [
3694
+ {
3695
+ "line": {
3696
+ "colorbar": {
3697
+ "outlinewidth": 0,
3698
+ "ticks": ""
3699
+ }
3700
+ },
3701
+ "marker": {
3702
+ "colorbar": {
3703
+ "outlinewidth": 0,
3704
+ "ticks": ""
3705
+ }
3706
+ },
3707
+ "type": "scatter3d"
3708
+ }
3709
+ ],
3710
+ "scattercarpet": [
3711
+ {
3712
+ "marker": {
3713
+ "colorbar": {
3714
+ "outlinewidth": 0,
3715
+ "ticks": ""
3716
+ }
3717
+ },
3718
+ "type": "scattercarpet"
3719
+ }
3720
+ ],
3721
+ "scattergeo": [
3722
+ {
3723
+ "marker": {
3724
+ "colorbar": {
3725
+ "outlinewidth": 0,
3726
+ "ticks": ""
3727
+ }
3728
+ },
3729
+ "type": "scattergeo"
3730
+ }
3731
+ ],
3732
+ "scattergl": [
3733
+ {
3734
+ "marker": {
3735
+ "colorbar": {
3736
+ "outlinewidth": 0,
3737
+ "ticks": ""
3738
+ }
3739
+ },
3740
+ "type": "scattergl"
3741
+ }
3742
+ ],
3743
+ "scattermapbox": [
3744
+ {
3745
+ "marker": {
3746
+ "colorbar": {
3747
+ "outlinewidth": 0,
3748
+ "ticks": ""
3749
+ }
3750
+ },
3751
+ "type": "scattermapbox"
3752
+ }
3753
+ ],
3754
+ "scatterpolar": [
3755
+ {
3756
+ "marker": {
3757
+ "colorbar": {
3758
+ "outlinewidth": 0,
3759
+ "ticks": ""
3760
+ }
3761
+ },
3762
+ "type": "scatterpolar"
3763
+ }
3764
+ ],
3765
+ "scatterpolargl": [
3766
+ {
3767
+ "marker": {
3768
+ "colorbar": {
3769
+ "outlinewidth": 0,
3770
+ "ticks": ""
3771
+ }
3772
+ },
3773
+ "type": "scatterpolargl"
3774
+ }
3775
+ ],
3776
+ "scatterternary": [
3777
+ {
3778
+ "marker": {
3779
+ "colorbar": {
3780
+ "outlinewidth": 0,
3781
+ "ticks": ""
3782
+ }
3783
+ },
3784
+ "type": "scatterternary"
3785
+ }
3786
+ ],
3787
+ "surface": [
3788
+ {
3789
+ "colorbar": {
3790
+ "outlinewidth": 0,
3791
+ "ticks": ""
3792
+ },
3793
+ "colorscale": [
3794
+ [
3795
+ 0,
3796
+ "#0d0887"
3797
+ ],
3798
+ [
3799
+ 0.1111111111111111,
3800
+ "#46039f"
3801
+ ],
3802
+ [
3803
+ 0.2222222222222222,
3804
+ "#7201a8"
3805
+ ],
3806
+ [
3807
+ 0.3333333333333333,
3808
+ "#9c179e"
3809
+ ],
3810
+ [
3811
+ 0.4444444444444444,
3812
+ "#bd3786"
3813
+ ],
3814
+ [
3815
+ 0.5555555555555556,
3816
+ "#d8576b"
3817
+ ],
3818
+ [
3819
+ 0.6666666666666666,
3820
+ "#ed7953"
3821
+ ],
3822
+ [
3823
+ 0.7777777777777778,
3824
+ "#fb9f3a"
3825
+ ],
3826
+ [
3827
+ 0.8888888888888888,
3828
+ "#fdca26"
3829
+ ],
3830
+ [
3831
+ 1,
3832
+ "#f0f921"
3833
+ ]
3834
+ ],
3835
+ "type": "surface"
3836
+ }
3837
+ ],
3838
+ "table": [
3839
+ {
3840
+ "cells": {
3841
+ "fill": {
3842
+ "color": "#EBF0F8"
3843
+ },
3844
+ "line": {
3845
+ "color": "white"
3846
+ }
3847
+ },
3848
+ "header": {
3849
+ "fill": {
3850
+ "color": "#C8D4E3"
3851
+ },
3852
+ "line": {
3853
+ "color": "white"
3854
+ }
3855
+ },
3856
+ "type": "table"
3857
+ }
3858
+ ]
3859
+ },
3860
+ "layout": {
3861
+ "annotationdefaults": {
3862
+ "arrowcolor": "#2a3f5f",
3863
+ "arrowhead": 0,
3864
+ "arrowwidth": 1
3865
+ },
3866
+ "autotypenumbers": "strict",
3867
+ "coloraxis": {
3868
+ "colorbar": {
3869
+ "outlinewidth": 0,
3870
+ "ticks": ""
3871
+ }
3872
+ },
3873
+ "colorscale": {
3874
+ "diverging": [
3875
+ [
3876
+ 0,
3877
+ "#8e0152"
3878
+ ],
3879
+ [
3880
+ 0.1,
3881
+ "#c51b7d"
3882
+ ],
3883
+ [
3884
+ 0.2,
3885
+ "#de77ae"
3886
+ ],
3887
+ [
3888
+ 0.3,
3889
+ "#f1b6da"
3890
+ ],
3891
+ [
3892
+ 0.4,
3893
+ "#fde0ef"
3894
+ ],
3895
+ [
3896
+ 0.5,
3897
+ "#f7f7f7"
3898
+ ],
3899
+ [
3900
+ 0.6,
3901
+ "#e6f5d0"
3902
+ ],
3903
+ [
3904
+ 0.7,
3905
+ "#b8e186"
3906
+ ],
3907
+ [
3908
+ 0.8,
3909
+ "#7fbc41"
3910
+ ],
3911
+ [
3912
+ 0.9,
3913
+ "#4d9221"
3914
+ ],
3915
+ [
3916
+ 1,
3917
+ "#276419"
3918
+ ]
3919
+ ],
3920
+ "sequential": [
3921
+ [
3922
+ 0,
3923
+ "#0d0887"
3924
+ ],
3925
+ [
3926
+ 0.1111111111111111,
3927
+ "#46039f"
3928
+ ],
3929
+ [
3930
+ 0.2222222222222222,
3931
+ "#7201a8"
3932
+ ],
3933
+ [
3934
+ 0.3333333333333333,
3935
+ "#9c179e"
3936
+ ],
3937
+ [
3938
+ 0.4444444444444444,
3939
+ "#bd3786"
3940
+ ],
3941
+ [
3942
+ 0.5555555555555556,
3943
+ "#d8576b"
3944
+ ],
3945
+ [
3946
+ 0.6666666666666666,
3947
+ "#ed7953"
3948
+ ],
3949
+ [
3950
+ 0.7777777777777778,
3951
+ "#fb9f3a"
3952
+ ],
3953
+ [
3954
+ 0.8888888888888888,
3955
+ "#fdca26"
3956
+ ],
3957
+ [
3958
+ 1,
3959
+ "#f0f921"
3960
+ ]
3961
+ ],
3962
+ "sequentialminus": [
3963
+ [
3964
+ 0,
3965
+ "#0d0887"
3966
+ ],
3967
+ [
3968
+ 0.1111111111111111,
3969
+ "#46039f"
3970
+ ],
3971
+ [
3972
+ 0.2222222222222222,
3973
+ "#7201a8"
3974
+ ],
3975
+ [
3976
+ 0.3333333333333333,
3977
+ "#9c179e"
3978
+ ],
3979
+ [
3980
+ 0.4444444444444444,
3981
+ "#bd3786"
3982
+ ],
3983
+ [
3984
+ 0.5555555555555556,
3985
+ "#d8576b"
3986
+ ],
3987
+ [
3988
+ 0.6666666666666666,
3989
+ "#ed7953"
3990
+ ],
3991
+ [
3992
+ 0.7777777777777778,
3993
+ "#fb9f3a"
3994
+ ],
3995
+ [
3996
+ 0.8888888888888888,
3997
+ "#fdca26"
3998
+ ],
3999
+ [
4000
+ 1,
4001
+ "#f0f921"
4002
+ ]
4003
+ ]
4004
+ },
4005
+ "colorway": [
4006
+ "#636efa",
4007
+ "#EF553B",
4008
+ "#00cc96",
4009
+ "#ab63fa",
4010
+ "#FFA15A",
4011
+ "#19d3f3",
4012
+ "#FF6692",
4013
+ "#B6E880",
4014
+ "#FF97FF",
4015
+ "#FECB52"
4016
+ ],
4017
+ "font": {
4018
+ "color": "#2a3f5f"
4019
+ },
4020
+ "geo": {
4021
+ "bgcolor": "white",
4022
+ "lakecolor": "white",
4023
+ "landcolor": "#E5ECF6",
4024
+ "showlakes": true,
4025
+ "showland": true,
4026
+ "subunitcolor": "white"
4027
+ },
4028
+ "hoverlabel": {
4029
+ "align": "left"
4030
+ },
4031
+ "hovermode": "closest",
4032
+ "mapbox": {
4033
+ "style": "light"
4034
+ },
4035
+ "paper_bgcolor": "white",
4036
+ "plot_bgcolor": "#E5ECF6",
4037
+ "polar": {
4038
+ "angularaxis": {
4039
+ "gridcolor": "white",
4040
+ "linecolor": "white",
4041
+ "ticks": ""
4042
+ },
4043
+ "bgcolor": "#E5ECF6",
4044
+ "radialaxis": {
4045
+ "gridcolor": "white",
4046
+ "linecolor": "white",
4047
+ "ticks": ""
4048
+ }
4049
+ },
4050
+ "scene": {
4051
+ "xaxis": {
4052
+ "backgroundcolor": "#E5ECF6",
4053
+ "gridcolor": "white",
4054
+ "gridwidth": 2,
4055
+ "linecolor": "white",
4056
+ "showbackground": true,
4057
+ "ticks": "",
4058
+ "zerolinecolor": "white"
4059
+ },
4060
+ "yaxis": {
4061
+ "backgroundcolor": "#E5ECF6",
4062
+ "gridcolor": "white",
4063
+ "gridwidth": 2,
4064
+ "linecolor": "white",
4065
+ "showbackground": true,
4066
+ "ticks": "",
4067
+ "zerolinecolor": "white"
4068
+ },
4069
+ "zaxis": {
4070
+ "backgroundcolor": "#E5ECF6",
4071
+ "gridcolor": "white",
4072
+ "gridwidth": 2,
4073
+ "linecolor": "white",
4074
+ "showbackground": true,
4075
+ "ticks": "",
4076
+ "zerolinecolor": "white"
4077
+ }
4078
+ },
4079
+ "shapedefaults": {
4080
+ "line": {
4081
+ "color": "#2a3f5f"
4082
+ }
4083
+ },
4084
+ "ternary": {
4085
+ "aaxis": {
4086
+ "gridcolor": "white",
4087
+ "linecolor": "white",
4088
+ "ticks": ""
4089
+ },
4090
+ "baxis": {
4091
+ "gridcolor": "white",
4092
+ "linecolor": "white",
4093
+ "ticks": ""
4094
+ },
4095
+ "bgcolor": "#E5ECF6",
4096
+ "caxis": {
4097
+ "gridcolor": "white",
4098
+ "linecolor": "white",
4099
+ "ticks": ""
4100
+ }
4101
+ },
4102
+ "title": {
4103
+ "x": 0.05
4104
+ },
4105
+ "xaxis": {
4106
+ "automargin": true,
4107
+ "gridcolor": "white",
4108
+ "linecolor": "white",
4109
+ "ticks": "",
4110
+ "title": {
4111
+ "standoff": 15
4112
+ },
4113
+ "zerolinecolor": "white",
4114
+ "zerolinewidth": 2
4115
+ },
4116
+ "yaxis": {
4117
+ "automargin": true,
4118
+ "gridcolor": "white",
4119
+ "linecolor": "white",
4120
+ "ticks": "",
4121
+ "title": {
4122
+ "standoff": 15
4123
+ },
4124
+ "zerolinecolor": "white",
4125
+ "zerolinewidth": 2
4126
+ }
4127
+ }
4128
+ },
4129
+ "title": {
4130
+ "text": "102 Kmer Distribution for 5-mers"
4131
+ },
4132
+ "xaxis": {
4133
+ "title": {
4134
+ "text": "Kmer"
4135
+ }
4136
+ },
4137
+ "yaxis": {
4138
+ "title": {
4139
+ "text": "Count"
4140
+ }
4141
+ }
4142
+ }
4143
+ }
4144
+ },
4145
+ "metadata": {},
4146
+ "output_type": "display_data"
4147
+ }
4148
+ ],
4149
+ "source": [
4150
+ "def main():\n",
4151
+ " test_hash_table(dna_string, dna_len, kmer_size)\n",
4152
+ " # # uncomment if you would like to enter your own values \n",
4153
+ " # test_hash_table(None, None, None)\n",
4154
+ "\n",
4155
+ "main()"
4156
+ ]
4157
+ }
4158
+ ],
4159
+ "metadata": {
4160
+ "kernelspec": {
4161
+ "display_name": "Python 3.10.8 64-bit",
4162
+ "language": "python",
4163
+ "name": "python3"
4164
+ },
4165
+ "language_info": {
4166
+ "codemirror_mode": {
4167
+ "name": "ipython",
4168
+ "version": 3
4169
+ },
4170
+ "file_extension": ".py",
4171
+ "mimetype": "text/x-python",
4172
+ "name": "python",
4173
+ "nbconvert_exporter": "python",
4174
+ "pygments_lexer": "ipython3",
4175
+ "version": "3.10.8"
4176
+ },
4177
+ "orig_nbformat": 4,
4178
+ "vscode": {
4179
+ "interpreter": {
4180
+ "hash": "b0fa6594d8f4cbf19f97940f81e996739fb7646882a419484c72d19e05852a7e"
4181
+ }
4182
+ }
4183
+ },
4184
+ "nbformat": 4,
4185
+ "nbformat_minor": 2
4186
+ }
requirements.txt ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ matplotlib==3.6.2
2
+ mmh3==3.0.0
3
+ plotly==5.11.0
4
+ prettytable==3.5.0
5
+ xxhash==3.1.0
6
+ mljar-mercury
7
+ nbformat==5.7.0
8
+ jupyterlab==3.2.4
9
+ jupyter==1.0.0