| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
| 30 | 31 |
- 인공신경망
- 딥러닝
- 생물정보학
- 바이오인포매틱스
- 이항분포
- 로제타폴드
- 인공지능 수학
- 단백질 구조 예측
- CNN
- 자바
- AP Computer Science A
- 파이썬
- 알파폴드
- AP
- 인공지능
- 결정트리
- Java
- ncbi
- 캐글
- BLaST
- 오류역전파
- RNN
- Kaggle
- bioinformatics
- 시그모이드
- 바이오파이썬
- 서열정렬
- 생명정보학
- SVM
- COVID
- Today
- Total
데이터 과학
ClustalW와 MUSCLE을 이용한 다중 서열 정렬 본문
ClustalW를 이용한 다중 서열 정렬
ClustalW는 가장 널리 사용되는 다중 서열 정렬(Multiple Sequence Alignment, MSA) 프로그램 중 하나입니다. 명령줄(Command Line) 환경에서 실행되는 ClustalW와 그래픽 사용자 인터페이스를 제공하는 ClustalX가 있으며, 두 프로그램은 동일한 정렬 알고리즘을 사용합니다.
Biopython은 Bio.Align.Applications 모듈을 통해 ClustalW를 Python 코드에서 실행할 수 있는 인터페이스를 제공합니다. 이를 이용하면 명령줄에서 수행하던 작업을 Python 프로그램 안에서 자동화할 수 있습니다.
ClustalW를 사용하기 전에 먼저 명령줄 환경에서 프로그램이 정상적으로 실행되는지 확인하는 것이 좋습니다. 이후 Biopython의 인터페이스를 이용하면 동일한 옵션을 Python 코드에서 손쉽게 사용할 수 있습니다.
다음은 ClustalW 명령 객체를 생성하는 가장 기본적인 예제입니다.
from Bio.Align.Applications import ClustalwCommandline
cline = ClustalwCommandline(
"clustalw2",
infile="opuntia.fasta"
)
print(cline)
실행 결과는 다음과 같습니다.
clustalw2 -infile=opuntia.fasta
위 코드에서는 실행 파일 이름을 clustalw2로 지정하였습니다. 이는 시스템에 ClustalW 2.x 버전이 설치되어 있다는 의미이며, 환경에 따라 실행 파일 이름이 clustalw인 경우도 있습니다. 두 버전은 대부분 동일한 명령행 옵션을 지원하므로 사용 방법에는 큰 차이가 없습니다.
실행 파일을 찾지 못하는 경우
Windows 환경에서는 다음과 같은 오류가 발생하는 경우가 있습니다.
'clustalw2' is not recognized...
또는
command not found
이 오류는 ClustalW 실행 파일이 운영체제의 PATH 환경 변수에 등록되어 있지 않기 때문에 발생합니다.
이 문제는 다음 두 가지 방법으로 해결할 수 있습니다.
- ClustalW가 설치된 폴더를 PATH 환경 변수에 추가한다.
- 실행 파일의 전체 경로를 직접 지정한다.
다음은 실행 파일의 전체 경로를 사용하는 예제입니다.
import os
from Bio.Align.Applications import ClustalwCommandline
clustalw_exe = r"C:\Program Files\ClustalW2\clustalw2.exe"
cline = ClustalwCommandline(
clustalw_exe,
infile="opuntia.fasta"
)
assert os.path.isfile(clustalw_exe), \
"ClustalW 실행 파일을 찾을 수 없습니다."
stdout, stderr = cline()
문자열 앞에 붙은 r은 Raw String을 의미합니다. Windows 경로에는 \ 문자가 포함되는데, Python에서는 \n, \t와 같은 이스케이프 문자로 해석될 수 있습니다. Raw String을 사용하면 이러한 변환 없이 경로를 그대로 사용할 수 있습니다.
명령 실행 과정
cline()을 실행하면 Biopython은 내부적으로 Python의 subprocess 기능을 이용하여 ClustalW를 실행합니다.
프로그램이 종료되면 다음 두 개의 문자열을 반환합니다.
- stdout : 프로그램의 표준 출력(Standard Output)
- stderr : 오류 및 경고 메시지를 저장하는 표준 오류(Standard Error)
대부분의 경우 ClustalW는 정렬 결과를 화면이 아니라 파일로 저장하므로 stdout에는 중요한 정보가 거의 포함되지 않습니다. 대신 지정한 출력 파일에 정렬 결과와 Guide Tree가 생성됩니다.
프로그램이 정상적으로 종료되면 종료 코드(Return Code)는 0을 반환합니다. 반대로 실행 중 오류가 발생하면 Biopython은 예외(Exception)를 발생시켜 오류를 사용자에게 알려줍니다.
정렬 결과 읽기
ClustalW 실행이 완료되면 입력 파일 이름을 기준으로 정렬 결과 파일이 생성됩니다. 예를 들어 입력 파일이 opuntia.fasta라면 기본적으로 opuntia.aln 파일이 만들어집니다.
생성된 정렬 결과는 AlignIO 모듈을 이용하여 쉽게 읽을 수 있습니다.
from Bio import AlignIO
alignment = AlignIO.read(
"opuntia.aln",
"clustal"
)
print(alignment)
AlignIO.read()는 Clustal 형식으로 저장된 정렬 결과를 MultipleSeqAlignment 객체로 변환합니다. 이후 각 서열을 비교하거나 보존 영역(conserved region)을 분석하는 등 다양한 후속 분석에 활용할 수 있습니다.
Guide Tree 읽기
ClustalW는 다중 서열 정렬을 수행하는 과정에서 Guide Tree도 함께 생성합니다. Guide Tree는 Newick 형식으로 저장되며, Biopython의 Phylo 모듈을 이용하여 쉽게 읽을 수 있습니다.
from Bio import Phylo
tree = Phylo.read(
"opuntia.dnd",
"newick"
)
Phylo.draw_ascii(tree)
ASCII 형태로 출력된 Guide Tree는 서열 간의 유사성을 직관적으로 확인하는 데 도움이 됩니다. 보다 다양한 시각화 기능은 Bio.Phylo 모듈에서 제공하며, 계통수 작성과 분석에 활용할 수 있습니다.
정리
ClustalW는 가장 대표적인 다중 서열 정렬 프로그램 가운데 하나이며, Biopython은 이를 Python 코드에서 쉽게 사용할 수 있도록 인터페이스를 제공합니다.
일반적인 작업 흐름은 다음과 같습니다.
- FASTA 형식의 입력 파일을 준비한다.
- ClustalW를 실행하여 다중 서열 정렬을 수행한다.
- 생성된 .aln 파일을 AlignIO로 읽는다.
- Guide Tree가 필요한 경우 .dnd 파일을 Phylo 모듈로 분석한다.
이와 같은 작업 흐름을 이해하면 ClustalW뿐 아니라 MUSCLE, MAFFT 등 다른 다중 서열 정렬 프로그램도 거의 동일한 방법으로 사용할 수 있습니다.
MUSCLE을 이용한 다중 서열 정렬
MUSCLE(Multiple Sequence Comparison by Log-Expectation)은 ClustalW보다 이후에 개발된 다중 서열 정렬 프로그램으로, 비교적 빠른 처리 속도와 높은 정렬 정확도를 제공합니다. DNA, RNA, 단백질 서열의 다중 정렬에 널리 사용되며, 중간 규모 이상의 서열 데이터에도 적합합니다.
Biopython은 Bio.Align.Applications 모듈을 통해 MUSCLE을 Python 코드에서 실행할 수 있는 명령줄 래퍼를 제공합니다. 다만 최신 Biopython에서는 이러한 래퍼의 유지보수가 중단되었으므로, 새로운 프로젝트에서는 Python의 subprocess 모듈을 이용해 MUSCLE을 직접 실행하는 방식을 권장합니다.
MUSCLE을 Python에서 사용하기 전에 명령줄에서 프로그램이 정상적으로 실행되는지 확인하는 것이 좋습니다. 프로그램이 운영체제의 PATH 환경 변수에 등록되어 있으면 실행 파일 이름만으로 호출할 수 있습니다.
기본 사용법
MUSCLE을 실행하기 위해서는 먼저 FASTA 형식의 입력 파일을 준비해야 합니다. 다음 예제에서는 opuntia.fasta 파일을 입력으로 사용하고, 정렬 결과를 opuntia.txt 파일에 저장합니다.
from Bio.Align.Applications import MuscleCommandline
cline = MuscleCommandline(
input="opuntia.fasta",
out="opuntia.txt"
)
print(cline)
실행 결과는 다음과 같습니다.
muscle -in opuntia.fasta -out opuntia.txt
MUSCLE의 실제 명령줄에서는 입력 파일을 지정할 때 -in 옵션을 사용합니다. 그러나 Python에서 in은 예약어이므로 Biopython에서는 대신 input이라는 매개변수 이름을 사용합니다.
별도의 출력 형식을 지정하지 않으면 MUSCLE은 정렬 결과를 FASTA 형식으로 저장합니다. 따라서 생성된 파일은 AlignIO 모듈에서 fasta 형식으로 읽을 수 있습니다.
from Bio import AlignIO
alignment = AlignIO.read(
"opuntia.txt",
"fasta"
)
print(alignment)
Clustal 형식으로 결과 저장하기
MUSCLE은 정렬 결과를 Clustal 형식으로도 출력할 수 있습니다. 이를 위해 clw=True 옵션을 사용합니다.
from Bio.Align.Applications import MuscleCommandline
cline = MuscleCommandline(
input="opuntia.fasta",
out="opuntia.aln",
clw=True
)
print(cline)
실행되는 명령은 다음과 같습니다.
muscle -in opuntia.fasta -out opuntia.aln -clw
생성된 결과 파일은 다음과 같이 읽을 수 있습니다.
from Bio import AlignIO
alignment = AlignIO.read(
"opuntia.aln",
"clustal"
)
print(alignment)
MUSCLE은 원래 ClustalW에서 사용하는 헤더와 형식을 보다 엄격하게 재현하는 출력 방식도 제공합니다. 이 경우 clwstrict=True 옵션을 사용합니다.
from Bio.Align.Applications import MuscleCommandline
cline = MuscleCommandline(
input="opuntia.fasta",
out="opuntia.aln",
clwstrict=True
)
print(cline)
실행 명령은 다음과 같습니다.
muscle -in opuntia.fasta -out opuntia.aln -clwstrict
엄격한 Clustal 형식으로 저장된 파일 역시 AlignIO에서 clustal 형식으로 읽을 수 있습니다.
출력 형식 선택 시 주의할 점
MUSCLE은 FASTA와 Clustal 형식 외에도 여러 출력 형식을 지원합니다. 그러나 Biopython의 AlignIO가 모든 형식을 읽을 수 있는 것은 아닙니다.
예를 들어 MUSCLE은 GCG MSF 형식으로 정렬 결과를 출력할 수 있지만, 사용 중인 Biopython 버전에 따라 해당 형식을 직접 파싱하지 못할 수 있습니다. 또한 HTML 형식은 사람이 결과를 확인하기에는 편리하지만, 후속 프로그램 분석에는 적합하지 않습니다.
따라서 Python에서 결과를 다시 읽어 분석하려면 FASTA 또는 Clustal 형식을 사용하는 것이 가장 안정적입니다.
반복 횟수와 실행 옵션
MUSCLE은 정렬 정확도와 실행 속도를 조절할 수 있는 다양한 옵션을 제공합니다. 대표적으로 최대 반복 횟수, 정렬 방식, 출력 형식 등을 지정할 수 있습니다.
정렬 대상이 많거나 서열 길이가 긴 경우에는 반복 횟수를 줄여 실행 시간을 단축할 수 있습니다. 반대로 높은 정확도가 필요한 경우에는 반복 횟수를 늘릴 수 있습니다.
사용 가능한 옵션은 MUSCLE의 버전에 따라 달라질 수 있으므로, 다음 명령으로 설치된 버전의 도움말을 확인하는 것이 좋습니다.
muscle -help
Biopython 래퍼의 도움말은 다음과 같이 확인할 수 있습니다.
from Bio.Align.Applications import MuscleCommandline
help(MuscleCommandline)
MUSCLE 실행 결과 읽기
MUSCLE 명령 객체를 생성한 뒤 이를 실행하면 정렬 결과 파일이 생성됩니다.
stdout, stderr = cline()
정렬 결과를 파일로 저장하도록 설정한 경우, 중요한 결과는 대부분 출력 파일에 기록됩니다. stdout에는 일반적인 실행 메시지가 저장되고, stderr에는 경고나 오류 메시지가 저장될 수 있습니다.
실행이 완료된 후에는 AlignIO를 이용해 결과 파일을 읽습니다.
from Bio import AlignIO
alignment = AlignIO.read(
"opuntia.aln",
"clustal"
)
print(alignment)
이렇게 읽은 정렬 객체는 각 서열의 비교, 보존 영역 확인, 거리 계산, 계통 분석 등의 후속 작업에 활용할 수 있습니다.
표준 출력을 이용한 MUSCLE 결과 처리
MUSCLE은 정렬 결과를 파일로 저장하지 않고 표준 출력(stdout)으로 직접 반환할 수도 있습니다. 이 방식을 사용하면 임시 출력 파일을 생성하지 않고도 정렬 결과를 Python 메모리에서 바로 처리할 수 있습니다.
입력 파일만 지정하고 출력 파일을 지정하지 않으면 MUSCLE은 기본적으로 정렬 결과를 표준 출력으로 보냅니다.
from Bio.Align.Applications import MuscleCommandline
muscle_cline = MuscleCommandline(
input="opuntia.fasta"
)
print(muscle_cline)
실행되는 명령은 다음과 같습니다.
muscle -in opuntia.fasta
명령 객체를 실행하면 표준 출력과 표준 오류를 문자열로 받을 수 있습니다.
stdout, stderr = muscle_cline()
stdout에는 FASTA 형식의 정렬 결과가 저장됩니다. 이 문자열을 AlignIO에서 읽으려면 파일처럼 동작하는 객체로 변환해야 합니다. 이를 위해 Python의 StringIO를 사용합니다.
from io import StringIO
from Bio import AlignIO
alignment = AlignIO.read(
StringIO(stdout),
"fasta"
)
print(alignment)
StringIO는 메모리에 저장된 문자열을 파일 객체처럼 사용할 수 있도록 해 줍니다. 따라서 실제 파일을 만들지 않고도 AlignIO.read()에 정렬 결과를 전달할 수 있습니다.
표준 출력 방식의 장점과 한계
표준 출력을 이용하면 임시 파일을 생성하고 삭제하는 과정을 생략할 수 있습니다. 소규모 데이터나 간단한 자동화 작업에서는 매우 편리합니다.
그러나 정렬 결과가 매우 큰 경우에는 주의해야 합니다. stdout과 stderr가 모두 문자열 형태로 메모리에 저장되기 때문에, 대용량 정렬에서는 많은 메모리를 사용할 수 있습니다.
대규모 서열 데이터를 처리할 때는 결과를 한꺼번에 문자열로 저장하기보다, subprocess.Popen()을 이용하여 출력 스트림을 직접 읽는 방식이 더 적합합니다.
import subprocess
import sys
from Bio.Align.Applications import MuscleCommandline
from Bio import AlignIO
muscle_cline = MuscleCommandline(
input="opuntia.fasta"
)
child = subprocess.Popen(
str(muscle_cline),
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
universal_newlines=True,
shell=(sys.platform != "win32")
)
alignment = AlignIO.read(
child.stdout,
"fasta"
)
print(alignment)
위 코드는 MUSCLE의 표준 출력을 파이프로 연결하여 AlignIO가 직접 읽도록 합니다. 이 방법은 전체 결과를 하나의 문자열로 메모리에 저장하지 않으므로, 큰 데이터에서 상대적으로 효율적입니다.
다만 외부 프로그램의 실행 오류, 프로세스 종료 상태, 표준 오류 메시지 등을 직접 확인해야 하므로 구현이 복잡해질 수 있습니다.
표준 입력과 표준 출력을 함께 사용하는 방법
MUSCLE은 입력 서열을 파일이 아닌 표준 입력(stdin)으로도 받을 수 있습니다. 이를 이용하면 입력 FASTA 파일과 출력 정렬 파일을 모두 생성하지 않고, Python 메모리에 있는 서열 데이터를 바로 MUSCLE에 전달할 수 있습니다.
먼저 정렬할 서열을 SeqRecord 객체로 준비합니다. 다음 예제에서는 FASTA 파일에서 길이가 900보다 짧은 서열만 선택합니다.
from Bio import SeqIO
records = (
record
for record in SeqIO.parse("opuntia.fasta", "fasta")
if len(record) < 900
)
입력 파일과 출력 파일을 지정하지 않은 상태에서 MUSCLE 명령 객체를 생성합니다. 결과 형식은 엄격한 Clustal 형식으로 설정합니다.
from Bio.Align.Applications import MuscleCommandline
muscle_cline = MuscleCommandline(
clwstrict=True
)
print(muscle_cline)
실행 명령은 다음과 같습니다.
muscle -clwstrict
이제 subprocess.Popen()을 이용하여 MUSCLE 프로세스를 실행합니다.
import subprocess
import sys
child = subprocess.Popen(
str(muscle_cline),
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
universal_newlines=True,
shell=(sys.platform != "win32")
)
MUSCLE은 실행된 상태에서 표준 입력을 기다립니다. SeqIO.write()를 이용하여 선택한 서열을 FASTA 형식으로 표준 입력에 전달합니다.
from Bio import SeqIO
SeqIO.write(
records,
child.stdin,
"fasta"
)
child.stdin.close()
입력을 모두 전달한 뒤에는 반드시 child.stdin.close()를 호출해야 합니다. 표준 입력을 닫아야 MUSCLE이 데이터 입력이 끝났음을 인식하고 정렬을 시작합니다.
정렬 결과는 표준 출력으로 반환되므로, AlignIO.read()를 이용해 바로 읽을 수 있습니다.
from Bio import AlignIO
alignment = AlignIO.read(
child.stdout,
"clustal"
)
print(alignment)
이 방법을 사용하면 입력용 FASTA 파일과 출력용 정렬 파일을 별도로 만들 필요가 없습니다. 모든 처리가 Python과 MUSCLE 사이의 표준 입출력 스트림을 통해 이루어집니다.
그러나 외부 프로그램과 표준 입출력을 직접 연결하는 방식은 운영체제와 실행 환경에 따라 문제가 발생할 수 있습니다. 특히 Windows와 Linux에서는 shell 옵션과 실행 파일 경로 처리 방식이 다를 수 있으므로 주의해야 합니다.
문자열을 표준 입력으로 전달하는 방법
데이터 크기가 크지 않다면 FASTA 데이터를 문자열로 만든 뒤 MUSCLE에 전달할 수도 있습니다.
먼저 StringIO를 이용하여 SeqRecord 객체를 FASTA 형식의 문자열로 변환합니다.
from Bio import SeqIO
from io import StringIO
records = (
record
for record in SeqIO.parse("opuntia.fasta", "fasta")
if len(record) < 900
)
handle = StringIO()
SeqIO.write(
records,
handle,
"fasta"
)
data = handle.getvalue()
이제 생성된 FASTA 문자열을 MUSCLE의 표준 입력으로 전달합니다.
stdout, stderr = muscle_cline(
stdin=data
)
반환된 정렬 결과는 다시 StringIO로 감싼 뒤 AlignIO에서 읽습니다.
from io import StringIO
from Bio import AlignIO
alignment = AlignIO.read(
StringIO(stdout),
"clustal"
)
print(alignment)
이 방식은 코드가 비교적 간단하지만, 입력 서열과 출력 정렬 결과가 모두 메모리에 저장됩니다. 따라서 서열 수가 많거나 데이터가 큰 경우에는 메모리 사용량이 크게 증가할 수 있습니다.
소규모 데이터에서는 문자열 방식이 편리하지만, 대용량 데이터에서는 파일 또는 스트림 기반 처리 방식을 사용하는 것이 안정적입니다.
'생명정보학 & 화학정보학 > 바이오파이썬' 카테고리의 다른 글
| PairwiseAligner를 이용한 서열 쌍 정렬 (0) | 2026.07.30 |
|---|---|
| EMBOSS에서의 서열정렬 (0) | 2026.07.30 |
| 정렬 (Alignment) (0) | 2026.07.30 |
| UPGMA 계통수 (0) | 2023.05.28 |
| Kaggle에서 서열 정렬과 계통수 (0) | 2022.11.01 |