estrain@2: #!/usr/bin/env python3 estrain@2: estrain@2: import argparse estrain@2: import os,subprocess estrain@2: import pickle estrain@2: estrain@2: ### SeqSero Kmer estrain@2: def parse_args(): estrain@2: "Parse the input arguments, use '-h' for help." estrain@2: parser = argparse.ArgumentParser(usage='Just type "SeqSero2_update_kmer_database.py", it will update kmer database automatically') estrain@2: return parser.parse_args() estrain@2: estrain@2: def reverse_complement(sequence): estrain@2: complement = { estrain@2: 'A': 'T', estrain@2: 'C': 'G', estrain@2: 'G': 'C', estrain@2: 'T': 'A', estrain@2: 'N': 'N', estrain@2: 'M': 'K', estrain@2: 'R': 'Y', estrain@2: 'W': 'W', estrain@2: 'S': 'S', estrain@2: 'Y': 'R', estrain@2: 'K': 'M', estrain@2: 'V': 'B', estrain@2: 'H': 'D', estrain@2: 'D': 'H', estrain@2: 'B': 'V' estrain@2: } estrain@2: return "".join(complement[base] for base in reversed(sequence)) estrain@2: estrain@2: def multifasta_dict(multifasta): estrain@2: multifasta_list = [ estrain@2: line.strip() for line in open(multifasta, 'r') if len(line.strip()) > 0 estrain@2: ] estrain@2: headers = [i for i in multifasta_list if i[0] == '>'] estrain@2: multifasta_dict = {} estrain@2: for h in headers: estrain@2: start = multifasta_list.index(h) estrain@2: for element in multifasta_list[start + 1:]: estrain@2: if element[0] == '>': estrain@2: break estrain@2: else: estrain@2: if h[1:] in multifasta_dict: estrain@2: multifasta_dict[h[1:]] += element estrain@2: else: estrain@2: multifasta_dict[h[1:]] = element estrain@2: return multifasta_dict estrain@2: estrain@2: def createKmerDict_reads(list_of_strings, kmer): estrain@2: kmer_table = {} estrain@2: for string in list_of_strings: estrain@2: sequence = string.strip('\n') estrain@2: for i in range(len(sequence) - kmer + 1): estrain@2: new_mer = sequence[i:i + kmer].upper() estrain@2: new_mer_rc = reverse_complement(new_mer) estrain@2: if new_mer in kmer_table: estrain@2: kmer_table[new_mer.upper()] += 1 estrain@2: else: estrain@2: kmer_table[new_mer.upper()] = 1 estrain@2: if new_mer_rc in kmer_table: estrain@2: kmer_table[new_mer_rc.upper()] += 1 estrain@2: else: estrain@2: kmer_table[new_mer_rc.upper()] = 1 estrain@2: return kmer_table estrain@2: estrain@2: def multifasta_to_kmers_dict(multifasta): estrain@2: multi_seq_dict = multifasta_dict(multifasta) estrain@2: lib_dict = {} estrain@2: for h in multi_seq_dict: estrain@2: lib_dict[h] = set( estrain@2: [k for k in createKmerDict_reads([multi_seq_dict[h]], 27)]) estrain@2: return lib_dict estrain@2: estrain@2: def get_salmid_invA_database(ex_dir): estrain@2: # read invA kmer and return it estrain@2: a = open(ex_dir + '/invA_mers_dict', 'rb') estrain@2: invA_dict = pickle.load(a) estrain@2: try: estrain@2: del invA_dict['version'] estrain@2: except: estrain@2: pass estrain@2: return invA_dict estrain@2: estrain@2: def get_salmid_rpoB_database(ex_dir): estrain@2: # read invA kmer and return it estrain@2: a = open(ex_dir + '/rpoB_mers_dict', 'rb') estrain@2: rpoB_dict = pickle.load(a) estrain@2: try: estrain@2: del rpoB_dict['version'] estrain@2: except: estrain@2: pass estrain@2: return rpoB_dict estrain@2: estrain@2: def main(): estrain@2: args = parse_args() estrain@2: ex_dir = os.path.dirname(os.path.realpath(__file__)) estrain@2: lib_dict = multifasta_to_kmers_dict(ex_dir + '/H_and_O_and_specific_genes.fasta') estrain@2: invA_dict=get_salmid_invA_database(ex_dir) estrain@2: #rpoB_dict=get_salmid_rpoB_database(ex_dir) estrain@2: lib_dict_new = lib_dict.copy() estrain@2: #print(len(lib_dict_new)) estrain@2: lib_dict_new.update(invA_dict) estrain@2: #print(len(lib_dict_new)) estrain@2: #lib_dict_new.update(rpoB_dict) estrain@2: #print(len(lib_dict_new)) estrain@2: f = open(ex_dir + '/antigens.pickle', "wb") estrain@2: pickle.dump(lib_dict_new, f) estrain@2: f.close() estrain@2: estrain@2: if __name__ == '__main__': estrain@2: main()