import pickle
def to_base_5(n):
'''
Converts number to its base 4 equivalent. Used to generate all possible combinations of nucleotides.
:param i: Current iteration
:return: base 4 number
'''
s=[]
while n:
s.append(str(n%5))
n=n//5
return ''.join(s[::-1])
def N_replace(num_N, iteration):
'''
Replaces Ns with specific nucleotides based on which iteration it is.
:param num_N: The number of Ns being changed.
:param iteration: The current iteration.
:return: Returns nucleotides to fill in place of Ns
'''
new_N = to_base_5(iteration)
num = 0
# Replaces each number with corresponding base
for base in ['S','A','U','C','G']:
new_N = new_N.replace(str(num), base)
num += 1
return new_N
# Get the upper and lower bounds on the lengths of the random loop
low_N = int(input("Smallest loop size to consider: "))
high_N = int(input("Largest loop size to consider: "))
# Create the list of random loop sequences
loop_list = []
for i in range(5 ** high_N):
loop = N_replace(high_N, i)
if 'S' not in loop and len(loop) > low_N - 1:
loop_list.append(loop)
apt = input("Aptamer sequence: ")
five_HHRz = 'GCUGUCACCGGA'
mid_HHRz = 'UCCGGUCUGAUGAGUCC'
three_HHRz = 'GGACGAAACAGC'
five_insulator = 'GGGAAACAAACAAA'
three_insulator = 'AAAAAGAAAAAUAAAAA'
# Add the aptamer and random loop sequences onto each of the two ribozyme loops to create list of candidate sequences
rbz_list = []
for j in loop_list:
rbz_list.append(five_insulator + five_HHRz + j + mid_HHRz + apt + three_HHRz + three_insulator)
rbz_list.append(five_insulator + five_HHRz + apt + mid_HHRz + j + three_HHRz + three_insulator)
# Dump the list as a pickle file
struct_file = open('seq_list.pkl', 'wb')
pickle.dump(rbz_list, struct_file)
struct_file.close()