NCBI EntrezからFastaファイルをダウンロード

NCBI Entrez は、30以上もの生物学的な目的で作成されたデータベースに対する統合的なテキストベースの検索、情報抽出システムです。
BiopythonパッケージのBio.Entrezモジュールを使えば、このシステムをpythonから手軽に使えちゃいます。 ちなみに、Bio.EntrezはEntrez Programming Utilities(a.k.a EUtils)を利用しているようです。

Biopythonはfastqファイルの処理くらいにしか使っていなかったけど、これは使えそう。。
ってことで試してみる。

ユーザー認証

from Bio import Entrez
Entrez.email = "A.N.Other@example.com"

Entrez.email でメールアドレスを登録してからクエリを投げないと弾かれます。
使用量が限度を超えた場合、アクセスをブロックする前にこのメールアドレスを介して連絡がくるそうです。

使用できるデータベースの検索

ブラウザだと↓

f:id:kimoppy126:20180913093926p:plain

EUtilsの返り値同様、基本xml形式で返さた値がオブジェクト内に格納されます。

handle = Entrez.einfo()
result = handle.read()
print(result)

<?xml version="1.0" encoding="UTF-8" ?>                                                             
<!DOCTYPE eInfoResult PUBLIC "-//NLM//DTD einfo 20130322//EN" "https://eutils.ncbi.nlm.nih.gov/euti$
s/dtd/20130322/einfo.dtd">                                                                          
<eInfoResult>                                                                                       
<DbList>                                                                                            
                                                                                                    
        <DbName>pubmed</DbName>                                                                     
        <DbName>protein</DbName>                                                                    
        <DbName>nuccore</DbName>                                                                    
        <DbName>ipg</DbName>                                                                        
        <DbName>nucleotide</DbName>                                                                 
        <DbName>nucgss</DbName>                                                                     
        <DbName>nucest</DbName>                                                                     
        <DbName>structure</DbName>                                                                  
        <DbName>sparcle</DbName>                                                                    
        <DbName>genome</DbName>                                                                     
        <DbName>annotinfo</DbName>                                                                  
        <DbName>assembly</DbName>                                                                   
        <DbName>bioproject</DbName>                                                                 
        <DbName>biosample</DbName>                                                                  
        <DbName>blastdbinfo</DbName>                                                                
        <DbName>books</DbName>                                                                      
        <DbName>cdd</DbName>                                                                        
        <DbName>clinvar</DbName>                                                                    
        <DbName>clone</DbName>                                                                      
        <DbName>gap</DbName>                                                                        
        <DbName>gapplus</DbName>                                                                    
        <DbName>grasp</DbName>                                                                      
        <DbName>dbvar</DbName>                                                                      
        <DbName>gene</DbName>                                                                       
        <DbName>gds</DbName>                                                                        
        <DbName>geoprofiles</DbName>                                                                
        <DbName>homologene</DbName>                                                                 
        <DbName>medgen</DbName>                                                                     
        <DbName>mesh</DbName>                                                                       
        <DbName>ncbisearch</DbName>                                                                 
        <DbName>nlmcatalog</DbName>                                                                 
        <DbName>omim</DbName>                                                                       
        <DbName>orgtrack</DbName>                                                                   
        <DbName>pmc</DbName>                                                                        
        <DbName>popset</DbName>                                                                     
        <DbName>probe</DbName>                                                                      
        <DbName>proteinclusters</DbName>                                                            
        <DbName>pcassay</DbName>                                                                    
        <DbName>biosystems</DbName>                                                                 
        <DbName>pccompound</DbName>                                                                 
        <DbName>pcsubstance</DbName>                                                                
        <DbName>pubmedhealth</DbName>                                                               
        <DbName>seqannot</DbName>                                                                   
        <DbName>snp</DbName> 
</DbList>      
               
</eInfoResult> 

これをパースし、オブジェクト内に格納するにはEntrez.read()を使用します。
データベースの一覧はDbList をキーとする辞書内に格納されています。

handle = Entrez.einfo()        
result = Entrez.read(handle)   
print(result['DbList'])

['pubmed', 'protein', 'nuccore', 'ipg', 'nucleotide', 'nucgss', 'nucest', 'structure', 'spa
rcle', 'genome', 'annotinfo', 'assembly', 'bioproject', 'biosample', 'blastdbinfo', 'books', 'cdd', 
'clinvar', 'clone', 'gap', 'gapplus', 'grasp', 'dbvar', 'gene', 'gds', 'geoprofiles', 'homologene', 
'medgen', 'mesh', 'ncbisearch', 'nlmcatalog', 'omim', 'orgtrack', 'pmc', 'popset', 'probe', 'protein
clusters', 'pcassay', 'biosystems', 'pccompound', 'pcsubstance', 'pubmedhealth', 'seqannot', 'snp', 
'sra', 'taxonomy', 'biocollections', 'unigene', 'gencoll', 'gtr']                                   

Entrez内の検索

ブラウザだと↓ f:id:kimoppy126:20180913083658p:plain

関心のあるキーワードで検索を行いたい場合。 例えば、

Cypripediodeae亜科のラン植物のmatK遺伝子

についての配列が欲しいときは、以下のように行います。

Entrez.email = "A.N.Other@example.com"     # Always tell NCBI who you are                
handle = Entrez.esearch(db="nucleotide", term="Cypripedioideae[Orgn] AND matK[Gene]")  
result = Entrez.read(handle) 

ヒットした論文数

print(result["Count"]) 

399                             

ヒットしたGenBank ID

print(result["IdList"])                                                                    

['1434742847', '1434742845', '1434742843', '1434742841', '1434742839', '844174433', '1373448595', '1
373448593', '1373448591', '1373448589', '1373448587', '1373448585', '1373448583', '1373448581', '137
3448579', '1373448577', '1373448575', '1373448573', '1373448131', '1354070957']                     

Entrezからの完全な情報の取得

ブラウザだと↓ f:id:kimoppy126:20180913092519p:plain

ヒットしたGenBank IDの一番最初のものについて、詳細を見てみましょう。 詳細の閲覧には、Bio.Entrez.efetchを使用します。

handle = Entrez.efetch(db="nucleotide", id="1434742847", rettype="gb", retmode="text")
print(handle.read()) 

LOCUS       MF543506                 834 bp    DNA     linear   PLN 31-JUL-2018            
DEFINITION  Cypripedium calceolus voucher CYCAOL02-210813 maturase K (matK)                
            gene, partial cds; chloroplast.                                                
ACCESSION   MF543506                                                                       
VERSION     MF543506.1                                                                     
KEYWORDS    .                                                                              
SOURCE      chloroplast Cypripedium calceolus                                              
  ORGANISM  Cypripedium calceolus                                                          
            Eukaryota; Viridiplantae; Streptophyta; Embryophyta; Tracheophyta;             
            Spermatophyta; Magnoliophyta; Liliopsida; Asparagales; Orchidaceae;            
            Cypripedioideae; Cypripedium.                                                  
REFERENCE   1  (bases 1 to 834)                                                            
  AUTHORS   Guglielmo,F., Poggio,L. and Tutino,S.                                          
  TITLE     DNA barcoding of land plant species in Aosta Valley (Northwest                 
            Italy)                                                                         
  JOURNAL   Unpublished                                                                    
REFERENCE   2  (bases 1 to 834)                                                            
  AUTHORS   Guglielmo,F., Poggio,L. and Tutino,S.                                          
  TITLE     Direct Submission                                                              
  JOURNAL   Submitted (25-JUL-2017) Aree protette - Museo regionale di Scienze             
            naturali Efisio Noissan, Regione Autonoma Valle d'Aosta, loc.                  
            Amerique 127A, Quart, Aosta 11020, Italy                                       
FEATURES             Location/Qualifiers                                                   
     source          1..834                                                                
                     /organism="Cypripedium calceolus"                                     
                     /organelle="plastid:chloroplast"                                      
                     /mol_type="genomic DNA"                                               
                     /specimen_voucher="CYCAOL02-210813"                                   
                     /db_xref="BOLD:VDNA042-17.matK"                                       
                     /db_xref="taxon:53038"                                                
                     /country="Italy: Aosta Valley, Ollomont, Chante"                      
                     /collection_date="21-Aug-2013"                                        
                     /collected_by="Laura Poggio,Raffaella Pierobon"                       
                     /identified_by="Laura Poggio"                                         
                     /PCR_primers="fwd_seq: cgatctattcattcaatatttc, rev_seq:               
                     tctagcacacgaaagtcgaagt"                                               
     gene            <1..>834                                                              
                     /gene="matK"                                                          
     CDS             <1..>834                                                              
                     /gene="matK"                                                          
                     /codon_start=1                                                        
                     /transl_table=11                                                      
                     /product="maturase K"                                                 
                     /protein_id="AXG21182.1"                                              
                     /translation="NYVSDLLIPHPIHLEILVQILQCWIKDVPSLHLLRLLFHEYHYF            
                     NSLITSKKSIYAFSRIKKRFLWFLYNSYVYECEYLFHFLRKQSSYLRSTSSGVFLERT            
                     HFYVKIEHLIVVCCNSFHRILCFLKDPFMHYVRYQGKAILASKGTLILMKKWKFHLVN            
                     FWQSYLHFWSQPYRIHIKQLYNYSFSFLGYFSSVLENHLVVRNQMLENSFLINIMTKK            
                     LDTIAPVISLIGSLSKAQFCTVLGHPISKPIWTDLSDSDILDRFCRICRNLCRYHSGS            
                     SK"                                                                   
ORIGIN                                                                                    
        1 aattatgtgt cagatctact aataccccat cccatccatc tggaaatctt ggttcaaatc               
       61 ctgcaatgct ggatcaagga tgttccttct ttgcatttat tgcgattgct tttccacgaa               
      121 tatcattatt ttaatagtct cattacttca aaaaaaagca tttacgcctt ttcaagaata               
      181 aagaaaagat tcctttggtt cctatataat tcttatgtat atgaatgcga atatctattc               
      241 cattttcttc gtaaacagtc ttcttattta cgatcaacat cttctggagt gtttcttgag               
      301 cgaacacatt tctatgtaaa aatagaacat cttatagtag tgtgttgtaa ttcttttcat               
      361 aggatcctat gctttctcaa ggatcctttc atgcattatg ttcgatatca aggaaaagca               
      421 attctggctt caaagggaac tcttattctg atgaagaaat ggaaatttca tcttgttaat               
      481 ttttggcaat cttatttgca cttttggtct caaccgtata ggatccatat aaagcaatta               
      541 tacaactatt ccttctcttt tctggggtat ttttcaagtg tactagaaaa tcatttggta               
      601 gtaagaaatc aaatgctaga gaattcattt ctaataaata ttatgactaa gaaattagat               
      661 accatagccc cagttatttc tcttattgga tcattgtcga aagctcaatt ttgtactgta               
      721 ttgggccatc ctattagtaa accgatctgg accgatttat cggattctga tattcttgat               
      781 cgattttgcc ggatatgtag aaatctttgt cgttatcaca gcggatcctc aaaa                     
//                                                                                        

EntrezからのFasta形式データの取得

rettype="fasta"を指定すれば、Fasta形式でデータを取得することができます。

handle = Entrez.efetch(db="nucleotide", id="1434742847", rettype="fasta", retmode="text")
print(handle.read())                                                                       

>MF543506.1 Cypripedium calceolus voucher CYCAOL02-210813 maturase K (matK) gene, partial cds; chlor
oplast                                                                                              
AATTATGTGTCAGATCTACTAATACCCCATCCCATCCATCTGGAAATCTTGGTTCAAATCCTGCAATGCT                              
GGATCAAGGATGTTCCTTCTTTGCATTTATTGCGATTGCTTTTCCACGAATATCATTATTTTAATAGTCT                              
CATTACTTCAAAAAAAAGCATTTACGCCTTTTCAAGAATAAAGAAAAGATTCCTTTGGTTCCTATATAAT                              
TCTTATGTATATGAATGCGAATATCTATTCCATTTTCTTCGTAAACAGTCTTCTTATTTACGATCAACAT                              
CTTCTGGAGTGTTTCTTGAGCGAACACATTTCTATGTAAAAATAGAACATCTTATAGTAGTGTGTTGTAA                              
TTCTTTTCATAGGATCCTATGCTTTCTCAAGGATCCTTTCATGCATTATGTTCGATATCAAGGAAAAGCA                              
ATTCTGGCTTCAAAGGGAACTCTTATTCTGATGAAGAAATGGAAATTTCATCTTGTTAATTTTTGGCAAT                              
CTTATTTGCACTTTTGGTCTCAACCGTATAGGATCCATATAAAGCAATTATACAACTATTCCTTCTCTTT                              
TCTGGGGTATTTTTCAAGTGTACTAGAAAATCATTTGGTAGTAAGAAATCAAATGCTAGAGAATTCATTT                              
CTAATAAATATTATGACTAAGAAATTAGATACCATAGCCCCAGTTATTTCTCTTATTGGATCATTGTCGA                              
AAGCTCAATTTTGTACTGTATTGGGCCATCCTATTAGTAAACCGATCTGGACCGATTTATCGGATTCTGA                              
TATTCTTGATCGATTTTGCCGGATATGTAGAAATCTTTGTCGTTATCACAGCGGATCCTCAAAA                                    

これを利用すると、以下のようにファイルが存在しない場合、
対応するfastqファイルをダウンロードするスクリプトが書けます。

import os
from Bio import SeqIO
from Bio import Entrez
Entrez.email = "A.N.Other@example.com"  # Always tell NCBI who you are
filename = "gi_186972394.fasta"
if not os.path.isfile(filename):
    # Downloading...
    net_handle = Entrez.efetch(db="nucleotide", id="186972394", rettype="fasta", retmode="text")
    out_handle = open(filename, "w")
    out_handle.write(net_handle.read())
    out_handle.close()
    net_handle.close()
    print("Saved")

まとめ

  • Bio.Entrezを使えばNCBIの検索ウィジェットでできることはほぼできちゃう。
  • fastaへの変換もできちゃう。そのままファイル出力もできちゃう。