2008-01-27 16:59:36
塩基配列のAを01、Cを00、Gを11、Tを10と表現すると、ある配列と相補的な配列を並べて足すと、その配列は1111.....となる。なるほどそうか。そうすると何かいいことがあるだろうか。
二つの塩基配列を比較して相補的かどうか確認するPHPスクリプトを書いてみた。
<?php
$seq0 = ereg_replace("A","01",$argv[1]);
$seq0 = ereg_replace("C","00",$seq0);
$seq0 = ereg_replace("G","11",$seq0);
$seq0 = ereg_replace("T","10",$seq0);
$seq1 = ereg_replace("A","01",strrev($argv[2]));
$seq1 = ereg_replace("C","00",$seq1);
$seq1 = ereg_replace("G","11",$seq1);
$seq1 = ereg_replace("T","10",$seq1);
$seq0a = str_split($seq0);
$seq1a = str_split($seq1);
$res = array();
if(strlen($seq0) == strlen($seq1)){
for($i=0;$i<strlen($seq0);$i++){
array_push($res,($seq0a[$i]+$seq1a[$i]));
}
}else{
echo "The lengths of two sequences are not equal.\n";
}
$count = array_count_values($res);
if($count[1]==strlen($seq0)){
echo "The two sequences are complemental.\n";
}else{
echo "The two sequences are not complemantal.\n";
$dif = array();
for($j=0;$j<strlen($seq0);$j++){
if($res[$j]!=1){
array_push($dif,(round(($j+1.1)/2)));
}
}
echo "Position: ".implode(",",array_unique($dif))."\n";
echo $argv[1]."\n";
echo strrev($argv[2])."\n";
for($k=1;$k<=strlen($argv[1]);$k++){
if(in_array($k,$dif)){
echo "*";
}else{
echo " ";
}
}
echo "\n";
}
これをcomplement.phpという名前で保存し、php complement.php TCGGCCATAAGACC GGTCTTACGGCCGAとしてみると、
The two sequences are not complemantal.
Position: 7
TCGGCCATAAGACC
AGCCGGCATTCTGG
*
という結果が表示される。これなら別に01表記に変換する必要はまったくないということに気づくわけである。1,2,3,4にして足したら3になるかどうかで判定すればいいのだ。それに上の足し算は2進法で計算しているわけでもない。
こんなものがどういうときに役立つかというと、例えば合成DNAを註文するときに、相補的な配列を入力しなければならないのを間違えてしまったりしていないかどうか確認するときなどが思いつくけれども、註文画面に相補鎖変換機能がついているところもあるし、そんなに役立たないような気もする。それに、R/YやNという入力にも対応していないし。