Как получить доступ к записи 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]
Надеется, что это помогает
ТЦ, главный автор биосервисов