barcode

SMILES

Coding/코딩잡담

SMILES?

Simplified Molecular Input Line Entry System의 약어. 네? 스마일 그 캐릭터 아니냐고요? 그럼 내가 여기다 글을 쓰겠수... 

 

아세트아미노펜

이건 우리가 진통제로 많이 먹는 아세트아미노펜이다. 사람은 저걸 보면 O, H, N때문에 으아악 안돼 하지만 컴퓨터 입장에서 저건 그냥 배열 덩어리다. (python으로 이미지 불러오면 배열로 나온다) 워드클라우드에서 마스킹 이미지(흰 바탕에 검정 이미지) 안에 글자를 깔끔하게 넣어줄 수 있는 비결이 바로 흰 바탕에 검정 이미지를 255와 0으로 된 배열로 가져오기 때문. (투명 바탕이면 안되더라...)

 

그래서 컴퓨터한테 이게 분자야라고 하면 컴퓨터는 

미쳤습니까 휴먼?

미쳤습니까 휴먼? 이건 그냥 그림인데요? 한다. 쟤는 좀 간단하지? 

 

슈감마덱스
매우 놀랍게도 직접 그렸다

닥터 프리즈너라는 드라마에도 나왔던 슈감마덱스. 사람 입장에서는 뭔가 이 괴랄해보이는 분자구조때문에 아 안돼 하지만 컴퓨터 입장에서는 이것 역시 걍 이미지다. ???: 아 인간은 이미지를 주면 아 안돼 하는구나 그리고 솔직히 저거 띄우려면 크기를 150*150px로 잡아도 표 엄청 차지해서 여러분들 스크롤하다 혈압 올라가요... 새 창에서 보여주면 되지 않나 하지만 복붙이 안되지롱 토이 프로젝트 하다 보면 생각보다 50px가 넉넉한 크기라는 걸 체감할 수 있다. 아무튼 이러한 이유로 얘네들을 ASCII(문자)로 한줄요약한 게 바로 SMILES다. 즉, 분자(문자)다. 

 

아세트아미노펜을 SMILES로 쓰면 CC(=O)NC1=CC=C(C=C1)O가 되고, 슈감마덱스를 SMILES로 쓰면 C(CSC[C@@H]1[C@@H]2[C@@H]([C@H]([C@H](O1)O[C@@H]3[C@H](O[C@@H]([C@@H]([C@H]3O)O)O[C@@H]4[C@H](O[C@@H]([C@@H]([C@H]4O)O)O[C@@H]5[C@H](O[C@@H]([C@@H]([C@H]5O)O)O[C@@H]6[C@H](O[C@@H]([C@@H]([C@H]6O)O)O[C@@H]7[C@H](O[C@@H]([C@@H]([C@H]7O)O)O[C@@H]8[C@H](O[C@@H]([C@@H]([C@H]8O)O)O[C@@H]9[C@H](O[C@H](O2)[C@@H]([C@H]9O)O)CSCCC(=O)O)CSCCC(=O)O)CSCCC(=O)O)CSCCC(=O)O)CSCCC(=O)O)CSCCC(=O)O)CSCCC(=O)O)O)O)C(=O)O 이렇게 된다. 한줄요약 안되는데요? 

매우 놀랍게도 컴퓨터는 이렇게 써줘야 아 분자구나 하지 위에 있는 이미지 던져주면 걍 이미지로 인식한다... 

 

SMILES의 국룰

바이오파이썬 파싱에는 for문이 국룰이고 양자역학에는 슈뢰딩거 방정식이 국룰이듯, SMILES에도 국룰이 있다. 저기요 대체 후자는 무슨 국룰인거예요 몰라 아무튼 있어 그런거 이러한 국룰들에 의거해, 컴퓨터는 SMILES로 입력받은 화합물을 다시 사람이 보기 편한 구조도로 그려줄 수 있다. 화합물 관련 프로그램에 저 기능 없으면 안 쓴다 

 

1) 원자는 대괄호로 표기한다. 이 때, charge가 없고 동위원소 표기도 하지 않는 경우(그니까 12C같은 거) 대괄호를 생략할 수있다.


2) 유기화합물에서 자주 보는 붕소, 탄소, 질소, 산소, 인, 황, 할로겐(아스타틴 및 테네신 제외)은 아무 charge 없이 표기된 원자에 한해서 최외각전자에 맞게 암묵적으로 수소가 알아서 추가된다. (예: [O]=H2O, 이 경우 대괄호 생략 가능함)


3) 이온이면 원소명 뒤에 +나 -를 붙이고, isotope(방사성 동위원소)인 경우 앞에 질량수를 표기한다. 그러니까 예를 들어서 컴퓨터에게 칼슘 이온에 대해 설명할 때는 [Ca+2], 우라늄 238에 대해 설명할때는 [238U]라고 쓴다. 중수소, 삼중수소도 각각 [2H], [3H]. (보통 D 혹은 T로 쓰기도 하지만 패스)


4) 결합은 단일이 -, 이중이 =, 삼중이 #이다. 1.5중은 :. (확장 SMILES에서 사중결합은 $로 쓰는데 유기화합물에서 4중까지는 잘 볼 일이 없다.

 

5) 결합하지 않는 경우 .으로 표기한다. 


6) 고리 화합물의 경우 spaning tree, 즉 신장 부분 그래프로 표기하게 되고 시작점과 끝점에 숫자로 라벨 표시를 한다. (예: C1CCCCC1) 방향족은 소문자. (왼쪽에 저건 사이클로핵산이고 벤젠은 c1ccccc1이다)


7) 화합물 중간에 가지가 있을 경우 괄호로 표기한다.


8) 기하 이성질체(Cis/trans)는 /나 \로 표기한다.


9) 광학 이성질체는 중심탄소에 @나 @@로 표기한다. (골뱅이 하나가 반시계방향) 키랄성 불명이면 당연히 표기하지 않음. (L-ala: CC@@HN/D-ala: CC@HN)


10) 화학 반응은 비포>>애프터 혹은 비포>촉매>애프터로 표기. (예: CC=C.O>>CC(O)C)

 

5번이 이해가 잘 안 된다면 여기 매우 적절한 예시가 있다. 바로 cTAB. 

cTAB의 분자구조

cTAB은 브로민화 세트리모늄(Cetrimonium bromide)을 줄인거고(소듐 도데킬 설페이트 줄여서 SDS잖음...), DNA 뽑을 때 쓰는 계면활성제이다. 그니까 비누 비누. 참고로 SDS도 비누다. 아무튼 저 구조를 보니... 응? 브로민은 떨어져 있네요? 그리고 cTAB의 SMILES는 CCCCCCCCCCCCCCCC[N+](C)(C)C.[Br-]  이다. 저기 브로민 이온 왼쪽에 마침표가 바로 브로민 이온이 있는데요 결합은 없습니다를 알려주는 것. 

 

왜 이렇게 표기하나요? 

그래프 이론이라는 게 있는데... 아니 꺾은선 막대 이딴거 말고. 그거는 용어나 개념이 복잡해서 나중에 디테일하게 설명해줘야 하지만, 여기서 말하는 그래프는 일단 꺾은선 막대 이딴 게 아니라 꼭지점과 변으로 구성되어 있으면서 객체간의 짝 관계를 모델링하는 그림이다. 지하철 노선도나 버스 노선도같이 어떠한 정보를 전달하는 수단이 되기도 한다. 서울 노선도 보면 그 얘기 안나와요 버뮤다 응암지대? 

 

아무튼 SMILES의 국룰은 그래프 이론에 의거해 분자를 그래프화하고, 그 표기법에 맞게 꼭지점과 변(그리고 고리 여부까지)을 한줄...아냐 슈감마덱스 저거 절대 한줄 안돼... 아무튼 한줄로 표기하는 수단이다. 참고로 제일 긴 거 250자까지 봤다. 250자 도랏 

 

아무튼 이런 식으로 도식화 한 다음 SMILES화 하게 되는데, 문제는 얘가 오픈소스가 아니다보니 저걸 생성하는 알고리즘이 죄다 달랐다. 그래서 똑같은 분자여도 SMILES가 무슨 닉네임마냥 천차만별이다. InChl Key는 그래도 천차만별까지는 아닌데 그것도 일단 괴랄하긴 마찬가지. 

 

SMILES의 파생형

SMIRKS와 SMATRS라는 파생작이 있는데 일단 후자는 원자 결합에 대한 쿼리가 추가된 버전이다. 그래서 SMILES의 표기를 쓸 수 있다. 


SMIRKS는 화학 반응 서술 위주로 확장된 버전인데, 화학 반응이라는 게 유기화학책을 본 사람들은 아시겠지만 A-intermediate->B로 가면서 전자를 뭐 어디서 잃고 어디가 nucleophile이고 어디가 electrophile이고 이런게 다 나온다. 그리고 유기화학에는 4대 반응이라는 게 있는데 뭐가 추가되고(첨가), 뭐가 빠지고(제거), 뭐가 바뀌고(치환, SN1 SN2 있음), 분자 내에서 뭐가 바뀌는(전위) 반응 중 내가 서술하는 반응이 뭔 반응인지를 알아야 할 거 아녀. 

'Coding > 코딩잡담' 카테고리의 다른 글

컴파일러와 인터프리터  (0) 2022.10.21
SI 접두어와 컴퓨터 용량  (0) 2022.10.10
불 대수와 논리게이트  (0) 2022.09.26
chmod가 뭐지?  (0) 2022.09.23
스택과 큐  (0) 2022.09.19