2022년 6월 24일 금요일

KMB 2022 학회 마지막 날 받은 뜻밖의 포스터 발표 장려상

한국미생물·생명공학회 국제학술대회 삼 일째 접어드는 날 아침, 발표를 듣고 있는데 갑자기 모르는 번호로부터 전화가 왔다. 포스터 발표 수상자로 선정되었으니 혹시 폐막식 때 상을 받을 수 있느냐는 것이었다. 학회 마지막 날이라서 수상자가 벌써 자리를 뜬 것은 아닌지 미리 확인하기 위함이었다.

고등학교를 졸업한 후로는 상을 받을 일이 거의 없었다. 대부분 대학원생이 포스터 발표자로서 상을 받게 되는데 머리에 허옇게 서리가 내린 중견 연구자가 포스터 발표자로 상을 받다니... 한국연구재단의 안내에 의하면 중견 연구자는 박사 학위 취득 후 10년이 경과한 사람이다. 이러한 기준을 따른다면 나는 박사 학위를 받은 뒤 무려 25년이 지났다. 정부출연연구소 소속 기준으로 정년 퇴직이 10년 미만으로 남았다.


시상식 사회를 보던 연세대 반용선 교수로부터 '수상자 중에 나이가 많은 분도 계시네요'라는 농담 섞인 말을 들으며 학생들 틈에서 쑥스럽지만 상장을 받았다. 수십 명의 수상자가 한꺼번에 단상에서 사진을 찍을 때에는 학회장 이정기 교수님의 배려로 바로 곁에 설 수 있었다. 쑥스럽고도 유쾌한 추억을 하나 남기게 되었다. 혹시 나를 잘 아는 포스터 심사위원의 '장난(?)'은 아니었을까 하는 생각도 하면서.

첫날 개회사를 하시던 학회장 이정기 교수님.

보통 학술대회 포스터라면 대학원생이나 연구원이 실험한 결과를 정리하여 직접 포스터를 작성하여 저자 이름 중에서 맨 앞에 위치하게 되고, 현장에서 발표를 진행한다. 그리고 전 과정을 지도 감독한 지도 교수가 맨 뒤에서 교신 저자로 자리잡게 된다. 이번에 상을 받은 내 포스터는 다른 연구원이 만든 실험 결과를 넘겨받아 생명정보학적 분석을 실시하여 내가 직접 포스터를 만들었다. 기본 가설을 세우기 위하여 NCBI에서 천 개 이상의 미생물 유전체 서열을 다운로드하여 분석 결과를 만들기도 하였다. 포스터를 만들자고 제안한 것도 나였고, 저자 목록의 중간을 차지하던 연구원과 UST 학생은 나의 동료일 뿐이다. 나는 그 동료들을 지도한다고 생각해 본 적이 한 번도 없고, 그 UST 학생의 지도 교수도 아니다. 보통의 대학에서 연구 활동이 벌어지는 구조와는 사뭇 다르다. 물론 내가 일하는 곳은 UST 캠퍼스의 하나인 것은 맞지만, 내가 2018년부터 2년 동안 기업 파견을 다녀오면서 UST 겸임교원을 그만 둔 이후 재임용 신청을 하지 않았다.

아직까지는 내가 제1저자로서 논문이나 포스터를 쓸 수 있다는 것에 대해 자부심을 느끼고 있다. 그러나 후학을 양성하여 그들로 하여금 좋은 연구를 하게 만들고 연구 과제 등을 통해 아낌없는 서포트를 하는 것이 현 시대가 필요로 하는 진정한 '중견 연구자'의 모습이라는 생각이 많이 든다. 물론 후배 연구자를 키워나가는 방법은 대학과 정부출연연구소가 매우 다르다. 이전부터 존재하던 학연 제도, 그리고 UST라는 비교적 최근에 만들어진 제도를 통해서 정부출연연구소는 대학의 형식을 따라가려고 애를 쓰지만 결코 같아질 수도 없고, 같아져서도 안 된다. 나는 이렇게 '잘 만들어진' 제도를 제대로 이용하지도 못했으며, 나를 돋보이게 애를 쓰지도 않았고, 그저 자유로운 영혼으로 연구를 즐기며 살아왔던 것 같다. 사람들을 규합하고 큰 일을 꾸미는 능력, 추진력, 그리고 내가 아무리 독학으로 따라잡으려 애를 써도 잘 되지 않는 (bio)informatics 분야의 분석 결과를 수월하게 쏟아내는 연구자들의 발표를 2박 3일 동안 들으며 과연 나는 어떤 경쟁력을 갖추고 이 분야의 발전에 기여를 할 수 있을지 많은 반성을 하였다. 아니, 단 한 점이라도 의미 있는 흔적을 남길 수 있었으면 좋겠다.

1,800명 정도가 사전 등록을 한 대규모의 학술행사를 성공적으로 마치기 위해서 애를 쓴 학회 관계자와 봉사자, 그리고 후원 업체들에게 이렇게 개인 블로그로나마 고마운 마음을 전한다.

태평양 건너편의 해외 석학이 온라인으로 실시간 기조 연설(plenary lecture)을 하고 있다. 오디오 상태도 매우 완벽하였다. 참으로 놀라운 세상이다. 


굿바이, HICO!


2022년 6월 22일 수요일

경주에서 완성한 Roary 매뉴얼

제49회 한국미생물·생명공학회 국제학술대회 및 정기학술대회에 참석하기 위해 경주화백컨벤션센터(HICO)를 찾았다. 본격적인 장마를 하루 앞두고 무척이나 덥고 습한 날씨가 기승을 부리고 있었다.

HICO 앞마당에서.

EMBL Peer Bork 박사의 발표 "Analyzing Microbiomes for Human and Plenatary Health" 이렇게 좋은 아이디어를 갖고서 대규모 연구를 하니 우리는 뭘 하지?

이번에 받은 가방은 마음에 든다. HICO에서 실시하는 설문조사에 응하고 휴대폰 거치대를 얻었다.

일정을 조금 일찍 마치고 숙소로 돌아와서 쉬면서 위키 사이트에 수일 동안 써 오던 Roary 설명서를 완성하였다. Pan genome analysis pipeline인 roary는 2015년에 논문으로 공개된 뒤 지금은 거의 업데이트가 이루어지지 않는다. 그도 그럴 것이 더 이상 개선할 여지도 없다고 생각한다. Roary는 내가 가장 즐겨 사용하는 생명정보학 프로그램 중 하나이지만, 그 기능을 완벽하게 이해하는 것도 아니었다. 별도로 Word 파일로 만들어서 계속 수정해 나가고 있는 나의 유전체 분석 매뉴얼에서 roary는 매우 큰 비중을 차지하고 있으나 늘 부족함을 느끼고 있었다. 위키 사이트에 작성한 매뉴얼은 아예 이 Word 파일을 참조하지 않고 거의 새로 쓰다시피 하였다. 정확하게 말하자면 방문자를 위한 친절한 입문서는 전혀 아니다.

Roray는 GFF3 파일을 대상으로 pan genome(core + accessory)를 계산하여 매우 다양한 형태의 결과 파일을 만든다. 부속 스크립트를 이용하여 각종 수치를 시각화해 주기도 하고, 유전체(구체적으로는 GFF3 파일) 단위의 operation을 할 수도 있다. 기본적으로 gene cluster ID를 반환하지만, 아미노산 서열을 뽑아내는 것도 가능하다. 내가 만든 매뉴얼의 후반부에서는 roary 결과물을 이용하여 GFF3 파일로부터 지정된 cluster ID에 해당하는 유전자의 염기서열을 추출하는 방법을 설명하였다. 이는 roary 자체 및 부속 스크립트의 기능으로 해결되지 않는다.

매뉴얼을 작성하면서 CSV(comma-separated values) 파일을 다루는 유틸리티 중 하나인 csvkit를 알게 되었고, 'seqkit grep' 명령어를 사용하여 ID의 정규 표현식에 의한 서열 추출 방법도 익히게 되었다. Lorance Stinson의 AWK CVS parser는 상당히 도전적인 과제가 될 것이다. AWK를 복잡한 스크립트로 쓰는 것도 모자라서 함수까지 만들어 사용하다니! xsv는 csvkit보다 더 나아 보이는데, 내가 아는 리눅스 시스템에서 설치하기가 조금 까다롭다. Nix/NixOS? Rust? Cargo? 이것이 다 무엇인가? 우분투 22.04 LTS에서 xsv를 설치해 보니 희한한 곳에 binary를 만들어 놓는다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
$ sudo apt install cargo
$ cargo install xsv
...
  Installing /home/hyjeong/.cargo/bin/xsv
   Installed package `xsv v0.13.0` (executable `xsv`)
warning: be sure to add `/home/hyjeong/.cargo/bin` to your PATH to be able to run the installed binaries
$ ~/.cargo/bin/xsv
xsv is a suite of CSV command line utilities.

Please choose one of the following commands:
    cat         Concatenate by row or column
    count       Count records
    fixlengths  Makes all records have same length
    flatten     Show one field per line
    fmt         Format CSV output (change field delimiter)
    frequency   Show frequency tables
    headers     Show header names
    help        Show this usage message.
    index       Create CSV index for faster access
    input       Read CSV data with special quoting rules
    join        Join CSV files
    sample      Randomly sample CSV data
    search      Search CSV data with regexes
    select      Select columns from CSV
    slice       Slice records from CSV
    sort        Sort CSV data
    split       Split CSV data into many files
    stats       Compute basic statistics
    table       Align CSV data into columns

Roary 말고도 몇 가지 주제에 대한 매뉴얼 작성 거리를 머릿속에 쌓아두고 있다. 너무 늦어지지 전에 해결해야 되는데...



2022년 6월 17일 금요일

학술논문 출판에서 scooping을 어떻게 막을 것인가? - ASM Journal의 새로운 정책

구글에서 영단어 'scoop'의 정확한 의미를 찾아 보았다. 국어에는 이것과 정확히 일치하는 낱말은 없다.

팝콘이 담긴 스쿠프 사진은 Pixabay에서 내려받은 것(Pixabay license - free for commercial use)


공들여 연구한 내용을 학술논문으로 정리하여 이제 막 투고를 하고 심사 중인데, 별안간 같은 주제의 논문이 다른 학술지에서 먼저 발표된다면 이처럼 맥이 빠지는 일은 없을 것이다. 대부분의 경우는 우연의 일치일 것이다. 생명과학 분야에서 한창 떠오르는 주제라면 이를 연구하는 사람이 전 세계에 어디 나 혼자뿐이겠는가? 어떠한 아이디어를 확인하기 위해 A라는 모델 생명체에서 연구를 진행하여 논문을 투고하고 심사 과정에 있는데, 다른 연구팀에서 동일 또는 유사한 주제를 B라는 모델 생명체에서 연구하여 오늘 갑자기 논문을 출판했다고 치자. 이러한 사실을 리뷰어가 알게 되면 내 논문이 무사히 출판될 가능성이 적어질 것이 자명하다. 

어디서 주워 들은 이야기를 하나 소개해 본다. 리뷰어가 투고자 A의 논문을 유난히 오랫동안 심사를 하면서 시간을 끌고, 그 사이에 그 논문의 아이디어를 이용하여 리뷰어 자신(혹은 잘 알고 지내는 다른 연구자?)이 별도로 실험을 진행하여 재빨리 논문을 먼저 낸 다음, 비슷한 연구 결과가 이미 발표되었으니 A의 논문을 출판에 적합하지 않다고 거절하는 것이다. 이는 사실 범죄에 가까운 행위이다. 실제로 이러한 일이 얼마나 존재하는지는 모르겠으나, scoop의 아주 나쁜 사례이다. 대부분의  scooping은 경쟁적인 연구 분야에서 우연의 일치로 벌어지는 것으로 보아야 할 것이다.  

ASM(American Society for Microbiology)에서 New Scooping Protection Policy라는 제목의 이메일을 보냈다. 이 정책과 관련된 웹사이트는 이곳이다. ASM 학술지에 투고를 한 경우, 그보다 앞서 6개월까지 유사한 논문이 발표되거나 preprint로 공개되었는지를 점검해 준다는 것이다. 어찌보면 이는 논문 투고를 준비하는 저자가 사전에 꼼꼼히 점검해야 할 일인지도 모른다. 이 정책을 음미해 보자면 투고자를 위해 scooping을 방지해 주는 것이 아니라, 아주 최근에 이미 다른 연구자에 의해서 논문으로 공개된 것과 유사하거나 일치하는 연구 결과를 ASM에 또 투고하는 헛짓거리를 하지 말라는 것 아닌가?

이는 저자를 scoop에서 보호하는 것이 아니라 저널을 보호하기 위한 정책에 더 가까워 보인다. '누가 가장 먼저 했는가?'는 학문 분야뿐만 아니라 모든 분야에서 누구나 다 중요하게 여기고 기억하는 기준이 된다. A라는 저널에 어떤 연구 결과가 먼저 발표되고, 뒤이어서 B라는 저널에서 이와 유사한 것이 발표된다면(B에 논문을 투고한 저자나 리뷰어 모두 A 저널에 유사한 연구 결과가 앞서서 발표된 것을 미처 모르는 상태에서), A 저널에 실린 논문의 인용 가능성이 더 커진다. 임팩트 팩터 또는 여러 가지 지표료 매겨지는 학술지의 순위에서 A << B가 아니라면 말이다.

누구나 쉽게 정보를 찾아볼 수 있는 시대가 되었으므로 '미처 모르고 있었다'라는 변명을 하기는 점점 더 어려워진다. 나의 독창성을 검증하기 위해 미리 검토해 봐야 할 정보의 범위가 너무나 넓어지고 있으니 삶의 피로도 역시 높아진다.

2022년 6월 16일 목요일

로드 자전거의 튜브 상태가 예사롭지 않다

모름지기 기계나 도구는 쓰지 않으면 망가진다. 사람이 살지 않는 집이 금방 망가지는 것처럼. 자전거도 예외가 될 수 없다. 저녁에 집 근처 1 km 정도 떨어진 식당에서 모임이 있어서 차는 집에 세워두고 오랜만에 자전거를 타고 1 km 정도를 이동해 보려고 계획하였다. 펌프를 집어들고 바람을 채우는데 공기가 새는 소리가 들린다. 앞바퀴는 타이어 옆면에서, 뒷바퀴는 밸브 근처에서...

아마 튜브가 팽창하지 않은 상태로 몇년을 방치하다 보니 튜브가 눌리고 접힌 곳에 손상이 발생한 것 같다. 대부분은 수선 가능하지만, 밸브 근처에서 튜브가 뚫리면 손을 쓸 수가 없다. 어쩌면 앞뒤 튜브를 전부 교체하는 것이 현명할 것이다. 

브레이크 선의 당김을 해제하고, 휠을 분리하고(QR이라서 어렵지는 않음), 타이어를 힘겹게 분리하고, 튜브를 교체하고... 손에 시커멓게 기름때를 묻혀가며 작업할 생각을 하니 벌써부터 한숨이 난다. 어휴...

일단 교체용 튜브를 몇개 구입해 놓는 것에서 출발하자. 

2022년 6월 10일 금요일

펄(Perl) 뻘짓 - pod를 이용한 펄 스크립트의 매뉴얼 작성

Pod(plain old documentation format, 링크)를 이용하여 펄 스크립트의 도움말을 만들어 보았다. Pod는 펄 프로그램이나 모듈의 documentation에 쓰이는 간단한 마크업 언어이다. 코드 내부에 문서를 직접 작성한다는 것이 특징인데, 코드가 아닌 텍스트 정보만을 저장한 .pod 파일을 만들어 활용할 수도 있다. 순수한 pod 문서의 사례는  리눅스 배포본이라면 다 갖고 있을 /usr/share/perl5/pod/perlpod.pod 파일(펄 안내서)을 참조하면 된다. 이 파일을 확인하려면 리눅스 명령행에서 'perldoc perlpod'를 입력하자. 이 문서(perlko)의 한글판은 여기에 있다.

코드 내부에 작성해 넣는 문서는 어떤 용도인가? 당연히 그 코드의 설명을 위한 것이다. 가령 펄에서 '#'로 시작하는 줄(주석)은 인터프리터가 해석하지 않고 지나가므로, 코드의 특정 부분을 설명하는 용도로 쓰인다. 그러나 이러한 방식의 정보는 코드를 텍스트 편집기로 열어야만 보인다. Pod는 코드 안에 작성되지만 실행을 통해서 화면에 일정한 형식을 갖추어 보기 좋은 형태로 뿌려진다. 따라서 코드의 설명서를 별도로 작성하는 수고를 덜어준다. 한글 Perl Maven 웹사이트의 Pod 소개문을 읽어 보면 개념을 잡는데 도움이 될 것이다.

요즘 가장 인기 있는 마크업 언어는 아마도 간단하고 문법이 쉬운 경량의 Markdown이 아닐까 한다. LaTeX도 마크업 언어의 일종으로 간주된다. 생명과학 전공자로서 LaTeX으로 학위논문을 썼던 나도 상당한 수준의 '뻘짓러'가 아니었을까? 도대체 왜 그랬었지?

엇, perlko 문서의 저자에 '신정식'이란 이름이 보인다. 현재 구글의 소프트웨어 엔지니어로 일하는, 내가 아는 그 Jungshik Shin이 맞을 것이다. 그는 인터넷의 한글화에 큰 공헌을 했던 것으로 알고 있다. Nerd와 Geek가 득실거렸던 대학교 1학년 때의 기숙사가 생각난다. 신정식과는 몇 개의 수업을 같이 들었었던 것 같다. 

펄 스크립트 또는 모듈 내에 심은 pod 문서를 보려면 'perldoc <script명>'을 입력하는 것이 일반적이다. 그러나 도움말을 보기 위하여 다른 명령어를 또 불러야 한다는 것이 성가시다. 그래서 명령행에 인수가 없거나 혹은 '-h' 또는 '--help'라는 단일 인수가 주어졌을 때 내부적으로 'perldoc <스크립트>'를 실행하여 스크립트 내에 심어놓은 도움말이 출력되게 하였다. 명령어 바로 뒤에 연달아 입력하는 문자열을 option, switch, flag, argument 등으로 세분해야 한다고 믿는 사람도 있겠지만, 그건 별로 중요하지 않다.


Pod 공식 설명 문서만으로는 그 문법을 이해하기가 어려워서 Bio::Seq.pm을 편집기로 열어서 실제 사례를 참조하였다. Bio::Seq 파일의 위치를 알고 싶다면 다음과 같이 입력한다. Bio와 Seq 사이의 연속된 콜론 두 개는 디렉토리('/')를 의미한다. 따라서 Bio::Seq.pm 모듈 파일의 실제 이름은 Seq.pm이다. 'perldoc -l Bio::Seq.pm'이라 입력해도 결과는 같다.

$ perldoc -l Bio::SeqIO
/usr/local/share/perl5/Bio/SeqIO.pm

기술 문서를 마크다운으로 배포하는 것은 이상할 것이 없지만, 요즘 분위기에서는 pod 파일로 배포하기는 적합하지 않다. 그저 펄 스크립트 내에 심어서 설명 용도로 쓰는 것이 최선일 것이다.


2022년 6월 16일 업데이트

Bash 스크립트 내에 POD-like documentation을 삽입하는 방법도 있다. 매우 유용한 팁이 아닐 수 없다. 다음에 소개할 문서는 2007년에 작성된 매우 오래된 것이다.


그런데 O'Reilly에서 발간한 Bash Cookbook에도 이미 Embedding Documentation in Shell Script라는 문서가 있다. 여기에서는 스크립트 내에서 =pod라는 태그를 쓰지 않는다. 두 문서 모두 연구해 볼 만한 가치가 있다.

2022년 6월 9일 목요일

뻘짓의 지평을 넓혀야 인생이 풍부해진다 - 자전거 이야기

'뻘짓'은 허튼짓을 뜻하는 전라남도 사투리라고 한다. 결코 비속어가 아니다. 비슷한 의미의 낱말로 '삽질'을 떠올리게 되는데, 근원이 불확실하여 별로 쓰고 싶지 않다.

젊어서 철이 없을 때 되도록 많은 뻘짓을 해 봐야 한다. 그러면 나중에 나이가 들어서 '뻘짓'을 재발견하면서 새로운 재미를 느끼게 될 것이다. 뻘짓은 창조적 정신의 원천이다! 내가 경험했던 다양한 뻘짓 중에 자전거 관련 취미가 있다. 2000년대 초반에 출퇴근 길에 열심히 달렸던 자전거가 복도 계단에 자물쇠로 묶인 상태로 벌써 몇년이 흘렀는지 기억이 나지 않는다. 자전거에 관한 이야기는 구글 블로그를 쓰기 전, 네이버에서 운영했던 블로그(2005-2015)에 대부분 존재한다. 네이버 블로그는 중간에 한번 탈퇴를 거치는 바람에 PDF 백업본 파일로만 남았다.

자전거 감옥. 약 10년 째 수감 중? 바람이 빠진 타이어는 옆면에 균열이 보이기 시작했고 계단에 눌린 상태라서 아마 내부의 튜브도 유착이 발생했을 것이다.

휘발유 가격도 크게 올랐고, 평소에 운동을 거의 하지 않는 나의 생활 습관을 그대로 두고 볼 수는 없어서 다시금 자전거 출퇴근에 관심을 가질까 생각한다. 매일은 어렵더라도 일주일에 두 번 정도라는 목표를 세우고 다시 습관을 들이고자 한다. 출근길은 편도로 약 9 km. 자전거를 한창 타던 시절에는 일부러 KAIST쪽으로 돌아가는 편도 11 km의 코스를 비가오나 눈이오나 매일 달렸었다.

나의 자전거는 생활형 로드 자전거(삼천리 랠리)이다. 한때 유명했던 입문 수준의 로드 자전거 랠리가 아니란 뜻이다. 일명 '도싸' 그리고 '발바리'로 알려진 커뮤니티에서 무료·중고 부품을 구입하여 순전히 재미로 조금씩 업그레이드를 하여 지금에 이르렀다. 브레이크 레버는 Cane Creek(신품), 뒷디레일러는 알리비오, 크랭크셋과 BB는 캄파뇰로... 겨우 2 x 6(카세트 스프라켓이 아니고 프리휠!)단 구식 기어에 퀼 스템에 고정하는 변속레버를 쓰는 주제에 온갖 기괴한 조합의 부품을 갖다가 붙였다. 리어 액슬은 거저 얻은 부품을 이용하여 QR용으로 바꾸었다.



내 자전거의 가장 아름다운 모습은 바로 크랭크셋에 있다. 휠셋은 로드 자전거의 표준인 700C가 아니고 '구식 사이클'에 널리 쓰이던 27인치이다. 내기억이 맞다면 ISO 630 규격이다. 

이탈리아에서 온 캄파뇰로!

 

개인이 할 수 있는 자전거 정비와 부품교체도 해 보지 않은 것이 없을 정도로 경험을 쌓았었지만 10년 가까이 이 '뻘짓'을 잊고 살았더니 이제는 기억이 잘 나지 않는다.

이것이 전부가 아니다. 나에게는 700C 통타이어(tubular tire)용 휠세트도 한 조 있다. 7단 카세트를 달고 있는 뒷쪽 휠의 허브를 살펴보면 현 울테그라의 전신인 Shimano 600'이라는 마킹이 보인다. 이 휠셋을 쓰기 위하여 트랙 경기 후 벗겨낸 튜블러 타이어를 싸게 팔던 것을 커뮤니티 회원과 한번에 구입하여 나눈 일도 있었으니... 겨우 하루에 20 km 남짓한 거리를 달리면서(주말 장거리 주행은 해 본 일이 없음) 부품 교체 장난질은 왜 이렇게 많이 하였는지, 지금 생각하면 정말 뻘짓이 맞다. 

하루에 20 km를 달리면서 출퇴근을 했다면 매주 100 km요, 세 달이면 1,000 km가 넘는다. 몇 년 동안 이 짓을 했으니 따지고 보면 적은 주행 거리는 아니다.

다시 자전거 출퇴근을 개시하려면 고칠 것이 많다. 이것 말고도 미니벨로가 하나 더 있는데, 타이어의 현 상태는 더욱 열악하다.

나에게 인터넷을 통해 자전거에 대한 엄청난 지식을 선사했던 전설적인 자전거 미캐닉 고 Sheldon Brown(1944-2008)에게 경의를 표하는 바이다. 구글 검색창에서 Sheldon Brown 또는 '셸던 브라운'을 입력하면 영문 위키피디어에서 자동으로 번역된 정보 말고는 한글로 된 정보가 전혀 나오지 않는다. 

뻘짓의 재발견은 계속된다. 다음 순서는 아마도 천체 망원경이 아닐런지...

[Perl] 텍스트 파일을 'chunk' 단위로 읽어들이기

chunk는 '큰 덩어리'라는 뜻이다. Perl을 이용하여 텍스트 파일을 읽어들일 때, 보통은 while 루프를 이용하여 줄 단위로 하나씩 읽어서 순차적으로 처리하게 된다. 그러나 어떤 분리자를 경계로 하여 구분된 여러 라인의 덩어리를 단위로 삼아서 변수로 읽어들이고 싶을 때도 있을 것이다. 예를 들어서 EMBOSS primersearch 프로그램의 결과 파일을 살펴보도록 하자. 다음에 보인 그림은 9개 프라이머쌍의 정보를 담고 있는 파일을 이용하여 하나의 FASTA file을 뒤져 amplimer를 탐색한 결과이다. 인간이 읽고 이해하기에는 쉽지만, 컴퓨터로 하여금 결과를 집계하도록 만들려면 매우 불편하다. 특히 수백 혹은 그 이상의 FASTA file에 대하여 primersearch를 돌렸다고 가정해 보자. 


언제 어떻게 활용될지 몰라서 프라이머 염기서열은 일단 가렸다. FASTA 파일 하나에 대해서 하나의 결과 파일을 쓰게 할 수도 있고, 여러 FASTA 파일에 대한 탐색 결과를 하나의 결과 파일에 몰아서 기록할 수도 있다. 후자의 방법을 이용하려면, 결과 파일 내에 입력 FASTA 파일에 따른 구분자를 넣을 수도 있다. 여러 FASTA 파일에 대한 탐색 결과를 처리하는 더 미련하고 복잡한 방법도 얼마든지 고안할 수 있다.
  

한 쌍의 프라이머에 대한 amplimer 탐색 결과는 빈 줄("\n\n")을 경계로 다른 결과와 구분된다. 바로 이것이 하나의 chunk이다. 이를 구현하기 위한 힌트는 StackOverflow의 Grabbing Chunks of Data from File in Perl에서 얻었다.

local $/ = "\n\n";

open LOG, $ARGV[1];
while ( $chunk = <LOG> ) {
   # do something on $chunk
}

결국은 "\n"을 경계로 하여 $chunk 변수를 분할하여 세부적인 작업을 해야 된다. 그러나 이렇게 하는 것이 편한 이유는, chunk 단위가 하나의 프라이머 쌍에 대한 '모든' amplimer 예측 결과에 해당하기 때문이다. 

Multi-record GenBank 파일은 '//'로 개별 단위가 분리된다. 오늘 알아본 방법을 통해서 GenBank 파일을 chunk 단위로 처리할 생각은 '1'도 없다. chunk 내의 구조가 워낙 복잡하기 때문이다. 꼭 필요하다면 csplit 유틸리티를 써서 각 레코드를 물리적인 파일로 나누어 버리는 것이 더욱 현명하다. 다음은 실제 응용 사례이다. 코드가 약간 난해하다! 아니, 난해할 것은 없다. 파일 분리자로 사용할 '//'를 정규표현식으로 나타낸 것에 불과하다. 맨 뒤의 '{*}'가 어떤 의미인지 알기가 좀 어렵다. csplit의 매뉴얼에 의하면 'repeat the previous pattern as many times as possible'이다. 'find ... -exec' 명령어에서 맨 뒤의 '\;'도 이해하기 쉽지는 않다. Bash 환경에서 {}, (), \, ; 등이 나오면 본능적으로 긴장을 하게 된다.

csplit --prefix=test ../genome.gbk '/^\/\/$/' '{*}'

리눅스 bash 환경에서 출현하는 특수한 문자 중 나를 가장 긴장하게 만드는 것은 바로 GNU parallel 유틸리티의 고급 용법이다...

BLAST parser 따위는 제발 짜지 말라는 글(Mad Scientist)이 기억났다. 과거에 BioPerl을 이용하여 human readable 형태의 BLAST 결과 파일을 파싱하는 코드를 짰던 적은 있다. 그 이후에 Zerg를 한동안 사용했었다. 잠시 추억에 젖어서 찾아보니 Zerg는 2003년에 나온 프로그램이다(논문 링크). 지금은 tabular output을 지정하면 되니 되므로 특별히 parser를 쓸 필요가 없다. Alignment를 반드시 눈으로 봐야 한다고 고집하지 않는다면 말이다. 2000년대 초반의 blastall 프로그램이 tabular output을 제공하지 않았었던가? 기억이 나지 않는다.

이러한 명령행 환경의 자료 조작 업무를 이제는 전부 Python으로 대체해 나가야 할까? 장기적으로는 그것이 정답일 수 있는데, 자꾸 손은 Perl Cookbook을 향하고 있으니...

2022년 6월 8일 수요일

세상은 넓고 공부할 것은 많으며 들을 음악도 많다

넷플릭스를 뒤적거리다 <영광의 깃발(원제: Glory)>이라는 1989년도 미국 영화를 보게 되었다. 남북전쟁에서 흑인들로만 구성된 부대(제54매사추세츠 의용보병연대)와 그 지휘관인 실제 인물 로버트 굴드 쇼(Robert Gould Shaw, 1837-1863)의 이야기이다. 노예 신분을 갓 벗어난 흑인들이 - 노예 제도를 허용하지 않던 북부에 살아서 그랬을 수도 있고, 남부에서 노예 생활을 하다가 탈출한 상태였을 수도 있음 - 군대에 자원해서 실제 전투에 가담한다는 것은 당시로는 매우 획기적인 일이었을 것이다. 영화의 마지막을 장식하는 와그너 요새 공격에서 비록 대패하였지만, 이들의 용맹은 더 많은 흑인이 남북전쟁에 참전하게 만드는 계기가 되었다고 한다. 전 부대원이 가로로 길게 늘어서서 전혀 엄폐도 하지 않은 채 적진을 향해 일제히 총을 쏘는, 매우 위험하고 비능률적인 전투 대형을 보고 의아하게 생각하다가 이 전쟁이 미국인들에게 어떤 의미를 갖는지 찾아보게 되었다. 1·2차 세계대전과 6·25 전쟁에 참전했던 미군보다 더 많은 사람이 남북전쟁 때 희생되었다고 한다. 그럼에도 불구하고 이 전쟁은 하나의 미국을 만들어 나가는 값진 전쟁으로 미국인들 가슴 속에 남아 있는 것 같다.

로버트 굴드 쇼와 매사추세츠 54연대 기념 부조. 출처: 미국 National Park Service.

남북전쟁에서 큰 전환점이 되었던 게티즈버그 전투(1863년)을 재연하는 행사는 지금도 인기가 있는 것 같다. 행사 참가자는 북군이든 남군이든 원하는 역할을 맡을 수가 있다. 그런데 만약 우리가 6·25 전쟁의 특정 전투를 재현하는 행사를 갖는다면? 결국 이 전쟁을 통해 어느 쪽으로든 통일이 이루어지지 않았기 때문에, 북한군의 역할을 맡고 싶은 '한국인'은 아무도 없을 것이다. 미국의 남북전쟁 재연 행사가 백인 중심의 시각으로 재구성된 역사를 미화하는 일이라는 비판도 있다고 한다.

미 남북전쟁 재연행사 "역사 보존" vs "백인중심 추종" 논란(2019년 6월 25일 한경 기사 링크)

앞으로 보름 남짓이면 6·25 전쟁 발발 72주년을 맞지만, 아직도 이 전쟁의 원인과 성격에 대해서 완벽한 정의를 내리기가 어렵다. 심지어 모스크바 3상회의에서 한반도의 신탁통치에 관한 결론이 당시 국내에 잘못 보도되었다는 것도 최근에야 알게 되었다. 소련이 신탁통치를, 미국은 즉시 독립을 주장했다는 국내 신문사의 보도는 완전한 오보였다고 한다. 이것이 단순한 오보인지, 혹은 어떤 정치적인 의도를 가지고 일부러 사실과 다르게 보도했는지는 알 수가 없다. 이 잘못된 보도로 말미암아 국내에는 맹렬한 반탁운동이 일어나게 되었고, 결과적으로는 분단의 고착과 나아가서는 동족 상잔의 비극인 6·25 전쟁까지도 이르게 된 것이다.

동족 상잔이라는 면에서 미국의 남북전쟁이나 한반도의 6·25 전쟁은 다를 것이 없다. 그런데 왜 전자는 하나의 국가를 만들어 나가는 성장통이었고, 후자는 있어서는 안될 비극이자 그로 인한 서로간의 적대감을 아직까지 해소하지 못한 상태로 갖고 있어야 하는가? 전쟁이 끝난 뒤 흐른 시간이 달라서? 통일이 이루어지지 않았기 때문에?

6·25 전쟁을 제대로 아는 것이 아직도 쉽지 않다. 내전인가? 강대국 사이의 대리전인가? 일제에 나라를 빼앗기고 급변하는 세계 정세에 자주적으로 준비하지 못한 우리의 책임은 없는가? 2014년 프레시안에 실렸던 기사 '6·25 전쟁'도, '한국전쟁'도 틀렸다를 매우 흥미롭게 읽었으나 링크 접속이 현재 원활하지 않아서 유감이다.

국가 사이의 갈등이 가장 폭력적으로 표출되는 것이 바로 전쟁이다. 역설적으로 전쟁은 새 질서를 만들기도 하고 기술의 극적인 발전을 유발하기도 한다. 또 어떤 사람들에게 전쟁은 둘도 없는 비즈니스 기회가 된다. 그렇다고 하여 전쟁을 장려할 수는 없는 노릇이다. 폭력이라는 인간의 내재적인 속성을 잘 다스려서 이를 전쟁이 아닌 다른 방식으로 승화해야 한다.

두 번째 주제인 음악 이야기로 넘어가자.

음악을 꽤 좋아하면서도 '이러한 거물 음악가를 아직 모르고 있었단 말인가?'하는 생각이 들 때가 많다. 유튜브를 통해 미처 몰랐던 곡을 들으며 감동에 빠지다가도, 내가 참으로 체계 없이 음악을 듣고 있었다는 자괴감 비슷한 것을 느낄 때가 많다. 칼라 블레이(Carla Bley)라는 1936년생 재즈 뮤지션을 알게 된 것은 불과 이틀 전. 그녀는 2018년 자라섬 재즈 페스티발에 참여하기도 하였다.

Carla Bley(사진 출처 링크)

"니 칼라 블레이 들어봤나"...90년대 음악애호가들의 단골멘트(매일경제 2021년 1월 9일 기사 링크)

(1987년 앨범 'Sextet'에 담긴 'Lawns'라는 곡은) 이후 이 곡은 음악 좀 듣는다는 뮤지션들이 라디오 음악 방송에 나와서 '이 곡 잘 모르셨죠'하는 느낌으로 소개하는 대표곡이 됐다.

다음 유튜브 동영상은 Carla Bley와 Steve Swallow의 <Lawns> 연주이다. 그렇다! 난 이틀 전까지 이 곡을 들어 본 일이 없었다. 존 콜트레인은 알면서 칼라 블레이를 모르면 무식한 건가? 아직도 찾아 들을 새로운 음악이 많다는 것을 오히려 다행으로 여기자.

 


2022년 6월 5일 일요일

계룡산 오르기(삼불봉)

지나친 운동부족 상태로 나이만 먹어가는 것은 옳지 않다는 생각이 들어서 아내와 함께 계룡산을 조금씩 올라가 보기로 했다. 늘 계룡산 사찰(동학사, 갑사, 신원사)과 근처 물가만 맴돌다가 지난주 은선 폭포를 시작으로 이번 주는 삼불봉에 도전하였다. 변변한 등산복이나 모자도 없는 상태에서 갖고 있는 것이라고는 경등산화 한 켤레가 전부였다. 혹시나 싶어서 쿠팡에서 최저가 등산스틱을 구입하였는데 정말 큰 도움을 받았다.

싸구려 등산스틱은 무겁고, 크고, 길이 조절이 불편하다. 손잡이 부분을 이루는 플라스틱에서는 왜 이렇게 유기용매 냄새가 나는지... 환경 호르몬이 풀풀 배어 나오고 있을 것이다. 그래도 이번 삼불봉 등산에서는 큰 몫을 했다.

우리는 등산스틱이라고 부르지만 영어권에서는 trekking pole이라고 부른다. '등산'은 하이킹(hiking), 트레킹(trekking), 그리고 마운티니어링(또는 마운틴 클라이밍 mountaineering or mountain climbing)으로 구분된다. 트레킹이라 해도 보통 이틀 이상의 코스는 되어야 그렇게 부른다고 한다. 저마다 알록달록한 등산복(반대편의 극단에는 레깅스가 있겠다)을 입고 배낭에 음료와 도시락 한끼 분량을 싸서 아침에 출발하여 저녁에 집에 돌아오는 것은 하이킹이다!

6월 4일 등산, 아니 하이킹 코스는 계룡산 동학사쪽 입구의 주차장에서 천정탐방지원센터를 시작으로 남매탑까지 2.8 km를 간 후 삼불봉에 오르는 것을 목표로 하였다. 돌아올 때에는 남매탑에서 세진정으로 곧바로 내려오는 코스를 택했다. 천정탐방지원센터를 기점으로 하면 입장료를 낼 필요가 없어서 매우 유리하다. 계룡산 국립공원 웹사이트(링크)에서 천정코스라고 부르는 이 코스는 남매탑에서 삼불봉으로 가는 편도 0.5km의 샛길을 제외하면 5.8km(3시간), 난이도 '중'에 해당한다.

지난주 은선폭포를 갈 때에는 뙤약볕이 내리쬐는 코스였지만, 이번에는 대부분 숲길이어서 매우 쾌적하게 오를 수 있었다. 여름을 위한 최적의 경로라고 해도 무방할 것이다.

등산은 기다림이다! 걷기 힘들어하는 아내를 조금 앞서 천천히 가면서 기다려 주기. 지난주에 은선폭포를 다녀와서는 장딴지가 아파서 삼사일 고생을 했지만, 이내 회복 후 단련이 되었는지 이번에는 괜찮았다.

큰 바위 앞에서. 전해져 내려오는 이름이 있지 않을까?

삼불봉을 다녀온 직후 남매탑 앞에서. 남매탑의 전설은 역사적 사실일까?

정중앙 바로 오른편의 뭉툭한 봉우리가 관음봉(766m)이다. 우리가 위치한 삼불봉보다 9미터 낮다.

엉덩이 붙일 곳을 찾기 어려울 정도로 비좁은 삼불봉에서.



발끝만 보면서 힘겹게 걷다가 탁 트인 하늘을 바라보는 기분. 이것이 산에 오르는 재미가 아닐까? 단 나이가 나이니만큼 무릎이 망가지지 않게 조심해야 한다.

언젠가는 삼불봉에서 관음봉까지 이르는 자연성릉을 따라 가리라.

남매탑에서 세진정으로 내려오는 길은 생각보다 힘들었다. 특히 남매탑에서 시작하여 첫 쉼터까지 내려오는 약 0.6km의 길은 공식 등산 안내도에도 난이도 4급(총 5급)으로 나와 있을 정도라서 등산 초보에게 쉽지 않았다. 오죽하면 그 길을 올라오는 사람에게 얼마나 더 내려가야 되느냐고 묻고 싶을 지경이었으니까. 사실 이것은 예의가 아니다. 결혼 전에 아내와 함께 이 길을 통해서 남매탑까지 올라갔던 적이 있었다. 그때는 비교적 쉽게 올랐던 것 같은데 생각해보면 돌도 씹어먹을 20대였으니 당연하지 않을까?

어느 경로를 거치든 관음봉까지 가 보는 것이 올해의 목표이다. 나 혼자라면 언제든 가겠지만, 체력이 좋지 못한 아내와 함께 오르려면 연습이 필요하다. 아내를 위해 좀 더 가벼운 등산스틱을 사야 되겠다.

긴 가뭄 끝에 오늘 꽤 많은 비가 내려서 당분간 은선 폭포에는 물이 꽤 많이 흐를 것이다.

바위 한가운데 갈라진 틈에 뿌리를 박고 사는 나무의 생명력이 대단하다.



2022년 6월 3일 금요일

논문을 출판하려면 돈이 많이 든다

논문을 내려면 생각보다 돈이 많이 든다. 연구비(인건비를 포함해야 함)가 기본적으로 들어가고, 논문 원고를 영어로 작성하여 교정을 하는 데에도 적지 않은 돈이 든다. 학술지를 선택하여 투고하면 지난한 검토 과정(review process)을 거쳐서 게재 승인이 떨어진다 해도, 최종적으로 게재료를 납부해야 정식으로 출판이 된다. 게재료는 논문 출판 기관에 따라서 천차만별이다.

논문의 저자 입장에서는 출판을 끝으로 돈이 더 이상 들지 않겠지만, 이를 읽으려는 독자는 돈이 들 수도 있고 들지 않을 수도 있다. 요즘 OA(open access)가 추세라고 한다. 이는 이용자들에게 학술정보, 논문 등을 무료로 개방하는 것이다. 그러나 출판사는 자선사업을 하는 것이 아니므로, OA로 논문을 공개하려면 저자에게 더 비싼 게재료를 내게 한다.

OA가 아닌 경우, 보통은 논문 PDF 파일 하나에 일정 비용을 지불하고 다운로드를 받게 된다. 일반 논문에 비하여 인용 횟수가 높을 것임은 자명하므로, 이에 굴복하여 큰 돈을 지불하도록 결정을 내릴 수도 있을 것이다. 만약 이용자가 소속된 기관이 해당 출판사에 꽤 큰 금액을 연 단위로 지불한 회원이라면, 이용자는 논문 이용료를 개별적으로 내지 않아도 된다. 

최근 국내 학회에서 발간하는 어느 학술지에 논문을 투고하여 심사를 거친 후 게재 승인을 받았다. 공개일자는 바로 어제. 실제 발간은 Springer Nature라는 회사에서 진행한다. 국내 학회에는 50만원의 게재료를 납부한 상태였다. 그런데 Springer Nature에서 온 안내 메일을 보니, OA로 출판하려면 무려 2,900달러를 내라는 것이었다. 납부 증명을 가져오면 국내 학회에서는 이미 냈던 돈 50만원을 돌려준다고 하였다.

2,900달러라니... 임팩트 팩터가 5를 넘는 '고급' 학술지도 아닌데 이렇게까지 할 필요가 있을까 싶어서 OA를 선택하는 것은 포기하였다. 따라서 내 논문의 PDF를 다운로드하려는 이용자는 소속 기관이 이 학술지를 구독하지 않는 경우 34.95유로, 즉 오늘 환율로 약 46,645원을 지불해야 한다. 어제 저널 웹사이트의 latest articles에서 가장 위에 자리잡은 내 논문은 전문이 공개되어 있지만, 아마 조금 뒤면 초록만 공개되는 상태로 바뀔 것이다. 한 저널에 실린 논문이 추가 비용을 냈는지에 따라서 어떤 것은 OA, 어떤 것은 돈을 주고 사서 보는 것으로 운명이 갈린다. 물론 논문을 읽으려는 사람의 소속 기관이 이 저널을 구독하고 있다면 차이가 없겠지만.

게재료가 치솟는 것이 요즘의 추세이다. 예를 들어 한국미생물생명공학회에서 발간하는 Journal of Microbiology and Biotechnology는 올해 3월 1일부터 게재료(article processing charge, 줄여서 APC 또는 출판비)를 무려 120만원으로 인상하였다. 학회 회원에게는 할인이 적용되어 70만원을 받는다. 외국인 투고자는 600달러를 내야 한다. 

논문 게재 실적이 연구자들의 승진이나 연구비 신청 경쟁에서 매우 중요한 근거로 쓰이게 되니 이를 이용하는 비즈니스가 성장하는 것을 막을 길이 없다. 다만 이를 악용하는 약탈적 학술지(predatory journal)가 자꾸 생겨나서 검증하기가 어렵다는 것이 문제이다. 이러한 현실을 비꼰 글 몇개를 인용해 본다.

MPDI나 Frontiers가 약탈적 학술지인가? BRIC 커뮤니티를 보면 이를 묻는 글이 심심찮게 올라온다. 참 판단하기 어려운 문제이다. 해당 출판사에서 만드는 저널이 분야에 따라 수십 개로 나뉘므로 여기에 모두 일률적인 잣대를 들이대기도 어렵고(IF가 있는 것도 있고 없는 것도 있고...), 단지 APC가 비싸다고 해서 모두 주의를 요하는 저널이라고 하기도 어렵다. 내가 몇번 논문을 낸 적이 있는 Frontiers in Microbiology의 현재 APC(링크)는 얼마인가? 여기도 지금은 2,950달러나 하는구나! 참고로 Frontiers 저널 전체에 대해서 나는 지금까지 총 6편의 논문을 실었었다(링크).

오죽하면 국가과학기술연구회 소속 출연연구소에서 Elsevier나 Wiley서 저널에 논문을 출판할 때 APC를 지원하겠는가. 두 회사의 평균 APC가 각각 약 3천달러와 3400달러나 된다. APC가 높은 학술지라고 해서 고급 학술지(소위 IF가 높은..)인 것도 아니니 판단은 논문 저자가 알아서 해야 될 것이다. 

2022년 5월 29일 일요일

WSL에서 우분투 22.04 LTS를 설치하는데 발생한 0x8027025a 오류의 해결

이번 7월에 개최할 예정인 미생물유전체 분석 교육에서는 4월에 배포된 Ubuntu 22.04 LTS를 기반으로 다시 디스트로를 만들어서 사용하기로 하였다. 내가 사용하는 몇 개의 리눅스 컴퓨터에서는 이미 이 디스트로를 설치하여 사용 중이다. Windows Terminal에서 다음의 명령을 실행하면 아직 Ubuntu 22.04 LTS는 보이지 않는다.

> wsl --list --online
다음은 설치할 수 있는 유효한 배포 목록입니다.
'wsl --install -d <배포>'를 사용하여 설치하세요.

NAME            FRIENDLY NAME
Ubuntu          Ubuntu
Debian          Debian GNU/Linux
kali-linux      Kali Linux Rolling
openSUSE-42     openSUSE Leap 42
SLES-12         SUSE Linux Enterprise Server v12
Ubuntu-16.04    Ubuntu 16.04 LTS
Ubuntu-18.04    Ubuntu 18.04 LTS
Ubuntu-20.04    Ubuntu 20.04 LTS

맨 위의 실제로 설해 보면 'Ubuntu'는 20.04에 해당한다. 그러나 Microsoft Store에서는 Ubuntu 22.04 LTS가 있기 때문에 이를 선택하여 설치를 진행하였더니 다운로드 후 설치 과정에서 다음과 같은 에러가 나타나면서 새 사용자명을 넣을 수가 없이 먹통이 되었다.

'???'에 해당하는 영문 메시지는 'The app didn't start in the required time'이다.

구글을 검색해 보니 이미 Ask Ubuntu에 이에 대한 질문과 해결책이 올라와 있었다.

How to fix 0x8027025a error when installing Ubuntu 22.04 LTS on WSL?

레지스트리를 건드리거나 심지어는 WSL1 설치 후 WSL2로 다시 바꾸는 등 너무나 불편한 해결책이 제시되어 있어서 이를 그대로 따라서 하기는 곤란하였다. 위에서 보인 화면에서 Windows Terminal을 강제로 종료한 다음 다시 실행하여 우분투를 기동하면 관리자 권한으로 로그온이 된다. 그래서 Ask Ubuntu의 답변 중 가장 마지막에 나오는 'Manually create user'를 따라하면서 일반 사용자를 추가하여 보았다. 이 방법으로 우분투 22.04 LTS를 설치 완료할 수 있었다. 0x8027025a 오류가 발생하는 근본적인 원인은 아직 이해하지 못하였다. WSL 환경에서 최신 디스트로의 목록을 확인한 다음 'wsl --install -d <distro>' 명령으로 설치할 수 있도록 조만간 개선이 이루어지게 될까? 혹은 이 불편함을 계속 감수해야 될까?

2022년 5월 27일 금요일

[Bash] 연속적인 숫자를 만들기

ZGA pipeline으로 바코드를 단 12개의 nanopore sequencing 결과물에 대한 de novo assembly를 마쳤다. FASTA file은 각 샘플에 대해서 다음의 하위 디렉토리에 존재한다.

zga_flye_barcode01/assembly/assembly.fasta

이를 전부 모아서 하나의 디렉토리(예: target/)에 모으고자 한다. FASTA 파일명이 전부 동일하므로 바코드 번호를 반영하여 변경해야 한다. 01부터 12까지 일련의 숫자를 생성하려면 seq 명령어를 쓰면 된다.

$ seq -w 1 12
01
02
03
..
12

'-w' 옵션은 출력하는 숫자 왼쪽에 자리채움용도의 '0'을 덧대는 용도로 쓰인다. seq는 기본적으로 '\n'을 separatorfh 사용하지만 다른 문자를 지정할 수도 있다. 다음의 명령어를 서로 비교해 보자. seq 명령어를 쓰지 않더라도 { .. } 구문을 사용하여 시작과 끝을 지정한 연속적인 숫자 혹은 문자를 출력할 수 있다.

$ seq -w -s ' ' 1 12
01 02 03 04 05 06 07 08 09 10 11 12
$ echo {01..12}
01 02 03 04 05 06 07 08 09 10 11 12
$ echo {a..z}
a b c d e f g h i j k l m n o p q r s t u v w x y z

seq 명령어를 응용하여 지정된 하위 디렉토리에서 FASTA 파일을 찾은 뒤 각자 바코드명을 붙여 이름을 변경한 뒤 한 디렉토리에 모으는 코드는 다음과 같다. 변수를 좌우에 붙은 문자열과 명확히 구분하기 위해 ${i} 형태로 경계를 확실히하는 것도 좋은 습관일 것이다.

$ mkdir target
$ for i in $(seq -w 01 12)
> do
> find zga_flye_barcode$i -name assembly.fasta -exec cp {} target/barcode$i.assembly.fasta \;
> done
$ ls target
barcode01.assembly.fasta  barcode04.assembly.fasta  barcode07.assembly.fasta  barcode10.assembly.fasta
barcode02.assembly.fasta  barcode05.assembly.fasta  barcode08.assembly.fasta  barcode11.assembly.fasta
barcode03.assembly.fasta  barcode06.assembly.fasta  barcode09.assembly.fasta  barcode12.assembly.fasta새

샘플이 12개에 불과하니 cp 명령으로 하나씩 FASTA file의 이름을 바꾸어 가면서 원하는 위치에 복사를 해도 되지만, 실수의 가능성이 큰데다가 작업 기록을 남기기도 어렵다.

find 명령으로 찾아낸 FASTA file의 full path에서 중간에 위치한 특정 문자열을 꺼내어 최종 파일명의 일부를 삼고 싶다면? 어떤 규칙을 이용하여 string manipulation을 하면 될 수준의 일인가, 혹은 어떤 구분자(예를 들어 '/')로 나뉘는 필드 중 특정 위치의 것을 꺼내면 될 일인가에 따라서 해결 방법은 조금씩 달라진다. 예를 들어 다음과 같은 파일이 있다고 가정하자.

/data/project/131_Bacillus_from_human_gut_2021_Aug/00_seqs/03_nanopore/02_assembly/16S_rRNA_BS.fa

이렇게 긴 path에서 131_Bacillus..에 해당하는 중간 문자열을 꺼내고 싶다면? 이 path가 A라는 변수에 저장되어 있다고 가정하고 문제를 풀어보자. 방법은 간단하다.

$ cp $A $(cut -d/ -f4 <<< $A).fasta

'/'를 구분자로 하여 A 변수에 저장된 문자열을 나누는 경우 첫 번째 필드는 공백이 된다. 왜냐하면 A 변수에 저장된 문자열이 '/'로 시작하기 때문이다. 따라서 131_Bacillus를 꺼내려면 4번째 필드를 지정해야 한다('-f4'). 왜 -f 4라고 떼어서 쓰지 않고 -f4라고 붙여 쓰는가? 그래도 된다.

이 bash 구문에서 '<<<'의 의미를 정확히 이해하는 것은 쉽지 않다. 나도 이를 설명하려면 주저할 것이 뻔하다. 이론적으로 설명을 하기는 어렵지만, 알고 있으면 리눅스 작업 능률을 크게 올려주는 잡스런 지식이 무척 많이 있다. 이번 7월에 있을 미생물 유전체 분석 교육에서 수강생들에게 이를 어느 정도로 소개해야 하는지 고민이 된다.

2022년 5월 22일 일요일

Behringer 오디오 인터페이스 UCA200을 더 구입하다

Berhinger의 U-Control UCA202/UCA222는 한동안 가장 싼 USB 오디오 인터페이스였을 것이다. 지금은 Teyun이라는 중국 브랜드의 Q12 모델이 마이크 프리앰프와 Hi-Z 입력 기능을 갖추고 있으면서도 UCA202/222보다 더 싸게 팔리고 있으니 중국의 기술 발전에 많은 음악 애호가들이 혜택을 입고 있다고 해도 과언은 아니다.

Enping Teyun Audio Equipment사의 오디오 인터페이스 제품군(출처 링크). 알리익스프레스를 찾아보면 가격은 놀랄 만하다. 


UCA200은 원래 USB 오디오 인터페이스 기능이 없던 Behringer의 콘솔 믹서에 번들로 제공된 제품으로 알고 있다. 그래서 헤드폰 모니터링용 단자가 아예 존재하지 않는다. 바로 믹서 자체에 헤드폰을 꽂으면 되니까. 그만큼 단순한 오디오 인터페이스로서 여기에 헤드폰 단자(볼륨 조절 놉 포함)와 광출력 단자를 갖춘 것이 2006년에 나온 UCA202이며, 2009년에 뒤이어 나온 UCA222는 케이스 색깔만 다를 뿐 기능적으로는 전혀 다를 것이 없다고 알려져 있다.

UCA 시리즈는 작고 가벼우면서 단순한데다가 리눅스나 윈도우즈 전부 별다른 드라이버를 설치하지 않아도 잘 작동하니 오디오 앰플리파이어에 직접 연결하여 음악을 재생하는 용도로는 이보다 좋은 선택이 없었다. 게다가 최근에 MAX4410칩을 이용한 헤드폰 앰프를 만들게 되면서 활용의 폭이 더 넓어지게 되었다.

나는 오래전부터 UCA200을 사용해 왔다. 컴퓨터를 이용한 녹음 작업을 익혀 보려고 제일 최초로 구입했던 USB 오디오 인터페이스였다. 그러다 보니 믹서와 DI box를 줄줄이 구입하는 미련한 짓을 저질렀지만, 요즘은 장비 하나에서 마이크와 Hi-Z 소스를 전부 다룰 수 있어서 여간 편리한 것이 아니다.

나의 UCA200은 거의 항상 볼루미오에 연결하여 음악 재생용으로 사용하고 있어서 컴퓨터에 연결해서 사용할 목적으로 UCA200을 하나쯤 더 갖고 있으면 좋겠다는 생각을 늘 하고 있었다. 그러던 중에 중고 음향장비를 취급하는 곳의 블로그에서 신품 재고를 10개 갖고 있다는 글을 보게 되어 2개를 구입하였다. 구입 단가는 1만원. DAW 프로그램인 Waveform Free에서 ASIO4ALL 드라이버를 이용하여 구동하는 데에도 문제가 없다.

기존에 갖고 있던 것보다 더 밝은 색상이다.

이 오디오 인터페이스는 구형 오디오 믹서에 연결하면 딱 좋을 물건이다. 벌써 내 마음은 Mackie Mix5나 Behringer Xenyx 502/802를 향하고 있다...

MAX4410 헤드폰 앰프와 좋은 조합을 이루었다.

볼루미오의 개인 라디오 플러그인을 잘못 건드렸다가 작동 상태가 이상해져서 공장 초기화를 실시하였다. 모니터를 연결하지 않으면 초기화 후 설정을 하면서 DHCP 서버를 통해서 IP 주소가 제대로 할당되었는지를 확인하기가 불편하다. 


필요한 때에만 볼루미오에 연결하여 상태를 확인할 수 있는 작은 모니터는 없을까? 노트북 컴퓨터에서 빼낸 LCD 패널 AD 컨트롤러라는 것을 연결하면 모니터로 재활용할 수 있다던데... 2014년 HP mini 5101 넷북에 NAS(OpenMediaVault)를 설치하여 사진 보관용 파일 저장소로 만든 일이 있다. 그러나 전원을 늘 연결하는 것이 부담스러워서 거의 사용하지 않다가 거의 7-8년만에 전원을 넣어 보았다. 여기에서 LCD 패널을 적출하여 미니 모니터 용도로 쓴다면?

 


2022년 5월 20일 금요일

MAX4410 헤드폰 앰프 보드를 섀시에 고정하다

앰프 보드 자체가 엄지손가락만 한 작은 크기라서 일렉트로닉스 DIY에 자주 쓰이는 알토이즈 통을 사용하여 소형화를 추구하는 것도 좋다.

출처: 내 블로그(2014년). 언제 이런 것을 만들었었지?

그러나 이번에는 몸집이 커져도 좋으니 되도록 무겁게 만들고 싶어졌다. 두꺼운 케이블에 앰프 본체가 휘둘리지 않고 볼륨 놉을 돌려도 놓인 상태 그대로 안정감 있게 유지되게 하였다. 묵직한 재료는 무엇이 있었던가... 갖고 있는 온갖 잡자재를 다 뒤져서 이런 해괴한 모양의 섀시를 꾸며 보았다. 날카로운 곳은 전혀 없지만 흉기(!)로 써도 부족함이 없는 자재가 들어갔다. 원래는 목재를 고정할 때 쓰이는 평철인데, 구멍을 넓혀서 RCA 단자나 스피커 단자를 고정할 앰프 뒷면 패널로 쓰려고 구입해 놓았었다. 구입했던 목적에 거의 맞게 쓰인 셈이다.




데이터시트에 의하면 MAX4410 칩은 잡음이나 왜곡이 극히 적으니 인터엠 R150 PLUS에 물려서 프리앰프로 써도 될 것 같았다. 그러나 실제로 연결을 해 보니 현재 달아 놓은 LEEM 마이크로믹서보다 약간 소리가 부드럽고 풀어지는 느낌이랄까? LEEM 마이크로믹서가 더 나은 것 같아서(잡음은 이것이 더 심하지만) 일단 원상복구를 해 놓았다. 고무 스티커를 바닥에 붙이면 완성이다. 견고성 측면에서는 따라올 것이 없는 앰프를 만들었다.


사무실에는 롤랜드 사운드캔버스 SC-D70이 있어서 헤드폰 앰프가 그다지 절실한 상황은 아니다. 이번에 만든 헤드폰 앰프는 Behringer UCA200 오디오 인터페이스와 좋은 짝을 이룰 것이다.


2022년 5월 19일 목요일

PGAP 최신 버전(2022-04-14.build6021)을 쓰고 싶다!

PGAP(Prokaryotic Genome Annotation Pipeline)은 NCBI가 개발하여 배포하는 주력 소프트웨어의 하나로서, NCBI에 제출되는 모든 원핵 미생물의 자동 유전체 주석화에 쓰인다. 이 소프트웨어 자체에 대한 가장 최근의 논문은 다음의 것이다.

NCBI prokaryotic genome annotation pipeline. Nucleic Acids Research 44(14):6614, 2016 

이 논문의 제1저자인 러시아 출신 과학자 Tatiana Tatusova는 1993년부터 NCBI에서 일하기 시작했으며 꽤 오래 전에 어느 워크숍에서 봤었던 것 같다. 아마도 Genomic Standards Consortium 관련된 미팅이었던 것 같은데... 

PGAP은 도커 이미지와 작동에 꼭 필요한 데이터 파일을 사용자가 직접 다운로드하여 로컬 컴퓨터에서 돌릴 수 있다. 32 쓰레드에 메모리 250GB를 갖춘 소박한 내 컴퓨터에서는 박테리아 유전체 하나를 처리하는 데 1시간 정도 걸리는 것 같다. 

도커를 이용한다고 하지만 사용자가 'sudo docker run ...'이라는 명령어를 입력하게 만들지는 않는다. 파이썬 3.6 이상에서 작동하는 pgap.py 스크립트를 실행하면 업데이트가 있는지 먼저 확인하여 최신판으로 갈아치운 뒤 주석화를 개시하게 된다. 지난 3월 중순까지는 2022-02-10.build5872를 사용하였는데, 며칠 전에 nanopore로 시퀀싱하여 조립 및 후처리(medaka polish & circlator fixstart)를 마친 유전체 염기서열의 주석화를 위하여 pgap.py를 실행하였더니 최신 버전인 2022-04-14.build6021를 다운로드하는 가장 첫 단계에서 에러가 발생하였다. 한동안 별다른 문제없이 잘 써 왔던 소프트웨어가 업데이트조차 되지 않으니 정말 보통 심각한 문제가 아니다. 

KOBIC을 통해서 원인을 파악한 결과 https://raw.githubusercontent.com/ 사이트가 접속 차단 목록에 들어가 있다고 한다. 국가정보원에서는 특정 IP 주소 목록을 제공하여 국가공공기관에서 접속하지 못하게 하는데, 하필이면 여기에 이 주소가 들어있다고 한다. 개발자가 소프트웨어 배포를 위해 사용하는 웹사이트가 국정원의 시각에서는 유해한 사이트란 말인가? 휴대폰에서 이 주소로 접속을 하면 자동으로 https://github.com/로 리다이렉트된다. 하지만 https://github.com/는 연구원 내에서 원활하게 접속할 수 있다. 

참 합리적이지 못한 정책이 아닐 수 없다 생각하고 일을 하기 위해 집에 리눅스 컴퓨터를 새로 꾸몄다. 우분투 계열의 최신 LTS판인 22.04('Jammy Jellyfish')의 Xubuntu 디스트로를 설치하였다. Xubuntu는 화려하지는 않지만 비교적 가벼워서 오래 된 하드웨어를 활용하기에 아주 적당하다. 다이소에서 5천원을 주고 구입했던 USB Wi-Fi 수신기도 커널 모율을 사용자가 빌드할 필요가 없이 잘 인식하였다. 당연히 PGAP 최신 버전도 설치가 잘 되었고, 테스트 러닝도 무사히 완수하였다.

집 리눅스 컴퓨터에 설치한 PGAP을 외장 HDD에 복사하여 연구소에 가져다가 설치할 수 있지 않을까? 도커 이미지는 docker save 명령을 이용하여 tar 파일로 만들고, data file 및 test_genomes 자료 또한 파일로 복사하여 가져가면 될 것이다. 퇴근 후 약 이틀에 걸쳐서 컴퓨터 마련 및 PGAP 설치를 한 뒤, PGAP 관련 파일을 SSD에 담아서 출근한 다음 리눅스 컴퓨터에 마운팅을 했는데, 드라이브가 텅 비어 있다. 엥? 어제 내가 이 SSD에 복사한 것이 아니었나? 에혀~

집에 돌아가서 어제 했던 일을 똑같이 반복한 뒤 내일 나와서 본 작업을 하자니 너무 시간이 아깝다. 2022-04-14.build6021에서 개선된 사항이 그렇게 대단한 것이라는 생각은 들지 않았다. 따라서 pgap.py를 실행하면서 강제 업데이트를 하는 기능을 어떻게 해서든 끄면 될 것 같았다. 업데이트를 하면서 상태가 이상해진 pgap.py는 지운 뒤, 2022-02-10.build5872의 소스 파일을 가져다가 풀어서 pgap.py만 원래대로 복구한 다음, 소스 코드를 열어 보았다. 자동 업데이트와 관련된 라인을 주석 처리하려는 것이 당초의 계획이었으나, '--no-self-update'라는 옵션을 발견할 수 있었다. 또한 PGAP 버전의 최신으로 업데이트된 상태에서 이전의 특정 버전의 것을 사용하여 실행하는 방법('--use-version <version>')도 있음을 알게 되었다.

Forcing use a specific version of PGAP

이렇게 하여 최신판 바로 직전의 버전을 써서 PGAP을 돌리는 데 성공하였다. 실제로는 metadata file(yaml)의 사소한 오타를 발견하지 못해서 원인을 찾느라 오전 내내 열 번 정도는 거듭하여 테스트 러닝을 실행했었다.

최신판(2022-04-14.build6021)에서 추가된 기능은 설치 위치를 바꿀 수 있다는 것이다. 기본 위치는 $HOME/.pgap이고, 환경변수 PGAP_INPUT_DIR을 활용하여 원하는 곳에 설치하면 된다. 바로 다음날, 집에서 가져온 파일을 이용하여 PGAP 최신 버전을 설치 완료한 뒤 실제 유전체 염기서열을 이용한 분석에 성공하였다.







2022년 5월 17일 화요일

MAX4410 헤드폰 앰프 보드 테스트 - 합격!

3.5 mm 헤드폰 플러그를 끝까지 꽉 꽂지도 않았다는 것을 모르고는 음질도 나쁘고 스테레오 분리도 전혀 되지 않아서 '무슨 이런 물건이 다 있나'하고 크게 실망을 하였다. 칩은 점점 뜨거워지고... 판매자가 제시한 전원 전압 범위는 DC 1.8-6V인데 나는 휴대폰용 충전기(5V)를 연결하였으니 동작에 이상을 일으킬 이유는 없다. 보드에는 인두를 전혀 대지 않고 다만 케이블을 만들어서 꽂기만 했을 뿐이다.

MAX4410 칩의 납땜 패턴을 보니 핀 두개가 한번에 납땜된 모습이 보였다.



'그렇지! 이것은 납땜 불량임에 틀림이 없어!'

나머지 두 개는 어떤가 확인해 보니 전부 똑같다. AliExpress에 보이는 사진으로는 그렇지 않다. 납땜 후 검수 불량이라 해도 한꺼번에 구입한 3개가 다 그렇다는 것은 뭔가 석연치 않다. 데이터시트에서 제시한 typical application circuit 그림을 보아도 1번과 2번 핀을 연결해 버리는 방식은 이해가 잘 가지 않는다. 더 이상 생각하지 않기로 하고 서랍속에 전부 처넣기 전에 그래도 아쉬우니 한번만 더 점검을 해 보기로 하였다.

자료 출처: Analog Devices


마음을 가다듬고 다시 연결을 해 보았다. 헤드폰 플러그를 힘주어 밀어 넣으니 아까보다는 더 깊숙하게 들어간다. 

'음? 소리 괜찮은데?'

보드 3장이 전부 제대로 소리를 내고 있었다. 무신호 시에 볼륨 조절용 놉을 끝까지 올려도 잡음이 그렇게 크게 느껴지지 않는다. 물론 컴퓨터 USB 단자 또는 휴대폰 충전기를 전원으로 사용하면 잡음이 무척 심했다. 운 좋게도 갖고 있던 인터넷 공유기용 5V 전원 어댑터를 연결하면 가장 잡음이 적었다. 이러한 수준이라면 Behringer UCA200 오디오 인터페이스에 연결하여 모니터링 용으로 써도 충분할 것 같다. 원래 이러한 의도로 구입했었던 것이다. 괜히 품질 수준을 오해해서 미안하다! 출력은 16 OHM 부하 기준으로 채널 당 80mW에 지나지 않는 앰플리파이어 칩이라서 고임피던스의 고급 헤드폰을 구동하는 목적으로는 적합하지 않을 것이다. 

이 작은 전위차계는 무려 전원 스위치까지 포함한다!


점퍼 케이블(female)의 품질이 좋지 않아서인지 전원쪽 커넥터가 헐거워서 자꾸 빠진다. 이런 간단한 부품도 좋은 등급의 것을 써야 하는지... 케이스가 확정되면 아예 납땜을 해 버리자.

온갖 종류의 저렴한 앰프 보드를 구입해 보았지만 볼륨 조절용 전위차계나 각종 단자가 납땜이 된 상태로 팔리는 제품이 DIY의 수고를 얼마나 많이 덜어주는지는 경험해 본 사람만이 안다. CMoy 헤드폰 앰프를 만드는 수고에 감히 비교하겠는가? 케이스만 잘 만들어 주면 이번 미션은 끝난다.

2022년 5월 16일 월요일

InterM 파워앰프(R150 Plus)에 LEEM Micro Mixer 연결하기

InterM 파워앰프의 음량 조절용 놉은 단계적으로 걸리면서 돌아가는 타입이라 세밀한 조정이 쉽지 않다. 특히 밤중에 거실에서 튜너를 연결하여 음악을 감상하려면 대략 1단과 2단 사이가 가장 적당한데 그 위치에 놉을 놓기가 참으로 어렵다. 구체적으로 말하자면 1단은 소리가 너무 작고 2단은 너무 크다! 그래서 입력 단자와 소스 기기로부터 연결된 케이블 사이에 포텐셔미터를 삽입하거나 혹은 스피커 출력단자와 스피커 케이블 사이에 5~10와트급의 시멘트 저항(수 OHM)을 넣는 방법을 생각하고 있었다. 매우 간단한 작업이지만 필요한 부품이 없어서 실행에는 옮기지 못하고 있었다.

그런데 예전에 잠깐 사용하던 8채널 LEEM Micro Mixer(WAM-490)가 있다는 것을 문득 깨달았다. 마침 1/4인치 커넥터가 달린 케이블도 많이 있으니 이를 튜너와 앰프 사이에 넣어서 음량 조절 용도로 쓰면 되겠다는 생각이 들었다.



이 믹서는 음질이 그렇게 중요하지 않은 현장에서 소스를 믹스하는 용도로 쓰는 제품이다. S/N ratio는 55 dB나 되고 왜율도 0.1%이다. 앰프를 연결한 뒤 신호가 없는 상태에서 볼륨을 조금만 올리면 잡음이 들릴 정도이니 말이다. 매스터 볼륨과 채널의 볼륨을 적당히 조절하여 피크를 치지 않으면서 잡음이 거의 들리지 않을 수준으로 만들어 놓았다. 파워앰프의 볼륨 놉을 3단으로 두어도 소리가 그렇게 크지 않다.

중고로 팔아버렸던 Tapco Mix 60이 간절히 그리워지는 순간이었다.  덩치가 꽤 있는 편이라서 작은 스피커 위에 올려 놓기에는 적당하지 않지만... 요즘 나오는 콘솔 믹서는 USB 인터페이스를 겸하는 것이 꽤 많아서 이것만 구해 놓으면 여러 용도로 쓸 수 있을 것이라는 유혹이 끊이지 않는다. 예를 들자면 Behringer의 Q502USB 같은 것. 그러나 이런 장비에 욕심을 부리게 되면 USB 마이크로폰의 입지가 위태로워진다.

어차피 한번 꼬인 음악 인생이라서 장비를 용도에 맞게 적재적소에 갖고 있을 필요는 없다. 마침 알리익스프레스에서 주문한 헤드폰 앰프 보드(MAX4410)가 도착하였으니 이를 Behringer UCA200 오디오 인터페이스에 연결해서 소리를 들어봐야 되겠다. 이런 조합으로 사용하면 오디오 인터페이스를 새로 사고 싶은 욕망을 억제할 수 있을 것이라 판단하여 구매를 결정하게 된 것이었다. 과연 만족할 만한 결과가 나올지, 그리고 그 만족감이 며칠이나 갈지는 아무도 모른다. 요즘 아르테시아의 A22XT 오디오 인터페이스(ESI의 U22XT와 동일 제춤으로 여겨짐)가 99,000원에 팔리고 있어서 자꾸 이리고 관심이 가는데...


  

2022년 5월 12일 목요일

MinKNOW v22.03.6에서 configuration test cell(CTC)이 인식되지 않는 문제

소프트웨어 업데이트가 기존의 버그를 해결하면서 때로는 새 문제를 만드는 경우가 가끔 있다. Oxford Nanopore Techologies의 MinION Mk1B를 구동하는 소프트웨어인 MinKNOW가 그러하다. 매번 시퀀싱을 시작하면서 '이번은 아무 오류가 없이 잘 지나갈까'하는 걱정을 하는 현실이 안타깝다.

GPGPU(GeForce RTX 3090)가 장착된 컴퓨터를 지난 2월 새로 장만하여 CUDA와 MinKNOW 및 guppy 등을 새로 설치한 다음, guppy HAC basecall을 성공적으로 실시한 뒤 새 샘플을 시퀀싱하기를 간절히 기다리다가 바로 어제 12개의 박테리아 샘플의 시퀀싱에 착수하였다. 그런데 오랜만에 컴퓨터의 전원을 올리면서 apt 명령어로 소프트웨어 업데이트를 한 것이 문제였을까, MinKNOW(최신판인 v22.03.6)에서 Hardware check에 실패한 것이었다. 그래도 시퀀싱은 할 수 있지 않을까? Hardware check를 매번 할 필요는 없을테니... 이런 안일한 마음으로 상태에서 flow cell을 꽂아서 점검을 해 보았다. 포어 상태를 표시하는 색깔이 평소와는 좀 다르지만 충분한 숫자의 포어가 살아있다 생각하고 라이브러리를 로딩하여 시퀀싱을 시작하였다. 그런데... 몇 분 지나지 않아서 script failure가 나면서 종료하고 말았다.

마침 바로 쓸 수 있는 MinION Mk1C가 바로 곁에 두 대나 있어서 라이브러리가 로딩된 flow cell을 이리로 옮겨서 시퀀싱을 시작하였다. 어젯밤 8시 반쯤에 Mk1C 두 대에서 러닝이 시작되어 아직까지 순조롭게 데이터가 생산되고 있다.

소프트웨어의 작동이 불량하면 깨끗하게 삭제 후 재설치를 하는 것이 정답이다. 그러나 apt를 이용하여 프로그램을 지우면 간혹 의존성 문제 등에 의해서 깨끗하게 지워지지 않을 때도 있다. 두 대의 리눅스 컴퓨터에 MinKNOW와 guppy를 설치하고 지우기를 반복하다가 갑자기 무슨 생각이 들었는지 /opt/ont 디렉토리를 싹 지우고 다시 시작해 보기로 하였다. 이것이 고난의 시작이었다! 이렇게 하면 MinKNOW 관련 소프트웨어가 깔끔하게 지워질 것으로 착각을 했던 것이다.

그 후로는 'sudo apt install minion-nc'를 아무리 실행해도 설정에 오류가 있다면서 실패를 거듭하였다. 오류 메시지를 보니 설치 스크립트를 실행하는 초기 단계에서 /opt/ont 디렉토리 아래에 python 인터프리터가 없다고 한다. 이건 무슨 일이지? Python이 필요하면 자동으로 설치가 되어야 하지 않을까? 매우 의아하게 생각하면서 Python 3.7.4의 소스 파일을 가져다가 컴파일을 하였다. 설정(./configure --prefix=/opt/ont/pytho3.7.4) 후 make 실행 단계에서 SSL library와 관련한 약간의 에러가 있었지만 큰 문제는 없으리라 생각하고 재설치를 한 뒤에 minion-nc를 설치하니 이번에는 오류가 생기지 않았다.

MinKNOW 소프트웨어 구동을 위한 python을 이렇게 처음부터 수작업으로 깔지는 않을텐데... 어쨌든 MinKNOW를 새로 실행한 뒤 CTC를 꽂아서 hardware check를 하니 여전히 position을 찾지 못한다. 도대체 왜 이러는 것이냐!

Nanopore community 웹사이트에 접속하여 나와 비슷한 문제를 겪는 사람이 있는지 질문과 답을 찾아 보았다. 2022년 4월 22일에 등록된 질문 CTC not detected에 대하여 이러한 코멘트가 있었다.



MinKNOW 최신 버전인 22.03.6이 CTC를 인식하지 못한다고 불평하는 사람이 나 혼자만이 아니었다. 해결책은 아무 flow cell이라 꽂은 뒤 hardware check를 하는 것이다. 전자 회로는 동일하기 때문이다.

Oxford Nanopore 기술진이 제시하는 소프트웨어 작동 불량의 해결 방법은 소프트웨어를 완전히 삭제한 뒤 새로 설치하는 것이다. MinKNOW 관련 소프트웨어 완전 삭제를 위해 권장되는 명령어는 다음의 두 줄이었다.

sudo apt purge minion-nc
sudo apt autoremove

반신반의하며 이 명령을 날려서 패키지를 완전히 삭제한 뒤, community 웹사이트에서 설명한 방법(링크 - 로그인 필요)에 따라서 minion-nc를 설치해 보았다. 터미널 창을 주시하고 있노라니 ONT 환경을 위해 파이썬 패키지를 가져다가 설치하는 과정이 똑똑히 나타났다. 그러면 그렇지! MinKNOW를 다시 켜고 다 쓴 flow cell을 MinION Mk1B에 꽂은 후 hardware check를 해 보았다. MinKNOW는 이를 CTC로 인식하여 성공적으로 점검을 마쳤다.

실제로 꽂혀 있는 것은 CTC가 아니라 다 쓴 flow cell이다.

점검 완료!

MinKNOW에 포함된 guppy의 버전이 아직 5.x대에 머물러 있던 시절, MinKNOW 내에서 HAC basecalling을 해 보고 싶어서 guppy 6.x을 추가로 설치하였다가 시퀀싱이 중단되는 에러를 겪었던 일이 있다. 지금은 MinKNOW용 guppy와 standalone형의 guppy가 전부 v6.x으로 판올림이 된 상태라서 이런 문제가 해결되었는지는 아직 알 수 었다. 돌이켜보면 당시에는 GPGPU가 없던 시절이라서 MinKNOW에서 HAC basecall이 된다고 해도 시퀀싱 러닝 종료 후 얼마를 더 기다려야 하는지 기약이 없었을 것이다.

$ dpkg -l | grep guppy
rc  ont-guppy                6.1.3-1~focal amd64 Oxford Nanopore Technologies high-performance GPU basecaller
ii  ont-guppy-cpu-for-minion 6.0.7-1~focal amd64 Oxford Nanopore Technologies high-performance GPU basecaller
ii  ont-guppyd-for-minion    6.0.7-1~focal all   Oxford Nanopore Technologies plc service for the real-time guppy basecaller

이번에 설치한 MinKNOW에서 과연 러닝과 동시에 HAC basecalling이 잘 이루어질까? Major version이 같으니 가능할지도 모른다. 혹은 fasta basecall부터 먼저 해 놓은 다음 나중에 명령행에서 HAC basecalling을 해야 할까? MinKNOW에서 각 서브 패키지를 확인해 보니 guppy 6.1.3(GPU version)이 잘 보인다. 이제는 MinKNOW 내에서 HAC basecalling을 할 수 있을 것 같다.