2021년 11월 24일 수요일

fIDBAC 실행용 펄 스크립트의 use compiler directive 선언 오류, 그리고 플러스 알파(+베타, 감마...)

fIDBAC(어제 작성한 소개의 글 링크)에서 오류를 찾는 것이 취미가 될 수준에 이르렀다. 나는 파이썬에는 까막눈이지만 Perl은 조금 아는 편이라서 fIDBAC의 주요 스크립트를 뜯어보는 수준은 된다. 메인 스크립트는 fIDBAC.pl이다.

fDIBAC.pl을 처음 실행하게 되면 GACP.pm 모듈을 인식하지 못한다는 에러가 발생한다. 

Can't locate GACP.pm in @INC (you may need to install the GACP module) (@INC contains: ...)

스크립트의 위치로 이동하여 실행을 하거나, 혹은 PERL5LIB 환경변수를 스크립트가 위치한 곳으로 선언하면 일단은 에러가 없어진다. GACP.pm은 config_db.txt 설정 파일을 읽어들여서 중요한 프로그램과 파일을 변수로 저장하는 역할을 한다.

왜 이런 사소한 오류가 뜨는 것일까? fIDBAC.pl 스크립트의 시작 부분을 확인해 보았다.

#!/usr/bin/perl -w
#author:liangq at 20181126 ,modified by liangqian ,at 20181206
use strict ;
use Getopt::Long ;
use Cwd 'abs_path';
use File::Basename ;
use File::Path 'mkpath';
use FindBin '$Bin';
use Data::Dumper;
use List::Util qw/max min/;
use lib $Bin;
use threads;
use GACP qw(parse_config);

특별한 문제는 없다. FindBin을 이용하여 원본 펄 스크립트의 위치를 찾아서 $Bin 변수에 저장하고(작은 따옴표로 둘러싼 것은 별로 마음에 들지 않음), 이어서 use lib $Bin 디렉티브를 선언했으니 펄 스크립트가 있는 디렉토리를 @INC의 맨 앞에 추가한 셈이 된다. 그리고 가장 마지막에서 use GACP를 선언하여 GACP.pm 모듈을 선언하였다. 훌륭하다!

그런데도 여전히 같은 에러가 발생하였다. GACP.pm을 로드하는 스크립트가 또 있나? fIDBAC.pl에 의해 내부적으로 구동되는 다른 스크립트 중에서 select_kmerfinder_16SAndANI.pl와 AR_VF.run.pl도 GACP.pm을 필요로 한다. 스크립트에 오타 같은 것은 없는데 왜 에러가 사라지지를 않는 것일까...

이런! select_kmerfinder_16SAndANI.pl 파일을 열어보니 'use lib $Bin' 라인이 없었다. 무슨 이런 실수를... 개발자는 항상 스크립트 설치 디렉토리에서만 테스트를 했단 말인가? 수준 이하의 오류를 찾아내어 수정하느라 인생을 낭비하는 것만 같아서 이제는 서글프기까지 하다. 빠진 라인을 삽입하였더니 이 오류는 사라졌다.

그러나 아직 끝이 아니다. 

  1. run_rgi.sh가 호출하는 format_RGIresult.pl는 도대체 GitHub 사이트 어디에 숨어 있는가?
  2. config_DB.txt에서 'orthoANI'라는 이름으로 부르는 프로그램은 도대체 무엇을 의미하는가? 내가 발견한 fIDBAC 파이프라인의 문제점 중 가장 심각한 것은 바로 여기에 있다. 
orthoANI의 문제를 좀더 상세하게 알아보자. config_DB.txt 파일을 열어보면 orthoANI는 ANI.pl 펄 스크립트를 지정하는 것으로 보인다. 그러나 OrthoANI라 하면, 보통은 천랩에서 개발한 ANI 계산용 알고리즘을 뜻한다. 이 알고리즘을 프로그램으로 구현한 것은 자바 애플리케이션인 OAT(Orthologous Average Nucleotide Identity Tool)이다. 'ortho-'라는 접두사를 붙여서 불필요한 혼동을 불러 일으키고 있다. 이것이 (2)에 따르는 첫 번째 문제이다.

ANI.pl은 원래 Jaipeng Chen이라는 사람이 JSpecies(GUI Java application)를 참조하여 legacy blast + Perl로 만든 ANI 계산용 스크립트이다(GitHub). 9년 전에 업로드된 상태 그대로 수정되지 않았다. fIDBAC의 script/Average_Nucleotide_Identity/readme.txt 파일에서도 이 GitHub를 인용하고 있으니 내 예상이 틀리지는 않을 것이다. ANI.pl이 호출되는 순서는 다음과 같다.

fDIBAC.pl(main script) -> OrthoANI.all_tre.new.py -> orthoAni.sh라는 스크립트를 실행 단계에 작성하여 활용함

OrthoANI.all_tre.new.py에서 orthoAni.sh 파일을 작성하기 위하여 다음과 같은 문자열을 만들어 ANI.pl을 실행하도록 만드는데, 이게 또 이상하다. 


ANI.pl의 필수 옵션인 '-fd formatdb -bl blastall'이 빠진 상태이다.  이 옵션은 formatdb와 blastall 실행 파일을 지정하기 위한 것이다. $PATH에 위치한다고 하여 생략해서는 안 된다. 따라서 그림에서 보인 cmd로는 ANI.pl이 제대로 실행되지 않는다. 이것이 두 번째 문제이다. 그러면 cmd를 조합하는 명령어 라인에 '-fd formatdb -bl blastall'을 삽입하면 되지 않을까 생각할 수 있다. 그러나 전혀 그렇지 않다. ANI.pl은 출력 파일을 쓰지도 않고, 오로지 표준 출력에 두 genome으로부터 계산한 ANI 수치를 표시할 뿐이다 OrthoANI.all_tre.new.py 스크립트의 후반부를 보면 ANI 수치 쌍을 전부 조합하여 하나의 OrthoANI.txt 파일을 만드는 것으로 되어 있는데, 내가 알고 있는 ANI.pl의 출력 형식으로는 이를 어떻게 만드는지 이해하기 어렵다. 이것이 세 번째의 문제이다.

full_path_to_file_1 VS full_path_to_file_2
 ANI: 93.0621988037596

세 번째 문제의 해결을 위해서 지금까지 미루어 두었던 파이썬 공부를 시작할 용의가 있다. 지금이 아니라면, 앞으로 영원히 파이썬 문맹으로 남게 될지도 모른다.

댓글 없음: