Spaces:
Running
Running
import tensorflow as tf | |
import numpy as np | |
import pandas as pd | |
import os | |
import argparse | |
# configure GPUs | |
for gpu in tf.config.list_physical_devices('GPU'): | |
tf.config.experimental.set_memory_growth(gpu, enable=True) | |
if len(tf.config.list_physical_devices('GPU')) > 0: | |
tf.config.experimental.set_visible_devices(tf.config.list_physical_devices('GPU')[0], 'GPU') | |
class Encoder: | |
def __init__(self, on_seq, off_seq, with_category = False, label = None, with_reg_val = False, value = None): | |
tlen = 24 | |
self.on_seq = "-" *(tlen-len(on_seq)) + on_seq | |
self.off_seq = "-" *(tlen-len(off_seq)) + off_seq | |
self.encoded_dict_indel = {'A': [1, 0, 0, 0, 0], 'T': [0, 1, 0, 0, 0], | |
'G': [0, 0, 1, 0, 0], 'C': [0, 0, 0, 1, 0], '_': [0, 0, 0, 0, 1], '-': [0, 0, 0, 0, 0]} | |
self.direction_dict = {'A':5, 'G':4, 'C':3, 'T':2, '_':1} | |
if with_category: | |
self.label = label | |
if with_reg_val: | |
self.value = value | |
self.encode_on_off_dim7() | |
def encode_sgRNA(self): | |
code_list = [] | |
encoded_dict = self.encoded_dict_indel | |
sgRNA_bases = list(self.on_seq) | |
for i in range(len(sgRNA_bases)): | |
if sgRNA_bases[i] == "N": | |
sgRNA_bases[i] = list(self.off_seq)[i] | |
code_list.append(encoded_dict[sgRNA_bases[i]]) | |
self.sgRNA_code = np.array(code_list) | |
def encode_off(self): | |
code_list = [] | |
encoded_dict = self.encoded_dict_indel | |
off_bases = list(self.off_seq) | |
for i in range(len(off_bases)): | |
code_list.append(encoded_dict[off_bases[i]]) | |
self.off_code = np.array(code_list) | |
def encode_on_off_dim7(self): | |
self.encode_sgRNA() | |
self.encode_off() | |
on_bases = list(self.on_seq) | |
off_bases = list(self.off_seq) | |
on_off_dim7_codes = [] | |
for i in range(len(on_bases)): | |
diff_code = np.bitwise_or(self.sgRNA_code[i], self.off_code[i]) | |
on_b = on_bases[i] | |
off_b = off_bases[i] | |
if on_b == "N": | |
on_b = off_b | |
dir_code = np.zeros(2) | |
if on_b == "-" or off_b == "-" or self.direction_dict[on_b] == self.direction_dict[off_b]: | |
pass | |
else: | |
if self.direction_dict[on_b] > self.direction_dict[off_b]: | |
dir_code[0] = 1 | |
else: | |
dir_code[1] = 1 | |
on_off_dim7_codes.append(np.concatenate((diff_code, dir_code))) | |
self.on_off_code = np.array(on_off_dim7_codes) | |
def encode_on_off_seq_pairs(input_file): | |
inputs = pd.read_csv(input_file, delimiter=",", header=None, names=['on_seq', 'off_seq']) | |
input_codes = [] | |
for idx, row in inputs.iterrows(): | |
on_seq = row['on_seq'] | |
off_seq = row['off_seq'] | |
en = Encoder(on_seq=on_seq, off_seq=off_seq) | |
input_codes.append(en.on_off_code) | |
input_codes = np.array(input_codes) | |
input_codes = input_codes.reshape((len(input_codes), 1, 24, 7)) | |
y_pred = CRISPR_net_predict(input_codes) | |
inputs['CRISPR_Net_score'] = y_pred | |
inputs.to_csv("CRISPR_net_results.csv", index=False) | |
def CRISPR_net_predict(X_test): | |
json_file = open("cas9_model/CRISPR_Net_CIRCLE_elevation_SITE_structure.json", 'r') | |
loaded_model_json = json_file.read() | |
json_file.close() | |
loaded_model = tf.keras.models.model_from_json(loaded_model_json) # Updated for TensorFlow 2 | |
loaded_model.load_weights("cas9_model/CRISPR_Net_CIRCLE_elevation_SITE_weights.h5") | |
y_pred = loaded_model.predict(X_test).flatten() | |
return y_pred | |
def process_input_and_predict(input_data, input_type='manual'): | |
if input_type == 'manual': | |
sequences = [seq.split(',') for seq in input_data.split('\n')] | |
inputs = pd.DataFrame(sequences, columns=['on_seq', 'off_seq']) | |
elif input_type == 'file': | |
inputs = pd.read_csv(input_data, delimiter=",", header=None, names=['on_seq', 'off_seq']) | |
valid_inputs = [] | |
input_codes = [] | |
for idx, row in inputs.iterrows(): | |
on_seq = row['on_seq'] | |
off_seq = row['off_seq'] | |
if not on_seq or not off_seq: | |
continue | |
en = Encoder(on_seq=on_seq, off_seq=off_seq) | |
input_codes.append(en.on_off_code) | |
valid_inputs.append((on_seq, off_seq)) | |
input_codes = np.array(input_codes) | |
input_codes = input_codes.reshape((len(input_codes), 1, 24, 7)) | |
y_pred = CRISPR_net_predict(input_codes) | |
# Create a new DataFrame from valid inputs and predictions | |
result_df = pd.DataFrame(valid_inputs, columns=['on_seq', 'off_seq']) | |
result_df['CRISPR_Net_score'] = y_pred | |
return result_df | |
if __name__ == '__main__': | |
parser = argparse.ArgumentParser(description="CRISPR-Net v1.0 (Aug 10 2019)") | |
parser.add_argument("input_file", | |
help="input_file example (on-target seq, off-target seq):\n GAGT_CCGAGCAGAAGAAGAATGG,GAGTACCAAGTAGAAGAAAAATTT\n" | |
"GTTGCCCCACAGGGCAGTAAAGG,GTGGACACCCCGGGCAGGAAAGG\n" | |
"GGGTGGGGGGAGTTTGCTCCAGG,AGGTGGGGTGA_TTTGCTCCAGG") | |
args = parser.parse_args() | |
file = args.input_file | |
if not os.path.exists(args.input_file): | |
print("File doesn't exist!") | |
else: | |
encode_on_off_seq_pairs(file) | |
tf.keras.backend.clear_session() |