Как получить доступ к записи KEGG без указания организма с помощью биосервисов?

Я пытаюсь получить доступ к KEGG через биосервисы, чтобы получить определенную информацию о списке генов. Проблема в том, что я не знаю заранее, какому организму принадлежат отдельные гены; В моем списке может быть много генов, которые все принадлежат разным организмам. Моя проблема в том, что я не знаю, как получить нужную информацию о генах без указания организма.

Чтобы привести пример:

gene_list = ['YMR293C', 'b3640']

Первый ген принадлежит дрожжам, а второй принадлежит E.coli.

Если я сейчас попробую:

from bioservices import *
kegg_con = KEGG()
res = kegg_con.get('b3640', parse=True)['NAME']

Я заканчиваю с TypeError поскольку

kegg_con.get('b3640', parse=True)

не возвращает словарь, а просто число (так как я не указываю организм, которому он принадлежит). Это работает, однако, когда я указываю организм (здесь это eco что означает E.coli):

kegg_con.get('eco:b3640', parse=True)['NAME']

возвращается

[u'dut']

что правильно, как можно увидеть здесь:

введите описание изображения здесь

Затем я попытался получить информацию о связанном организме с помощью команды find. Это прекрасно работает для YMR293C но терпит неудачу для b3640:

kegg_con.find('genes', 'YMR293C')

возвращается

Происхождение:YMR293C\tHER2, GEP6, QRS1, RRG6; субъединица глутамил-тРНК (Gln) амидотрансферазы HER2 (EC:6.3.5.7); K02433 Субъединица А-аспартил-тРНК (Asn)/ глутамил-тРНК (Gln) амидотрансферазы [EC:6.3.5.6 6.3.5.7]\ncal:CaO19.11438\tlikely амидаза, сходная с митохондриальной предполагаемой глутамил-тРНК-амидотрансферазой S. cerevisiae YMR293C:CaO19.3956\tlikely амидаза, сходная с митохондриальной предполагаемой глутамил-тРНК амидотрансферазой S. cerevisiae YMR293C; K02433 субъединица A аспартил-тРНК (Asn)/ глутамил-тРНК (Gln) амидотрансферазы A [EC:6.3.5.6 6.3.5.7]\n'

из которого я могу легко извлечь необходимую информацию (в этом случае: sce:YMR293C), однако, когда я бегу

 kegg_con.find('genes', 'b3640')

я получил

u'cnb:CNBB3640\ типотетический белок; Белок транслокации олигосахаридов K06316 RFT1\ncgi:CGB_B3640C\ типотетический белок \neco:b3640\tdut; дезоксиуридинетрифосфатазу (EC:3.6.1.23); K01520 dUTP пирофосфатаза [EC:3.6.1.23]\nsea:SeAg_B3640\tbfd; связанный с бактериоферритином ферредоксин; K02192 ассоциированный с бактериоферритином ферредоксин \nyps:YPTB3640\t консервативный гипотетический белок \nreu:Reut_B3640\t консервативный гипотетический белок \nbbr:BB3640\tphage-связанный экспортируемый белок \nmag:amb3640\thypothetic protein \ nbcgeB40-tBBBG-98 K02407 белок, связанный с жгутиковыми крючками 2\ncbi:CLJ_B3640\t консервативный гипотетический белок; K09963 нехарактеризованный белок \nmmo:MMOB3640\ типотетический белок \nmbo:Mb3640c\tftsH; мембраносвязанная протеаза FTSH (белок клеточного деления) (EC:3.4.24.-); K03798 протеаза деления клеток FtsH [EC:3.4.24.-]\n'

который не предоставляет информацию о E.coli.

Поэтому мои вопросы:

1) Есть ли способ, чтобы я мог получить доступ к информации о гене только на основе его идентификатора гена, не указывая организм, которому он принадлежит?

2) Как лучше всего получить информацию, к какому организму принадлежит ген? И почему find мне не удается найти ген E.coli?

1 ответ

Решение

Вывод метода find() - это чистая строка, которую нелегко прочитать, но я считаю, что информация, которую вы ищете, находится в выводе. На третьей строке вы можете увидеть:

eco:b3640

Теперь я не уверен, что формат вывода из KEGG всегда имеет одинаковую структуру. Если это так, предполагая, что интересующая линия является третьей, вы можете использовать:

res = kegg_con.find('genes', 'b3640') 
orgnanism = res.split("\n")[2].split()[0].split(":")[0]

Далее вы можете проверить, является ли это действительным организмом, следующим образом:

assert organism in kegg_con.organismIds

Чтобы быть в безопасности, вы можете искать идентификатор в строке (а не брать третью строку):

[x for x in res.split() if "b3640" in x]

Надеется, что это помогает

ТЦ, главный автор биосервисов

Другие вопросы по тегам