FASTQ'dan FASTA'ya Donusturme Perl Scripti
By Güngör Budak
- 3 minutes read - 484 wordsFASTQ ve FASTA formatlari aslinda ayni bilgiyi iceren ancak birinde sadece herbir dizi icin iki satir daha az bilginin bulundugu dosya formatlari. Projemde onemli olan diger bir farklari ise FASTA formatinin direkt olarak MegaBLAST arama yapilabilmesi. Iste bu yuzden, genetik dizilim yapan makinelerin olusturdugu FASTQ formatini FASTA’ya cevirmem gerekiyor. Ve bu script pipeline’in ilk adimi.
Aslinda deneme amacli aldigim genetk dizilimin, bana bunu ulastiran tarafindan eslestirmesinin yapilmadigi icin, bir on adim olarak bu eslestirmeyi yapmistim. Ancak, pipeline’a boyle bir adim eklemeyecegim. Pipeline, icerisinde sadece eslesemeyen okumalarin (unmapped reads) bulundugu FASTQ dosyasiyla baslayacak.
Asagidaki detaylandirdigim script, create_fasta.pl adini verdigim Perl scripti.
Her zaman oldugu gibi scriptle su satirla basliyoruz:
1#!/usr/local/bin/perl
Daha sonra kullanicidan scripti calistirirken istedigimiz iki parametreyi @ARGV dizisinden (array) okuyoruz. $input, FASTQ dosyasinin yolu, $n ise FASTA formatina cevirmek istedigimiz okuma sayisi. Eger tum dosyayi cevirmek istiyorsak, $n degeri girmeyebiliriz. Bu durumda asagidaki kontrol yapisindan anlayacaginiz gibi $n tanimlanmadiginda $n’i cok buyuk bir sayiya (1012) atiyor.
1$input = $ARGV[0];
2if (defined($n)) {
3 $n = $ARGV[1];
4} else {
5 $n = 1000000000000;
6}
Ardindan girdi dosyamizi (FASTQ dosyasi) aciyoruz.
1open INPUT, $input or die $!;
Sonra $i, $j ve $k degiskenlerine sirasiyla 1, 2, 1 degerlerini atiyoruz. Bu degiskenlerden $i her okumanin baslik satirinin, satir numarasi, boylece her $i’inci satiri, baslik olarak gorup, o sekilde FASTA dosyamiza yazdirabiliriz. Ayni sekilde $j ise her okumanin dizilim satirinin satir numarasi, yani her $j’inci satirda bir diziyle karsilasiyoruz. Bu satirlar her 4 satirda bir karisimiza ciktigi icin (cunku FASTQ dosyasinda her okuma 4 satira sahip) bunlari daha sonra kontrol yapilarinin icinde 4’er artiracagiz. $k ise, sadece bir sayici. Her okumada, kontrol yapisi icinde, 1 artirilacak ve onu okuma adindaki okuma numarasini yazdirmak icin kullanacagim.
1$i = 1;
2$j = 2;
3$k = 1;
Simdi tum isi yapan while dongusu var. Bu dongu dosyayi satir satir okuyor ve satiri baslik ise ayri, dizi ise ayri degerlendirip ona gore cikti veriyor. Ayrica eger istedigimiz okuma sayisina ulasmissa donguyu sonlandiriyor.
while dongusunu asagidaki gibi kuruyoruz ve dosyamizdaki her okunan satiri $line degiskeninde sakliyoruz.
1while(my $line = <INPUT>){
2
3}
Daha sonra chomp komutu ile bu satirdan, satir sonundaki yeni satir karakterini siliyoruz.
1chomp($line);
Son olarak asagida, kodun tumunde goreceginiz while dongusu icindeki kontrol yapilari ile de dosyamizi satir satir olusturuyoruz.
1#!/usr/local/bin/perl
2$input = $ARGV[0];
3if (defined($n)) {
4 $n = $ARGV[1];
5} else {
6 $n = 1000000000000;
7}
8
9open INPUT, $input or die $!;
10$i = 1;
11$j = 2;
12$k = 1;
13while (my $line = <INPUT>){
14 chomp($line);
15
16 if ($i eq $.){
17 print ">read_".$k." ".$line."\n";
18 $i += 4;
19 } elsif ($j eq $.){
20 print $line."\n";
21 $j += 4;
22 $k++;
23 }
24
25 last if ($k>$n);
26}
27
28close INPUT;
Simdilik script bu sekilde, neredeyse tamam ancak okuma isimlerini sabit bir sekilde “read_X” seklinde adlandirmaktansa, dinamik bir sekilde, girdi dosyasina gore belirlemek istiyorum. Bunu ileride degistirecegim.