Различия между выводом Biopython NCBI/Entrez и выводом пакета R
Я новичок в доступе к Entrez через Biopython и пару пакетов R (rentrez и reutil). При доступе к базе данных 'nuccore' с помощью esummary поля вывода, возвращаемые Biopython, отличаются от полей, возвращаемых пакетами R.
Python:
handle = Entrez.esearch(db='nuccore', term='183844[GPRJ]', retmax=75000)
record = Entrez.read(handle)
id_list = record["IdList"]
search_results = Entrez.read(Entrez.epost("nuccore", id=",".join(id_list), restart=1, retmax=10000))
webenv = search_results["WebEnv"]
query_key = search_results["QueryKey"]
handle1 = Entrez.esummary(db="nuccore", query_key=query_key, WebEnv=webenv)
record1 = Entrez.read(handle1)
Поля, возвращаемые Biopython:
['AccessionVersion', 'Caption', 'Comment', 'CreateDate', 'Extra', 'Flags', 'Gi', 'Id', 'Item', 'Length', 'ReplacedBy', 'Status', ' TaxId", 'Title', 'UpdateDate']
R (reutil пакет):
trak <- esearch('183844[GPRJ]', "nuccore", usehistory=TRUE, retmax = 70000)
query_key <- 1
web_env <- "NCID_1_224566406_130.14.18.34_9001_1496371219_1582367639_0MetA0_S_MegaStore_F_1"
esum <- esummary(db="nuccore", querykey = query_key, webenv = web_env, retstart = 1, retmax = 10000)
gtrkr <- content(esum, "parsed")
В то время как поля, возвращаемые R-пакетами reutil и rentrez, имеют следующий результат: 31 результат:
['uid', 'caption', 'title', 'extra', 'gi', 'creatate', 'updatedate', 'flags', 'taxid', 'slen', 'biomol', 'moltype', ' топология ', 'sourcedb', 'segsetsize', 'projectid', 'genome', 'subtype', 'subname', ' Assemblygi ',' Assemblyacc ',' Tech ',' Completeness ',' генетический код ',' Strand ', "организм", "штамм", "биопроба", "статистика", "свойства", "oslt"]
Заранее спасибо.
2 ответа
Приходя к этому поздно, но как бывший участник biopython
и хранитель rentrez
Я чувствую, что мне нужно объяснить, что здесь происходит.
Biopython по умолчанию обращается к исходным записям "версии 1.0", а пакеты R извлекают записи "версии 2.0". Краткое описание различий между этими записями приводится на странице справки rentrez:
NCBI предлагает два различных формата для сводных документов. Версия 1.0 представляет собой относительно ограниченную сводку записей базы данных, основанную на общем определении типа документа. Сводные данные версии 1.0 доступны только в виде XML и недоступны для некоторых новых баз данных. Сводные данные версии 2.0 обычно содержат больше информации о данной записи, но каждая база данных имеет свой собственный отдельный формат. Резюме 2.0 доступны для записей во всех базах данных, а также в виде файлов JSON и XML. Начиная с версии 0.4, Rentrez по умолчанию извлекает сводки версии 2.0 и использует JSON в качестве формата обмена (поскольку объект JSON может быть легче преобразован в собственные типы R). Существующие сценарии, которые основывались на структуре и именовании файлов сводки "Версия 1.0", можно обновить, установив для нового аргумента "версия" значение "1.0".
И просто чтобы продемонстрировать изменение этого аргумента, воспроизводятся результаты Biopython.
> eg_gene <- entrez_search(db="nuccore", term='183844[GPRJ]', retmax=1)
> entrez_summary(db="nuccore", id=eg_gene$ids, version="1.0")
esummary result with 13 items:
[1] Caption Title Extra Gi
[5] CreateDate UpdateDate Flags TaxId
[9] Length Status ReplacedBy Comment
[13] AccessionVersion
> entrez_summary(db="nuccore", id=eg_gene$ids)
esummary result with 31 items:
[1] uid caption title extra gi
[6] createdate updatedate flags taxid slen
[11] biomol moltype topology sourcedb segsetsize
[16] projectid genome subtype subname assemblygi
[21] assemblyacc tech completeness geneticcode strand
[26] organism strain biosample statistics properties
[31] oslt
Редактирование - получение записей версии 2.0 с помощью Biopython
handle = Entrez.esearch(db="nuccore", term="183844[GPRJ]", retmax=1)
record = Entrez.read(handle)
handle_two = Entrez.esummary(db="nuccore", id=record["IdList"][0], version="2.0")
Entrez.read(handle_two, validate=False)
,
{'DocumentSummarySet': ListElement([ListElement(['NPMJ00000000', 'Salmonella enterica subsp. enterica serovar Johannesburg strain CFSAN059880, whole genome shotgun sequencing project', 'gi|1235597280|gb|NPMJ00000000.1|NPMJ01000000', '1235597280', '2017/08/22', '2017/08/22', '0', '913076', '48', 'genomic', 'dna', 'linear', 'insd', '0', '186035', '', 'strain|serovar|host|sub_species|country|isolation_source|collection_date|collected_by', 'CFSAN059880|Johannesburg|Bos taurus|enterica|Nigeria|cattle stool|2012|University of Ibadan', '0', '', 'wgs', '', '11', '', 'Salmonella enterica subsp. enterica serovar Johannesburg', 'CFSAN059880', [StringElement('', attributes={'count': '1', 'type': 'all'}), StringElement('', attributes={'count': '3500', 'type': 'blob_size'}), StringElement('', attributes={'count': '1', 'type': 'org'}), StringElement('', attributes={'count': '2', 'type': 'pub'}), StringElement('', attributes={'count': '1', 'subtype': 'unpublished', 'type': 'pub'}), StringElement('', attributes={'count': '1', 'source': 'all', 'type': 'all'}), StringElement('', attributes={'count': '3500', 'source': 'all', 'type': 'blob_size'}), StringElement('', attributes={'count': '1', 'source': 'all', 'type': 'org'}), StringElement('', attributes={'count': '2', 'source': 'all', 'type': 'pub'})], StringElement('1', attributes={'master': '1', 'na': '1'}), StringElement('NPMJ00000000.1', attributes={'indexed': 'yes'}), 'NPMJ00000000.1'], attributes={'uid': '1235597280'})], attributes={'status': 'OK'})}
Чтобы объяснить пример Biopython:
from Bio import Entrez
handle = Entrez.esearch(db='nuccore', term='183844[GPRJ]', retmax=75000)
record = Entrez.read(handle)
id_list = record["IdList"]
search_results = Entrez.read(Entrez.epost("nuccore", id=",".join(id_list), restart=1, retmax=10000))
webenv = search_results["WebEnv"]
query_key = search_results["QueryKey"]
handle1 = Entrez.esummary(db="nuccore", query_key=query_key, WebEnv=webenv)
record1 = Entrez.read(handle1)
Теперь это должно подтвердить их 1000 записей (соответствующие retmax
), и у каждого есть 15 полей:
print(len(record1))
for entry in record1:
assert len(entry) == 15
print(record1[0])
Это должно дать:
1000
{'Item': [], 'Id': '1102582672', 'Caption': 'MEKF00000000', 'Title': 'Salmonella enterica subsp. enterica serovar Sandiego strain CFSAN039537, whole genome shotgun sequencing project', 'Extra': 'gi|1102582672|gb|MEKF00000000.1|MEKF01000000[1102582672]', 'Gi': 1102582672, 'CreateDate': '2016/11/14', 'UpdateDate': '2017/07/11', 'Flags': 0, 'TaxId': 0, 'Length': 93, 'Status': 'live', 'ReplacedBy': '', 'Comment': ' ', 'AccessionVersion': 'MEKF00000000.1'}
Кстати, я не уверен, что 'Item'
пустой список от.
Давайте проверим фактический необработанный XML для первой записи, используя retmax=1
from Bio import Entrez
handle = Entrez.esearch(db='nuccore', term='183844[GPRJ]', retmax=1)
record = Entrez.read(handle)
id_list = record["IdList"]
search_results = Entrez.read(Entrez.epost("nuccore", id=",".join(id_list), restart=1, retmax=10000))
webenv = search_results["WebEnv"]
query_key = search_results["QueryKey"]
handle1 = Entrez.esummary(db="nuccore", query_key=query_key, WebEnv=webenv)
print(handle1.read())
Это дает:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE eSummaryResult PUBLIC "-//NLM//DTD esummary v1 20041029//EN" "https://eutils.ncbi.nlm.nih.gov/eutils/dtd/20041029/esummary-v1.dtd">
<eSummaryResult>
<DocSum>
<Id>1102582672</Id>
<Item Name="Caption" Type="String">MEKF00000000</Item>
<Item Name="Title" Type="String">Salmonella enterica subsp. enterica serovar Sandiego strain CFSAN039537, whole genome shotgun sequencing project</Item>
<Item Name="Extra" Type="String">gi|1102582672|gb|MEKF00000000.1|MEKF01000000[1102582672]</Item>
<Item Name="Gi" Type="Integer">1102582672</Item>
<Item Name="CreateDate" Type="String">2016/11/14</Item>
<Item Name="UpdateDate" Type="String">2017/07/11</Item>
<Item Name="Flags" Type="Integer">0</Item>
<Item Name="TaxId" Type="Integer">0</Item>
<Item Name="Length" Type="Integer">93</Item>
<Item Name="Status" Type="String">live</Item>
<Item Name="ReplacedBy" Type="String"></Item>
<Item Name="Comment" Type="String"><![CDATA[ ]]></Item>
<Item Name="AccessionVersion" Type="String">MEKF00000000.1</Item>
</DocSum>
</eSummaryResult>
то есть те же самые поля, что и анализатор Entrez от Biopython дает вам ключи (плюс Id
и это Item
пустой список, который меня озадачил выше).
Вы уверены, что сравниваете как с здесь?
Не могли бы вы привести конкретный пример присоединения, где в вашем решении R есть дополнительные данные?