(<-)

RegressionTest

[BioPythonTutorial/Advanced]

SubsMatrix

(->)

Chap 4.3 Parser Design

디자인 개괄

파서들은 event-oriented 디자인관점에서 만들어지며, scanner와 consumer객체를 포함한다.

scanner는 데이터소스로 부터 입력을 받고, 라인별로 분석하며, 데이터내의 특정정보를 인식할때마다 이벤트를 보내주는 역할을 한다. 예를들어, 데이터가 종이름을 포함한다면, scanner는 organism_name이라는 이벤트를 생성한다.

consumer는 scanner가 만든 이벤트를 받는 객체이다. 앞 예제에서 consumer는 organism_name 이벤트를 받고, 해당 어플리케이션에 맞는 작업을 수행한다.

이벤트

두가지 타입의 이벤트가 있다.

  • info 이벤트 : 데이터 스트림 내에서 특정 정보의 위치꼬리표 이벤트
  • section 이벤트 : 스트림내에서 section을 표시하는 이벤트

여기서, info event는 데이터내의 특정 라인과 관련되어 있는 반면, section event는 그렇지 않다.

section 이벤트 이름은 start_EVENTNAME 과 end_EVENTNAME 포맷내에 있어야 하며, 여기서, EVENTNAME은 해당 이벤트의 이름이다.

예를들어, FastaFormat의 scanner는 다음의 이벤트를 생성한다.

EVENT NAME       ORIGINAL INPUT
begin_sequence
title            >gi|132871|sp|P19947|RL30_BACSU 50S RIBOSOMAL PROTEIN L30
sequence         MAKLEITLKRSVIGRPEDQRVTVRTLGLKKTNQTVVHEDNAAIRGMINKVSHLVSVKEQ
end_sequence
begin_sequence
title            >gi|132679|sp|P19946|RL15_BACSU 50S RIBOSOMAL PROTEIN L15
sequence         MKLHELKPSEGSRKTRNRVGRGIGSGNGKTAGKGHKGQNARSGGGVRPGFEGGQMPLFQRLPK
sequence         RKEYAVVNLDKLNGFAEGTEVTPELLLETGVISKLNAGVKILGNGKLEKKLTVKANKFSASAK
sequence         GTAEVI
end_sequence

따라서, FastaFormat의 scanner는 다음의 이벤트들을 생성한다. title, sequence, begin_sequence, and end_sequence. begin_sequence와 end_sequemce 이벤트는 원래 입력값의 어떤라인과도 관련되어 있지 않음을 참고한다.

scanner가 보낼수 있는 이벤트들은 각 데이터포맷에 대해 특별히 정해져있어야 한다.

'noevent' 이벤트

데이터파일이 의미없는 정보들을 가진 라인들을 포함하는 경우기 있다. blank lines같은 것들. 이런 라인들에 대해서 scanner는 'noevent'라는 이벤트를 만들어낸다.

Scanners

class Scanner:
    def feed(self, handle, consumer):
        # Implementation

scanner는 파일 핸들과 consumer를 취하는 'feed'라는 메쏘드를 지원해야한다. 파일 핸들로 부터 데이터를 읽고, consumer를 위한 이벤트를 생성해야하는 것이다.

Consumers

class Consumer:
    # event handlers

consumer는 이벤트들을 다루는 메쏘드들을 포함한다. 그 메쏘드의 이름은 그것이 다루는 이벤트의 이름이다. 정보를 포함하는 데이터의 라인에서, info event가 지나가며, section event는 아무것도 지나가지 않는다. 당신은 당신의 어플리케이션에서 관심없는 이벤트들에 대해서 무시하고 지나갈 수 있다. 그런 이벤트들에 대해 아무런 메쏘드도 적용하지 않으면 된다.

모든 consumer는 기본적인 Consumer class에서 유도되었다. 예를 들어,

class FASTAConsumer(Consumer):
    def title(self, line):
        # do something with the title
    def sequence(self, line):
        # do something with the sequence
    def begin_sequence(self):
        # a new sequence starts
    def end_sequence(self):
        # a sequence ends

이후절들

[BLAST] result, [ENZYME], [FASTA], MedLine, [PROSITE], SwissProt 에 대한 이벤트 리스트.

web biohackers.net