생물정보학/바이오파이썬

FASTQ 파일 다루기

곰탱이장 2024. 11. 30. 18:51

 FASTQ 형식 소개에서 다뤘듯이 FASTQ 파일 형식은 서열id,서열,품질을 동시에 품고 있다. 이번 포스트에서는 ROSALIND 문제들을 통해 FASTQ 파일을 어떻게 다루는지 서술할 것이다.

 

https://rosalind.info/problems/phre/

 

ROSALIND | Read Quality Distribution

It appears that your browser has JavaScript disabled. Rosalind requires your browser to be JavaScript enabled. Read Quality Distribution solved by 1338 2013년 6월 25일 8:04:38 오후 by Rosalind Team Topics: Bioinformatics Tools, NGS Quality Prevails Fi

rosalind.info

 

이 문제에서는 FASTQ 파일에서 여러 개의 read에서 품질(quality)를 추출하여 품질의 평균이 역치를 넘은 서열의 개수를 구하는 문제이다. 우리가 SeqIO.parse()를 통해서 파일을 읽을 때 우리는 SeqRecord 객체를 얻는다. 이 SeqRecord 객체는 여러가지 정보를 attribute로 저장하고 있다. 이를 우리는 부를 수 있다.

from Bio import SeqIO

with open(r'파일경로','r') as f:
	threshold = int(f.readline().rstrip())
    
    records = SeqIO.parse(f,'fastq')
    ans=0
    for record in records:
    	if sum(record.letter_annotations['phred_quality'])/len(record) >= threshold:
        	ans+=1
	print(ans)

이와 같이 우리는 record.letter_annotations['phred_quality']로 base 당 품질이 어떻게 되는지 부를 수 있다.

 

https://rosalind.info/problems/filt/

 

ROSALIND | Read Filtration by Quality

It appears that your browser has JavaScript disabled. Rosalind requires your browser to be JavaScript enabled. Read Filtration by Quality solved by 1042 2013년 6월 25일 8:05:33 오후 by Rosalind Team Topics: Bioinformatics Tools, NGS A Good Sort Filter

rosalind.info

 

 이 문제는 여러개의 read중 주어진 역치를 넘은 base의 비율이 주어진 비율보다 높은 read의 개수를 세는 문제이다. 이 문제를 통해 우리는 base 하나씩 품질에 접근해서 품질이 낮은 base들은 쳐낼 수 있다.

from Bio import SeqIO

with open(r"파일경로",'r') as f:
    threshold,percentage = map(int,f.readline().rstrip().split())
    
    records = SeqIO.parse(f,'fastq')
    ans=0
    for record in records:
        total = len(record.seq)
        over=sum(i>=threshold for i in record.letter_annotations['phred_quality'])
        if over/total >= percentage/100:
            ans+=1
    
    print(ans)

 

https://rosalind.info/problems/bphr/

 

ROSALIND | Base Quality Distribution

It appears that your browser has JavaScript disabled. Rosalind requires your browser to be JavaScript enabled. Base Quality Distribution solved by 776 2014년 2월 21일 5:37:09 오후 by Rosalind Team Topics: Bioinformatics Tools, NGS All That is Said Lit

rosalind.info

 

이 문제는 반대로 여러 개의 길이가 같은 read에서 유독 품질이 떨어지는 특정 base position의 개수를 세는 문제이다. 

from Bio import SeqIO

with open(r'파일경로','r') as f:
    threshold = int(f.readline().rstrip())

    records = SeqIO.parse(f,'fastq')
    mean_q = next(records).letter_annotations['phred_quality']
    cnt=1
    for record in records:
        cnt+=1
        for idx,q in enumerate(record.letter_annotations['phred_quality']):
            mean_q[idx]+=q
    
    ans = sum(i/cnt < threshold for i in mean_q)
    print(ans)

 

https://rosalind.info/problems/bfil/

 

ROSALIND | Base Filtration by Quality

It appears that your browser has JavaScript disabled. Rosalind requires your browser to be JavaScript enabled. Base Filtration by Quality solved by 657 2014년 2월 21일 5:41:55 오후 by Rosalind Team Topics: Bioinformatics Tools, NGS Cannot milk it? Onc

rosalind.info

 

 이 문제는 주어진 read 중 품질이 떨어지는 양쪽 끝을 trimming 함으로써 그나마 쓸 수 있는 정보를 건져내는 문제이다.

from Bio import SeqIO

def trim(record,cut_off):
    quality_list = record.letter_annotations['phred_quality']
    front,back = -1,-1
    for idx,q in enumerate(quality_list):
        if q>=cut_off:
            front = idx
            break
    
    for idx,q in enumerate(quality_list[::-1]):
        if q>=cut_off:
            back = idx
            break
    
    return front,back

with open(r"파일경로",'r') as f:
    cut_off = int(f.readline().rstrip())

    records = SeqIO.parse(f,'fastq')
    ans_file = open(r"파일경로",'w')
    for record in records:
        front,back=trim(record,cut_off)
        new_record = record[front:len(record)-back]

        SeqIO.write(new_record,ans_file,'fastq')
    ans_file.close()

 

우리는 이와 같이 FASTQ 파일에서 품질에 접근하여 서열을 다룰 수 있다.

'생물정보학 > 바이오파이썬' 카테고리의 다른 글

Suboptimal local alignment  (2) 2024.12.07
Seq 객체 다루기  (0) 2024.12.01
단백질 번역하기  (2) 2024.11.29
FASTQ 형식 소개  (0) 2024.11.24
ID를 이용하여 global pairwise alignment 하기  (0) 2024.11.24