python์์ bam์ด๋ vcf ํ์ผ์ ์ง์ ๋ค๋ฃจ๊ธฐ์๋ ์ ๋ณด๋ ๋ง๊ณ ํ์คํ์ค ์ฝ๋ฉํ๊ธฐ๊ฐ ์ด๋ ต๋ค.
pysam์ด๋ ๋ชจ๋์ ์ด์ฉํ๋ฉด ์ข ๋ ์ฝ๊ณ ๋น ๋ฅด๊ฒ bam ํ์ผ์ด๋ vcf ํ์ผ์ ๋ค๋ฃฐ ์ ์๊ธฐ ๋๋ฌธ์ pysam ๋ชจ๋ ์ฌ์ฉ๋ฒ์ ๋ํด ์์๋ณด๋ ค๊ณ ํ๋ค.
1. pysam์ด๋?
pysam์ SAM/BAM, VCF ํ์์ ํ์ผ์ ์ฝ๊ณ ์กฐ์ํ๋ ํ์ด์ฌ ๋ชจ๋์ด๋ค.
์ด ๋ชจ๋์ samtools์ ๊ธฐ๋ฅ์ ๊ฐ๋จํ๊ฒ ์กฐ์๋ ๊ฐ๋ฅํ๋ฉฐ tabix์ ๋ํ ์ธํฐํ์ด์ค๋ ํฌํจํ๊ณ ์๋ค.
2. pysam ์ค์นํ๊ธฐ
pysam์ ์ค์นํ๋ ๋ฐฉ๋ฒ์ ๋๊ฐ์ง๊ฐ ์๋๋ฐ, conda ๋ฅผ ์ด์ฉํด์ ์ค์นํ๊ฑฐ๋ ์ง์ pip install ๋ช ๋ น์ด๋ก ์ค์นํ๋ฉด๋๋ค.
<conda๋ก ์ค์นํ๊ธฐ>
conda config --add channels defaults
conda config --add channels conda-forge
conda config --add channels bioconda
conda install pysam
<pip ์ผ๋ก ์ค์นํ๊ธฐ>
pip install pysam
3. pysam์ ์ด์ฉํ bamํ์ผ ๋ค๋ฃจ๊ธฐ
pysam document์ ์ ๋์์๊ธด ํ๋ ๊ธฐ๋ก์ฉ์ผ๋ก vcf ํ์ผ ๋ค๋ฃจ๋๋ฒ์ ๋ํด ์ค๋ช ํ๊ฒ ๋ค.
document๋ ์๋ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ๋ฉด ๋๋ค.
https://pysam.readthedocs.io/en/latest/api.html
๋จผ์ pysam์ import ํด์จ๋ค.
์ฌ์ฉํ๋ ค๋ bamํ์ผ์ ๊ฒฝ๋ก๋ฅผ ex1.bam ์์น์ ๋ฃ์ด์ฃผ๊ณ bamํ์ผ์ด๋ฏ๋ก rb ์ฆ read binary ์ต์ ์ ์จ์ค๋ค.
- r: ํ์ผ์ ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ํ์ผ์ ์ฐ๋ค.
- b: BAM ํ์์ ๋ฐ์ด๋๋ฆฌ ํ์ผ์ ์ฒ๋ฆฌ.
import pysam
samfile = pysam.AlignmentFile("ex1.bam", "rb")
bamํ์ผ์์ ํน์ ๋ฒ์์ read๋ฅผ ๊ฐ์ ธ์ ์ถ๋ ฅํ๊ธฐ
chr1 ์ผ์์ฒด์ 100๋ฒ๋ถํฐ 120๋ฒ ์ผ๊ธฐ๊น์ง์ ๋ฒ์์ ํด๋นํ๋ read๋ฅผ ๊ฐ์ ธ์ค๊ณ ์ถ์๋ ์๋์ ๊ฐ์ด ์ฌ์ฉํด์ค๋ค.
for read in samfile.fetch('chr1', 100, 120):
print(read)
samfile.close()
bamํ์ผ์์ paired read๋ง ์ ์ฅํ๊ธฐ
bamํ์ผ์์ paired read๋ง ๊ฐ์ ธ์์ ์ฌ์ฉํ๊ณ ์ถ์๋ ์๋์ ๊ฐ์ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ค.
allpaired.bam๋ผ๋ bamํ์ผ์ด ์ต์ข output์ด๊ณ ํด๋น bamํ์ผ์ ex1.bam์์์ paired read๋ฅผ ์ ์ฅํ๋ค.
import pysam
samfile = pysam.AlignmentFile("ex1.bam", "rb")
pairedreads = pysam.AlignmentFile("allpaired.bam", "wb", template=samfile)
for read in samfile.fetch():
if read.is_paired:
pairedreads.write(read)
pairedreads.close()
samfile.close()
4. pysam์ ์ด์ฉํ vcf ํ์ผ ๋ค๋ฃจ๊ธฐ
pysam์ ์ด์ฉํด์ vcf ํ์ผ์ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ์ ๋งค์ฐ ๊ฐ๋จํ๋ค.
VariantFile์ ์ด์ฉํด์ ๋ถ๋ฌ์ค๋ฉด ํค๋๋ ์ปฌ๋ผ๋ช ์ ๋ฐ๋ก ์ ํด์ฃผ์ง ์์๋ vcf๋ฅผ ์ฝ์ด์ฌ ์ ์๋ค.
test.vcf๋ผ๋ vcfํ์ผ์ vcf_in ์ด๋ผ๋ ๋ณ์๋ก ๋ถ๋ฌ์๋ณด๊ฒ ๋ค.
VCF ํ์ผ ์ฝ์ด์ค๊ธฐ
from pysam import VariantFile
vcf_in = VariantFile("test.vcf") # auto-detect input format
vcf_out = VariantFile('-', 'w', header=vcf_in.header)
for rec in vcf_in.fetch('chr1', 100000, 200000):
vcf_out.write(rec) ##chr1:100000-200000 ๋ฒ์์ ๋ณ์ด๊ฐ ์ ์ฅ๋จ
VCF ํ์ผ์์ ํน์ ์ปฌ๋ผ์ ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ
vcfํ์ผ์์ chromosome, position, ref, alt ์ ๋ณด๋ฅผ ํ์ธํ๊ณ ์ถ์ ๊ฒฝ์ฐrec.chrom ์ฒ๋ผ . ๋ค์ ์ปฌ๋ผ๋ช ์ ์จ์ฃผ๋ฉด ๋๋ค.
for rec in vcf.fetch():
# print(rec.header)
chrom=rec.chrom
pos=str(rec.pos)
ref=rec.ref
alt=rec.alts[0]
# print(rec)
if len(ref) > 1 or len(alt) > 1 :
print(ref, alt)
๊ธฐ์กด์ VCFํ์ผ์ ์ฝ์ด์ค๊ธฐ ์ํด for๋ฌธ์ผ๋ก ํ์ค์ฉ ์ฝ๋ฉ์ ํ๋ค๋ฉด ๋ชจ๋์ ์ด์ฉํ๋ฉด ์ข ๋ ์ฝ๊ฒ ํ์ผ์ ๋ค๋ฃฐ ์ ์๋ค.