Выбор пал на домен LAP1_C (PF05609). LAP1 (Lamina-associated polypeptide 1), содержащие этот домен, - белки с единственным трансмембранным участком. Локализуются на внутренней части ядерной мембраны. Они взаимодействуют и активируют торсин A, AAA+ АТФазу, локализованную в эндоплазматическом ретикулуме через перинуклеарный домен, и образуют гетерогексамерное кольцо (LAP1-Torsin)3, которое направляет торсин во внутреннюю часть ядерной мембраны. Схема анализируемой архитектуры представлен ниже.
Необработанный список белков с был скопирован из описания архитектуры. Список последовательностей всех белков скачан с пункта "Alignments". Далее список был приведен в более удобный вид и отфильтрован по данной архитектуре при помощи следующего скрипта.
#!/usr/bin/env python3 from Bio import SeqIO import pandas allseq = SeqIO.parse('/home/olesia/full.fasta', 'fasta') with open ('/home/olesia/domain_organisation.txt', 'r') as names, \ open('/home/olesia/domain_organisation_list.txt', 'w') as names_only, \ open('/home/olesia/domain_organisation.fasta', 'w') as outf: a = names.readlines() for i in range(len(a)): k=a[i].split() a[i]=k[0] names_list = a names_only.write('\n'.join(names_list)) for i in allseq: if i.name in names_list: SeqIO.write(i, outf, "fasta")
Последовательности из полученного fasta-файла были выровнены следующей командой
muscle -in domain_organisation.fasta -out align.fasta
Далее полученное выравнивание обрезала до границы архитектуры в Jalview. Там же удалила странно выровнявшиеся и очень похожие последовательности (Edit => Remove redundancy, порог - 95). Далее на основании полученного файла искала архитектуру во всех последовательностях.
hmm2build HMM align_cut.fa hmm2calibrate HMM hmm2search -E 0.1 --cpu 1 HMM full.fasta > hmmresult.txt
Выходной файл анализировала следующим скриптом.
#!/usr/bin/env python3 from Bio import SeqIO import pandas import matplotlib.pyplot as plt allseq = SeqIO.parse('/home/olesia/pr9/full.fasta', 'fasta') len_lst = [len(i.seq) for i in allseq] fig = plt.figure() ax = fig.add_subplot(1, 1, 1) ax.hist(len_lst) ax.set_ylabel('number') ax.set_xlabel('len') plt.savefig('len.png') with open('/home/olesia/pr9/domain_organisation_list.txt', 'r') as names: names_list = [i.strip() for i in names.readlines()] table = pandas.read_csv('/home/olesia/pr9/kakto.csv', sep='\t') table['True'] = 'no' table['1-spec'] = 0 table['sens'] = 0 table['F1'] = 0 table.loc[table['Sequence'].isin(names_list), 'True'] = 'yes' for i in range(len(table)): sl = table.loc[:i-1] anti_sl = table.loc[i:] yes_count = sl[sl['True'] == 'yes'].shape[0] no_count = sl[sl['True'] == 'no'].shape[0] anti_no = anti_sl[anti_sl['True'] == 'no'].shape[0] table.loc[i, '1-spec'] = 1 - (anti_no+792-len(table))/(no_count+anti_no+792-len(table)) table.loc[i, 'sens'] = yes_count/len(names_list) table.loc[i, 'F1'] = (2*yes_count)/(i+yes_count+no_count+1) table.to_csv('/home/olesia/pr9/kakto.csv', sep='\t', index=False) fig = plt.figure() ax = fig.add_subplot(1, 1, 1) ax.plot( table['1-spec'], table['sens'], color='tab:blue') ax.set_xlabel('1 - TNR') ax.set_ylabel('TPR') plt.savefig('ROC.png') plt.close() fig = plt.figure() ax = fig.add_subplot(1, 1, 1) numb = [i for i in range(len(table))] ax.stem(numb, table['score']) ax.set_ylabel('score') plt.savefig('score.png') plt.close() fig = plt.figure() ax = fig.add_subplot(1, 1, 1) ax.plot(numb, table['F1']) ax.set_ylabel('F1') plt.savefig('F1.png') plt.close()
Получены следующая таблица и графики
Распределение длин белков. Видно 2 пика, первый из которых соответствует одно- и двухдоменной архитектурам. Score decrease показывает распределение находок HMM-профиля по score. Видны "волны", соответствующие белкам с разной архитектурой. ROC-кривая, построенная по созданному HMM-профилю. Как и на прошлом графике наблюдаются "волны". График функции F1, также имеет "волны" в областях, соответствующейих скачку score между белками с разными архитектурами.