MicroSoftware 2001년 10월호 --yong27

원래는 회사서 개발중인 Proteome분석시스템에 대한 글인데... 그중에 BioPython활용 부분만을 소개합니다.

BioPython의 활용

BioPython은 생물정보학에 자주 활용되는 기능들 및 라이브러리들를 Python으로 구축해 놓은 패키지이다. Python의 명료한 문법체계와 객체지향기법이 적절하게 생물학적 요구와 맞물려서 구현되었으며, 오픈소스프로젝트로 전 세계 생물정보학 연구 인력에 의해 공동으로 개발되고 있는 프로젝트이다(http://www.biopython.org). 그 시작은 BioPerl과 유사하지만, BioPerl에 비해 훨씬 명료하고, 체계적으로 설계되어 있다고 본 필자는 생각한다. 그 이유로, OOP개념이 적절하게 녹아들어가서 복잡한 생명현상의 모델링에 적합할 뿐 아니라, 명료한 문법체계로 인하여, 소스코드의 이해가 쉬우며, 패키지의 배포형식 또한 체계적이고, 이해하기 쉽기 때문이다.

BioPython의 기능들을 소개하자면, 각종 생물정보학용 FlatFile 형식을 파싱하여 Python에 이용할 수 있는 데이터형태로 만드는 것, 온라인 생물정보학 자원들에 대해 Python으로 접근하고, 이용할 수 있는 기능, 유용한 생물정보학관련 프로그램들(BLAST, ClustalW)을 연동하는 기능, 생물학적 서열들을 조작할 수 있는 기능 등이 있다. 서열조작의 경우, 생물학적 서열의 특징을 객체지향개념으로 잘 설계하여, 마치 진짜 생물학적 서열의 성격을 클래스형태로 구현했다는 느낌마저 든다. 이 클래스는 BioPython 전반에 걸쳐 유용하게 활용된다. 그 외에도 각종 생물정보학적 툴들이 포함되어 있는데, 최근에는 생물정보학에서 많이 활용되는 Clustering관련 Algorithm들이 Python으로 구현되어 함께 배포되고 있다.

BioPython의 다양한 기능 중에서 본예제에 사용된 기능은 SwissProt 플랫파일 데이터베이스의 파싱이다. RelationalDatabase로의 변환을 위해서는 SwissProt 플랫파일의 문법규칙을 정확히 이해하고, 특정 레코드별로 해당 정보들을 뽑아낸 후, 관계형 데이터베이스에 입력하는 작업이 필요하다. 리스트 1은 BioPython을 이용하여, SwissProt FlatFileParsing하고, RelationalDatabase에 입력하는 Python 스크립트의 예제를 보여준다.

리스트 1.

   1 from Bio.SwissProt import SProt
   2 import DB2, _db2                                            # DB2 RDBMS와의 연동
   3 
   4 class DbConnectionException(AssertionError):                # DB연결 예외생성
   5     pass
   6 
   7 flatfile = open('sprot39.dat', 'r')                         # flat file database의 경로 및 화일열기
   8 
   9 conn = DB2.connect(dsn='dbname', uid='user', pwd='pass')
  10 try:
  11     curs = conn.cursor()                                    # DB2 연결커서의 작성, 연결실패시 이곳에서 검출
  12 except AttributeError:
  13     raise DbConnectionException, "DB not connected"
  14 
  15 parser = SProt.RecordParser()                               # parser의 지정
  16 iterator = SProt.Iterator(flatfile, parser)                 # flat file의 레코드 반복 인스턴스
  17 
  18 while 1:
  19     currentRecord = iterator.next()                         # next() 메쏘드로 다음 레코드로 이동
  20     if currentRecord is None:
  21         break
  22     swissID = currentRecord.entry_name
  23     ProtName = currentRecord.description
  24     try: 
  25         curs.execute('INSERT INTO TABLE1 VALUES (?,?), (swissID, ProtName))
  26     except _db2.error,e:
  27         print e
  28 curs.close()
  29 conn.close()

리스트 1에서 Bio.SwissProtBioPython중에서도 SwissProt과 관련된 패키지이며, SProt 모듈은 플랫파일 파싱과 관련된 작업을 관할한다. BioPython내에는 다양한 플랫파일 형식에 따른 파서 들이 존재하는데, 대표적인 것으로 GenBank 플랫파일 형식, FASTA, BLAST 결과포맷등이 있다. 본 예제에서는 SwissProt형식을 파싱하는 parser를 지정하고, 다음단계 레코드로 이동하는 iterator 인스턴스가 만들어짐으로써 레코드별로 파싱이 가능하도록 하였다.

본 예제는 while문내에서 레코드 끝부분까지 해당 SwissProt 플랫파일내의 Entry_name과 description 부분을 DB내에 insert시키게 된다. 이 작업에 앞서서 데이터베이스의 스키마작성 및 테이블작성이 완료되어 있어야 함은 두말할 나위가 없다. 이 예제에서는 SwissProt 파서로 ID와 단백질 이름만을 파싱하였으나, 실제로는 SwissProt내에 있는 대부분의 정보들을 파싱할 수 있다. (참고로 Python-DB2 연동모듈은 Python DB-API spec 2.0을 따르는 것으로써, 리눅스코리아의 이만용씨(BryanLee)에 의해 제작되었다. http://www.python.org/topics/database/modules.html 연동모듈 사용에 관한 많은 조언을 주심에 대해 지면으로나마 감사의 마음을 전한다.).


CategoryArticle

MakeRdbUsingBioPython (last edited 2012-08-20 13:20:14 by 182)

web biohackers.net