PYTHON๐Ÿ

python :: pysam ๋ชจ๋“ˆ์„ ์ด์šฉํ•œ bam, vcf ํŒŒ์ผ ๋‹ค๋ฃจ๊ธฐ

ํžˆ์Šคํ†ค 2024. 12. 20. 17:08

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๋ฌธ์œผ๋กœ ํ•œ์ค„์”ฉ ์ฝ”๋”ฉ์„ ํ–ˆ๋‹ค๋ฉด ๋ชจ๋“ˆ์„ ์ด์šฉํ•˜๋ฉด ์ข€ ๋” ์‰ฝ๊ฒŒ ํŒŒ์ผ์„ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค.