본문 바로가기
연구관련/Bioinfo류

SMILES 로 구조 파일 만들고 비교, 그림으로 나타내기

by adnoctum 2014. 4. 28.




   PDB에서 ligand 가 있는 것들에 대해서 SMILES 를 이용해 2D 혹은 3D 구조 파일로 만들고, 그림으로도 만든다. 


(구조 파일을 이용하여 그림을 그린 결과 비교는 이 글에 있다)


이것은 일을 할 때 찾아 보는 수고를 덜기 위해 개인적인 일을 기록한다. 명령어 조차도 할 때마다 찾아 보니 귀찮아서라도 이 곳에 사용했던 명령어를 적어 둔다, ㅋ. 


결국은 SMILES, sdf file, mol2 file, 간의 상호 변환이 주된 문제이고, 이름으로 같은 chemical 인지를 matching 시키는 것에 있어 부정확한 것이 있으므로 구조로 비교까지 하는 것이 다른 한 작업. 주요하게 사용하는 프로그램은 Marvin 의 molconvert 와 OpenBabel. molconvert 는 연구용은 무료로 받을 수 있고 OpenBabel 은 무료 소프트웨어 이다. molconvert 는 java 로 되어 있고 OpenBabel 은 C 로 되어 있는듯 한데 어쨌든 이것은 source compile 해서 쓰고 있다. (작업 환경은 언제나 그렇듯 모두 linux 이다). 


표기 중 푸른색은 명령어, 붉은색은 명령어에 지정할 수 있는 옵션, 검은색은 옵션 값이다. 


SMILES 로 2D 구조 파일(sdf) 만들기


obabel [file_name] -O ./sdf/[id].sdf --gen2d -d -b --title [id]

molconvert sdf [file_name] -o ./sdf_by_molconvert/[id].sdf -Y



[file_name] 의 파일은 한 줄로 되어 있고 SMILES 만 있다. [id] 는 적당한 ID 이고(chemb-id 와 같은), sdf 파일에 title 을 저장하기 위하여 obable 의 경우 --title option 을 사용했다. sdf 을 finger print 로 만들어서 구조 비교를 할 경우 이 title 을 뽑아 낼 생각이다. 아무것도 없으면 여러 개의 sdf 파일을 하나로 묶어 놓은 sdf 파일에서 몇 번째 chemical 이랑 비교한 것인지만 나와서 약간 번거롭기 때문이다. obabel의 -d 옵션이나 molconvert 의 -Y 옵션은 implicit version 으로, 수소 원자를 제거해 주는 기능을 한다. 즉, 굳이 쓸 필요가 없다면 수소를 표현하지 않는다 - 수소 문제는 약간 복잡한데[각주:1], pH 에 의해서도 영향을 받고 표기를 할 때 편의를 위해서도 H 를 쓰지 않을 수 있기 때문에 난 아예 무조건 없애는 쪽으로 선택했다. 




sdf 파일에 특성과 제목 추가하기


obabel [file_name] -O ./sdf_by_obabel2/[name_part] --title [id] --property [ligandId] [id]


sdf 파일의 경우 title 이나 별다른 property 가 없이 각 원자의 좌표와 연결 정보만 저장이 된 경우도 많은데, 이 경우 구조 검색/비교를 했을 때 어떤 chemical 에 대하여 수행된 것인지 알아 내기가 번거롭다. 보통 여러 compound 를 하나로 묶어 놓은 sdf 파일에서 몇 번째 compound 와 비교한 것인지가 출력이 되는데, 그 대신 title 이나 property 를 출력하게 하면 바로 알 수 있어서 좋다. 이런 경우, 이미 만들어 져 있는 sdf 파일에 title 과 property 를 위와 같은 명령어로 추가한다. 위는 python code 에서 system call 로 작업하고 있는 거라 변수 명이 [ ] 로 표기가 되어 있으니 자세한 설명은 OpenBabel 설명서를 참고하자. 



여러 sdf 파일을 하나의 sdf 파일로 묶기


obabel *.sdf -O ../pdb_ligand.all.sdf



구조 비교를 위한 finger print index 만들기


obabel pdb_ligand.all.obabel2.sdf -ofs -xfMACCS


구조 비교는 보통 finger print 라는 것을 갖고 하게 된다. 즉, chemical 의 feature 를 정의한 후, 각 feature 에 해당하는 bit 를 정하고, 각 chemical 에 대하여 그 bit 를 채운 후 그것을 갖고 비교를 하게 된다. 쉽게 다시 쓰면, 예를 들면, C=O 결합이 있으면 2진수의 첫 번째 값 (첫 번째 bit)을 1, 없으면 0, N=N 이 있으면 2진수의 두 번째 값(두 번째 bit) 를 1, benzene ring 이 있으면 2진수의 세 번째 값 (세 번째 bit) 를 1, 과 같은 식으로 각 chemical 의 특징을 나타내는 feature 에 대하여 그 feature 를 갖고 있으냐 없느냐에 따라 값이 setting 이 되고, 그 값을 갖고 비교를 하게 된다는 의미이다. 각 feature 의 유무에 따라 만들어 진 값이 finger print인 것이다. 그러한 비교를 좀 더 쉽게 하기 위하여 index 를 만드는 과정이 위의 명령어이다. index 를 만든다 함은, feature 값을 이용하여 유사한 feature 를 갖는 compound - 결과적으로 구조적으로 비슷한 compound - 를 찾을 때 보다 빠른 검색을 위한 file 구조를 만든다는 의미이다. 아주 간단히 예를 들면, feature  값을 정렬해 놓으면 binary search 를 할 수 있어서 후에 비슷한 feature 값을 찾는 작업을 쉽게 할 수 있다. 이런 식이다. compound 의 개수가 1만개가 넘어 가는 경우가 많기 때문에 finger print 의 index 를 만들어서 검색을 하게 된다. 내가 예로 든 것은 말 그대로 예를 위한 예이고, 실제로는 더 복잡할 것이다. finger print 의 종류로 쓸 수 있는 것은 OpenBabel 에서 FP2, FP3, MACCS 세 가지가 제공이 되고 있으므로 적당히 사용한다. 





  1. 이 부분에서는 유기화학이나 일반화학(대학 수준 정도)를 배웠으면 쉽게 이해할 수 있다. [본문으로]