Biopython
Bio.SeqRecord
#
Find similar titles
- 최초 작성자
- 최근 업데이트
Structured data
- Category
- Programming
Biopython을 활용하여 서열 레코드 객체를 다루는 법을 알아보고자 한다. 서열 레코드 객체는 from Bio.SeqRecord import SeqRecord 를 이용하여 사용할 수가 있다. 간단히 help(SeqRecord) 를 이용하면 도움말을 확인할 수 있다. 이 객체는 보통 fasta, genbank등 다양한 서열 파일들을 읽고 쓰고 정보를 추가하거나 하기 위한 용도로 사용되고 있다.
>>> from Bio.Seq import Seq
>>> simple_seq = Seq("GATC")
>>> from Bio.SeqRecord import SeqRecord
>>> simple_seq_r = SeqRecord(simple_seq)
먼저 위의 예에서는 서열 객체를 먼저 임포트 하여 임의의 서열 객체를 만든다. 그리고 서열 레코드 객체를 이용하여 단순히 SeqRecord(서열객체)를 이용하여 서열 레코드 객체를 만들 수 있다.
>>> simple_seq_r.id
'<unknown id>'
>>> simple_seq_r.id = "AC12345"
>>> simple_seq_r.description = "Made up sequence I wish I could write a paper about"
>>> print(simple_seq_r.description)
Made up sequence I wish I could write a paper about
>>> simple_seq_r.seq
Seq('GATC', Alphabet())
위의 예제에서는 서열 레코드 객체의 정보를 출력하는 방법이다. 각 인스턴스에 id, description, seq 등을 이용하여 기본적으로 갖고 있는 서열의 정보를 출력하는 방법이다.
>>> from Bio.Seq import Seq
>>> simple_seq = Seq("GATC")
>>> from Bio.SeqRecord import SeqRecord
>>> simple_seq_r = SeqRecord(simple_seq, id="AC12345")
위의 예제에서는 SeqRecord(simple_seq, id="AC12345") 와 같이 서열의 기본정보에 이어 서열의 id정보를 추가로 지정할 수 있다. 이렇게 지정하면 가 아니라 서열의 이름을 가진 서열 객체를 만들 수가 있다. 이는 나중에 서열의 id로 서열을 찾거나 가공하는 등의 보다 나은 정보를 만들 수가 있다.
>>> simple_seq_r.annotations["evidence"] = "None. I just made it up."
>>> print(simple_seq_r.annotations)
{'evidence': 'None. I just made it up.'}
>>> print(simple_seq_r.annotations["evidence"])
None. I just made it up.
위의 예에서는 서열에 보다 많은 정보를 추가하기 위해서 annotations라는 자료를 추가하였다. 사용법은 일반적인 해쉬 파이썬에서는 Dictionary 자료 구조를 이용하고 있다. 이는 각 항목에 어떤 데이터가 들어가는 지 알수 가 없기 때문에 사용자의 필요에 따라서 많은 데이터 형식을 담고자 함이다. 위의 예에서는 'evidence'라는 정보를 입력하여 "None.." 과 같이 텍스트 형식으로 입력하였다.
>>> simple_seq_r.letter_annotations["phred_quality"] = [40, 40, 38, 30]
>>> print(simple_seq_r.letter_annotations)
{'phred_quality': [40, 40, 38, 30]}
>>> print(simple_seq_r.letter_annotations["phred_quality"])
[40, 40, 38, 30]
위의 예제에서는 letter_annotations라는 변수를 선언하고 Dictionary에 phred_quality 라는 변수 값은 선언 후에 [40, 40, 38, 30]와 같이 서열의 퀄리티 값을 입력하였다. 이는 각 서열의 퀄리티 값을 입력함으로써 추후 각 서열 시퀀스에 해당하는 퀄리티 값을 가공할 수 있도록 정보를 추가한 예제이다. 이처럼 서열 객체와 달리 서열 레코드 객체에서는 다양한 많은 정보를 추가하거나 가공할 수 있도록 다양한 주석 정보를 만들 수 있도록 허용하고 있다.
본격적으로 다음으로 다루어 볼 내용은 fasta서열과 genbank 포맷으로 된 서열을 다루어 보는 것이다. 일반적으로 서열 객체가 단순히 서열의 이름, 정보, 서열정보 만을 다루기 위한 것이라면 이는 추후 SeqIO 모듈을 이용하여 포맷 변환, 파일 쓰기 등을 사용하기 위한 용도라고 보면된다.
아래에는 다음과 같이 간단한 fasta 형식의 서열이 있다. 이는 NCBI에서 제공하는 일반적인 형태로 첫 라인에 >로 시작하고 gi, gb, ref 등 다양한 정보 그리고 설명 라인을 담고 있다. 이는 반드시 >로 시작하여 한 라인에 작성되어야 한다. 그리고 그 다음 라인으로 각 서열 정보를 60개씩 담고 있다.
>gi|45478711|ref|NC_005816.1| Yersinia pestis biovar Microtus ... pPCP1, complete sequence
TGTAACGAACGGTGCAATAGTGATCCACACCCAACGCCTGAAATCAGATCCAGGGGGTAATCTGCTCTCC
...
이 정보를 다루기 위해 아래와 같이 SeqIO객체를 임포트 한다. SeqIO에서는 기본적으로 서열 레코드 객체를 반환한다. 사용법은 다음과 같다. SeqIO.read("파일이름", "포맷형식") 과 같이 사용하며 여기에서는 fasta 형식이므로 fasta를 사용하였다. 결과를 출력해보면 SeqRecord(seq=Seq... 와 같이 서열 레코드 객체가 반환되는 것을 알 수 있다.
>>> from Bio import SeqIO
>>> record = SeqIO.read("NC_005816.fna", "fasta")
>>> record SeqRecord(seq=Seq('TGTAACGAACGGTGCAATAGTGATCCACACCCAACGCCTGAAATCAGATCCAGG...CTG',
SingleLetterAlphabet()), id='gi|45478711|ref|NC_005816.1|', name='gi|45478711|ref|NC_005816.1|',
description='gi|45478711|ref|NC_005816.1| Yersinia pestis biovar Microtus ... sequence',
dbxrefs=[])
서열 객체와 마찬가지로 다음과 같이 서열정보, id, 이름, 설명 정보를 추가로 출력 해 볼 수가 있다. 통상적으로 fasta 포맷 형식 파일에서는 id, name이 같이 사용된다. 다만 설명, description은 > 로 시작되는 전체 라인을 가지고 있다. 따라서 설명 정보만 추출하기 위해서는 .split()[1:] 와 같이 id를 제외한 정보를 가져올 수 있는 추가 코딩을 해주어야 한다.
>>> record.seq
Seq('TGTAACGAACGGTGCAATAGTGATCCACACCCAACGCCTGAAATCAGATCCAGG...CTG', SingleLetterAlphabet())
>>> record.id
'gi|45478711|ref|NC_005816.1|'
>>> record.name
'gi|45478711|ref|NC_005816.1|'
>>> record.description
'gi|45478711|ref|NC_005816.1| Yersinia pestis biovar Microtus ... pPCP1, complete sequence'
다음은 genbank파일의 예를 나타낸 것이다. 형식은 다음과 같이 이루어져 있다. LOCUS로 이루어져 있으며 각 항목에 대해 공백 다음에 정보를 제공하고 있다.
LOCUS NC_005816 9609 bp DNA circular BCT 21- JUL-2008
DEFINITION Yersinia pestis biovar Microtus str. 91001 plasmid pPCP1, complete
sequence.
ACCESSION NC_005816
VERSION NC_005816.1 GI:45478711
PROJECT GenomeProject:10638
...
genbank파일은 fasta 형식과 달리 많은 정보를 추가로 제공한다. 차후에 각 포맷에 대해 다시 알아보고 여기서는 genbank 파일을 읽고 쓰는 법을 알아본다.
>>> from Bio import SeqIO
>>> record = SeqIO.read("NC_005816.gb", "genbank")
>>> record
SeqRecord(seq=Seq('TGTAACGAACGGTGCAATAGTGATCCACACCCAACGCCTGAAATCAGATCCAGG...CTG',
IUPACAmbiguousDNA()), id='NC_005816.1', name='NC_005816',
description='Yersinia pestis biovar Microtus str. 91001 plasmid pPCP1, complete sequence.',
dbxrefs=['Project:58037'])
fasta 서열과 마찬가지로 위와 같이 사용할 수 있다. SeqIO.read("NC_005816.gb", "genbank") 와 같이 SeqIO.read("파일이름", "파일형식") 으로 사용할 수 있다. 여기서는 우리가 사용하고자 하는 파일 형식이 genbank이므로 이를 사용하였다. 사용법은 fasta와 대동 소이하다.
>>> record.id
'NC_005816.1'
>>> record.name
'NC_005816'
>>> record.description
'Yersinia pestis biovar Microtus str. 91001 plasmid pPCP1, complete sequence.'
위의 정보를 출력하면 비슷한 결과를 볼 수 있다. Fasta 서열과 마찬가지로 id, name, description, 서열 정보를 출력할 수 있고 추가로 제공되는 정보는 제공되는 Dictionary 구조를 이용하여 출력할 수 있다.
fasta 포맷과 달리 genbank에서는 서열의 위치 정보에 따라 많은 정보가 달라진다. 예를 들면 UTR, CDS, Gene, Exon, Intron, mRNA 등 다양한 정보가 위치에 따라 서로 다른 정보를 주기 때문에 아래와 같이 서열 구조 정보를 다룰 수가 있다. 이는 from Bio import SeqFeature 를 이용하여 사용할 수 있다. 아래의 예제에는 각 위치를 포지셔닝 할 수 있도록 보여주고 있다.
>>> from Bio import SeqFeature
>>> start_pos = SeqFeature.AfterPosition(5)
>>> end_pos = SeqFeature.BetweenPosition(9, left=8, right=9)
>>> my_location = SeqFeature.FeatureLocation(start_pos, end_pos)
아래의 예제에서는 실제 genbank 파일을 읽어들여 서열 구조를 볼 수 있도록 한 예제이다. record.features 를 이용하여 전체 서열 구조의 갯수가 41개라는 것을 알 수 있으며 이에 대한 자세한 정보도 출력할 수 있다.
>>> from Bio import SeqIO
>>> record = SeqIO.read("NC_005816.gb", "genbank")
>>> record
SeqRecord(seq=Seq('TGTAACGAACGGTGCAATAGTGATCCACACCCAACGCCTGAAATCAGATCCAGG...CTG',
IUPACAmbiguousDNA()), id='NC_005816.1', name='NC_005816',
description='Yersinia pestis biovar Microtus str. 91001 plasmid pPCP1, complete sequence.',
dbxrefs=['Project:58037'])
>>> len(record)
9609
>>> len(record.features)
41