compara-deep-learning/threads.py

145 lines
5.3 KiB
Python
Raw Permalink Normal View History

2019-07-24 04:54:02 -07:00
from multiprocessing import Process
2019-07-24 03:27:54 -07:00
import numpy as np
import edlib as ed
import progressbar
import time
from skbio.alignment import local_pairwise_align_ssw
2019-07-24 04:54:02 -07:00
from skbio import DNA
2019-07-24 03:27:54 -07:00
import copy
from save_data import write_data_synteny
2019-07-24 04:54:02 -07:00
2019-07-24 03:27:54 -07:00
class Thread_objects():
2019-07-24 04:54:02 -07:00
def __init__(self, df_temp, gene_sequences, lsy, i, name):
self.gene_sequences = copy.deepcopy(gene_sequences)
self.lsy = copy.deepcopy(lsy)
self.df = copy.deepcopy(df_temp)
self.smg = []
self.sml = []
self.indexes = []
self.i = i
self.start = 0
self.end = 0
self.name = name
2019-07-24 03:27:54 -07:00
2019-07-24 04:54:02 -07:00
def create_synteny_matrix_mul(self, gene_seq, g1, g2, n):
2019-07-24 03:27:54 -07:00
for gene in g1:
2019-07-24 04:54:02 -07:00
if gene == "NULL_GENE":
2019-07-24 03:27:54 -07:00
continue
try:
2019-07-24 04:54:02 -07:00
_ = gene_seq[gene]
except BaseException:
return np.zeros((n, n, 2)), np.zeros((n, n, 2))
2019-07-24 03:27:54 -07:00
for gene in g2:
2019-07-24 04:54:02 -07:00
if gene == "NULL_GENE":
2019-07-24 03:27:54 -07:00
continue
try:
2019-07-24 04:54:02 -07:00
_ = gene_seq[gene]
except BaseException:
return np.zeros((n, n, 2)), np.zeros((n, n, 2))
sm = np.zeros((n, n, 2))
sml = np.zeros((n, n, 2))
2019-07-24 03:27:54 -07:00
for i in range(n):
2019-07-24 04:54:02 -07:00
if g1[i] == "NULL_GENE":
2019-07-24 03:27:54 -07:00
continue
2019-07-24 04:54:02 -07:00
if gene_seq[g1[i]] == "":
return np.zeros((n, n, 2)), np.zeros((n, n, 2))
2019-07-24 03:27:54 -07:00
for j in range(n):
2019-07-24 04:54:02 -07:00
if g2[j] == "NULL_GENE":
2019-07-24 03:27:54 -07:00
continue
2019-07-24 04:54:02 -07:00
if gene_seq[g2[j]] == "":
return np.zeros((n, n, 2)), np.zeros((n, n, 2))
norm_len = max(len(gene_seq[g1[i]]), len(gene_seq[g2[j]]))
2019-07-24 03:27:54 -07:00
try:
2019-07-24 04:54:02 -07:00
result = ed.align(
gene_seq[g1[i]], gene_seq[g2[j]], mode="NW", task="distance")
sm[i][j][0] = result["editDistance"] / (norm_len)
result = ed.align(
gene_seq[g1[i]], gene_seq[g2[j]][::-1], mode="NW", task="distance")
sm[i][j][1] = result["editDistance"] / (norm_len)
_, result, _ = local_pairwise_align_ssw(
DNA(gene_seq[g1[i]]), DNA(gene_seq[g2[j]]))
sml[i][j][0] = result / (norm_len)
_, result, _ = local_pairwise_align_ssw(
DNA(gene_seq[g1[i]]), DNA(gene_seq[g2[j]][::-1]))
sml[i][j][1] = result / (norm_len)
except BaseException:
return np.zeros((n, n, 2)), np.zeros((n, n, 2))
return sm, sml
2019-07-24 03:27:54 -07:00
2019-07-24 04:54:02 -07:00
def synteny_matrix(self, gene_seq, hdf, lsy, n):
t = 0
self.start = time.time()
for index, row in progressbar.progressbar(hdf.iterrows()):
g1 = str(row["gene_stable_id"])
g2 = str(row["homology_gene_stable_id"])
x = []
y = []
t += 1
2019-07-24 03:27:54 -07:00
try:
2019-07-24 04:54:02 -07:00
_ = lsy[g1]
except BaseException:
2019-07-24 03:27:54 -07:00
continue
try:
2019-07-24 04:54:02 -07:00
_ = lsy[g2]
except BaseException:
2019-07-24 03:27:54 -07:00
continue
2019-07-24 04:54:02 -07:00
for i in range(len(lsy[g1]['b']) - 1, -1, -1):
2019-07-24 03:27:54 -07:00
x.append(lsy[g1]['b'][i])
x.append(g1)
for k in lsy[g1]['f']:
x.append(k)
2019-07-24 04:54:02 -07:00
for i in range(len(lsy[g2]['b']) - 1, -1, -1):
2019-07-24 03:27:54 -07:00
y.append(lsy[g2]['b'][i])
y.append(g2)
for k in lsy[g2]['f']:
y.append(k)
2019-07-24 04:54:02 -07:00
assert(len(x) == len(y))
assert(len(x) == (2 * n + 1))
smgtemp, smltemp = self.create_synteny_matrix_mul(
gene_seq, x, y, 2 * n + 1)
if np.all(smgtemp == 0):
continue
2019-07-24 03:27:54 -07:00
self.smg.append(smgtemp)
self.sml.append(smltemp)
self.indexes.append(index)
2019-07-24 04:54:02 -07:00
self.end = time.time()
print(
"Thread {} finished in {}s.".format(
self.i + 1,
self.end - self.start))
write_data_synteny(self.smg, self.sml, self.indexes, self.i, self.name)
2019-07-24 03:27:54 -07:00
class Procerssrunner():
def __init__(self):
2019-07-24 04:54:02 -07:00
self.thread_alive = []
self.obj_list = []
2019-07-24 03:27:54 -07:00
2019-07-24 04:54:02 -07:00
def start_thread(self, obj, i, thread_alive, n, name):
t = Process(target=obj.synteny_matrix, args=(
obj.gene_sequences, obj.df, obj.lsy, n), name="Thread_" + str(i + 1))
print("Thread ", (i + 1), " started for ", name, ".")
2019-07-24 03:27:54 -07:00
thread_alive.append(t)
2019-07-24 04:54:02 -07:00
def start_processes(self, nop, df, gene_sequences, lsy, part, n, name):
2019-07-24 03:27:54 -07:00
for i in range(nop):
2019-07-24 04:54:02 -07:00
df_temp = df.loc[df.index.values[i * part:(i + 1) * part]]
obj = Thread_objects(df_temp, gene_sequences, lsy, i, name)
2019-07-24 03:27:54 -07:00
print("Object Created")
2019-07-24 04:54:02 -07:00
self.start_thread(obj, i, self.thread_alive, n, name)
2019-07-24 03:27:54 -07:00
self.obj_list.append(obj)
2019-07-24 04:54:02 -07:00
st = time.time()
2019-07-24 03:27:54 -07:00
for t in self.thread_alive:
t.start()
2019-07-24 04:54:02 -07:00
# for t in self.thread_alive:
# t.join()
while(len(self.thread_alive) != 0):
2019-07-24 03:27:54 -07:00
time.sleep(60)
2019-07-24 04:54:02 -07:00
self.thread_alive = [t for t in self.thread_alive if t.is_alive()]
end = time.time()
2019-07-24 03:27:54 -07:00
print("Ending Processes")
2019-07-24 04:54:02 -07:00
print("Time taken:{}s".format(end - st))