레이블이 iTOL인 게시물을 표시합니다. 모든 게시물 표시
레이블이 iTOL인 게시물을 표시합니다. 모든 게시물 표시

2023년 11월 16일 목요일

[iTOL] Text label dataset을 이용한 자유로운 텍스트 장식

어제 쓴 글('iTOL 제어판에서 라벨 스타일을 일괄적으로 편집하기')에서는 내가 원하는 방식의 라벨 스타일 변경을 제대로 하지 못하였음을 밝혔다. 대신 text label dataset을 이용하면 가능할 수도 있겠다는 것으로 글을 마무리하였었다. iTOL을 익히던 초창기에는 dataset file이 이렇게 다양하지 않았던 것으로 기억한다. 

테스트를 해 보니 과연 이것이 가장 완벽한 해결책임을 알 수 있었다. 오늘의 글에서는 이를 좀더 자세히 다루어 보기로 한다. 단, heatmap 자료의 column label에 대해서는 자유자재로 스타일을 바꾸는 것이 과연 가능한지 아직 알 수 없다.

나는 보통 유전체 염기서열 정보를 이용하여 트리를 만든다. 따라서 Newick tree file을 만들 때에는 assembly accession을 leaf label로 사용한다. 


Assembly accession으로는 무슨 생명체인지 알 수가 없으니 tree 파일의 ID와 실제 표시하고 싶은 학명 또는 균주 정보로 바꾸어야 한다. 가장 직관적인 방법은 labels dataset 파일을 사용하는 것이다. 위에서 보인 트리 자료에 대하여 적용할 labels dataset 파일 일부를 소개해 본다.

GCF_014288055.1,GCF_014288055.1 Agathobaculum sp. M2
GCF_900625105.1,GCF_900625105.1 Agathobaculum sp. Marseille-P7918
GCF_014287995.1,GCF_014287995.1 Agathobaculum sp. NSJ-28

분리자(쉼표)를 경계로 ID와 표시할 텍스트를 나열하였다. Assembly accession으로 나타낸 leaf ID를 균주 정보로 완전히 대체하는 것이 아니라 assembly accession + 균주 번호를 전부 나타내고 싶었기에 이러한 형태가 되었다. 이 파일을 적용하면 다음과 같은 트리 그림이 나온다.


이 상태에서 label text의 속성(색깔, 이탤릭, 볼드)를 바꾸거나 배경색을 지정하는 것은 style dataset 파일을 이용하면 된다. 파일의 데이터 라인은 대충 다음과 같다.

GCF_000807675.2,label,node,#000000,1,bold,#FAEEC3
GCF_900155735.1,label,node,#000000,1,normal,#FAEEC3
GCA_003096535.1,label,node,#000000,1,normal,#FAEEC3

만들어진 그림을 보자. 표시된 텍스트는 ID라는 단일한 필드이다.


이것으로 충분히 아름답다. 하지만 학명을 이탤릭으로 표시하지 못하였다. 제어판의 label style creator를 사용하면 라벨 안에 다양한 스타일 속성을 부여할 수 있다. 그러나 라벨을 공백(분리자는 변경 가능) 기준으로 나눈 뒤 특정 필드에 대해서 속성을 바꾸는 식으로 작동하게 되므로 2, 3번째 필드를 이탤릭으로 바꿀 경우 'sp.'까지도 무차별로 변환된다. 더욱 세밀한 조정 방법이 필요하다.

iTOL 도움말을 공부하다가 우연히 알게 된 text label dataset 덕분에 이 골치아픈 상황을 벗어나게 되었다. 이 데이터셋은 labels dataset 파일의 기능까지 어느 정도는 포함한다. 단, 내가 만든 샘플 그림에서는 ID(assembly accession)이 항상 표시된다. 파일의 데이터 라인을 소개하면 다음과 같다. 텍스트의 색깔을 바꾸는 것도 당연히 가능하고, 볼드와 이탤릭을 한꺼번에 표시할 수 있어서 매우 유용하다. Label position(external or internal)을 정확히 이해하는 것이 중요하다. 다음의 데이터 라인에서 세 번째에 위치하는 숫자가 label position이다. -1, 즉 external로 설정해야 트리의 외부에 텍스트가 표시된다. 우리가 원하는 대부분의 상황에 해당한다.

GCF_025567315.1,<bi>Agathobaculum ammoniilyticum </bi><n>Sanger_34T</n>,-1,#000000,bold,1,0
GCF_015552745.1,<i>Agathobaculum butyriciproducens </i><n>1001099B_141217_D10</n>,-1,#000000,normal,1,0
GCF_027664705.1,<i>Agathobaculum butyriciproducens </i><n>AF94-03DA</n>,-1,#000000,normal,1,0
GCF_020687055.1,<i>Agathobaculum butyriciproducens </i><n>CLA-AA-H270</n>,-1,#000000,normal,1,0

결과를 살펴보자. 애초에 원했던 것이 고스란히 구현되었다. Leaf ID와 그 옆에 표시된 text는 분명히 별도의 필드라는 것이 한눈에 느껴진다.


다음은 iTOL 도움말에서 text label dataset의 활용을 극대화하여 나타낸 매우 화려한 사례이다. 여기에서 leaf ID가 보이지 않는 것은 Control panel > Basic > Display > Labels에서 'Hide'를 선택했기 때문이다. 만약 labels dataset만을 이용하였다면, 라벨을 보이지 않게 한 경우 leaf 옆에는 아무런 텍스트가 나타나지 않을 것이다.


제어판의 dataset editor에서 데이터를 하나씩 입력하거나 클립보드에서 복사해 넣어도 된다.


2023년 11월 17일 업데이트

iTOL에서 제공하는 text lable dataset template file(업데이트 작성 날짜 기준)에는 사소한 오류가 두 군데 존재한다. ALL_LABELS_ROTATION 변수는 정의되지 않은 것이라는 오류 메시지가 나오므로 주석 처리를 해야 한다. 그리고 파일 마지막 부분에 소개한 DATA example에서 Oryza sativa 라인이 잘못되었다. Leaf 3개짜리 가상의 트리를 만들어서 적용했을 때 Oryza sativa 텍스트가 표시되지 않아서 한참을 헤맸었다. 다음의 data example line을 보라.

DATA
#Examples

#node 9598 will have an external label 'Pan troglodytes' in bold red and twice the size of standard labels
#9598,Pan troglodytes,-1,#ff0000,bold,2,0

#node 9606 will have an external label with multiple mixed styles
#9606,<bi color='#006600'>Homo </bi><i>sapiens</i><sup size='0.5' color='#999999'>citation</sup>,-1,#000000,normal,1,0

#node 4530 will have an internal label 'Oryza sativa' in bold italic blue, starting directly over the node
#4530,Oryza sativa,0,#0000ff,bold-italic,1

데이터 라인은 ID, label, position, color, style, size_factor, rotation의 6개 필드로 구성되어야 하지만 Oryza sativa 라인에서는 맨 끝에 와야 하는 rotation이 빠진 상태이다. 여기에 ',0'을 추가해야 한다. 

데이터셋 템플릿 파일에 최종 수정일이나 버전 번호를 붙여서 관리를 하면 더욱 좋을 것 같다. 오류 보고 겸 나의 의견을 간단히 적어서 iTOL 측에 보냈다(iTOL about & contact). 이메일을 보낸 다음날, iTOL의 개발자인 Ivica Letunic을 통해서 곧 수정되었다는 답장을 받았다. 개인 웹사이트구글 스칼라를 보니 이 사람도 보통 수준의 연구자가 아니다! 2006년부터 2021년까지 출판된 iTOL 논문의 저자는 전부 Ivica Letunic과 Peer Bork 두 사람이다! Peer Bork는 EMBL Heidelberg의 소장 아닌가...

2023년 11월 15일 수요일

iTOL 제어판에서 라벨 스타일을 일괄적으로 편집하기

분류학은 규칙을 매우 엄격하게 따지는 학문이라서 이를 조금이라도 어기면 불평을 듣기 십상이다. 예를 들어 미생물을 이명법으로 명명할 때 이탤릭체(기울임꼴)를 준수해야 하는 것이 그 중의 하나다. 웹 환경에서 작성한 글을 꼼꼼하게 교정하지 않고 배포하는 일이 잦아지면서 이탤릭체, 볼드, 또는 첨자와 같은 스타일을 엄격하게 준수하지 않은 글을 많이 접하게 된다. 인터넷 상의 글이야 그렇다 치더라도 정식으로 배포된 출판물에서 이러한 오류를 발견하고 미간을 찌푸리는 미생물 분류학자가 매우 많을 것이다.

2015년 4월부터 온라인으로 전환된 Bergey's Manual of Systematics of Archaea and Bacteria(BMSAB)에 새로운 속(genus)에 관한 챕터를 하나 투고한 일이 있다. 나는 공저자 중의 하나로서 2018년 하반기부터 이에 관한 유전체 분석을 시작하여 2019년 상반기에 투고를 했었는데, 에디터가 정년퇴임을 하면서 공중에 뜬 상태가 되었다가 올 초에 출판사로부터 다시 연락이 와서 그 사이에 새로 공개된 유전체를 포함하여 전면적인 분석을 다시 하고 최종본을 완성하여 리비전 형태로 보냈었다.

세 명의 저자 중 나와 교신저자가 전부 외부 기관에 나와 있기에 이메일 교신이 원활하지 않은 상태라서 galley proof 처리 시한을 놓치고 말았다. 일반적인 저널은 48시간 내에 교정쇄에 수정을 하여 보내라고 하는데 이 저널의 경우 무려 14일의 기한을 준다. 이를 '저널'로 간주해도 옳은지는 잘 모르겠다. 웹사이트에서는 reference work라고 표현하였다. 처음에는 에디터의 사정으로 애를 먹였으니 게재 승인 후 교정 작업에서는 저자 집단이 애를 먹여도 좀 참아주어야 하지 않겠는가... 그렇다 하더라도 이미 DOI 번호(아직 미공개)도 나온 상태이니 올해 안에 출판이 되도록 최대한 작업에 박차를 가해야 되겠다.

프로덕션 에디터의 질의 중에는 내가 iTOL에서 만들었던 annotated tree 그림을 고해상도의 것으로 다시 보내달라는 사항이 있었다. 확대를 해도 글꼴이 뭉개지지 않는 PDF 파일이 있으니 그것을 보내면 된다. 

그런데...

Q11. Generally, the binomials are emphasised in italic. Please check and amend accordingly in Figure 2.

아이고, 57개나 되는 라벨을 미처 이탤릭체로 전환하지 않았더니 이런 요구를 하는구나! iTOL의 유료 구독이 끝난 뒤에 이 논문을 위한 트리 생성 작업을 진행했기에 변경 사항을 저장해 두지 못한다. 오직 tree 자료만 iTOL 계정에 남아 있을 뿐, 나머지 annotation file은 매번 드래그하여 넣어서 최종 트리를 만든 후 export를 해야 된다. 라벨을 개별적으로 더블클릭하여 이탤릭체로 만든다 하더라도, iTOL에 저장이 되지 않는다. 그러니 마지막 수정이라 생각하고 iTOL에서 작업을 완벽하게 해야만 한다.

이렇게 일을 할 수는 없는 노릇이다. 구독료를 납부하지 않고 좀 더 간편하게 라벨의 전체 수정을 할 방법이 없는지 도움말을 찾아 보았다. 'Defining multiple font styles within labels' 섹션에 그 방법이 설명되어 있었다. 라벨은 몇 개의 파트로 이루어지므로, 원하는 위치의 파트에 볼드, 이탤릭, 위 첨자, 아래 첨자를 각각 적용할 수 있다. 이 작업은 iTOL Control panel > Advanced > Other functions > Lable functions > Multi-style에서 하면 된다. 라벨 파트는 기본적으로 3개만 있는 것으로 되어 있다. 따라서 내 자료와 같이 (1)assembly accession (2)genus (3)species-epithet (4)strain의 네 파트 혹은 그 이상(스트레인 명이 여러 단어인 경우도 있으므로 파트 수는 더 늘어날 수 있음)으로 라벨이 이루어진 경우 오류가 있는 것으로 인식하므로, Lable style creator에서 'Add a lable part'를 클릭하여 최대의 파트 수를 갖는 라벨의 수에 맞추어야 한다.

iTOL 제어판(advanced 탭)에서 Label style creator를 사용하는 모습. 2, 3번째 필드를 일괄적으로 이탤릭체로 만들었더니 종이 확정되지 않은 것은 Genus_name sp.의 형태가 되고 말았다. 'sp.'는 다시 정상 형태로 되돌려야 한다. Label style creator에서 이렇게까지 세밀하게 조정하는 것이 가능한지는 잘 모르겠다. Options에서 'Exclude labels: sp.'라고 하면 될까? 그렇지 않다. 'sp.'가 포함된 모든 라벨에 대해서 스타일 적용을 하지 않는 방식으로 작동한다.

iTOL에 저장된 트리 자료에 라벨 정보 파일을 올려서 이와 같이 스타일에 손을 대고 - 제어판에서 건드린 모든 것은 따로 기록을 해 두는 것이 현명할 것이다 - 나머지 annotation file을 입히는 일에는 몇 분이 걸리지 않는다. 역시 찾으면 방법은 나온다! 하지만 해결이 불가능 한 것이 있다. Tree에 곁들인 heatmap에는 leaf(raw) label과 동일한 정보를 column label로 만들어 넣었는데, 이것에도 스타일을 적용하기는 매우 곤란하다.

그러나 문제점을 발견 하였다. 표준 균주의 라벨은 style annotation file을 통해서 볼드체로 만들어 놓았는데, 나중에 이탤릭화를 하면서 다시 얇은 글씨로 되돌아갔다는 점. 하이고... Inkscape에서 일일이 고쳐 보았으나 볼드와 이탤릭 속성을 동시에 줄 수가 없다. 워드나 파워포인트가 아니니 참고 살아야 하는 것 같다.

종합하자면 branch와 leaf label에 대한 색상과 스타일을 결정하는 annotation file(iTOL 도움말샘플)과 제어판을 통해서 조절하는 label style creater의 미묘한 권력 관계에 문제가 있는 것 같다. iTOL에서 표현하는 색상과 스타일을 설정하는 방법이 점차 세분화되는 것도 사용자를 어렵게 한다. 이에 대해서는 나중에 별도로 다루어 보고자 한다. 그리고 텍스트의 속성 중 볼드와 이탤릭은 공존할 수 있는 것인지에 대한 근본적인 질문도 아직 남아 있다. 예를 들자면 위 첨자와 아래 첨자는 공존할 수 없음이 당연하다. 첨자를 이탤릭체로 만들려는 노력은 아무도 하지 않을 것이다. 하지만 이탤릭과 볼드는? 이를 동시에 가질 수 있는 속성으로 만들어 주는 편집기가 있고, 그렇지 않은 것도 있다. 

2023년 11월 16일 업데이트 - text label dataset의 활용

Text label dataset(iTOL 도움말, template)을 사용하면 각 node ID에 텍스트를 연결하여 tree에 표시하되 html tag를 사용하여 매우 다양한 스타일을 적용할 수 있다고 한다. 전통적으로 사용하던 labels annotation file(iTOL 도움말, template)에서는 아무런 스타일이 없는 단순한 텍스트만 표시하게 해 주었다. Text label dataset에서는 <bi>...</bi> 태그를 써서 볼드와 이텔릭을 동시에 나타내는 것이 가능하다. 데이터 파일을 만들기는 상당히 귀찮지만 이것을 잘 이용하면 leaf label을 자유자재로 변형할 수 있을 것으로 기대한다.


2018년 2월 23일 금요일

감동의 iTOL(Interactive Tree Of Life)

iTOL(http://itol.embl.de/)은 계통수를 시각화, 주석화 및 관리하는 도구이다. 웹 인터페이스로 구성되어 있어서 누구나 tree file을 올린 다음 다채로운 annotation을 할 수 있다. 계통수 곁에 배열할 데이터가 많거나 복잡하다면 데이터셋 파일을 올리면 된다. 탐색기에 있는 텍스트 파일을 마우스로 웹브라우저에 끌어다 넣으면 그만이다. 다중서열정렬부터 phylogenetic inference를 거쳐서 최종적으로 트리 작성까지를 GUI 환경에서 손쉽게 마칠 수 있는 도구로는 MEGA가 대표적이다. 하지만 내가 알기로는 트리 옆에 heatmap을 배열하는 등의 복잡한 시각화는 하기가 어렵다.

극지연구소에 근무하는 K모 박사의 말에 의하면 전문가들은 MEGA를 좋아하지 않는다고 했다. Phylogenetic analysis에 대한 깊은 지식 없이 의미도 모르는 트리를 무작정 그리게 만든다는 비평을 했던 것 같다. 다르게 표현한다면 이 분야에 대한 공부를 하려는 동기를 갖지 못하게 하는 간편한 도구라고나 할까? 그게 옳다고 해도 사전 지식이 너무나 부족한 초보자에게는 일단 어떻게 해서든 계통수를 자기 손으로 만들어 낼 수 있게 한다는 측면에서 충분히 의미가 있는 소프트웨어라고 생각한다.

난 아주 가끔 MEGA를 사용하지만 사용 빈도가 높지 않아서 그런지 사용자 인터페이스가 좀처럼 익숙하게 다가오지 않는다. 세션의 개념도 아직까지 잘 잡히지 않는다. 오히려 서열정렬은 별도로 실행한 뒤 FastTree나 요즘 익히기 시작한 RAxML에서 tree file을 만든 뒤 다른 도구에서 tree visualization을 하는 것이 더욱 편하다. 이렇게 하면서 Newick format 파일에 좀 더 익숙해졌고, 완전한 tree맹(盲)을 벗어나는데 오히려 도움이 된 것 같다.

트리를 그림으로 표현하는 도구로는 FigTree를 주로 사용하였고, Archaeopterix(실행파일은 forester.jar)를 좀 알아보려다가 이제는 iTOL로 완전히 정착하는 과정에 있다. 내가 iTOL을 본격적으로 쓰게 된 것은 다음의 글 때문이다. 능력이 된다면 python이나 R code를 직접 짜서 그려도 되겠지만 iTOL은 별로 어렵지 않게 publication quality의 그림을 만들게 해 준다.

Displaying data associated with phylogenetic trees [멜버른 대학의 Kat Holt가 2012년 작성]

계정을 생성하면 데이터를 보관하고 다른 사용자와 공유할 수도 있다. 그러나 계정을 만들지 않아도 트리를 그리는 데에는 문제가 없다. 단지 서버측에 저장이 되지 않을 뿐이다. 최근에 그린 그림(최종본이 아님)을 살짝 엿보자. 왼쪽의 그림은 Roray가 만든 core genome alignment를 FastTree에 투입하여 얻은 것이고, 오른쪽의 heatmap(정확히는 2 개)는 average nucleotide identity(pyani)와 LS-BSR의 결과물을 R로 처리한 것이다. 아래에서 보인 그림은 root의 위치를 다시 잡아야 하는데, 너무나 당연하지만 reroot를 하면 오른쪽에 보인 데이터도 이에 맞추어서 바뀐다. Tree annotation에 쓰이는 보조 자료를 dataset이라고 한다. 이 그림에서는 ANI와 LS-BSR에서 생성한 heatmap 자료가 두 건의 dataset에 해당한다. Dataset에는 binary, simple or multi-value bar chart, pie chart, text label, colored strip, colored gradient, connection, heatmap, boxplot, protein domain 등 다양한 유형이 있으며, help page에서 제공하는 템플릿 파일을 적용하여 만들면 된다.

웹사이트에는 동영상을 곁들인 사용 설명서가 있어서 익숙해지는데 큰 어려움은 없다. 한가지 힌트를 준다면 Node ID와 label을 별도로 관리하는 것이 좋다. Tree file에 수록된 node ID에 밑줄이 있다면 이는 공백으로 표현되는데, 이렇게 되면 추가할 데이터셋과 연결하기가 나쁘다. 따라서 tree 작성까지는 각자 심플한 문자열을 써서 node ID를 삼되, 나중에 실제로 표현할 label을 다음과 같이 텍스트 파일로 수록해 둔 마우스로 끌어다 놓으면 된다. 다음의 사례에서는 NCBI taxonomy ID를 node ID롤 사용하였다.
167,Escherichia coli
1423,Bacillus subtilis
...
특정 범위(아마도 clade라고 적는 것이 더 적합할 것이다)에 속하는 모든 node에 색을 입히려면 colored range라는 개념을 이해하는 것이 중요하다. 두 node를 같은 range에 포함시키면 아마도 last common ancestor에 속하는 것을 같은 색으로 입히는 것 같은데 아직 확인해 보지는 않았다. 개별 노드 단위로 색을 입히려면 colored strip 유형을 쓰면 된다.