import click
import pandas as pd
import os
@click.command()
@click.option('-r', '--reference', help='accession_file(nucl_gb.accession2taxid/prot.accession2taxid/...)', required=True)
@click.option('-i', '--inputfile', help='search_file(number_nt_virus_blastn.m8/number_nt_bacteria_blastn.m8/...)', required=True)
@click.option('-o1', '--outfile1', help='blastn_match_taxid(number_nt_virus_blastn_match_taxid/...)',required=True)
@click.option('-o2', '--outfile2', help='blastn_match_taxid_totaxid(number_nt_virus_blastn_match_taxid_totaxid(onlytaxid)/...)',required=True)
@click.option('-o3', '--outfile3', help='blastn_match_taxid_totaxid_lineage(number_nt_virus_blastn_match_taxid_totaxid_lineage.txt/...)',required=True)
@click.option('-o4', '--outfile4', help='number_nt_virus_blastn_match_taxid_lineage/..',required=True)
@click.option('-o5', '--outfile5', help='number_nt_virus_blastn_match_taxid_lineage_add_kgs/...',required=True)
@click.option('-o6', '--outfile6', help='number_nt_virus_blastn_match_taxid_lineage_add_kgs_delrepeat/...',required=True)
@click.option('-o7', '--outfile7', help='number_nt_virus_blastn_match_taxid_lineage_add_kgs_delrepeat1/...',required=True)
@click.option('-o8', '--outfile8', help='number_nt_virus_blastn_match_taxid_lineage_add_kgs_delrepeat1_out.txt/...',required=True)
def get_blastn_match_taxid_lineage(reference,inputfile,outfile1,outfile2,outfile3,outfile4,outfile5,outfile6,outfile7,outfile8):
accession_file1 = reference
df_accession = pd.read_csv(accession_file1, sep='\t')
df_accession1=df_accession.iloc[:,1:3]
accession_to_taxid_dict=dict(zip(df_accession1['accession.version'],df_accession1['taxid']))
search_file1=inputfile
df_search=pd.read_csv(search_file1,sep='\t',header=None)
df_search.columns=['Query id','accession.version','% identity','alignment length','mismatches','gap openings',
'q. start','q. end','s. start','s. end','e-value','bit score']
df_search['taxid']=df_search['accession.version'].apply(lambda x : accession_to_taxid_dict[x])
df_search.to_csv(outfile1,index=False,sep='\t',header=None)
df_search['taxid'].to_csv(outfile2,index=False,sep='\t',header=None)
val1=os.system("taxonkit lineage %s | taxonkit reformat -f '{k};{g};{s}' |cut -f 1,3 | tee %s |paste %s %s > %s" % (outfile2,outfile3,outfile3,outfile1,outfile4))
if val1==0:
print("taxid匹配上lineage成功")
else:
print("taxid匹配上lineage失败")
file1 = outfile3
df1 = pd.read_csv(file1, sep='\t', header=None)
file2 = outfile4
df2 = pd.read_csv(file2, sep='\t', header=None)
df3 = df2.iloc[:, 0:df2.shape[1] - 1]
df3.columns = ['taxid', 'taxnomy_k_g_s', 'Query id', 'accession.version', '% identity', 'alignment length',
'mismatches', 'gap openings',
'q. start', 'q. end', 's. start', 's. end', 'e-value', 'bit score']
df4 = df3['taxnomy_k_g_s'].str.split(';', expand=True)
df4.columns = ['kingdom', 'genus', 'species']
df5 = pd.concat([df3, df4], axis=1, names=['kingdom', 'genus', 'species'])
df5.to_csv(outfile5,index=False, sep='\t')
file1 = outfile5
df1 = pd.read_csv(file1, sep='\t')
print(df1['% identity'].value_counts(ascending=False))
for i in range(len(df1['% identity'])):
if df1['% identity'][i] > 80:
i += 1
else:
print("unmeet")
break
list1 = df1['Query id'].unique().tolist()
list3 = []
for i in range(len(list1)):
list2 = df1[df1['Query id'] == list1[i]]['species'].tolist()
for j in range(1, len(list2)):
if str(list2[j]).split(' ', 2)[0] != str(list2[0]).split(' ', 2)[0]:
list3.append(list1[i])
break
else:
j = j + 1
for i in range(len(list3)):
df1 = df1[~df1['Query id'].isin([str(list3[i])])]
df2 = df1.reset_index(drop=True)
df2.to_csv(outfile6,index=None, sep='\t')
file2 =outfile6
df3 = pd.read_csv(file2, sep='\t')
df4 = df3.drop_duplicates(subset='Query id').reset_index()
df4.to_csv(outfile7,index=None, sep='\t')
file1 = outfile7
df1 = pd.read_csv(file1, sep='\t')
df2 = df1.taxid.value_counts()
df3 = df1['taxid'].value_counts(ascending=False)
dict_df3 = {'taxid': df3.index, 'count': df3.values}
df4 = pd.DataFrame(dict_df3)
dict_id_to_taxnomy = dict(zip(df1['taxid'], df1['taxnomy_k_g_s']))
df4['taxnomy_k_g_s'] = df4['taxid'].apply(lambda x: dict_id_to_taxnomy[x])
df5 = df4['taxnomy_k_g_s'].str.split(';', expand=True)
df5.columns = ['kingdom', 'genus', 'species']
df6 = pd.concat([df4, df5], axis=1, names=['kingdom', 'genus', 'species'])
del df6['taxnomy_k_g_s']
df6['type'] = 0
for i in range(len(df6)):
if df6.loc[i, 'kingdom'] in 'Viruses':
df6.loc[i, 'type'] = '病毒'
elif df6.loc[i, 'kingdom'] == 'Bacteria':
df6.loc[i, 'type'] = '细菌'
elif df6.loc[i, 'kingdom'] in 'fungi':
df6.loc[i, 'type'] = '真菌'
df6['Name'] = df6['species']
df6['level 1'] = df6['kingdom']
col_names = df6.columns.tolist()
col_names_index = ['Name', 'level 1', 'taxid', 'count', 'kingdom', 'genus', 'species', 'type']
df7 = df6.reindex(columns=col_names_index)
df7.to_csv(outfile8,index=None, sep='\t')
if __name__ == '__main__':
get_blastn_match_taxid_lineage()