FASTAシークエンスのいっぱい入ったファイルの中から、ある特定のFASTAシークエンスを抽出したい時につかえるプログラムを書いてみました。
ここまで書くには結構勉強した。
FASTAフォーマット
>1
ATGATATGAGGATGCGTAGTA
>2
AAAAATTTTGGGGCCCCC
>3
TTTTTCCCGTGTAGTGATGTGTCGTGCTGATCGTACGTCG
という遺伝子が入ったファイルがある。
その中から3のみを抽出したいときは、
>3
と書かれたファイルを用意して下のプログラムを実行すると。
FASTAフォーマットのファイルの中から
>3
TTTTTCCCGTGTAGTGATGTGTCGTGCTGATCGTACGTCG
だけを抽出してくれる。
今5万個とか扱っているのでこれを勉強して書く手間と5万個コピペする手間を考えたら
これを書くほうが楽チン。
プログラムの内容は何でもいいから目的が果たせたらいいという代物なので
褒められたものではないだろう。
ここから下がプログラム
#!/usr/bin/perl -w
use strict;
use warnings;
use POSIX;
# enter the fastafile to hash.
my ($fastafile) = @ARGV;
open FASTA, "<$fastafile";
my %hash=(); # initializes a hash
while (<FASTA>)
{
if ($_ =~ /^>/)
{
my $header = $_;
$header =~ s/\s//g;
my $read_id = $_;
$hash{$header}{name}=$read_id;
my $line = <FASTA>;
$hash{$header}{sequence}= $line;
}
}
close FASTA;
my $counter = 0;
my $name = <STDIN>;
open (FASTANAME, $name);
while (<FASTANAME>)
{
my $filename = $_;
$filename =~ s/\s//g;
my $header = $filename;
if (exists $hash{"$header"})
{
$counter = $counter + 1;
print "$hash{$header}{name}";
print "$hash{$header}{sequence}";
}
}
close (FASTANAME);
print "$counter fasta sequences are here\n";
ここまで書くには結構勉強した。
FASTAフォーマット
>1
ATGATATGAGGATGCGTAGTA
>2
AAAAATTTTGGGGCCCCC
>3
TTTTTCCCGTGTAGTGATGTGTCGTGCTGATCGTACGTCG
という遺伝子が入ったファイルがある。
その中から3のみを抽出したいときは、
>3
と書かれたファイルを用意して下のプログラムを実行すると。
FASTAフォーマットのファイルの中から
>3
TTTTTCCCGTGTAGTGATGTGTCGTGCTGATCGTACGTCG
だけを抽出してくれる。
今5万個とか扱っているのでこれを勉強して書く手間と5万個コピペする手間を考えたら
これを書くほうが楽チン。
プログラムの内容は何でもいいから目的が果たせたらいいという代物なので
褒められたものではないだろう。
ここから下がプログラム
#!/usr/bin/perl -w
use strict;
use warnings;
use POSIX;
# enter the fastafile to hash.
my ($fastafile) = @ARGV;
open FASTA, "<$fastafile";
my %hash=(); # initializes a hash
while (<FASTA>)
{
if ($_ =~ /^>/)
{
my $header = $_;
$header =~ s/\s//g;
my $read_id = $_;
$hash{$header}{name}=$read_id;
my $line = <FASTA>;
$hash{$header}{sequence}= $line;
}
}
close FASTA;
my $counter = 0;
my $name = <STDIN>;
open (FASTANAME, $name);
while (<FASTANAME>)
{
my $filename = $_;
$filename =~ s/\s//g;
my $header = $filename;
if (exists $hash{"$header"})
{
$counter = $counter + 1;
print "$hash{$header}{name}";
print "$hash{$header}{sequence}";
}
}
close (FASTANAME);
print "$counter fasta sequences are here\n";
PR
ブラストクラストを走らせると問題がでてくる。
一回のランでは綺麗にクラスタリングされないのだ。
クラスタリングされなかったものを集めてきてもう一度ブラスとクラストをかけると、
クラスタリングされるものが出てくる。
この原因はおそらくシークエンスの長さによるものだと思うのだが、どうすればいいの?
やはりクラスタリングされなくなるまでクラスタリングするべきか。
一回のランでは綺麗にクラスタリングされないのだ。
クラスタリングされなかったものを集めてきてもう一度ブラスとクラストをかけると、
クラスタリングされるものが出てくる。
この原因はおそらくシークエンスの長さによるものだと思うのだが、どうすればいいの?
やはりクラスタリングされなくなるまでクラスタリングするべきか。
ブラストクラストというプログラムを使って、ESTデーターなどのたくさんの配列の冗長を取り除く事ができます。
目で確認できるほどなら問題ないのですが、データーがたくさんあると数えるのが大変なのでパールでプログラムを作ってみました。
このプログラムを使うと、ブラストクラストの吐き出すデーターのクラスターされた数をカウントできます。
僕の場合は120937の配列をクラスタリングされてできた結果が67694にクラスタリングされました。
下に張ったプログラムを実行すると
ぶわーっと各クラスターに何個のシークエンスがクラスタリングされたかを吐き出した後に
20個以上クラスタリングされたクラスターの数、
19個から6個クラスタリングされたクラスターの数、
5個クラスタリングされたクラスターの数、
4個クラスタリングされたクラスターの数、
3個クラスタリングされたクラスターの数、
2個クラスタリングされたクラスターの数、
1個(クラスタリングされなかったもの)クラスタリングされたクラスターの数、
を吐き出します。
クラスターの数は最後の方にプリントされます。
20= 532
19-5>1069
5=253
4=349
3=571
2=1035
1=63885
67694
total 67694
こんな感じです。
これは例えば3つのシークエンスがクラスタリングされたものが571あるということを表しています。
同様に19から5よりも上の数のシークエンスがクラスタリングされたものは1069あるという意味です。
こういう処理をやろうとしている人にしか
このプログラムの意味はわからないと思いますが丁寧に説明するのは面倒なのであんまり説明しません。
きっとこんな事をしている人たちはバイオインフォマジシャン達なので
こんなしょぼいプログラムは必要ないでしょう。
一応、独学で奮闘している人にとって参考になるかなあと思ってのっけておきます。
(僕も独学ですので適当なプログラミングです。)
プログラムはここから。
#!/usr/bin/perl -w
use strict;
use warnings;
use POSIX;
my $counter_20 = 0;
my $counter_5_20= 0;
my $counter_5= 0;
my $counter_4= 0;
my $counter_3= 0;
my $counter_2= 0;
my $counter_1= 0;
my $counter= 0;
my $name = <STDIN>;
open (FASTANAME, $name);
while (<FASTANAME>)
{
my @filename = split( " ", $_);
my $clusternumber = @filename;
print $clusternumber, "\n";
if ($clusternumber == 1)
{$counter_1++
}elsif ($clusternumber == 2)
{$counter_2++
}elsif ($clusternumber == 3)
{$counter_3++
}elsif ($clusternumber == 4)
{$counter_4++
}elsif ($clusternumber == 5)
{$counter_5++
}elsif ($clusternumber >= 20)
{$counter_20++
}else
{$counter_5_20++
}
$counter++;
}
close (FASTANAME);
print "20\= $counter_20\n";
print '19>5',"$counter_5_20\n";
print "5\=$counter_5\n";
print "4\=$counter_4\n";
print "3\=$counter_3\n";
print "2\=$counter_2\n";
print "1\=$counter_1\n";
print "$counter\n";
my $total = $counter_1 + $counter_2 + $counter_3 + $counter_4 + $counter_5 + $counter_5_20 + $counter_20;
print "total $total\n";
目で確認できるほどなら問題ないのですが、データーがたくさんあると数えるのが大変なのでパールでプログラムを作ってみました。
このプログラムを使うと、ブラストクラストの吐き出すデーターのクラスターされた数をカウントできます。
僕の場合は120937の配列をクラスタリングされてできた結果が67694にクラスタリングされました。
下に張ったプログラムを実行すると
ぶわーっと各クラスターに何個のシークエンスがクラスタリングされたかを吐き出した後に
20個以上クラスタリングされたクラスターの数、
19個から6個クラスタリングされたクラスターの数、
5個クラスタリングされたクラスターの数、
4個クラスタリングされたクラスターの数、
3個クラスタリングされたクラスターの数、
2個クラスタリングされたクラスターの数、
1個(クラスタリングされなかったもの)クラスタリングされたクラスターの数、
を吐き出します。
クラスターの数は最後の方にプリントされます。
20= 532
19-5>1069
5=253
4=349
3=571
2=1035
1=63885
67694
total 67694
こんな感じです。
これは例えば3つのシークエンスがクラスタリングされたものが571あるということを表しています。
同様に19から5よりも上の数のシークエンスがクラスタリングされたものは1069あるという意味です。
こういう処理をやろうとしている人にしか
このプログラムの意味はわからないと思いますが丁寧に説明するのは面倒なのであんまり説明しません。
きっとこんな事をしている人たちはバイオインフォマジシャン達なので
こんなしょぼいプログラムは必要ないでしょう。
一応、独学で奮闘している人にとって参考になるかなあと思ってのっけておきます。
(僕も独学ですので適当なプログラミングです。)
プログラムはここから。
#!/usr/bin/perl -w
use strict;
use warnings;
use POSIX;
my $counter_20 = 0;
my $counter_5_20= 0;
my $counter_5= 0;
my $counter_4= 0;
my $counter_3= 0;
my $counter_2= 0;
my $counter_1= 0;
my $counter= 0;
my $name = <STDIN>;
open (FASTANAME, $name);
while (<FASTANAME>)
{
my @filename = split( " ", $_);
my $clusternumber = @filename;
print $clusternumber, "\n";
if ($clusternumber == 1)
{$counter_1++
}elsif ($clusternumber == 2)
{$counter_2++
}elsif ($clusternumber == 3)
{$counter_3++
}elsif ($clusternumber == 4)
{$counter_4++
}elsif ($clusternumber == 5)
{$counter_5++
}elsif ($clusternumber >= 20)
{$counter_20++
}else
{$counter_5_20++
}
$counter++;
}
close (FASTANAME);
print "20\= $counter_20\n";
print '19>5',"$counter_5_20\n";
print "5\=$counter_5\n";
print "4\=$counter_4\n";
print "3\=$counter_3\n";
print "2\=$counter_2\n";
print "1\=$counter_1\n";
print "$counter\n";
my $total = $counter_1 + $counter_2 + $counter_3 + $counter_4 + $counter_5 + $counter_5_20 + $counter_20;
print "total $total\n";