(<-) |
[../] |
[../Classification] |
(->) |
3.7 보다 진보된 Sequence Classes -- Sequence IDs 와 Features
당신은 section 2.2에서 기본적인 Biopython sequence class 에 대한 모든 것을 읽었다. 이것은 sequence 만을 가지고 많은 유용한 것들을 어떻게 하는지를 기술하였다. 그러나 많은 경우에 sequence 들은 그것들과 연관된 많은 중요한 부가적 특성을 가진다. 이 section 은 어떻게 Biopython 이 이러한 높은 수준의 sequence 의 description을 다루는지를 기술한다.
3.7.1 Sequence ids 와 Descriptions -- SeqRecord 로 다루기
즉각적으로 위의 Sequence class 는 Bio.SeqRecord module 에 정의된 SeqRecord class 이다. 이 class 는 id 와 sequence 와 연관된 특징 같은 보다 높은 수준의 특징들을 허용한다. Class 그 자체는 매우 간단하고, 아래의 정보를 attribute 로 제공한다.
- seq -- sequence 그 자체 -- Bio.Seq object id -- sequence를 identify 하기 위해서 사용되는 기본 id. 대개의 경우에 이것은 accession number 와 같은 것이다.
name -- sequence 에 대한 "일반적인" name/id. 어떤 경우에 이것은 accession number 와 같을 것이다. 그러나, 그것은 역시 clone name 일수도 있다. 나는 이것을 GenBank record 의 Locus id 와 대등하다고 생각한다. description -- sequence 에 대한 사람이 읽을 수 있는 description 이나 expressive name. 이것은 FASTA formatted entry 에서의 id information을 따르는 것과 같다. annotations -- sequence 에 대한 부가적 정보의 dictionary. Key 는 정보의 name 이고, 정보는 value 에 저장된다. 이것은 sequence 에 대한 보다 덜 구조적인 부가적 정보를 허용한다.
features -- sequence 의 특성에 대한 보다 구조적인 정보를 가진 SeqFeature 의 list 이다. SeqFeature 의 구조는 밑의 section 3.7.2 에 기술된다. 모든 정보가 class 의 attribute 로 저장되기 때문에 SeqRecord class를 사용하는 것은 많이 복잡하지는 않다. Class를 initializing 하는 것은 단지 Seq object를 SeqRecord 로 passing 하기만 하면 된다.
>>> from Bio.Seq import Seq >>> simple_seq = Seq("GATC") >>> from Bio.SeqRecord import SeqRecord >>> simple_seq_r = SeqRecord(simple_seq)
부가적으로, 당신은 id, name 과 description을 initialization function 에 넘겨줄 수 있다. 그러나 만약 그렇지 않으면, 그것들은 unknown 상태를 지칭하는 string 으로 될 것이고, 그 결과로 수정될 수 있을 것이다.
>>> simple_seq_r.id '<unknown id>' >>> simple_seq_r.id = 'AC12345' >>> simple_seq_r.description = 'My little made up sequence I wish I could write a paper about and submit to GenBank' >>> print simple_seq_r.description My little made up sequence I wish I could write a paper about and submit to GenBank >>> simple_seq_r.seq Seq('GATC', Alphabet())
Annotation을 더하는 것은 거의 똑같이 쉽고, 단지, 직접적으로 annotation dictionary를 다루는 것을 수반한다.
>>> simple_seq_r.annotations['evidence'] = 'None. I just made it up.' >>> print simple_seq_r.annotations {'evidence': 'None. I just made it up.'}
저것은 그것에 대한 모든 것이다. (That's just about all there is to it!) 다음에는, 당신은 sequence 에 대한 정보를 나타내는 부가적인 구조적 방법을 제공하는 SeqFeature 에 대해서 배우기를 원할 수도 있다.
3.7.2 Features 와 Annotations -- SeqFeatures
Sequence의 features 는 sequence를 기술하는 필수적인 부분이다. 한번 당신이 sequence 그 자체를 넘어서는 것을 얻었다면, 당신은 sequence 에 대해서 알려진 보다 "추상적"인 정보를 쉽게 얻고 조직하는 어떤 방법을 필요로 한다. 모든 것을 cover 하는 general sequence feature class를 개발하는 것은 아마도 불가능한 반면, Biopython SeqFeature class 는 sequence 에 대한 정보를 가능한한 많이 encapsulate 하고자 한다.
그 디자인은 많은 부분이 GenBank/EMBL feature tables에 기반하고 있다. 그래서 만약 당신이 그들이 어떻게 보이는지를 이해한다면, 당신은 아마도 Biopython class 의 구조를 이해하는데 보다 쉬울 것이다.
3.7.2.1 SeqFeature 그 자체
Sequence feature를 다루는 첫 번째 level 은 SeqFeature class 그 자체이다. 이 class 는 몇 개의 attribute를 가진다. 그래서 처음에 우리는 그들과 그들의 일반적인 특성을 열거하고, 그 다음에 real life example 인 GenBank feature table 에 어떻게 적용하는지를 보여주는 예를 해 볼 것이다. SeqFeature 의 attribute 는 다음과 같다.
location -- 당신이 처리하는 sequence 에서의 SeqFeature 의 location. Locations end-points 는 애매할 수도 있다. -- section 3.7.2.2 는 description을 어떻게 다루는지에 대한 보다 많은 서술을 가지고 있다. type -- feature type 의 textual description 이다. (옐흘 들어, 이것은 'CDS' 나 'gene' 같은 어떤 것이다.) ref -- 다른 sequence 에 대한 reference. 가끔 feature 는 특정 sequence 위에 있을수도 있다. 그러나 다른 sequence 로 참조할 필요가 있을 수도 있다. 이것은 reference를 제공한다. (보통 accession number) 이것의 좋은 예는 대부분의 coding sequence 를 가지는 genomic sequence 이다. 그러나 exon 의 하나가 다른 accession 이 있는 경우에, feature 는 missing exon을 위해서 이 다른 accession 으로 참조될 필요가 있을 것이다. ref_db -- 이것은 cross sequence reference를 제공하는 ref 와 같이 작동한다. 만약 reference 가 있다면, ref_db 는 None 으로 설정될 것이다. 만약 reference 가 같은 database 에 있다면, 다른 방법으로 database 의 이름으로 설정된다. strand -- feature 가 locate 된 sequence 의 strand. 이것은 top strand 에 대한 '1' 이거나 bottom strand 에 대한 '-1' 이거나, 양측 strand(또는 상관이 없거나)를 위한 0 중의 하나이다. 이것은 단지 double stranded DNA 에만 해당되고, protein 이나 RNA 는 아니라는 것을 기억하라. qualifiers -- 이것은 feature 에 대한 부가적 정보의 python dictionary 이다. Key 는 value 안에 정보가 저장된 간결한 one-work description 의 종류이고, 그 value 는 실제 정보이다. 예를 들어, qualifier를 위한 common key 는 "evidence" 일 수도 있고, 그 value 는 "계산된(실험이 아닌)" 것일 수 있다. 이것은 단지 feature를 보는 사람으로 하여금 그것이 실험적으로 확인된 것이 아니라는 것을 알게 하는 하나의 방법이다.
sub_features -- feature 의 매우 중요한 feature 는 그것이 그 아래에 부가적인 sub_feature를 가질 수 있다는 것이다. 이것은 feature 의 nesting을 허용하고, GenBank/EMBL feature lines과 같은 것들을 (우리가 기대하기에) 직관적인 방법으로 다룰 수 있게 도와준다. SeqFeature 의 작동예를 보여주기 위해서, 한 GenBank feature table 로부터 아래의 feature를 보자.
mRNA complement(join(<49223..49300,49780..>50208)) /gene="F28B23.12"
SeqFeature 의 가장 쉬운 attribute을 처음으로 보기 위해서, 만약 당신이 이를 위한 SeqFeature object를 가졌다고 한다면, 그것을 mRNA type에, strand -1 (상보적), external databases 에 대한 reference 가 없기 때문에 ref 와 ref_db는 None 이라 한다. 이 SeqFeature 에 대한 qualifier 는 {'gene' : 'F28B23.12'} 와 같이 보이는 python dictionary 이다.
이제, location line에서 'join' 이 어떻게 다루어지는지에 대한 보다 교묘한 부분을 보도록 하자. 처음에, top level SeqFeature의 location (지금 바로 다룰 것) 은 '<49223' 로부터 '>50208' 로 가는 것으로 설정된다. (이와 같은 애매한 location 들이 어떻게 다루어지는지에 대해서 section 3.7.2.2를 보라.) 그래서 Top level object 의 location 은 feature 의 entire span 이다. 그렇다면, 당신은 어떻게 'join'에서 정보를 얻는가? 그것이 sub_feature 가 관여하는 곳이다.
Sub_feature attribute 은 두 개의 SeqFeature object를 그 안에 있는 list를 가진다. 그리고, 이것들은 join에서의 정보를 포함한다. 첫 번째 sub_feature 인 top_level_feature.sub_features[0]을 보도록 하자. 이 object 는 'mRNA_join,' -1 의 strand (부모 SeqFeature 로부터 물려받음), '<49223'에서 '49300'로 가는 location을 가진 SeqFeature object 이다.
그래서, sub_feature 는 당신으로 하여금 원한다면 internal information을 얻도록 하거나, (예를 들어, 만약 당신이 genomic sequence 로부터 exon 만을 얻기를 원할 때) 단지 넓은 그림을 다룰 수 있도록 허용한다. (예를 들어, 당신이 단지 한 region 에 있는 gene 의 coding sequence를 알기를 원할 때) 다행히도 이 구조화는 가끔 SeqFeature 에 포함될 수 있는 복잡한 정보를 얻는 것을 쉽고 직관적으로 만든다.
3.7.2.2 Locations
SeqFeature 에 대한 위의 section에서, 우리는 location을 다루는 Feature 의 더 어려운 부분의 하나를 건너뛰었다. 이것이 어려울 수 있는 이유는 location 의 position 의 애매함 때문이다. 우리가 이 모든 것으로 들어가기 전에, 이에 대해서 얘기할 때 사용할 용어를 정의하기로 하자. 기본적으로 우리가 쓸 두가지 용어가 있다.
position -- 이것은 애매하거나 그렇지 않은 sequence 에서의 한 postion을 참조한다. 예를 들면, 5, 20, <100, 35 은 모두 position이다. location -- location 은 sequence 의 region을 정의하는 두 개의 position이다. 예를 들면, 5..20 (5 에서 20) 은 하나의 location이다.
때때로 나는 이 두 개 사이에 헷갈리기 때문에 언급하였다.
Location을 다루는데에 있어서의 문제는 그들 자체의 position 에 있다. 생물학에 있어서 많은 경우에 완전히 분명한 것이 없다. (우리 wet lab 생물학자가 그것들을 확실하게 하려고 노력하는 만큼) 예를 들어, 당신은 dinucleotide priming 실험을 하여, 두 site 중의 하나에서 mRNA transcript 의 start 가 시작하는 것을 발견했을 수도 있다. 이것은 매우 유용한 정보이지만, 문제는 어떻게 이것을 position 으로 표현하는가에 있다. 우리가 이것을 처리할 수 있도록 돕기 위해서, 우리는 fuzzy position 의 개념을 가지고 있다. 기본적으로 5가지 타입의 fuzzy position 이 있다. 그래서 우리는 그것들을 다룰 5개의 class를 가진다.
ExactPosition -- 그 이름이 제시하듯이, 이 class 는 sequence를 따라 정확하게 정해진 position을 나타낸다. 이것은 하나의 숫자로 표현되고, 당신은 object 의 position attribute을 봄으로써 position을 얻을 수 있다.
BeforePosition -- 이 class 는 어떤 특정한 site 에 앞서 발생하는 fuzzy position을 나타낸다. GenBank/EMBL notation에서, 이것은 '<13' 와 같은 것으로 표현되는데, 실제 position 이 13 보다 적은 어딘가에 위치한다는 것을 의미한다. 특정한 upper boundary를 얻기 위해서, object 의 position attribute을 보라.
AfterPosition -- BeforePosition과 대조적으로, 이 class 는 어떤 특정한 site 뒤에 발생하는 position을 나타낸다. 이것은 GenBank에서 '>13' 와 같이 표현되는데, BeforePosition 과 같이, 당신은 object 의 position attribute을 봄으로써 boundary number를 얻는다.
WithinPosition -- 이 class 는 두 개의 특정 nucleotide 사이의 어딘가에 발생하는 position을 모델링한다. GenBank/EMBL notation에서, 이것은 '(1.5)'와 같이 표현되고, 1에서 5까지의 range 사이의 어딘가에 position 이 있음을 나타낸다. 이 class 에서의 정보를 얻기 위하여 당신은 두 개의 attribute을 보아야 한다. Position attribute 은 우리가 보는 range 의 lower boundary를 정한다. 그래서 우리의 예에서 이것은 1일 것이다. Extention attribute 은 higher boundary를 정한다. 그래서 이 예에서 그것은 4일 것이다. 그러므로 object.position 이 lower boundary 이고 object.position + object.extension 이 the upper boundary 이다.
BetweenPosition -- 이 class 는 두 개의 coordinates 사이의 발생하는 position을 다룬다. 예를 들어, 당신은 한 sequence 위에서 두 개의 nucleotide 사이에 발생하는 protein binding site를 가지고 있을 수 있다. 이것은 '23'과 같이 표현되는데, 실제 position 이 position 2 와 3 사이에서 일어나는 것을 가리킨다. Object 로부터 이 정보를 얻는 것은 position attribute 가 lower boundary를 정하고 (이 경우 2), extension 이 higher boundary 의 range를 가리키는 (이 경우 1) WithinPosition 과 매우 유사하다.
이제 우리는 우리가 처리할 수 있는 모든 종류의 fuzzy position을 가졌고, 실제로 한 sequence에서 location을 정할 준비가 되었다. 이것은 FeatureLocation class 에 의해 다루어진다. 이 타입의 object 는 기본적으로 단지 잠재적인 fuzzy start 와 한 feature 의 end position을 가진다. Position을 생성하고 그것들을 pass 함으로써 당신은 FeatureLocation object를 생성할 수 있다.
>>> from Bio import SeqFeature >>> start_pos = SeqFeature.AfterPosition(5) >>> end_pos = SeqFeature.BetweenPosition(8, 9) >>> my_location = SeqFeature.FeatureLocation(start_pos, end_pos)
만약 당신이 FeatureLocation object 를 출력한다면, 당신은 정보를 멋진 형태로 얻을 수 있다.
>>> print my_location (>5..(8^9))
우리는 fuzzy start 와 end position을 location 의 start 와 end attribute를 사용함으로써 access 할 수 있다.
>>> my_location.start <Bio.SeqFeature.AfterPosition instance at 0x101d7164> >>> print my_location.start >5 >>> print my_location.end (8^9)
만약 당신이 fuzzy position을 다루기를 원치 않고, 단지 numbers를 원한다면, 당신은 단지 location 의 nofuzzy_start 와 nofuzzy_end attribute를 요청하면 된다.
>>> my_location.nofuzzy_start 5 >>> my_location.nofuzzy_end 8
이것이 당신에게 fuzzy location 의 position attrubute를 돌려줌을 주목하라.
유사하게, fuzzy position 에 대해 걱정하지 않고 position을 생성하는 것을 쉽게 하기 위해서, 당신은 단지 number 들을 FeaturePosition constructor 에 pass 할 수 있고, 당신은 ExactPosition object를 돌려받을 것이다.
>>> exact_location = SeqFeature.FeatureLocation(5, 8) >>> print exact_location (5..8) >>> exact_location.start <Bio.SeqFeature.ExactPosition instance at 0x101dcab4>
이것이 Biopython에서 fuzzy position을 처리하는데 대한 모든 것이다. 그것은 이렇게 디자인되어서, fuzziness를 다루는 것이 exact position을 다루는 것보다 그렇게 더 복잡하지는 않다. 그리고 당신이 그것이 사실인 것을 발견하길 바란다!
3.7.2.3 References
또다른 일반적인 sequence 에 관련된 annotation 은 journal 이나 다른 sequence를 다루는 출판된 자료에 대한 reference 이다. 우리는 Biopython에서 Reference를 표현하는 아주 간단한 방법을 가지고 있다. -- 우리는 object 의 attribute 로서 reference 에 대한 관련된 정보를 저장한Bio.SeqFeature.Reference class를 가지고 있다.
그 attribute 는 당신이 journal, title, author 와 같은 reference에서 볼 것으로 예상되는 것들을 포함한다. 게다가 그것은 medline_id 와 pubmed_id, reference 에 대한 comment를 가질 수 있다. 이것들은 모두 object 의 attribute 로서 쉽게 access 되어진다.
하나의 reference 는 역시 location object를 가져서, 그것은 reference 가 참조하는 sequence에서 특정한 location을 정할 수 있다. 예를 들어, 당신은 BAC 에 위치한 특정 gene을 다루고 있는 journal을 가지고 있을 수 있다. 그리고 그것이 이 position을 정확히 참조하는지를 명시하길 원한다. Location 은 section 3.7.2.2 에 기술된 것과 같이 잠재적으로 fuzzy location 이다.
저것이 그에 대한 전부이다. Reference 는 다루기 쉬울 것이고, 많은 사용례들을 cover 하기에 충분한 만큼 일반적일 것이다.