2019년 8월 31일 토요일

요즘의 손목시계 크기란...


가장 최근에 산 시계 위에 갖고 있는 것 중에서 가장 오래된 결혼 예물 시계를 얹어 보았다. 과거에 비하면 너무 크다. 아마 직경이 1 cm 정도는 늘어난 것 같다. 손목이 두껍지 않은 남자에게는 과하게 크다는 느낌이 들 때가 많다.

나는 시계 디자인 요소 중에서 시인성을 가장 중요하게 생각한다. 노안이 무척 심하게 왔기 때문이다. 큰 사이즈의 디자인은 분명 도움이 된다. 그러나 시계 케이스의 지름 자체보다는 바늘과 인덱스의 크기·디자인, 다이얼과 바늘의 색깔 대조 등이 시인성에 더욱 중요하다. 그래서 안경을 쓰지 않고는 제대로 보이지 않는 날짜 및 요일 창이나 크로노그래프용 작은 다이얼을 별로 좋아하지 않는다.

시인성 측면에서는 다이버 시계만 한 것이 없다. 일반적인 다이버 시계는 그대신 무겁고 크다는 것이 문제다.

2019년 8월 30일 금요일

QIIME 1을 공부하면서 느낀 점

QIIME 2가 2018년에 공개되면서 QIIME 1에 대한 공식 지원은 중단되었다. 16S rRNA 염기서열에 의한 미생물 군집 분석을 처음 공부하는 입장이라면 당연히 QIIME 2를 가지고 시작하는 것이 바람직할 것이다. 그러나 QIIME 1에 관해서는 워낙 많은 공부자료가 인터넷에 널려있고, SRA에서 raw data를 받아서 실제로 따라서 해 보니 의외로 16S rRNA 염기서열에 기반한 microbial(요즘 유행되는 용어로는 microbiome) taxonomic profiling의 분석 과정에 대해서 많은 것을 알게 되었다. 뒤에서도 언급하겠지만 QIIME 2는 편의성과 일관된 인터페이스(물론 명령행 기반이지만) 안에 기본 원리가 살짝 숨겨져 있다는 느낌이 든다. 또한 부속 스크립트(전체 목록)가 매우 풍부하여 다른 용도로도 사용하기에도 좋다. conda environment가 아니라 CentOS 7에 원래 깔려있는 파이썬 환경에 설치하기를 잘했다고 느끼고 있다. QIIME 1을 사용할 때에는 FastTree와 USEARCH를 최신 버전이 아닌 것으로 잠시 되돌리는 트릭을 써야 하는 불편함이 있지만 말이다.

며칠 동안 QIIME 1을 다루면서 어렵다고 느낀 점은 다음의 두 가지였다. QIIME 2에서는 전부 편리하게 개선이 되었을지도 모르겠다.
  1. 입력 파일에 대한 철저한 이해가 필요하다.
  2. OTU picking과 chimera 제거의 과정에서 선택의 폭이 넓다. 특히 chimera 제거를 언제 하는 것이 좋은지에 대해서는 좀 더 고민이 필요하다.
지금까지 나의 시퀀싱 경험은 전적으로 미생물 단일 유전체에 대한 것이다. 커다란 유리판에 손으로 부어서 만드는 시퀀싱용 polyacylamide gel에서부터 ABI 3700을 거쳐 Roche/454 Illumina, Ion Torrent, PacBio, 그리고 약간의 MinION까지... 1991년부터 시퀀싱을 해 왔지만 많아봐야 일루미나 장비 기준으로 하나의 레인에서 생성된 최대 12개 정도 샘플에 대한 paired read - 이미 demultiplexing이 되어 샘플 수 x 2에 해당하는 - fastq 파일을 가지고 분석을 시작하는 것이 전부였다. 전형적인 파일 이름의 형태는 L2S357_15_L001_R1_001.fastq.gz와 같다. QIIME 2에서 쓰는 용어로 말하자면 Casava 1.8 paired-end demultiplexed fastq에 해당한다(QIIME 2 documentation - Importing data 링크). 동시에 처리했던 데이터 중 최대 규모였던 것은 150개 정도의 박테리아 균주 유전체에 대한 일루미나 결과였다. 인간 유전체를 다루는 사람에게는 명함도 내밀지 못할 수준이 아닌가.

QIIME '2'의 튜토리얼을 따라가며 공부를 하다가 제일 먼저 놀랐던 것은 바코드를 읽은 fastq 파일이 따로 존재한다는 것이었다. 그러면 SRA에 raw data를 제출할 때에는 어떻게 하지? 실제로 천랩에서 sequencing only service를 요청하면 어떤 결과를 제공할까? 다음주에 곽 박사에게 물어봐야 되겠다. QIIME 1 공식 문서의 Preparing raw Illumina data in different formats for use with QIIME에도 포맷에 따른 일루미나 파일 처리에 대한 유용한 정보가 많다. Single-end read와 barcode read로 구성된 한 쌍의 파일은 EMP(Earth Microbiome Project) protocol의 multiplexed single-end fastq라 부른다. 이것을 처리하는 QIIME 1 script는 split_libraries_fastq.py이다. Paired-end fastq는 join_paired_ends.py로 처리한다. 341F와 805R 프라이머로 16S rRNA의 V3-V4 region을 증폭한 산물의 크기는 중간값이 421 bp이다(링크). Amplicon을 만들어서 MiSeq으로 2 x 250 cycle pair end sequencing을 하면 중간을 연결하기에 매우 적당하다. Join이 얼마나 성공적이었는지 확인하고, 부속되는 바코드 read 파일을 업데이트하는 일이 필요하다. Input read 전부가 성공적으로 연결되지는 않으므로, 후속 분석 작업을 하려면 원본 바코드 read로부터 join된 read의 것만을 남겨야 하기 때문이다. 바코드 입력 데이터 파일 처리 방법은 QIIME 2가 좀 더 일관적이며 합리적인 것으로 느껴진다. QIIME 1에서는 다음과 같이 파일 타입(일루미나)에 따라 다른 방법을 취해야 한다. 
  1. EMP multiplexed SE fastq: split_libraries_fastq.py(quality filtering 가능: -q 19)
  2. EMP multiplexed PE fastq: join_paired_ends.py + split_libraries_fastq.py
  3. Casava 1.8 PE demultiplexed fasqt: join_paired_ends.py + add_qiime_labels.py 이것은 이해하기가 조금 까다롭다. Edamame course의 교육 자료를 보면 도움이 될 것이다. EDAMAME(Exploration in Data Analysis for Metagenomic Advances in Microbial Ecology)에서 개최하는 교육 코스이다.
2018년 Science에 실린 Gopalakrishnan 등의 논문 'Gut microbiome modulates response to anti–PD-1 immunotherapy in melanoma patients'에서 ENA에 등록한 FMT 실험 마우스의 16S sequencing data(study accession PRJEB22895)를 다운로드하여 보았다.


서열 ID(Wargo.R2d7_45029)를 보면 이미 demultiplexing이 된 상태임을 알 수 있다. 아마도 split_libraries_fastq.py를 --store_qual_scores 인수와 함께 실행하여 FASTA 및 .qual 파일을 함께 만든 다음, convert_fastaqual_fastq.py을 실행하여 fastq로 전환한 것 같다. 외견상으로는 single end fastq이지만, 논문에서는 paired end sequencing 결과를 join하였다고 밝히고 있다. 시퀀싱 결과물을 제출하기 편리하게 만들기 위해 전환을 한 것임에 틀림없다. 저러한 형태의 파일은 절대로 일루미나 장비에서 생산된 직후의 모습이 아니다. Wargo는 이 논문의 교신저자 이름이니 말이다.

Chimera 제거는 반드시 필요하다고 생각한다. 천랩의 자료에 의하면 16S rRNA의 454 sequencing 데이터에서 약 15-20%가 chimera였다는 논문을 인용하였다. 그러나 Illumina Overview Tutorial에서는 이 과정이 생략되어 있다는 것이 의외였다. Chimera 제거는 OTU picking 전에 모든 read(seqs.fna)에 대해서 할 수도 있고, 그 후에 할 수도 있다. 공식적으로는 identify_chimeric_seqs.py를 이용하여 제거하지만(ChimericSlayer 또는 USEARCH 6.1 사용; 설명 링크) QC 과정의 일종인 usearch quality filter(pick_otus.py -m usearch로 작동; 설명 링크)를 사용할 수도 있다. Reference sequence가 필요한 방법도 있고 de novo로 검출하는 방법도 있다. OTU picking을 마친 뒤 각 클러스터에서 뽑은 대표 서열을 가지고 chimera를 검출한 경우 phylogenetic tree와 alignment 등에서 이를 제거해야 한다. 개인적인 견해로는 UCHIME을 사용하는 usearch quality filter로 모든 read를 먼저 처리한 다음 이것을 가지고 OTU picking, 대표서열 추출, taxonomic assignment 및 tree building을 순차적으로 실행하는 것이 바람직한 것 같다. pick_open_reference_otus.py를 실행하면 단 하나의 스크립트로 이 모든 것을 다 진행할 수 있다.

OTU picking의 여러 방법, biom 파일의 구조 등 공부할 것이 너무나 많지만 워낙 양이 많아서 여기에서 다 기술하기는 어렵다. QIIME 2에서는 개념이 너무나 많이 바뀌었다. QIIME 1에서는 454 데이터에 대해서만 쓰이는 denoise라는 용어가 QIIME 2로 와서는 아주 일반적으로 쓰이는 것도 같고, OTU cluster는 feature라는 말로 바뀐 것 같으며, 모든 데이터가 .qza라는 'artifact' 파일로 다루어진다는 것이 외견상 깔끔해 보이기는 해도 마치 두꺼운 포장재로 둘러싸인 상자 속 물건을 다루는 것 같아서 아직은 좀 어색하다.

Denoising이란 오류를 교정하는 일이라고 한다. 그런데 genome assembly를 위한 일루미나 데이터의 전처리에서는 error correction이라고는 불러도 denoising이란 말은 잘 쓰지 않는다. 근본적으로 동인할 일을 서로 다른 분야에서 약간 다르게 부르는 것인지, 혹은 16S rRNA amplicon에서 오류 정정을 하는 방법이 독특하기 때문에 별도의 용어로 칭하는 것인지는 잘 모르겠다. 가령 SPAdes assembler의 error correction 모듈을 16S amplicon data에 적용해도 될까?

Alpha 및 beta diversity에 대한 간단한 설명은 metagenomics wiki에 수록되어 있다. OTU table을 만든 다음에 해야 할 일에 해당한다.

일주일 정도 더 QIIME 1을 주물러 봐야 일정 수준의 이해도에 오를 것 같다. 그 다음에는 설치만 해 놓고 방치했던 QIIME 2를 다시 시작해 봐야 한다.

QIIME 2의 특징(논문에서 인용)

  • Interactive spatial and temporal analysis and visualization tools
  • Support for metabolomics and shotgun metagenomics analysis
  • Automated data provenance tracking to ensure reproducible, transparent microbiome data science

참고 자료


2019년 8월 28일 수요일

QIIME 1 어렵게 설치하기

이미 대세는 QIIME 2(공식 웹사이트)라고 생각되는데 왜 이제와서 QIIME 1인가? 사실 내가 쓰는 서버에도 qiime2가 conda environment(v2019.1) 및 docker image(v2018.11)로 설치된 상태라서 이런 수고를 할 필요는 없었다. 그러나 요즘 읽고 있는 논문 "Microbiota and cancer immunotherapy: in search of microbial signals"(Gut 2019 Vol 68 No 3)에 큰 흥미를 느껴서 여기에서 수행한 분석 방법을 따라서 연습을 해 보기로 마음을 먹었다. 최근 면역체크포인트 억제제(PD-1 억제제)를 사용한 항암 치료가 개인에 따라서 다른 치료 성적을 보이며(R: responding vs NR: non-responding), 그것은 microbiome과 연관이 있다는 논문이 발표되어 큰 주목을 끌었다. 다음은 사례로 든 논문 세 가지. 전부 2018년 Science에 연달아서 발표된 논문이다. 나는 이 중에서 Gopalakrishnan et al이 쓴 논문의 16S sequencing raw data를 가지고 연습을 할 생각이다.

[12] Routy B, Le Chatelier E, Derosa L, et al. Gut microbiome influences efficacy of PD-1-based immunotherapy against epithelial tumors. Science 2018;359:91–7.
[13]  Gopalakrishnan V, Spencer CN, Nezi L, et al. Gut microbiome modulates response to anti-PD-1 immunotherapy in melanoma patients. Science 2018;359:97–103.
[14]  Matson V, Fessler J, Bao R, et al. The commensal microbiome is associated with anti-PD-1 efficacy in metastatic melanoma patients. Science 2018;359:104–8.


2019년도 Gut 논문에서는 이상의 세 가지의 연구 사례에서 공통적인 'microbial signal'이 없다는 점에 착안하여 같은 분석 파이프라인을 적용하여 어떤 결과가 나오는지를 살펴보기로 한 것이다. 16S 데이터는 QIIME 1.9.1을, shotgun metagenome data는 MetaPhlAn2를, R과 NR 집단에 연관된 바이오마커 동정에는 LEfSe를 사용하였다. 결론에서는 taxonomic profiling으로는 두 집단을 가르는 '미생물 시그날'을 찾아내긴 어려우며, function의 차이를 유의해서 보아야 될 것이라 하였다. 그러려면 shotgun 방색의 metagenomics가 앞으로는 더욱 중요하다는 뜻이 된다. 예전에는 assembly 기반의 shotgun metagnomic에 관심이 많았었지만 용도에 따라서는 그럴 필요가 없다고 느껴진다.

QIIME Installation Guide에 따르면 Miniconda에서 환경을 만들라고 하였다. 파이썬은 2.7을 쓰라고 하였다. 나는 Anaconda를 설치해 두었으니 여기에서 시작하면 되겠다고 생각을 했다. 그런데...

(base) $ conda create -n qiime1 python=2.7 qiime matplotlib=1.4.3 mock nose -c bioconda
...
PackagesNotFoundError: The following packages are not available from current channels:

  - matplotlib=1.4.3

matplotlib의 버전(1.4.3)이 너무 옛날 것인가? 채널에 해당되는 버전이 없다는 에러 메시지가 나왔다. 그래서 matplotlib 뒤에 지정된 버전을 지우기도 하고, 파이썬만 있는 qiime1 conda environment만 먼저 만들어서 여기에 진입하여 qiime1을 설치하는 등 여러 시도를 했지만 'Package XYZ conflicts for:'에러가 수십개나 발생하는 것이다. 이래서는 도저히 안되겠다 싶어서 alternative installation methods document를 확인하였다. 시스템에 원래 설치된 python 2.7에서 관리자 권한으로 pip를 사용하여 최소 설치를 하면 될 것이라 생각을 하였다.

회사 환경은 SSL 인증서 문제로 프로그램 설치가 참 까다롭다. conda, git, pip... 뭐 하나 쉬운 것이 없다. pip를 쓰려면 명령행에 누더기처럼 --trusted-host pypi.org --trusted-host files.pythonhosted.org를 덧붙여야 한다.

문서를 보면 먼저 numpy를 설치하란다. 이는 이미 설치가 되어 있는 상태이다. 그러면 본격적으로 QIIME 1.9.1을 깔아보자!

# pip install qiime==1.9.1 --trusted-host pypi.org --trusted-host files.pythonhosted.org
...
ERROR: ipython 5.8.0 has requirement setuptools>=18.5, but you'll have setuptools 0.9.8 which is incompatible.
ERROR: ipapython 4.6.4 has requirement dnspython>=1.15, but you'll have dnspython 1.12.0 which is incompatible.
ERROR: ipapython 4.6.4 has requirement python-ldap>=3.0.0b1, but you'll have python-ldap 2.4.15 which is incompatible.

이건 또 뭔가? setuptools, dnspython, 그리고 python-ldap만 수동으로 설치하면 되려나? pip install로 하나씩 설치를 해 나가는데 또 이런 에러 메시지가 나왔다.

ERROR: Cannot uninstall 'XYZ'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.

구글을 뒤져보니 이 에러는 distutils가 설치한 프로그램이라서 정확히 어떤 파일이 제거되어야 하는지 알 수 없다라는 의미라고 한다(distutils는 uninstaller 를 가지고 있지 않아서 distutils로 설치하면 지우기가 어렵다고 함). 이런 경우에는 --ignore-installed 옵션을 쓰라고 한다. 즉 다음과 같이 하여 별로 필요하지 않은 requirement를 일일이 점검하지 않고 다시 QIIME을 설치하게 만들었다.

# pip install --ignore-installed qiime==1.9.1 --trusted-host pypi.org --trusted-host files.pythonhosted.org

설치가 끝났으면 테스트 스크립트를 실행한다.

# print_qiime_config.py -t
...
ImportError: No module named Tkinter

이것은 또 뭔가? Tkinter라는 Tcl/Tk 파이썬 인터페이스 패키지가 없다는 에러이다. 전에도 본 일이 있다. yum으로 tkinter를 설치하면 된다. 우분투용 패키지 이름은 python-tk, python3는 python3-tk라고 한다. 내 환경은 CentOS 7이다.

자, 그러면 다 되었겠지?

# print_qiime_config.py -t
AssertionError: Unsupported FastTree version. 2.1.3 is required, but running 2.1.10.

아이고, 별게 다 속을 썩인다. FastTree-2.1.3 소스 코드를 가져다가 컴파일하였다.

# mkdir /usr/local/apps/FastTree-2.1.3
# cd /usr/local/apps/FastTree-2.1.3
# wget http://www.microbesonline.org/fasttree/FastTree-2.1.3.c
# gcc -O3 -finline-functions -funroll-loops -Wall -o FastTree FastTree.c -lm
# ln -s FastTree fasttree

방금 빌드한 fasttree 바이너리가 가장 먼저 인식되도록 PATH 변수를 수정한 다음 다시 print_qiime_config.py -t를 실행하였다. 드디어 에러가 하나도 발생하지 않았다. 얼마나 반가운 OK 사인인가!

# PATH=/usr/local/apps/FastTree-2.1.3:$PATH
# print_qiime_config.py -t


System information
==================
         Platform: linux2
   Python version: 2.7.5 (default, Jun 20 2019, 20:27:34)  [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]
Python executable: /usr/bin/python

QIIME default reference information
===================================
For details on what files are used as QIIME's default references, see here:
 https://github.com/biocore/qiime-default-reference/releases/tag/0.1.3

Dependency versions
===================
          QIIME library version: 1.9.1
           QIIME script version: 1.9.1
qiime-default-reference version: 0.1.3
                  NumPy version: 1.16.5
                  SciPy version: 1.2.2
                 pandas version: 0.24.2
             matplotlib version: 2.2.4
            biom-format version: 2.1.7
                   h5py version: Not installed.
                   qcli version: 0.1.1
                   pyqi version: 0.3.2
             scikit-bio version: 0.2.3
                 PyNAST version: 1.2.2
                Emperor version: 0.9.61
                burrito version: 0.9.1
       burrito-fillings version: 0.1.1
              sortmerna version: SortMeRNA version 2.0, 29/11/2014
              sumaclust version: SUMACLUST Version 1.0.00
                  swarm version: Swarm 1.2.19 [Aug 28 2019 11:29:13]
                          gdata: Installed.

QIIME config values
===================
For definitions of these settings and to learn how to configure QIIME, see here:
 http://qiime.org/install/qiime_config.html
 http://qiime.org/tutorials/parallel_qiime.html

                     blastmat_dir: None
      pick_otus_reference_seqs_fp: /usr/lib/python2.7/site-packages/qiime_default_reference/gg_13_8_otus/rep_set/97_otus.fasta
                         sc_queue: all.q
      topiaryexplorer_project_dir: None
     pynast_template_alignment_fp: /usr/lib/python2.7/site-packages/qiime_default_reference/gg_13_8_otus/rep_set_aligned/85_otus.pynast.fasta
                  cluster_jobs_fp: start_parallel_jobs.py
pynast_template_alignment_blastdb: None
assign_taxonomy_reference_seqs_fp: /usr/lib/python2.7/site-packages/qiime_default_reference/gg_13_8_otus/rep_set/97_otus.fasta
                     torque_queue: friendlyq
                    jobs_to_start: 1
                       slurm_time: None
            denoiser_min_per_core: 50
assign_taxonomy_id_to_taxonomy_fp: /usr/lib/python2.7/site-packages/qiime_default_reference/gg_13_8_otus/taxonomy/97_otu_taxonomy.txt
                         temp_dir: /tmp/
                     slurm_memory: None
                      slurm_queue: None
                      blastall_fp: blastall
                 seconds_to_sleep: 1

QIIME base install test results
===============================
.........
----------------------------------------------------------------------
Ran 9 tests in 0.026s

OK

다음으로는 도커 이미지도 다운로드해 두었다.

# docker pull quay.io/biocontainers/qiime:1.9.1--np112py27_1

pip를 이용하여 개별적으로 설치하느라 괜히 고생을 한 것은 아닌지 모르겠다.

2021년 5월 13일 업데이트

지금은 conda를 이용하여 쉽게 설치할 수 있으니 이런 고생을 할 필요가 없다. 2021년 5월에 QIIME 1.9.1이 웬 말이냐고 하겠지만, 아직 쓸모가 있는 것 같다.

2019년 8월 26일 월요일

고등학생이 제1저자로 쓴 논문 논란에 대하여 생각해 보다

조국 법무부장관 후보자의 딸이 고등학생 시절 어느 의대에서 잠시 인턴으로 일을 하고 제1저자로 낸 논문(eNOS gene polymorphisms in perinatal hypoxic-ischemic encephalopathy 링크 doi: https://doi.org/10.4132/KoreanJPathol.2009.43.4.306)에 대한 논란이 연일 뜨겁게 펼쳐지고 있다. 장관 후보자 인사청문회에서는 후보자 개인의 자질과 정책에 대한 검증이 이루어지는 것이 우선시되어야 함은 당연하다. 현재 논란이 되는 모든 일은 일단은 조국 개인과는 관계가 없는 일이라고 볼 수도 있다. 비록 당시에는 법의 테두리 안에서 이루어진 일이라 해도, 수험생 자녀를 둔 일반인의 정서에는 맞지 않는데다가 많은 국민이 문제를 제기하고 있으니 그냥 넘어가기는 어렵다. 더군다나 부모로서 이 사태에 대하여 어느 정도의 책임이 있음은 당연하다. 만약 이 일에 조국은 일절 관여하지 않고 그 순전히 아내가 기획한 일이라면? 일단은 직접적인 책임은 없다고 본다. 하지만 그 기획 과정에서 조국과 그 아내(역시 교수)의 사회적 지위가 절대적으로 작용했음은 부인하기 어렵다.

학술지에 출간되는 논문에 대해서 정확하지 않은 정보가 너무 범람하는 것 같아서 내가 아는 한도 안에서 이를 정리해 보고자 한다.

논문이란 연구자가 자신의 업적을 인정받는 유일하고도 객관적인 결과물이다. 물론 특허라는 제도도 있지만 학계에 있는 사람에게는 좋은 논문을 내서 자주 인용되는 것만큼 영광스러운 일이 없다. 황우석 사태 이후 연구진실성에 대한 인식이 크게 높아진 것은 대단히 바람직한 일이다. 그런데 연구진실성·연구윤리에는 실험 데이터를 위·변조하지 않는 일만 포함되는 것이 아니다. 이를 논문으로 출판할 경우 저자를 부당하게 표시하지 않는 것도 포함된다. (구)교육과학기술부가 『연구윤리확보를 위한 지침』에서 제시한 연구부정행위의 범위를 알아보자.
연구부정행위(이하 "부정행위"라 함은 연구의 제안, 연구의 수행, 연구 결과의 보고 및 발표 등에서 행하여진 위조·변조·부당한 논문저자 표시 행위 등을 말하며 다음 각 호와 같다.
  • "위조"라 함은 자료나 연구결과를 허위로 만들고 이를 기록하거나 보고하는 행위를 말한다.
  • "변조"라 함은 연구와 관련된 재료·장비·과정 등을 조작하거나 데이터 또는 연구결과를 변경하거나 누락시켜 연구기록이 진실에 부합되지 않도록 하는 행위를 말한다.
  • "표절"이라 함은 타인의 아이디어, 연구내용·결과 등을 정당한 승이 또는 인용 없이 도용하는 행위를 말한다. 
  • "부당한 논문저자 표시"라 함은 연구내용 또는 결과에 대하여 과학적·기술적 공헌 또는 기여를 한 사람에게 정당한 저자 자격을 부여하지 않거나, 과학적·기술적 공헌 또는 기여를 하지 않은 자에게 감사의 표시 또는 예우 등을 이유로 논문 저자 자격을 부여하는 행위를 말한다. 
  • 본인 또는 타인의 부정행위 혐의에 대한 조사를 고의로 방해하거나 제보자에게 위해를 가하는 행위
  • 기타 학계에서 통상적으로 용인되는 범위를 심각(현저)하게 벗어난 행위
  • 타인에게 상기의 부정행위를 행할 것을 제안 강요하거나 협박하는 행위 
이상의 기준에서 판단하자면 이번 문제는 조 모 씨가 과연 정당한 제1저자가 맞는지에 대한 것으로 구체화하여 생각하면 된다. '책임저자'였던 단국대 교수가 만약 자기에게 돌아올 어떤 댓가를 기대하고 그러한 일을 했다면 그것은 또 다른 심각한 문제가 된다. 자, 그러면 논문에 저자로서 이름을 올릴 사람은 어떠한 자격을 갖추어야 하는가? 이야기가 길어지니 사이언스온에 실린 '저자의 자격': 누가 저자이며 저자가 아닌가?를 먼저 읽어보면 답은 명확하다.

일단 우리나라에서만 통용되는 '책임저자'라는 부정확한 용어에 대해서 짚고 넘어가자. 책임저자란 아마도 교신저자(corresponding author)를 번역한 것으로 생각된다. 교신저자는 논문의 투고와 수정, 저널측에 대한 저작권 양도(별로 마음에 들지는 않지만), 게재료 납부 등 저자를 대표하여 출판사 측과의 교신을 담당하는 사람을 말한다. 학교라면 대개 교수가 이 일을 맡게 된다. 투고와 출판에 이르는 모든 과정에서 소통의 창구 역할을 수행하므로 그 책임이 매우 크다. 그러나 우리나라에서는 학술 논문에 점수를 매겨서 업적으로 활용하는 체계가 워낙 잘(?) 잡혀 있지 않은가? 점수에는 늘 공정성 시비가 붙기 마련이므로 매우 객관적인 것처럼 보이는 우스꽝스런 체계를 만들게 되었으니 그것이 바로 제1저자 혹은 교신저자에 절대적인 가중치를 부여하고 나머지는 순서에 따라서 낮은 점수를 부여하는 계산식을 만들게 된 것이다. 따라서 모든 저자를 결정하는 권한 - 저자로 포함되는 것을 허락하고 그 순서를 정하는 - 이 있다고 일반적으로 여겨지는 교신저자는 논문이라는 업적에서 막강한 권위를 휘두르는 위치로 인식된다. 임팩트 팩터가 높은 학술지는 그야말로 성배와 같다. 하지만 이 계산식에 따르면 아무리 학술지 자체의 임팩트 팩터가 높다 해도 저자가 많은 논문(요즘은 협업이 워낙 많고 연구의 규모가 커져서 저자수가 많은 논문이 흔하다) 중 하나의 공저자라면 이 점수가 희석되므로 나의 일자리 찾기나 승진에 써먹기는 힘들다. 그래서 여러 고려를 한 끝에 그 논문의 혜택을 가장 많이 볼 사람, 즉 그 논문을 업적으로 삼아서 일자리(조 모 씨의 경우에는 대학입시였을 것이다)나 승진을 원하는 사람이 제1저자를, 지도교수의 경우는 교신저자 위치를 갖게 배려하였을 것이다. 그 교신저자가 이러한 저자 결정 - 즉 고등학생을 제1저자로 만듦으로써 - 을 통하여 직접적인 이득을 받았을 것으로는 여겨지지 않는다. 다만 비슷한 '계급'에 있는 사람들끼리 서로 자녀들의 대입에 도움이 되도록 품앗이를 하는 수준의 일이었을 것이다. 그렇다면 기분나쁠 사람은 누구인가? 이러한 그들만의 방식이 있다는 것을 전혀 모르는 일반 사람들, 그리고 문제의 논문을 출판한 학술지 관계자가 되겠다. 그리고 논문을 투고할 때 모든 저자는 논문의 내용에 동의해야 한다. 여기에는 저자의 포함 여부 및 서로의 위치에 대해서 동의함을 포함한다. 그러나 현실적으로는 제1저자와 교신저자 이외의 사람들은 '아니 저 사람이 무슨 일을 했다고 첫/두번째 저자요? 말도 안됩니다. 난 이 논문 내는 거 동의 못해요!'라고 나서지는 못한다. 그리고 이러한 업적 다툼을 해결하는 가장 현명하고도 교활한 방식은 공동제1저자 혹은 공동교신저자를 만드는 것이다! 두 명은 기본이며 많게는 세 명, 혹은 그 이상까지... 나는 이 치졸한 방식이 우리나라 논문에 많다고 믿는다. 뒤에서 이야기할 연구비 지원 기관의 성과 압박도 이러한 기형적인 행태에 일조를 하고 있다.

단순한 데이터의 생산이나 영문 번역으로는 저자의 자격을 가질 수 없다는 것이 요즘의 보편적인 기준이다. 조 모 씨가 뛰어난 영어 실력이 있었고 이 능력을 발휘하여 영문(번역?)을 잘 써서 제1저자 위치를 주었다는 지도교수의 변명은 너무 궁색하다. 이미 수집된 데이터에 대해서 과학적으로 의미가 있는 분석을 실시하고, 논문의 상당 부분을 처음부터 작성해서 이 주제에 대해 다른 어느 저자보다도 잘 꿰뚫고 있어야 올바른 제1저자의 자격이 있다. 고등학생이 의학분야의 전문 용어를 몇 주 공부해서 논문을 번역할 수준이 된다는 것은 말도 되지 않고(인턴을 하기 몇 달 전부터 이 분야를 열심히 공부했음을 증명할 수 있을까?), 만약 번역에서 중요한 기여를 했다 해도 이것만으로는 제1저자는커녕 공저자의 자격을 묻기도 어렵다. 이런 고마움을 표시하라고 사사(acknowledgments)가 있는 것이다. 예를 들어서 "Understanding the Differences between Genome Sequences of Escherichia coli B Strains REL606 and BL21(DE3) and Comparison of the E. coli B and K-12 Genomes" 2009년도 논문(링크)의 Fig. 1은 내가 직접 그렸다. Genome sequence alignment에서 얻어진 좌표를 xfig 데이터파일 형태로 고치는 무식한(?) Perl 스크립트를 통해서 말이다. 하지만 내 이름은 사사에만 언급되어 있을 뿐이다.

'별로 중요하지도 않는 국내저널에 내는 큰 의미없는 논문..이라면 지도교수가 제1저자와 책임저자를 다 하기는 껄끄러웠을 수도 있겠다' (기사 링크) 우종학 교수의 이러한 의견은 학술지에 대한 예의가 아니라고 생각한다. '기존의 데이터를 썼다;라는 표현도 적절하지 않다. 최소한 기존의 데이터라고 표현하려면 다른 논문에서 한번 다루었던 데이터를 새로운 측면에서 바라보기 위해 다시 분석을 했다거나, 또는 아직 논문화까지는 되지 않았다 해도 공개 DB에 등록된 데이터를 다운로드하여 분석을 했을 때 비로소 이렇게 말할 수 있다. 해당 논문을 읽어보라. 목적을 가지고 실험을 설계하여 임상 샘플로부터 DNA를 추출하여 시퀀싱을 실시했고(37명의 환자와 54명의 대조군 시료), 이를 통계적으로 분석한 것이다. 데이터 생산 시점과 분석 및 논문 작성에 시간차가 있다고 해서 기존의 데이터라고 말하기는 곤란하다. 학술지와 논문의 수준이 세계적 수준에 이르지 않는다고 하여 올바른 저자 표기 문제가 희석되리라고 생각한다면 대단히 곤란하다.

이 논문은 한국연구재단의 지원을 받아서 수행된 것이라고 한다. 논문에는 이러한 점을 사사에 보통 적게 된다. 돈을 지원했으니 논문이란 성과를 내야 하고(연구비 1억원당 임팩트 팩터 얼마짜리 논문이 몇 개나 나왔는지를 가지고 연구사업을 평가하는 슬픈 현실!), 논문과 연구과제의 연관성을 보이기 위하여 사사에 연구과제의 번호를 쓰게 하는 것이다. 게다가 그 연구사업의 책임자가 주저자(보통 제1저자와 교신저자)가 맞는지까지 점검한다. 그렇지 않으면 그 연구과제의 실적물로 인정하지 않겠다는 것이다. 심지어 사사에 포함되는 연구과제의 수가 너무 많으면 이를 인정하지 않기도 한다. 이런 경향은 우리나라가 좀 심한 것 같다. 그러나 모든 연구사업에는 기간이 있고, 기간이 종료되고 나서 논문이 나오는 일도 비일비재하다. 실제로 논문이 출판되기 위해 원래 연구사업에서 참여연구자로 등록되지 않은 다른 사람이 나중에 노력을 들이는 경우도 허다하다. 문제의 본 논문에서 사사한 KRF2006-331-E00163 과제의 책임자가 이 논문의 교신저자가 아니고 다섯번째 저자라는 것도 큰 문제는 되지 않는다. 그러나 여러 기사를 보면 교신저자가 논문을 출판하는 과정에서 이 과제를 사사했다는 것을 제5저자에게 제대로 알리지 않은 것 같다. 일단 이 문제는 제외를 하고 다음의 두 가지를 살펴보자. 이는 문제가 되는가?
  1. 연구사업이 끝나고도 상당한 시간이 지나도록 논문을 내지 않았다.
  2. 연구사업 신청서에 연구원으로 정식 등록되지 않은 사람이 이 사업에서 만들어진 데이터를 나중에 분석하여 논문을 냈다.
이상의 두 가지 사항은 연구부정이 아니다. 연구사업은 기간 내에 목적한 바를 이루고 '연구보고서'를 해당 기관에 제출하는 것으로 일단락이 된다. 임팩트 팩터 몇 점짜리 논문을 몇 편 내겠다고 사업신청서에 목표치를 제시했다고, 이를 달성하지 못하는 것을 문제시한다면 실패 가능성이 있는 도전적인 연구는 할 수가 없게 된다. 물론 아무리 노력을 해도 원하는 결과가 나오지 않거나, 결과는 잘 나왔지만 학술지 측에서 출판할만한 일로 인정을 하지 않아서 논문화가 되지 않는 일이 허다하다. 아예 논문을 쓰지 않고 있는 것과는 다른 일이다. 어쨌든 위의 두 가지 사항에 대해서는 문제를 삼지 않는 것이 맞다고 본다. 어떤 임상의는 이 논문이 정식 IRB(Institutional Review Board, 기관윤리위원회)의 심의를 통과한 것에 대해서 문제를 제기했다. 사람과 관계된 연구는 반드시 사전에 IRB를 통과해야 하고, 논문에도 이를 적시해야 한다. 하지만 IRB 승인을 위해 제출한 서류에 포함되지 않은 사람은 이 연구에서 나온 데이터를 절대 들여다보거나 분석해서는 안된다고 할 수는 없다. 그렇다면 IRB 신청서에 포함되지 않은 사람은 절대로 논문의 저자가 되어서는 안된다는 이상한 결론이 내려진다. 데이터의 민감한 부분을 제외한 나머지 사항을 분석하는 것은 상관이 없다고 생각한다.

오늘 올라온 기사(병리학회 이사장 "조국 딸 논문, IRB통과 허위땐 취소 사유" 링크)에 의하면 이 논문은 IRB를 통과했다고 적혀 있으나 실제로 병원 윤리위를 거치지 않았다고 한다. 물론 당시에는 IRB 통과가 의무 사항은 아니었다. 그러나 열리지도 않은 IRB에서 이 연구가 통과했다고 논문에 적었다면 이는 큰 문제가 된다. 내가 알기로 요즘 논문에서는 IRB 번호를 적어야 한다. 이렇게까지 해 놓지 않으면 'IRB를 분명히 열어서 통과했었었는데 관련 문서가 모두 폐기되어 입증하기가 곤란하다'고 대충 내두를 가능성도 있기 때문이다.

모든 논문은 하나의 연구과제를 통해서만 이루어진 성과라고 생각하면 현실을 너무 모르는 이야기이다. 간혹 몰염치한 연구자가 평가만 대충 통과하기 위해 하나의 논문에 여러 연구비를 사사하는 추태를 저지르기도 한다. 그렇다고 해서 연구과제에 참여연구원으로 이름을 올린 사람만 논문 저자에 포함되어야 한다거나, 인간을 대상으로 하는 연구에서 IRB 신청서에 이름이 오른 사람만 논문 저자에 포함되어야 한다고 주장한다면 이는 지나친 것이다.

다음으로는 논문에 표시된 조 모 씨의 소속기관 문제이다. 요즘 추세는 연구를 하던 당시의 소속 기관과 출간 시점의 소속 기관을 같이 표기하는 것을 원칙으로 한다. 사실 이것 가지고도 업적 다툼이 벌어진다. 만약 A라는 연구자가 미국 B 대학에서 포스트닥으로 일하던 시절 논문을 써 놓고 투고 등의 뒷일을 그쪽 지도교수에게 맡기고 귀국하여 C 대학에 조교수가 되었다고 가정하자. 조교수 A씨는 짧은 시일 내에 많은 논문을 내서 빨리 부교수로 승진을 해야 한다. 여기서 승진에 필요한 논문이라 함은 C 대학에 와서 한 일로 국한지어야 한다. C 대학에서 열심히 일을 하는 도중에 B 대학에서 써 놓고 온 논문이 좋은 학술지에 나갔다고 하자. 만약 그 논문에 저자의 소속을 C라고만 쓰는 것(옳지 않다!)과 B와 C를 같이 쓰는 것은 우리나라의 업적 계산기에서는 절반의 점수 차이를 가져온다. 마음 같아서는 C만을 소속으로 쓰고 싶겠지만, 대부분의 일이 이루어진 것은 B 대학 아니던가? 물론 C 대학에 와서 투고 및 리뷰 과정을 통과하기 위해 조금은 문서 작업을 했을 것이 당연하지만 말이다.

저널은 저자의 소속이 정말로 맞는지 재직증명서를 요구하지는 않는다. 일단 이것은 학자의 양심으로 믿고 가는 것이다. 그리고 부당한 논문저자 표시 여부를 검증할 의무 역시 저널측에는 없다. 이것은 전적으로 교신저자의 책임이다. 조 모 씨의 소속 기관은 단국대학교와 출판 당시의 소속(아마도 고등학교)이 병기되었어야 옳다고 본다. 단순 인턴이 단국대학교의 소속이었다고 볼 수 있는가? 만약 어떤 형태로든 단국대학교에서 이에 대한 경력 사항을 증명서 형태로 발급해 줄 수 있다면 괜찮다고 본다. 그러나 정식적이고 모두에게 열린 인턴 코스가 아니라 학부모끼리 '우리 애 한번 도와줘'의 형태로 논문을 만들기 위해 조 모 씨만을 위한 인턴 자리를 그때만 만들고 없앴을 가능성이 대단히 높다. 그리고 논란이 되는 것을 사전에 막기 위하여 재학 중이던 고등학교를 논문의 저자 소속에서 일부러 누락시켰을 가능성이 대단히 높다.

결론을 내리자면 이번 논문 문제는 당사자(즉 조 모 씨와 지도교수)에게 소명 기회를 준 다음, 논문을 철회하는 것이 맞다고 본다. 소명 내용에 따라 철회가 번복될 것 같지는 않다. 조 모 씨가 당시 미성년이었을 것이니 이를 감안할 수 있을지는 모르겠다. 그 논문이 만약 대학 입시에서 정말로 유리한 요소로 작용했다면, 이를 어떻게 해야 되나? 입학 취소? 그러면 대학원은? 난 그것까지는 모르겠다. 그리고 이것이 전부가 아니다. 공주대학교와 관련한 일도 해명이 필요한 상태이다.

만약 조국이 법무부 장관 후보로 거론되지 않았다면 이 일은 전혀 드러나지 않았을 것이다. 그리고 이렇게 그들끼리만 기회를 만들어서 자녀를 대학에 보내는 능력있는 부모들은 훨씬 더 많을 것이다. 그냥 이대로 사회가 굴러가게 만들 수는 없다고 생각한다.

사족

부정확한 저자 표시는 연구부정행위에 해당하며, 사안에 따라서 소속기관으로부터 징계 혹은 법적인 처벌을 받을 수 있다. 그러면 사사의 부정확한 표기는 어떻게 될까? 아직까지는 사사의 부정확한 표기에 대해서는 연구부정행위로는 다루지 않는 것 같다. 부연하자면 논문에서 사사한 과제의 계획서에 작성했던 내용과 논문이 잘 부합하는지까지를 체크하지는 못한다. 만약 여기까지 실사가 이루어지고 정직하지 못한 연구과제 사사를 문제시한다면 걸리지 않을 연구자는 별로 없을 것이다! 일반적으로 연구과제계획서는 요약본을 제외하면 일반에게 공개되지 않으며, 이를 조사하지 않으면 과제계획서의 내용과 해당 과제를 사사한 논문이 정말 연관성이 있는지 일반인 수준에서는 판명하기 쉽지 않다. 

너무 급하게 쓴 글이라 앞으로도 계속 수정이 가해질 것 같다.

2019년 8월 23일 금요일

2019 CJ R&D Global Conference "생명공학 기술로 만드는 우리의 미래"

2019년 8월 22일(어제), 작년에 이어서 CJ 블로썸 파크에서 열렸던 2019 CJ R&D Global Conference(프로그램연사)에 다녀왔다. 파견 근무지에서 걸어서 갈 수 있는 위치라서 별 부담 없이 다녀올 수 있었다.





오랜만에 만난 신수안 미래기술연구소장 겸 부사장님이 세션 I 좌장을 맡았다. 이분에게 암실에서 흑백 사진 인화를 배웠던 기억이 난다.

작년에 이어서 올해에도 microbiome에 대한 발표가 큰 비중을 차지하고 있어서 관련 업(학?)계에 있는 나로서는 관심을 갖지 않을 이유가 없다. 인간의 장내 미생물이 면역이나 대사에 관련하여 중요한 역할을 함은 잘 알려져 있는데, 신경정신과적 질환에도 연관이 있음을 시사하는 연구 결과가 최근 많이 발표되고 있다. Plenary lecture에서 첫번째로 발표(제목: The gut microbiome and neurological disorders)를 한 캘리포니아 공과대학(Caltech)의 Sarkis K. Mazmanian은 이러한 연구 분야의 선두 주자라 할 수 있다. 강연에서는 장내 미생물이 만드는 아밀로이드 단백질에 신경세포로 들어가서 파킨슨병을 유발하는 인자로 작용할 수 있음을 시사하는 결과를 보여주었다. Mazmanian 연구실의 In the News 웹사이트를 방문하면 언론에 소개된 관련 연구 성과가 나온다. 2017년 Immunity에 실렸던 리뷰 논문을 읽어봄직하다.

http://dx.doi.org/10.1016/j.immuni.2017.05.011

Plenary lecture의 두번째 연사는 합성생물학 분야의 대가로 잘 알려진 UC 버클리의 Jay Keasling은 'Engineering biology for sustainable development'라는 제목으로 미생물의 게놈 엔지니어링과 인류를 위협하는 문제(건강, 에너지, 자원 고갈 등)를 극복해 나가는 사례를 발표하였다. 말라리아 치료제로 잘 알려진 artemisinin, 맥주원료 홉을 대신할 GM 미생물, 바이오플라스틱 등의 주제는 물론 이를 어떻게 사업화로 이어가고 있는지를 소개하였다. 맥주 이야기에 관심이 있다면 Brewing hoppy beer without the hops를 참조하라.

신생학문인 미생물 내분비학(microbial endocrinology)란 무엇인가? 아이오와주립대 수의학과 교수인 Mark Lyte가 주창한 이 용어는 미생물이 숙주에 영향을 미칠 수 있는 신경전달물질을 인식하거나 만드는 능력을 연구하는 분야를 말한다(Microbial endrocrinology and the microbiota-gut-brain axis, PubMed). 인간의 체내에서 작용하는 신경전달물질은 사실 자연계에도 널리 존재하며, 따라서 진화적인 관점에서 이를 다루어야 한다는 것이다("Understanding the role of microbial endocrinology in the microbiome"). 또한 항생제가 아닌 약물이 미생물에 어떤 영향을 미치는지에 대해서는 잘 알려져있지 않은데, EMBL의 구조 및 바이오인포매틱스 그룹장인 Kiran Raosaheb Patil은 잘 설계된 실험을 통해서 대규모의 drug-bacteria interaction을 연구한 최신 결과를 발표하였다("How drugs impact our bugs"). 비록 인도식 영어 억양이라서 알아듣기가 매우 어려웠다는 것이 아쉬움으로 남는다. 이럴 거라면 나도 동시통역기를 대여하여 들어볼 것을.

학술행사와 더불어 석박사 학위 취득자(예정자 포함)를 대상으로 하는 채용/직무 상담도 동시에 진행되었다. 사전에 온라인으로 신청한 지원자들이 이날 오후 개별적으로 미팅을 하여 당일 서류전형 결과를 확인하는 독특한 방식이었다. KRIBB에 재직하던 시절부터 알던 반가운 사람들을 이 자리에서 많이 만날 수 있었다. 개방형 연구혁신을 통해 외부 아이디어를 모집하여 지원하고(CJ제일제당 블로썸 아이디어랩 1기 개최, 뉴스 링크), 국외에서도 직접 인재를 찾기 위해 사장단이 LA까지 총출동하는 등(CJ 글로벌데이 개최, 뉴스 링크) 미래를 준비하기 위해 전사적으로 힘을 쏟는 모습이 인상깊었다. 문득 대덕연구단지에 있는 선후배·동료 연구자들이 생각이 난다. 아직도 우리는 더 많은 지원을 요구하는 목소리만 내는 수준으로 머물러 있는 것은 아닐까?

논문 심사 후 거절 의견을 보내면서

연구자로서 누구나 논문을 써서 좋은 학술지에 출판하기를 원하지만 리뷰어로서 논문 심사 부탁을 받는 것은 참 성가신 일이다. 분야에 잘 맞는다면 봉사를 한다는 의미에서 심사를 수락하는 것이 바람직하지만 말이다. 내가 힘겹게 작성한 논문이 게재 승인(보통 accept가 되었다고 표현한다)을 받았다는 것은 담당 편집인(editor)과 리뷰어가 뒤에서 숨은 수고를 했다는 뜻이 되니 내가 반대로 리뷰어의 입장이 되었을 때는 되도록이면 응하는 것이 옳을 것이다. 현재 대부분의 학술지가 따르는 동료 심사(peer review)가 항상 완벽한 것은 아니지만 말이다.

요즘 주로 메일함을 어지럽히는 것은 리뷰 요청보다는 듣도 보도 못한 출판사에서 논문을 금방 실어줄테니 원고를 보내달라는 메일이다. 돈벌이를 목적으로 하는 이런 수준 이하의 '약탈적' 출판사 혹은 학회의 실상에 대해서는 국내에서도 큰 문제가 되었던 WASET 학회 사태를 통해 이제 잘 알려진 상태이다. 이를 방지하기 위해 한국연구재단에서도 2018년 9월 약탈적 부실 학술지 및 학술대회 피해를 예방하기 위한 가이드를 배포하였다.

부실 학술지 및 학술대회 피해 예방 관련 해외자료 소개

이야기가 좀 다른 곳으로 흘렀다. 오늘 글을 쓰려는 것은 부실 저널이나 학회에 관한 것이 아니라 심사 의뢰를 받은 매우 부실한 국외 논문에 관한 것이다. 리뷰어는 자신이 심사한 논문의 내용에 대해서 기밀을 유지해야 하므로 저자나 논문 내용을 특정할 수 있는 민감한 사항을 제외하고 이 문제를 짚어보고자 한다.

심사 요청을 받은 논문은 어떤 미생물 균주 4건의 유전체 해독 및 분석에 관한 내용을 다루고 있었다. 영어를 모국어로 쓰지 않는 사람이 원고의 영어 수준에 대하여 왈가왈부한다는 것이 대단히 적절치 않음은 잘 알지만, 워드프로세서에서 기본적으로 제공하는 맞춤법 검사 기능도 전혀 작동시키지 않은 듯 철자 오류가 너무나 많았다. 요즘 출판되는 유전체 논문의 수준에도 한참 못미치는 분석 방법과 해석 방법도 문제였다.

하지만 정작 나의 뚜껑(?)을 열리게 한 것은 다른 곳에 있었다. 이 논문에서는 미생물 균주를 배양하여 유전체 해독을 한 것이 주된 내용의 하나였다. 균주를 어디에서 입수했는지에 대한 기본 정보조차 쓰지 않은 것은 일단 논외로 하자. 당연히 NCBI에 유전체 염기서열을 제출하여 받은 accession number도 원고에 기재가 되어 있었다. 그런데 구글을 검색해 보니 똑같은 유전체 데이터를 사용하여 만들어진 논문이 이미 2018년에 다른 저널에 출판되어 있었다. 그 논문을 보면 NCBI에서 genome data를 '입수'하여 분석을 한 것처럼 기술하였다. 균주 배양, DNA 분리, 라이브러리 제작, 시퀀싱 및 어셈블리는 마치 저자들과 관련이 없는 것처럼 보였다. 하지만 2018년 논문과 이번에 내가 심사한 논문의 저자는 교신 저자를 포함하여 총 세 명이 일치한다.

이건 정상이 아니다. 게다가 2018년에 논문에는 어떤 유전자군의 분석 결과를 실었는데, 이번 논문에는 그 유전자군의 한 서브셋을 가지고 또 비슷한 그림을 그려 놓았다. 내가 보기에 이는 내용상 자기 표절에 가깝다.

두 개의 논문이 별도의 논문으로 존재해야 할 타당한 이유를 도저히 느낄 수가 없었다. NCBI에 유전체 정보를 등록하여 accession number가 발급되었다고 하자. 그렇다고 해서 sequencing and annotation에 해당되는 논문이 반드시 시기적으로 먼저 나와야 한다는 법은 없다. 하지만 동일 연구자 그룹이 생산하여 등록한 데이터를 마치 공개된 유전체를 입수하여 분석만 한 것처럼 첫번째 논문을 내고, 일년이 지나서 유전체 시퀀싱을 주된 내용으로 하는 논문을 별도로 낸다는 것은 이해할 수가 없다. 더군다나 두 논문의 교신 저자도 같다. 만약 두 논문이 내용적으로 별도의 논문으로 출판되기에 충분히 독립적인 일이라 한다면(균주 세트는 동일하다 해도), 두번째 논문은 첫 논문을 참고문헌으로서 인용하는 것이 자연스럽다. 하지만 이번 논문에서 2018년의 논문을 인용하는 것은 심각한 자기 모순에 빠지는 결과를 낳는다.

왜 그런가? '우리는 이미 2018년 논문에서 이 세균 균주들의 유전체 해독을 했었다'라고 할 수는 없다. 왜냐하면 2018년 논문에서는 유전체 서열을 NCBI에서 입수해서 썼다고 했고, 유전체 해독은 이번 논문의 주된 결과 중 하나인 것으로 기술했기 때문이다. 그리고 2018년 논문을 누군가 본다면 '어라? 같은 유전자를 가지고 그때 이미 그림을 그렸었네?'하고 눈치를 챌 것이 뻔하다. 저자 역시 2018년 논문에 대해서는 이번 원고에서 전혀 언급하지 않았다. 이는 다분히 의도적인 것이라 생각된다.

문제의 2018년 논문 URL을 여기에 공개해버리고 싶은 열망이 부글부글 끓어오르지만, 리뷰어의 도의상 기밀은 지켜야 하므로 참기로 하였다. 단박에 reject의견을 날렸다. 한국의 학술단체에서 출판하는 논문이라 해서 우습게 알고 이런 수준 이하의 논문을 보낸단 말인가?

2019년 8월 20일 화요일

여름 쇼핑 - 손목시계를 하나 더 구입하다

약간의 여유 자금이 생겨서 카시오 에디피스(Edifice) 브랜드의 표준 크로노그래프 손목시계 EFR-S567D-2AV(2019년 신모델)를 구입하였다. 일본산 제품에 대한 불매 운동이 한창 벌어지고 있는 요즘 상황에 비추어 볼 때 적절치 않은 구매 행위라는 소리를 들어도 어쩔 수 없다.

이 시계는 커다란 초침이 없다. 보통 크로노그래프 시계는 큰 초침이 스톱워치용 초 단위를 나타내는데(평소에는 12시 방향에 멈추어 있음), 이 시계는 12시 방향의 서브다이얼의 바늘이 그것을 대신한다. 시계가 잘 가고 있는지를 확인하려면 9시 방향의 파랑색 작은 바늘을 보아야 한다.



아직까지 나에겐 파란 다이얼의 시계가 하나도 없었기에 이것을 골랐다. 아내에게 줄 팔찌형 시계는 타임메카에서 오늘 배송될 예정이다.

2014년까지만 해도 나는 결혼 예물 시계를 그야말로 '닳도록' 차고 다녔었다. 간간이 실용적인 전자시계를 코팅이 전부 벗겨질 정도로 차기도 했었다. 시계에 대한 관심이나 욕심은 전혀 없었고, 흠집이 나지 않게 아껴서 차야겠다는 생각도 갖고 있지 않았지만 중학생이 되면서부터 시계를 차던 버릇은 휴대폰이 보편화된 지금까지 없어지지 않았다.

2014년 당시 보유 시계. 2014년 7월 맨 왼쪽의 포체 손목시계를 시작으로 시계가 조금씩 늘어나게 되었다. 세번째 타이맥스 시계는 밴드를 분리하여 요리용 스톱워치가 되었다. 출처 링크.
오늘의 글에서 사진으로 보인 것 말고도 다섯 개의 시계가 더 있다. 그중에는 오토매틱 시계에 대한 관심 때문에 구입했던 저급의 중국산 시계도 하나 포함된다. 이런 시계를 샀었던 것을 밝히고 싶지 않은(그러나 블로그에 기록은 했었다), 지금 생각하면 이런 물건을 왜 샀나 싶을 정도로 한심한 제품이었다.

시계가 점점 많아지니 지금은 거의 차지 않는 예전 시계의 관리가 문제다. 소모된 배터리를 제때 교체하지 않으면 액이 흘러나와 무브먼트를 망치게 된다. 아예 배터리를 빠 놓아야 할지, 아니면 계속 새것으로 교체를 해야 될지 고민스럽다. 현재는 서툴게 시계줄을 조정하거나 교체하는 정도만 하고 있는데, 뒷뚜껑을 열고 배터리를 직접 교체하는 수준까지 직접 해 볼 것인가?

고만고만한 시계를 사 모으지 말고 아예 한 방에 제대로 된 시계를 장만하는 것이 정석이라는 말도 흔히 듣게 된다. 나의 선택은? 모른다.

2019년 8월 19일 월요일

잘 쓴 글씨로 좋은 평가를 받으면 특혜인가?

바꾸어 말하자면 글씨를 못쓴다고 불이익을 받으면 편견이고 차별인가? 오늘 경향신문 인터넷판에 실린 기사를 소개해 본다.

글씨마저도 스펙 시대...'지렁이체 바꿔야 산다'

이 사진의 저작권은 누구에게 있는지 나는 모른다. 오늘(2019년 8월 19일) 경향신문에 입력된 기사(위의 링크 참조)에 딸린 이 사진에는 출처에 대한 아무런 정보가 없다. 놀랍게도 같은 신문 2005년에 11월 10일에 실린 기사 '[피플] 악필, 너는 내 운명인가?'에도 같은 사진이 쓰였었다. 보고서 표지의 제출일은 2005년 11월이다. 이것이 실제 과제물로 제출한 보고서를 촬영한 사진인지(허락은 받았을까) 혹은 기사의 이해를 위해 연출한 것인지를 나도 모른다. 만약 실제 존재하는 보고서를 촬영한 것이라면, 보고서를 쓴 사람에게 어떤 허락을 받아야 하나? 얼굴을 찍은 것은 아니니 초상권은 아니고, 그렇다면 저작권인가? 그것도 아닐지도 모른다. 물론 이름(성은 살짝 가렸지만)과 학번이 노출되었으므로 개인정보를 무단으로 공개한 것일 수도 있겠다. 어쩌면 기자는 이런 보고서 표지를 그냥 찍어서 기사에 곁들이기 방식으로 사용한다 해도 법적 책임은 없다는 것을 이미 알고서 사용했는지도 모른다. 이러한 상황이 꽤 많이 있다는 글을 본 적이 있다.
기사의 내용만을 보면, 시험 답안을 악필로 써서 점수가 깎인 법학전문대학원 학생이 글씨 교정학원에 등록하면서 이렇게까지 해야 하는지 부당함을 토로하는 것으로 시작한다. 가뜩이나 취업도 안되고 '스펙'을 쌓느라 시간과 금전적 부담을 져야 하는 요즘 사람들에게 글씨까지도 예쁘게 잘 쓰라고 은연중에 강요하는 사회가 되었음을 비판하는 의도로 쓰여진 기사이다.

만약 옷 매무새나 목소리로 사람을 평가한다면 그건 틀림없이 차별이라고 비난받아 마땅하다. 그러나 글씨라면? 요즘은 책장을 넘겨가며 정보를 습득하는 일도 과거에 비해서는 월등히 줄어들었고, 손으로 글씨를 쓰는 일도 마찬가지로 줄었다. 쉽게 말해서 계약서나 카드 결제기에 서명을 하는 정도 외에는 글씨를 전혀 쓰지 않아도 일상 생활에 불편함이 거의 없는 시대에 잘 쓴 답안에 더 높은 점수를 부여하고, 심지어 입사 지원 서류 중 하나로 자필 자기 소개서를 쓰게 하는 것은 부당하다고 주장할 수도 있겠다. 사실 입사 시험을 보는 그 자리에서 자필 서류를 쓰게 하지 않으면 얼마든지 대필도 가능한 세상이다. 글씨를 얼마나 잘 쓰는지의 여부로 편견을 가지면 안되니 앞으로는 평가 등을 위해서 절대 손으로 쓴 글씨를 내서는 안되게 해야 한다고 약간 급진적인 주장을 할 수도 있을 것이다.

하지만 내 생각은 좀 다르다. 글씨는 일단 정보의 전달이 주된 목적이다. 정보 전달이 심각하게 어려울 정도의 필체라면 고쳐야 한다. 이는 취업때에 임박해서 학원을 찾아다니면서 해결할 것이 아니라, 초등학교 및 중고등학교 때 어느 정도는 훈련이 되었어야 한다는 이야기이다.

각종 과제나 답안지 등을 손글씨가 아니라 손글씨로 인쇄하여 냄으로써 손글씨를 못쓰는 사람에 대한 차별을 없애고 배려하는 효과가 있다면 워드 혹은 파워포인트에 온갖 현란한 장식을 넣어서 현혹함으로써 나타나는 부작용도 분명히 존재한다. 손글씨 학원 못지 않게 파워포인트를 '그리는' 기술을 익히는 것도 경제적으로 부담이 되는 행위니까 말이다. 그럴 것이라면 손가락에 굳은살이 박히도록 지나치게 많은 분량을 요구하지 않는 수준에서 정성들여 손으로 쓴 과제나 답안지를 제출하도록 하는 것이 더욱 심플하다.

만약 사법시험 2차시험 답안을 컴퓨터로 쓴다면 어떨까? 이러한 요구는 이미 오래 전부터 있었다고 한다(2002년 기사 링크). 그러나 당시의 기준으로는 외국에서도 이러한 사례가 아직 없고, 아마 시험장에서 컴퓨터로 쳐서 답안을 입력하게 된다면 예상치 못한 부작용이 생길 것이다. 예를 들어 잘 작성된 답안이 흘러나와서 학원가를 돌아다닐 수도 있고, 전산화된 자료를 몰래 들고와서 시험장의 컴퓨터에 입력하려는 시도가 이어질 것이 뻔하다.

나는 식구들 중에서 가장 글씨를 못쓰는 사람이었다. 아니, 정확히 말하자면 글씨를 못쓴다고 지적을 받는 사람이었다. 그래서 글씨에 대해서는 늘 자신감이 없었다. 교회에서 학생회 활동을 하던 고등학생 시절, 행사 계획서를 손으로 작성하여 장소 섭외를 위하여 찾아간 곳의 책임자(나의 작은아버지)께서 하셨던 말씀이 아직도 기억이 난다.

"야, 너희는 타자기도 없니?"

교회의 공식 업무에서는 타자기를 쓰던 시절이었지만 학생회에서 만드는 보고서나 계획서는 모두 손으로 쓰던 시절이었다. 물론 나는 이 일로 좌절하지는 않았다. 오히려 나의 글씨가 개성이 있고 잘 쓴다고 칭찬을 하는 사람은 나의 아내였다.

잘 쓴 글씨를 타인에 대한 예의라고 생각하면 이는 평가의 기준이 되고 권력이 작용하는 대상이 되고 만다. 쉽게 말해서 글씨가 그게 뭐냐고 한 마디를 하면 요즘 널리 쓰이는 표현을 빌리자면 꼰대질을 하는 셈이다. 그러나 글씨의 기능성을 생각하면 효과적인 내용 전달을 위해서는 어느 수준의 필체는 되어 주어야 한다고 생각한다. 우리가 두려워할 것이 있다면 AI가 글씨체를 평가하는 시대가 아닐까?

Pan-genome analysis tool에서 산출한 strain-specific gene의 활용에 조심해야 하는 이유

여러 미생물 유전체를 모아서 pan-genome 분석을 하면 각 균주에만 특이적으로 존재하는 유전자 정보를 얻게 된다. 이는 그 균주의 존재 여부를 검출하는 특이적 마커로 유용하게 쓰일 수 있다. 몇 번의 프로젝트를 통해서 특정 균주에만 존재하는 특이적 염기서열(꼭 유전자 단위일 필요는 없지만)을 찾아서 이것이 정말 쓸만한 것인지를 점검하는 과정에서 이상한 현상을 종종 발견하게 되었다. 즉, 해당 단백질 서열을 다시 비교 대상에 쓰인 모든 유전체들에 대하여 blast로 점검하면 identity가 95%를 훨씬 넘는 match가 다른 유전체에서 발견되는 것이었다. 이는 내 상식으로는 이해할 수 없는 일이었다. 오직 LS-BSR만 이런 문제를 보이지 않았고, roary, orthoMCL, 그리고 최근 설치하여 활용 가능성을 알아보고 있는 panX 모두 그러하였다. 유전자 단위가 아니라 유전체 단위로 분석을 실시하는 panseq의 novel region finder 기능에서만 이러한 이상 현상이 발견되지 않았다.

Pairwise similarity를 클러스터링하는 알고리즘의 특성인가? 내 수준으로는 이 레벨에서 벌어지는 일들을 이해하기 어렵다. 단서를 찾기 위해 panX 웹사이트를 뒤적거리다가 눈에 뜨이는 항목을 하나 발견하였다.

panX advanced options: Resolve unclustered genes

유사도가 매우 높지만 클러스터를 이루지 못하는 유전자들을 해결하기 위한 옵션이다. panX는 클러스터를 구성하는 유전자들의 길이 분포를 스무스하게 만들기 위해 점검을 실시한다는 뜻으로 풀이된다. 즉 기본 동작 조건에서는 유사도가 높지만 길이에 큰 차이가 있는 유전자를 분리시키는 것으로 보인다.

blast 결과를 점검해 보았다. 균주 특이적 유전자로 분류된 것 중 다른 균주에 존재하는 것과 similarity가 매우 높게 나왔던 것은 유전자 길이에서 큰 차이가 있었다. 즉 match가 이루어진 유전자 쌍 중에서 어느 하나에게는 full length match이지만, 다른 쪽에게는 절반이거나 혹은 그 이하의 영역에 대해서만 match였었다. Roary 웹사이트에는 이런 예외적 현상에 대한 설명이 없었고, 나 역시 paralog를 분리하는 문제에만 관심을 갖고 있었다. 당연히 직면할 수 있는 문제임에도 불구하고 이를 미처 인지하지 못했다니 부끄럽기만 하다. blast score ration를 기반으로 클러스터를 만들지 말지를 결정하는 LS-BSR에서는 이런 문제가 나타나지 않음을 쉽게 이해할 수 있다.

온전한 유전자(A)가 sequencing error로 인하여 길이가 유사한 두 개의 CDS(C + D)로 예측되었다고 가정하자. 다른 genome에 존재하는 A의 homolog는 C와 D 모두에 대해서 높은 similarity를 보이겠지만, 길이 분포의 문제로 인하여 이를 하나의 클러스터로 모으지는 못한다. A는 또 다른 genome에 존재하는 유사한 길이의 A', A'', A''' 등과 클러스터를 형성할 수는 있으나 모든 비교대상 genome을 아우리는 core genome의 일원은 되지 못할 것이고, C와 D는 균주 특이적 유전자로 취급될 것이다. 만약 C나 D를 그 균주의 특이적 마커로 판단하여 PCR primer를 고른다면 당연히 원하는 결과를 얻는 길에서 멀어질 것이다.

panX 파라미터를 건드려서 이러한 짧은 유전자를 억지로 클러스터에 포함시키는 것은 바람직하지 못하다. 아니, 짧은 유전자가 반드시 클러스터에서 소외되리라는 것은 편견이다. 대부분이 짧은 형태이고 유난히 긴 것이 하나 있다면 그것이 클러스터에서 제외될 것이다. 균주 특이적 마커 염기서열을 찾는 것이 주된 목적이라면, 아예 유전체 서열을 기본으로 움직이는 panseq를 사용하거나 또는 기존의 도구를 통해서 얻어진 unique gene을 전체 유전체에 대하여 최종 검색을 하여 점검하는 것이 바람직할 것이다.

2019년 8월 15일 목요일

6LQ8 푸시풀 앰프의 출력 트랜스 교체

6J6 푸시풀 앰프의 덮개를 열고 66 코어 트랜스 두 개를 꺼내고야 말았다. 이영건 선생님, 죄송합니다...


오른쪽은 그동안 출력트랜스 대용으로 써 왔던 전원트랜스.
스피커처럼 즉각적으로 바꾸어 연결해 가면서 소리를 비교할 수 있는 부품이 아니니 교체를 통해서 얼마나 소리가 좋아졌는지를 냉정하게 판별하기가 어렵다. 만약 파형발생기와 오실로스코프가 있었다면 매우 객관적으로 음질을 비교 평가할 수 있었을 것이다. 하지만 귀가 느끼는 세계는 계측과는 또 다른 차원이다. 제대로 만들어진 진공관 앰프용 출력 트랜스이니 당연히 음질은 더 좋을 것이다. 코어의 재질, 샌드위치 감기, 코어의 크기 등.

교체를 한 상태에서 소리를 들어보았다. 더 나아졌을 것이라는 기대감이 더 크게 작용하고 있으니 왠지 더 좋은 소리가 나는 것 같다. 볼륨 조절기의 본체에 접지선을 연결하고 NFB를 연결하는 것으로 마무리를 하였다.




6J6 푸시풀 앰프는 일년 반 정도 사용하였는데 벌써 부품용으로 전락하였다니 아깝다는 생각이 든다. 출력이 매우 낮고 마이크로포닉 노이즈가 심하다는 고질적인 문제점이 있었다. 앞으로 부품용 및 연구용으로 충분히 쓰일 수 있으리라 믿는다.

앞으로는 케이스를 개선하는 연구를 더 해야 되겠다.

2019년 8월 17일 업데이트

상판(나무 도마) 아래에 나무젓가락을 붙여서 앞뒤 좌우로 미끄러지지 않게 하였다.

다음으로는 적당히 구멍을 뚫어서 상판과 플라스틱 상자 부분을 케이블타이로 붙들어 묶을 생각이다. 구멍을 뚫기 위하여 핀바이스를 주문해 놓았다. 나무 또는 플라스틱에 작은 직경의 구멍을 뚫으려고 전동 드릴을 들이대기는 너무 거추장스럽다.

며칠 동안 들어본 결과를 말하자면, 제대로 제작한 푸시풀 출력 트랜스로 교체를 했다는 기대감 때문인 것일까? 지금까지 내가 사용한 그 어떤 진공관 앰프보다 소리가 좋다는 느낌이 강력하게 든다. 혹시 플라시보 효과는 아닐까? 정류회로쪽의 발열이 심하고 - 캐패시터와 저항류를 너무 가깝게 붙여 놓았고, 저항도 와트 수가 큰 것을 사용하는 것이 나았을 것이다 - 외관이 허름하다는 것 말고는 문제점을 찾기가 어렵다.

2019년 8월 21일 업데이트

핀바이스로 구멍을 뚫어서 상판과 플라스틱 상자를 케이블타이로 연결하였다. 상판이 두꺼워서 그런지 핀바이스를 쓰는 것이 쉽지 않았다. 돌리는 과정에서 자꾸 드릴날 고정부분이 풀어진다. 중국산 저가 수공구라 그런 것인지, 혹은 공구를 용도에 맞지 않게 쓰는 것인지?


섀시를 완전히 새로 꾸미지 않는다면 현재 거의 완성된 상태라 볼 수도 있을 것이다. 그러나 세부적인 모습을 들여다본다면 아직 부족한 모습이 많다. 플라스틱 상자 내의 기판(정류회로 및 리플 필터)은 서포트만 달아 놓았을 뿐 고정이 되지 않은 상태이며, 전원트랜스 역시 고정을 하지 않았다. 워낙 무거운데다가 주변이 기판으로 꽉 막혀 있어서 움직이지 않을 뿐이다.

내 귀가 간사한 때문일까? 출력 트랜스를 교체한 이후로 제법 소리가 좋다고 느껴진다.

2019년 8월 11일 일요일

진공관 앰프용 출력 트랜스의 임피던스 알아내기

6J6 푸시풀 앰프가 작동 중인 모습. 전자액자에 보이는 것은 조반니 파올로 파니니의 로마 판테온 내부(1734).

이영건 선생님이 제작신 6J6 푸시풀 앰프를 파견 근무지 숙소로 가지고 왔다. 최근에 만든 6LQ8 푸시풀 앰프와 비교를 해 보고 싶었기 때문이었다. 내가 만든 앰프는 일반 전원트랜스를 출력트랜스 대신으로 사용한 것이라서 음질이 불리할지도 모른다는 생각을 늘 하고 있었다.

막상 비교 청취를 하니 6LQ8 PP 앰프가 음질이 나쁘다고 할 근거를 찾기 힘들었다. 출력은 당연히 6LQ8 앰프가 크다. 파형발생기와 오실로스코프가 있어야 왜곡이 일어나기 전의 정확한 출력이 몇 와트인지를 측정할 수 있다.

6J6 앰프에 쓰인 출력트랜스의 임피던스 비율은 얼마일까? 제작자에게는 죄송한 이야기지만, 이를 적출하여 다른 앰프에 쓸 수도 있지 않을까? UL탭은 없으며 코어 사이즈는 66 mm이다. 제작자에게 예전에 전화로 문의한 적은 있는데 정확히 기억이 나지 않는다.


출력트랜스는 커버 없이 코어가 노출된 상태이며 내부의 베이클라이트판에 케이블타이와 순간접착제로 고정되었다. 볼륨 조절기가 왜 이렇게 뻑뻑한가 했더니 모터가 달린 전동 가변저항이었다(이런 물건).

6J6은 오디오용 진공관이 아니라서 이를 이용한 앰프의 회로를 인터넷에서 구하기는 힘들다. 검색된 정보는 다음이 전부이다.

[1] 위상반전회로 https://mysite.du.edu/~etuttle/electron/elect33.htm


[2] 1.2W 6J6 하이브리드 앰프 https://ibb.co/B4hRSyv https://youtu.be/3k8jxa0s788 (동영상) 'Ra-a = 16K+16K'라 한 것은 무슨 의미인지를 모르겠다. 유튜브 링크에는 'The video OPT is incorrect the OPT is 20Ka-a , the circuit require 32Ka-a and the B+ voltage is 300V is higher then design voltage. This is the power transformer is for temporary testing use.'라 하였다. 내가 알고 있기에는 32K 트랜스포머의 중간에 탭을 내면 양단과 중간 사이의 임피던스는 절반이 아니라 1/2, 즉 4K가 되는데(임피던스비는 권선비의 제곱에 비례하므로)...




[3] 6J6 PP 앰프 http://diyaudioprojects.com/Forum/viewtopic.php?t=5598
[2]와 [3]에서는 B 전원을 위해 voltage multiplier를 사용하였다. 늘상 접해왔던 (2)배전압을 능가한다.

6J6 PP 구성의 경우 16K:8 출력트랜스를 썼다는 글은 간혹 보인다. 위에 소개한 것 중 [3]번이 그러하다. 미지의 출력트랜스가 있을 때, 임피던스 비율을 알아낼 방법은 없을까?  만약 트랜스 1차에 220V를 연결하여 2차 전압을 재면, 권선비를 알 수 있다. 이를 제곱하면 임피던스 비율이 나온다.

6J6 PP 앰프는 매우 단순한 구성이라서 negative feedback도 걸려있지 않다. 따라서 출력관을 소켓에서 빼면 출력트랜스의 1차와 2차는 전기적으로 완전히 분리된다. 이런 상태에서 220V를 1차에 연결한 뒤 2차 전압을 측정하여 보았다. 9.3V가 나온다. 이번에는 2차에 5W 시멘트 저항 두 개를 16.4옴으로 만들어 연결하여 다시 측정을 해 보았다. 이번에는 8.95~8.96V 정도가 걸렸고, 부하저항에서 소모되는 전력은 계산상으로는 4.98W 정도가 된다. 처음에는 2.2옴 저항 하나를 연결하였었는데 열이 너무 많이 나서 즉시 전원을 끊었다. 전압비는 곧 권선비이므로 24.6이 되고, 제곱을 하면 605.16이다. 이를 환산하면 4.81K:8이 된다. 대충 5K:8의 매우 흔히 쓰이는 출력트랜스가 된다.

출력트랜스 1차 양단에 220V를 공급하기 위해 만든 케이블. 한번 만들어 두면 쓸모가 많다. 잠시 착각을 하여 클립을 납땜한 다음에 절연 외피를 씌우느라 애를 먹었다. 납땜을 하기 전에 수축 튜브 등의 다른 자재를 미리 관통시켜 놓는 것을 잊는 수가 가끔 있다. 머리가 나쁘면 늘 손발이 고생이다.

내가 만든 6LQ8 앰프 PCB에 6J6 앰프의 출력트랜스를 조합하면 가장 좋은 음질이 나올까? 이는 해 보기 전에는 알 수 없다. 출력트랜스를 재활용하기 위해 6J6 앰프를 완전히 분해해 버린다? 그것 역시 쉽게 결정을 내리기 어려운 일이다.

위험한 실험?

하루가 지나서 생각을 해 보니 출력트랜스에 상용전원 220V를 직결한 것은 다소 위험한 실험이었다고 느껴진다. 출력트랜스의 센터탭에 가해지는 수백 볼트의 직류를 생각한다면 전압 자체는 유사하지만, 뽑아낼 수 있는 전류는 비교 불가하기 때문이다. 좀 더 안전한 실험을 위해서는 다른 트랜스포머를 하나 거쳐서 연결하는 것이 나았을 것이다. 꼭 1차에 220V를 연결할 필요도 없을 것이다.

2019년 8월 10일 토요일

하루에 위 내시경 검사 두 번 받은 사연

건강이 좋지 않으셨던 아버지께서는 정기적인 위 내시경 검사를 무척 싫어하셨던 것으로 기억한다. 검사일이 다가오면 며칠 전부터 몹시 신경을 쓰시고 힘들어 하셨다. 그 모습을 봐 왔던 나는 직장에서 처음 내시경 검사를 하면서 자연스럽게 수면 내시경 검사를 선택하게 되었다. 그러다가 일반 내시경을 처음으로 받게 된 일이 생겼으니 사연은 이러하다. 가벼운 위궤양 증세가 있다고 하여 약 처방을 받고 2주 정도의 투약 치료가 끝난 뒤 재검을 하기로 했는데 담당자는 아주 간단하게 '일반 내시경 하실 거죠?'하면서 접수를 해 버렸다.

이런, 드디어 내가 일반 내시경을 하는구나. 

무척 긴장을 하고 검사대에 올랐는데 생각보다 많이 힘들지는 않았다. 그래서 그 이후로는 계속 일반 내시경으로만 검사를 받았다. 3년 전에는 대장 내시경을 같이 하느라 수면 내시경 검사를 했고, 2년 전에는 일반 검사를 받는데 십이지장쪽을 검사하는데 구역질을 좀 많이 했다. 그래서 작년에는 오랜만에 편하게 받아보자고 수면 검사를 택했다. 

일년에 한 번, 마치 숙제를 제출하듯 올해에도 건강검진 날짜는 다가왔다. 이번에는 또 무슨 방식으로 할까? 간편하게 빨리 끝나고 검사 후 맘대로 운전을 해도 되는 일반 방식이냐, 돈이 좀 들지만 편하게 치를 수 있는 수면 방식이냐. 일단 일반 방식으로 접수를 하고 당일날 마음이 바뀌면 수면 방식으로 하겠다고 이야기를 해 두었다.

검사날(오늘)이 되어 아침 일곱시 반도 되기 전에 병원에 도착하였다. 일반 내시경으로 접수를 했지만 수면 내시경으로 하고 싶다고 했더니 일단 변경이 되는지 알아보겠다면서 접수 직원은 검사실로 전화를 돌렸다. 추가로 내야 하는 비용은 4만원. 적은 금액은 아니었다. 그런데 검사실에서는 아직 전화를 받지 않았고, 일반 내시경으로 해야 빨리 끝나기 때문에 아침 일찍 오시라고 연락을 했다는 것이었다. 

그렇다면 일반 내시경으로 하지 뭐.

원래 접수했던 방식으로 검사를 받겠다고 했더니, 접수창구 직원은 내시경을 제일 먼저 하는게 어떻겠냐고 했다. 뭐라고? 지금까지 십수 년 건강검진을 받으면서 내시경은 항상 마지막 코스였다. 검사 항목 중에서 가장 힘든 것이니 그렇게 배치를 하는 것이 자연스럽기도 했고, 위 내시경을 먼저 받으라고 권장을 받은 적도 내 기억으로는 단 한 번도 없었다.

에라, 모르겠다. 뭐 그렇게 하지요.

그래서 옷을 갈아입고 내시경 검사실로 행햤다. 시각은 오전 8시가 갓 넘었고, 검사실에서는 8시 15분쯤에 검사가 시작되므로 다른 항목부터 먼저 받고 계시면 부르겠다고 하였다. 그래서 한 층 아래로 내려가 다른 검사를 먼저 받았다.

곧 호출을 받고 내시경 검사실로 향했다. 깨끗하게 소독된 기구를 오늘 내가 처음 쓰는 사람이구나! 가스가 빠지는 약을 받아 삼키고 검사실로 들어갔다. 목 마취용 약을 뿌리고 검사대에 누웠다. 오래 전에는 목 마취용 약을 입에 머금고 10분 이상을 기다리게 하였었다. 그러고는 약을 삼킨 다음 별도의 마취제를 또 검사 직전에 목에 뿌렸던 것으로 기억한다. 그때는 약을 입 안에 물고서 이리저리 움직이면 혀까지 마비가 되어서 검사가 다 끝나고도 한참 동안 감각이 돌아오지 않아서 식사를 하기 힘들었었는데, 언젠부턴가는 마취약을 목에 뿌린 즉시 검사를 하니 세상이 참 편해지긴 했다.

검사는 생각보다 매우 수월하게 끝났다. 내가 생각하기에도 매우 편안했고, 의사도 너무 잘 받는다고 칭찬(?)을 하면서 계속 사진을 찍었다. 별 문제가 될 소견은 없다면서 검사를 끝낸 뒤 찍은 사진을 보여주려는 찰나, 모니터에는 보이는 이미지가 없다. 내시경 카메라를 입 속에 넣기 전에 찍힌 것 하나만 덜렁 남아 있는 것이 아닌가.

'어머, 사진이 왜 안 넘어왔지?'

이런 일이 생기기도 하는구나. 별 이상이 없으니 그냥 이대로 마칠 것인가? 그래도 기록은 남겨야 하지 않는가? 결론은 내시경을 다시 한 번 더 받는 것으로 모아졌고 - 잘 참는다고 칭찬을 받은 것이 잘못이다! - 담당 직원들은 매우 미안해했다. 나도 별 불만을 제기하기 않고 그러라고 했다. 목 마취는 다시 할 필요가 없다고 했다. 다시 입에 기구를 끼우고 검사대에 옆으로 누웠다. 오, 이런...

두번째 검사는 조금 더 힘들었다. 이미 한 번 훑어 보았으니 담당 의사도 먼젓번보다는 신속하게 검사를 끝냈다. 거듭 미안하다는 말과 함께... 이런 일을 겪는 것이 내가 처음이냐고 물었는데 그건 아니라고 했다. 솔직히 말하자면 채혈을 위해 주삿바늘을 찔렀는데 혈관이 잘 잡히질 않아서 다른 곳을 또 찌르는 것보다 더 힘들지는 않은 정도라고나 할까? 폐암이라고 해서 왼쪽 폐를 절제했는데 나중에 수술을 마치고 났더니 실제 잘라내야 할 폐는 오른쪽인 것을 나중에 알게 된 것에 비하면 덜 황당무계한 일 아니겠는가?

내 자신이 별로 힘들지 않았고, 대단한 일이라 생각하지 않았기에 문제를 제기하지는 않았다. 어찌보면 두 번 겪기 힘든 경험 아닌가. 하지만 위 내시경 검사를 매번 할 때마다 봅시 힘들어하는 사람이라면 어떻게 했을까? 아마 몹시 화를 내고 다시 하지 않겠다고 할 것이다.

아마 내년부터는 위 내시경 검사를 하기 직전에 항상 카메라 작동이 잘 되냐고 묻는 버릇이 생길 것 같다. 그리고 일반 내시경으로 할지 혹은 수면 내시경으로 할지 망설이는 일도 줄어들 것이다.


2019년 8월 7일 수요일

SAM flag에 대해서 좀 더 알아보자 - mapping 여부에 따른 read 추출하기

SAM/BAM 파일로부터 properly paired (mapped) read를 꺼내려면 -f 0x03 flag를 쓰면 충분하다. 더욱 간단하게는 두번째 비트가 1이면 된다. -f 0x02의 의미가 proper pair이기 때문이다. 그러나 paired read가 쓰인 경우 항상 0x01과 따라다니게 되므로 -f 0x03이 더욱 바람직하다.

이토록 간단한 flag이지만, 실제 매핑이 이루어진 read의 입장에서 4가지의 경우로 세분한다면 이해의 폭을 더욱 넗힐 수 있다. Paired fastq file(I & II)을 이용하여 매핑을 하였을 때 하나의 참조서열 내부에서 정상적인 pair를 이루는 모든 경우는 다음이 전부이다. 화살표는 참조서열 위에 매핑일 이루어진 read를, 별표(*)는 fastq 파일에 수록된 상태의 서열을 reverse complementary로 전환해야 함을 의미한다. 내가 알기로 first 및 second는 _1 및 _2 파일을 의미한다. pair를 이루는 시작(left)과 끝(right) read를 의미하는 것이 아니다.

First           Second        Second           First
-------▶......◀-------     -------▶......◀-------
from I         from II*       from II         from I*
  [A]            [B]            [C]            [D] 

(아, 도대체 html로는 부등호 기호를 써서 화살표를 표현하기가 어려우니...)

A-B의 네 가지 read는 단 한번씩만 mapping되어서 SAM 파일 내에서 하나의 alignment record로 존재한다고 가정하자. 그러면 각각의 alignment는 어떤 flag을 갖게 될 것인가? flag의 설명은 samtools flag 명령으로 표시되는 것과 SAM flag decorder에서 쓰이는 용어가 조금 다르지만 편의상 후자의 것을 쓰기로 하자.

기본적으로 여기에 보인 네 가지 alignment는 전부  웹사이트기본적으로 read paired(0x01)와 read mapped in proper pair(0x02)를 만족하므로 0x03을 기본값으로 깔고 있다. 다음으로 생각할 것은 이 read가 pair 중 첫번째 혹은 두번째 read인가, 그리고 이 read와 mate 중 어느 것이 참조서열에 대하여 reverse로 존재하는가의 여부이다. 이는 다음과 같이 4가지의 flag으로 표현된다.

  • 0x10: read reverse strand
  • 0x20: mate reverse strand
  • 0x40: first in pair
  • 0x80: second in par
A는 mate reverse strand(0x20), first in pair(0x40)이다. 따라서 0x03 + 0x20 + 0x40 = 0x63 = 99
B는 read reverse strand(0x10), second in pair(0x80)이다. 따라서 0x03 + 0x10 + 0x80 = 0x93 = 147
C는 mate reverse strand(0x20), second in pair(0x80)이다. 따라서 0x03 + 0x20 + 0x80 = 0xa3 = 163
D는 read reverse strand(0x10), first in pair(0x40)이다. 따라서 0x03 + 0x10 + 0x40 = 0x53 = 83

99/147, 그리고 163/83은 NGS read alignment를 다루는 사람이라면 잊어서는 안되는 숫자가 되겠다. samtools view -f 99로 추출한 read는 -f 147로 얻은 것과 mate 관계이고, -f 163과 -f 83 역시 같은 관계이다. 이렇게 얻은 모든 파일을 합치면 -f 0x03으로 추출한 read 세트와 동일한 것이 된다. 혹시 내가 전개한 이론이 맞지 않다고 생각하는 독자가 계시다면 언제든지 연락 주시길!

Unmapped read에 대해서는?

read unmapped는 0x04(0x4, 또는 십진수로 4라고만 써도 되는데 버릇이 되어서 계속 두 자리 16진수로 표현하고 있다), mate unmapped는 0x08이므로 이를 적절히 조합하면 unmapped pair와 어느 한쪽만 mapping이 된 pair를 찾을 수 있다. 내가 생각하는 가장 간단한 flag 값은 이러하다. 
  • both unmapped: -f 12 (0x04 + 0x08, 16진수로는 0x0c)
  • read mapped, mate unmapped: -f 0x08 -F 0x04
  • read unmapped, mate mapped: -f 0x04 -F 0x08
그런데 Novocraft의 웹사이트(Extracting unmapped reads from a BAM file produced by NovoAlign)에서는 좀 더 복잡한 flag 값을 제시한다.
  • both unmapped: -f 12 -F 256
  • read mapped, mate unmapped: -f 8 -F 260
  • read unmapped, mated mapped: -f 4 -F 264
숫자 단위가 큰 flag은 무엇을 의미하는지 알아보자.
  • 256(0x100): not primary alignment
  • 260: 256 + 0x04(read unmapped)
  • 264: 256 + 0x08(mate unmapped)
이것을 -F로 적용하니 직관적으로 이해를 하기가 좀 어렵다. 테스트를 해 보면 내가 제시한 flag로 하는 것과 결과에 차이가 없다. 이로써 이틀에 걸친 SAM flag 공부하기를 마치고자 한다. SAM and BAM filtering one-liner도 참고하기에 좋다.



2019년 8월 6일 화요일

samtools flagstat로 출력되는 숫자를 재현하기

samtools flagstat는 SAM/BAM 파일에 수록된 read alignment 정보를 출력해 주는 매우 유용한 프로그램이다. 그러나 출력되는 정보는 기본적으로 read가 아닌 'alignment'라서 직관적으로 이해하기 어려울 때가 많다. 특히 하나의 read가 reference 서열에 존재하는 반복 서열에 의해 여러 곳에 매핑될 경우 계산이 잘 맞지 않는 것처럼 느껴진다. 이것을 명확하게 이해하기 위하여 samtools view -f (또는 -F) INT 명령의 flag를 잘 조합하여 samtools flagstat로 표현되는 수치와 같은 값이 나오게 만들어 보았다.

솔직하게 고백하자면 나는 거의 항상 CLC Genomics Workbench에서 박테리아 게놈의 NGS data를 다루기 때문에(de novo assembly 위주의 업무) SAM/BAM 파일을 직접 다룰 일은 없다고 해도 과언이 아니다. 하지만 데이터 조작의 기본 원리를 이해하거나 사용 프로그램을 접하기 어려운 사람에게 설명을 하려면 CLC Genomics Workbench만을 고집할 수는 없다. 그래서 IGV(Integrated Genomics Viewer)도 가끔은 실행해 봐야 한다.

미생물 유전체 서열로부터 64780 x 2(129560 reads, 2x150 nt)개의 가짜 fastq file을 만들었다. 사용한 시뮬레이터는 ART MountainRainier이다. 레퍼런스 서열은 read를 만들어낸 원본 read와 가까운 유전체를 대략 같은 간격의 약 500개의 조각(크기는 1 kb)으로 나눈 것이었다. 매핑에는 bowtie2를 사용하였다.

$ samtools view -H mapping.sam # 헤더 정보만 보여줌
$ samtools view -b mapping.sam > mapping.bam
$ samtools view -b mapping.sam -o mapping.bam # 같은 결과
$ samtools flagstat mapping.bam 
[1] 131900 + 0 in total (QC-passed reads + QC-failed reads)
[2] 2340 + 0 secondary
[3] 0 + 0 supplementary
[4] 0 + 0 duplicates
[5] 21390 + 0 mapped (16.22% : N/A)
[6] 129560 + 0 paired in sequencing
[7] 64780 + 0 read1
[8] 64780 + 0 read2
[9] 15554 + 0 properly paired (12.01% : N/A)
[10] 15710 + 0 with itself and mate mapped
[11] 3340 + 0 singletons (2.58% : N/A)
[12] 122 + 0 with mate mapped to a different chr
[13] 105 + 0 with mate mapped to a different chr (mapQ >=5)

그러면 각 줄번호에 해당하는 숫자를 재현해 보자. 0만 표시된 것은 제외하였다. alignment의 수가 필요한지(samtools view -c), 혹은 이로부터 read name에 해당하는 것을 뽑아낼 것인지를 명확히 해야 된다.

[1]은 read의 수가 아니라 alignment의 수이다. 다음과 같이 하면 된다.

$ samtools view -c mapping.bam
131900

[2]는 primary와 secondary mapping을 이해해야 한다. 256을 16진수로 표현하면 0x100이다. 따라서 -f 0x100이라고 써도 된다.

$ samtools view -c -f 256 mapping.bam
2340

수치가 나오지 않은 [3,4]는 생략하자. [5]는 mapped read의 alignment 수를 의미하므로, SAM/BAM flag의 0x04(unmap)의 반대, 즉 -F 0X04를 쓰면 된다.

$ samtools view -c -F 0x04 mapping.bam
21390

만약 properly paired read에 대한 것만을 추출하고 싶다면 -f 0x03(1 for paired, 2 for proper_pair)으로 설정해야 한다.

[6]은 매핑 결과와는 관계없이 최초 read에 들어있던 read의 수를 의미한다. 이는 이미 알고 있는 숫자이다. 그러나 BAM 파일에서 굳이 구하고 싶다면 다음 계산에서 나온 수치에 2를 곱하면 된다. BAM file에서는 simulated read name 끝부분의 /1 또는 /2가 제거된 상태라서, uniq 명령을 거치고 나면 그 수가 절반으로 줄기 때문이다. sort는 꼭 하지 않아도 된다.

$ samtools view mapping.bam | cut -f1 | sort | uniq | wc -l
64780

[7]과 [8]은 fwd 및 rev read file에 들어 있는 read의 수이므로 서로 동일하며, 이미 알고 있는 값이므로 넘어간다. 전체 read 수의 절반임은 당연하다.

[9]는 조금 어렵다. Properly paired를 의미하는 flag은 0x02인데, 이는 반드시 0x01(paired)과 같이 쓰인다. 따라서 -f 0x03을 주어서 read의 수를 계산한 다음, pair를 만들기 위해 2를 곱하면 된다. samtools view -c -f 0x03 mapping.bam이라고 명령을 내리고 싶은 강렬한 욕구가 느껴지지만, 그렇게 하면 안된다. 왜냐하면 proper pair를 이룬 상태로 reference 내의 여러 곳에 결합할 수도 있기 때문이다. 실제로 이렇게 계산하면 15554가 아니라 16760이 나온다.

$ samtools view -f 0x03 mapping.bam | cut -f1 | sort | uniq | wc -l
7777

[10]은 read 쌍이 둘 다 매핑이 된 것을 의미한다. Read 쌍의 거리와 방향이 적정한지는 중요하지 않다. 이것은 어떻게 flag를 정해야 할까? read도 unmapped가 아니고(-F 0x04), 그의 짝도 unmapped가 아니여(-F 0x08)! 따라서 -F 0x12를 하여 계산되는 read의 수에 2를 곱한다.

$ samtools view -F 12 mapping.bam | cut -f1 | sort | uniq | wc -l
7855

다음으로 [11]은 꽤 까다롭다. sinlgeton, read pair의 한쪽만 mapping이 된 것을 산출하는 것이다. 여기에서는 -f 0x04 -F 0x08을 하거나 -f 0x08 -F 0x04를 하면 된다. 두 명령어를 따로 실행해서 합쳐야 할 것 같은 생각이 들지만, read name을 각각 추출하여 비교해 보면 똑같다. 이것은 read pair를 산출하는 것이 아니므로 곱하기 2를 하면 안된다.

$ samtools view -f 0x04 -F 0x08 mapping.bam | cut -f1 | sort | uniq | wc -l
3340

[12,13]은 아직 정확한 flag 조합을 찾지 못하였다. SAM/BAM flag의 의미를 파악하려면 매SAM/BAM speficiation 파일이나 samtools flags 명령어, 또는 SAM flag 디코더를 적절히 활용해 보라.

Paired read, 즉 [5]와 singleton[11]은 후속 분석에서 유용할 때가 많다. 특히 11번에 해당하는 read의 pair를 추출해 놓으면 read pair에 의한 연결 부위를 찾는데 활용할 수 있다. 이상에서 살펴본 바와 같이 SAM/BAM flag을 자유롭게 쓸 수 있게 되면, samtools bam2fq 명령을 이용하여 BAM 파일에서 조건에 맞는 read를 직접 추출할 수도 있다. pair가 깨진 상태라면 BBmap의 repair.sh 및 관련 명령어(Repair Guide)를 적절히 활용하면 매우 편리하다.

2019년 8월 5일 월요일

GenoGlobe.kr, 새롭게 시작하는 블로그

기존에 사용하던 웹호스팅 서버에 DokuWiki를 새로 설치하고 블로그 플러그인을 깔았다. 설정을 약간 매만져서 https://genoglobe.kr/이라고만 치면 곧바로 연결이 되게 만들었다. 보통 DokuWiki를 설치하면 http://mydomain/path/to/installation/doku.php?id=start가 기본 접속 주소가 된다. 지금 보이는 이 웹사이트는 구글 블로그에 기반한 것으로서 GenoGlobe.com  도메인을 사용한다.

아래에 소개한 GenoGlobe.kr의 로고는 인터넷에서 찾은 지구 이미지(수정후 비상업적 용도로 재사용 가능한 것, 링크)에 Century Gothic 글꼴의 G 문자와 CGView를 이용하여 내가 직접 그린 E. coli genome image(링크)를 겹친 것이다. 그래픽 소프트웨어를 쓸 줄 아는 것이 없으니 작업은 그저 단순하게 파워포인트에서! 글꼴은 가능하다면 원형에 가깝게 G가 표현된 것을 골랐다. 어찌보면 구글 로고의 첫 글자를 연상시킬지도 모르지만 전혀 의도한 바는 아니다.

GenoGlobe.kr의 로고(링크).

가장 최근의 구글 로고에서 'G'자가 디자인적으로 완벽하지 않다는 논란이 있어서 이를 소개해 본다. 글 제목은 별로 마음에 들지 않는다.

논란의 'G'! 구글 로고 변경의 G 로고 디자인은 '실수' 범벅이다? 아니다? 정답은!


파비콘은 몇 번을 새로 만들었는데 썩 마음에 들지는 않는다. 기본 개념은 GenoGlobe의 'G'에 이중 나선을 결합한 것이다(링크).

아마도 올해 안에 GenoGlobe.kr로 내 블로그를 완전히 이전하게 될 것 같다. 그 이후에는 GenoGlobe.com 도메인을 더 이상 유지하지 않는 것도 비용 절감 차원에서 고려해볼 수 있으나, 나의 통일된 '브랜드' 유지 차원에서 그냥 둘 수도 있다.