2025년 3월 4일 화요일

휴덕은 있어도 탈덕은 없다

경상남도 상주시에 출장을 가서 상주보 부근 경천섬이 바라보이는 곳을 차를 몰고 지나치다가 눈에 번쩍 뜨이는 어떤 편액을 만나게 되었다. 흔히 '현판'이라는 낱말을 쓰고는 하는데, 현판은 나무판이나 종이 등에 글씨를 써서 거는 액자류를 통틀어 일컫는다. 건물의 이름을 써서 건물 정면의 문과 처마 사이에 거는 목판은 편액이라고 부른다. 

입덕문(入德門)!




이곳은 조선 후기 서원인 도남서원이다. 입덕문을 통과하면 성인의 덕을 배우게 된다는 뜻이다. 그러나 '입덕'이란 대중문화에 깊은 관심을 갖게 되는 일을 부르는 말로도 쓰인다. 1970년대 일본에 등장한 신조어인 '오타쿠'가 한국에서는 '오덕후', '덕후'로 바뀌더니, 이 세계에 들어서는 것을 '입덕'이라고 부르게 된 것으로 보인다.

입덕의 대상은 주로 만화책, 애니메이션, 피규어 등이다. 하지만 대상을 한정할 필요는 없지 않은가? 악기 연습이나 녹음에 몰두하고 있다면 그것도 '입덕'이다. 생각해 보면 나도 다양한 분야로 입덕을 거치고 있다. 2월 초에 있었던 공연 때문에 잠시 손을 놓았던 진공관 앰프 개조 작업도 다시 시작해야 한다. '휴덕은 있어도 탈덕은 없다'는 나에게도 적용되는 말일 것이다. 

현재 나의 최우선 덕질 대상은 달리기일까? 경북 여행을 겸한 2박3일 동안 달리기를 하지 못하였다. 날씨가 매우 나빴고 낯선 곳이라 코스를 새로 짜기도 어려웠던 탓도 있지만, 왼쪽 무릎이 보내는 '좀 쉬고 싶다'는 신호를 더 이상 무시하기 어려웠다. 

오늘은 거리에 연연하지 말고 가볍게 뛰어 보겠다. 

밤 10시 5분, 달리기를 마쳤다. 기온은 영상 4도. 7 km / 45분 22초 / 6분 28초의 페이스. 런데이 앱에서 몇 개의 배지를 받았다.

이보다 7 km 기록이 더 좋은 날이 많이 있었는데 왜 오늘 신기록 배지를 받았는지 알 수 없다. 



2박3일에 걸쳐 대전에서 상주로 가기

부석사, 소수서원, 도산서원, 하회마을. 지난 이틀 동안 들른 곳이다. 긴 우회로를 거쳐 오늘(3월 3일) 저녁에 드디어 최종 목적지인 상주에 도착하였다.

부석사 석등과 무량수전.



아내는 무량수전 배흘림 기둥에 기대앉았다.

영주 소수서원 입구에서.





상상외로 거대했던 안동 법흥사지 칠층전탑.


임금이 내려 준 '도산서원'이란 이름을 명필 한석봉이 선조 앞에서 직접 썼다는 이야기가 전한다. 내부에는 '전교당'이라는 편액이 걸려 있다. 


도산서원 앞마당에서 낙동강을 바라보면 기묘하게 생긴 둔덕이 있다. 이는 시사단(試士壇)이라고 부른다. 정조때 퇴계 이황을 추모하기 위해 이곳에서 과거 시험을 치른 것을 기념하기 위해 지은 작은 건축물인데, 안동댐이 만들어지면 수몰 위기에 처하자 약 10미터 높이의 언덕을 만들어 그 위로 옮겼다고 한다.


아무도 밟지 않은 눈길을 밟으며 퇴계 이황의 묘소에 들렀다.



이름도, 벼슬도 새겨져 있지 않은 묘비의 한가운데 새겨진 글은 
'퇴도만은 진성이공지묘(退陶晩隱眞城李公之墓)'. 퇴도는 퇴계가 쓰던 호의 하나이고, 만은은 늦게 은거했다는 뜻이다. 진성은 본관. 좌측에 새겨진 글은 퇴계가 생전에 직접 지었다고 한다. 이에 대한 해석은 여기를 참고하라.

성리학, 또는 유학이 21세기를 사는 우리에게 부르짖는 바는 무엇일까? 어제 영주의 소수서원과 선비촌 박물관을 둘러보면서 시작된 골치아픈 물음은 여행 이틀째 더욱 내 머릿속을 강하게 울리고 있었다. 볼거리와 맛있는 음식을 찾아 눈과 입을 자극하는 여행이 아니라 관념을 뒤흔들며 질문을 던지는 여행이 되었다.

나는 유학 또는 유교에 대해 매우 비판적인 사람이다. 그러나 제대로 비판을 하려면 제대로 아는 것부터 출발해야 한다. 그러려면 한자 공부부터 시작해야 할까? 같은 시간을 투자한다면 차라리 한자보다 영어 공부를 하는 것이 더 나을까?

한국고전번역원 - 새로운 해석이 필요한 유교와 유학

명종의 어필 편액. 이로써 소수서원은 최초의 사액서원이 되었다. 3월 2일에 방문하였다.


도산서원에서 멀지 않은 이육사 문학관(안타깝게도 오늘은 휴관일...)에서 바라본 풍광이 예사롭지 않았다. 한 폭의 수묵화로 표현한 겨울 산을 보는 듯하였다.

옥빛으로 빚나며 하회마을을 휘감아 흐르는 낙동강물. 여기는 하회 옥연 구곡이다. 물 저편으로 보이는 것이 조금 뒤에 오를 부용대이다. 바위 색깔도 예사롭지 않았다. 안동의 '지질학'이 궁금하다.


부용대에 올라 바라본 하회마을. 여행 이틀째의 마지막 코스였다. 여기를 오르지 않았으면 후회했을 것이다.



선비란 무엇인가? 학식과 인격을 갖춘 사람으로서 아직 벼슬에 오르지 않은 '양반'이라는 것이 문제이다. 선비 정신을 현대에도 가치 있는 것으로 인정하려면, 신분에 의한 진입 장벽이 분명히 존재했던 과거의 기준을 털어 내야 한다고 믿는다. 양인(양반, 중인, 상민)뿐만 아니라 비록 노비로서 생존을 위해 힘겨운 삶을 살고 있다고 하여도 고매한 인격을 갖추고 있으며 시간을 내어 학문에 힘쓰고 있다면 선비라 불러 마땅하다.

조선시대에는 벼슬살이를 하는 것이 선비의 완성이었다. 모욕을 참으면서 때를 기다리다가 권력자를 만나 비로소 세상에 드러나는 것도 그러한 방법의 하나일 것이다. 그러나 이러한 자세는 나의 신념과는 잘 맞지 않는다. 옳다는 생각도 잘 들지 않는다.

노동을 천시하지 않고, 모든 국민에게 공평하게 부과된 의무를 회피하지 않으며(서원은 세금과 병역을 회피하는 수단으로 변질되된 것으로 알고 있음) 권력 지향적인 자세를 과감히 버릴 때, 그러한 선비 정신이라면 현대에도 계승할 가치가 있다고 본다. 

2025년 3월 3일 월요일

예기치 않은 FASTQ 파일 조작 실수가 가져온 새로운 발견?

10년도 더 된 옛날 만든 미생물의 일루미나 시퀀싱 데이터를 정리하여 국가바이오데이터스테이션(K-BDS)에 등록하는 '유전체 박물관(고물상?)'에 열심히 매진하는 과정에서 데이터 검수 책임을 맡는 관리자에게 늘 고마운 마음을 갖게 된다. 등록 당시에 포함된 어이없는 오류를 바로잡기 위해 번거로운 부탁을 해도 매번 잘 수용해 주기 때문이다. 아직 GenBank의 서열 정보와 같이 버전 관리가 이루어지고 있지는 않지만, 앞으로는 이 기능이 포함되리라 믿는다.

최근 품질관리 담당자로부터 내 HiSeq 2000 raw sequencing data(FASTQ 파일)를 검수하는 과정에서 동일한 서열 ID가 중복하여 나타난다는 소식을 들었다. 당시에는 한 샘플의 FASTQ 파일이 너무 크면 001, 002...와 같은 이름을 붙여서 분할한 형태로 제공하였었다. 이를 'cat' 명령어로 하나의 FASTQ 파일로 합치는 과정에서 똑같은 원본 파일을 두 차례 반복하여 이어 붙인 것이 원인이었다.

72개의 샘플 중에서 이런 문제가 발생한 것은 6가지였다. 문제를 수정한 뒤 모든 분석 작업, 즉 jellyfish를 이용한 21-mer abundance analysis, phyloFlash, ZGA pipeline 및 GTDB-Tk를 전부 새로 실시하였다. 특히 GTDB-Tk는 공식 문서를 기계적으로 따라하다가 너무 오래된 소프트웨어 및 reference DB를 설치하였음을 발견하고 최근 재설치를 하였기에 어차피 모든 데이터에 대한 재작업이 필요한 상태였다. Sequence read ID가 전부 2회씩 중복하여 존재함에도 불구하고 내가 사용한 그 어떤 소프트웨어도 오류 메시지를 뱉어내지 않았었다. 아마도 프로그램 내부에서는 read ID를 전부 단순한 일련번호와 같은 것으로 치환하여 쓰고 있는 것이 아닐까 한다.

수정된 FASTQ 파일을 이용하여 재분석을 하던 과정 중에 Methanobrevibacter smithii의 어느 균주에 대한 시퀀싱 데이터가 이상하다는 것을 발견하였다. FASTQ 파일에 오류가 있었을 때, 즉 정상에 대하여 2배로 부풀려진 상태에서는 contig의 수가 500개에 육박하였고 CheckM(실제로는 ZGA pipeline 내부에서 실행)에서 계산한 completeness가 40%도 되지 않았었다. 그래서 sequencing coverage가 상당히 부족해서 문제가 생겼을 것이라 생각하고 더 이상 쓸 수 없는 데이터로 간주하였었다(KAP241424). 21-mer abundance analysis에서도 main peak가 그렇게 잘 드러나지 않았기에 이런 생각을 하는 것도 당연하였다.

그런데 total contig length를 보니 약 1.8 Mb였다. 이는 Methanobrevibacter smithii의 유전체 크기로 알려진 값과 매우 유사하였다. Contig의 수가 지나치게 많이 나올 정도로 sequencing coverage가 충분하지 않다면, total contig length도 매우 낮은 수준이어야 한다. 표준 균주인 ATCC 35061의 유전체를 NCBI에서 다운로드한 뒤 ZGA로 CheckM 점검을 해 보았더니 이것 역시 completeness가 40% 미만으로 나타났다. 이건 말이 되지 않는다. 두 유전체 서열에 대하여 CheckM을 직접 실행해 보았다. ZGA가 설치된 conda 환경을 그대로 이용하였으니 CheckM 버전은 ZGA pipeline의 것과 동일하다.

결과는 놀랍게도 두 균주 모두 completeness가 100%인 것으로 계산되었다. ZGA pipeline 안에서 CheckM을 실행하고 그 메시지를 처리하는 과정에 문제가 있는 것이 틀림없다. 따라서 내가 시퀀싱한 Methanobrevibacter smithii 균주는 아무런 문제가 없으며, 분리 정보만 되찾아 정리한다면 K-BDS에 등록하여도 아무런 문제가 없다는 결론을 내렸다.

수정한 FASTQ 파일을 이용하여 조립을 하면 contig의 수는 겨우 41개에 불과하다(~156x coverage). 이 데이터를 그대로 duplicate하여 분량을 두 배로 만든 상태에서 조립을 하였더니 contig 수가 500개 가까이 된다? 사실 이 현상은 나의 지식이나 경험으로는 잘 이해가 가지 않는다. 일루미나의 경우 대략 150x 정도의 sequencing coverage에서 최적의 결과가 나오게 되고, 투입량을 그 이상으로 올린다고 해도 더 좋아지지는 않는다는 논문을 본 일은 있다. 하지만 투입량을 그 이상 올렸을 때 조립 결과가 심각하게 나빠진다는 것은 이해하기 어렵다.

이번 데이터에 포함된 오류는 단순히 시퀀싱 분량이 2배로 늘어난 것과는 상황이 다르다는 생각이 들었다. 시퀀싱을 한 판 더 실시하여 read를 2배로 얻었다 해도 이전의 것과 모든 염기서열과 quality가 똑같은 read가 발생할 가능성은 극히 적다. 하지만 내가 초래한 실수에서는 그렇지 않다. 완벽하게 똑같은 read가 2개씩 존재하고 있다. 그렇다면 k-mer spectrum에서 가장 왼쪽에 있는 것들(시퀀싱 오류에 의해서 1,2...회 정도의 저빈도로 존재하지만 그 종류는 가장 많은 것)이 둘 씩 만나서 짧은 contig를 다수 만들게 되는 것이 아닐까?

그림 출처: 손장일, 남진우. Present and future of de novo whole-genome assembly (https://doi.org/10.1093/bib/bbw096, Figure 4)


아직 이전 FASTQ 파일로 만든 contig의 길이 분포 및 평균 read depth를 점검해 보지는 않았다. 버릴 데이터라고 생각해서 신경을 쓰지 않았기 때문이다. 만약 이 assembly에서 짧은 low depth contig가 많은 수를 차지한다면, 나의 원인 분석이 그렇게 틀리지는 않았다는 결론을 내릴 수 있을 것이다.

그래서 '망친' 데이터라고 해서 함부로 내다 버려서는 안된다고 생각한다. 조작 실수에 의해 '망친' 것으로 오해를 할 수도 있기 때문이다. 망친 데이터의 모임인 KAP241424는 전반적인 검토를 거친 뒤 데이터와 README 파일을 바꾸어야 한다. 물론 오늘 글의 주제가 된 Methanobrevibacter smithii의 데이터는 한번 더 확인을 거쳐서 '부활'하게 될 것으로 본다.

2025년 3월 1일 토요일

달리기 입문 7개월을 마치며

어제는 너무 피곤하여 달리기를 건너 뛰었다. 긴 회의와 면접으로 몹시 바빴던 오늘, 8 km 달리기로 2월을 마무리하였다. 칼로리 소모량으로 환산한다면 라면 1인분을 불태운 셈이다. 야심차게 10 km를 채워보고 싶었으나 다리에 묵직한 피로감이 느껴져서 무리는 하지 않기로 하였다. 좀 더 달려서 둔산대교 북단을 반환점으로 삼으면 10 km 코스가 될 것이다.


2월에 달린 총 거리는 90 km를 겨우 넘긴 정도이다. 조금만 더 노력을 했더라면 100 km를 채울 수도 있었을 것이다. 다음 달에는 연속해서 10 km를 달리는 것이 가능할 것 같다. 페이스 욕심만 내지 않는다면 말이다. 

앞으로 '하루 달리기의 최소 거리는 7 km'라는 규칙을 지킬 수 있을 것이다. 2월에 총 13회를 달리는 동안 7 km 이상을 달린 것이 10회나 되기 때문이다. 7 km로 15회를 달리면 105 km가 된다. 아주 약간 '도전적'인 목표이다.