RやY、そしてNに対応させてみた。足したら10になる組合わせとして設定している。
<?php $seq0 = ereg_replace("A","1",$argv[1]); $seq0 = ereg_replace("C","2",$seq0); $seq0 = ereg_replace("Y","3",$seq0); $seq0 = ereg_replace("N","5",$seq0); $seq0 = ereg_replace("R","7",$seq0); $seq0 = ereg_replace("G","8",$seq0); $seq0 = ereg_replace("T","9",$seq0); $seq1 = ereg_replace("A","1",strrev($argv[2])); $seq1 = ereg_replace("C","2",$seq1); $seq1 = ereg_replace("Y","3",$seq1); $seq1 = ereg_replace("N","5",$seq1); $seq1 = ereg_replace("R","7",$seq1); $seq1 = ereg_replace("G","8",$seq1); $seq1 = ereg_replace("T","9",$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 "二つの配列の長さが等しくありません。\n"; } $count = array_count_values($res); if($count[10]==strlen($seq0)){ echo "二つの塩基配列は互いに相補鎖です。\n"; }else{ echo "二つの塩基配列は互いに相補鎖ではありません。\n"; $dif = array(); for($j=0;$j<strlen($seq0);$j++){ if($res[$j]!=10){ array_push($dif,($j+1)); } } echo "異なっている位置: ".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"; } ?>これをcomple.phpとでも名付けて保存し、php comple.php GGCCYTCTNA TNAGARGGTCと入力してみれば、
二つの塩基配列は互いに相補鎖ではありません。 異なっている位置: 2 GGCCYTCTNA CTGGRAGANT *と答えてくれる。実は三延期の組合わせの一文字表記というのもあるのだが、面倒臭いので今回は設定していない。足したら10ではなく、14くらいにする必要はあると思うが、最初の数値への変換設定を増やせばいいだけだ。
塩基配列の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という入力にも対応していないし。
肩凝りが激しくて困っている。もう痛くて痛くて、一昨日は肩から腕にかけて痺れるような感覚が降りていった。マウスやトラックボールがいけないんじゃないかと思っている。そこで、足でトラックボールを操作してみたりしたのだが、全然状況は改善されない。仕方がないので、なるべくキーボードから手を離さずに仕事をしようと考えた。
MacOSXだとどうしてもGUIなしってことはないのだが、いや、それならMacを使う理由がないのだが、極力キーボードから手を離さないにはどうしたらいいかを考えた。
そこで今日知ったことがいくつかある。
さて、日常の細々したメモファイルはテキストファイルかhtmlファイルか、どちらが便利なのだろう。よく判らないが、htmlで新規メモファイルを作るPHPスクリプトを作ってみた。以下のPHPスクリプトファイルをmemoというような名前でパスの通ったディレクトリに置いて、実行権を与えておく。
#!/usr/bin/php <?php $title = $argv[1]; if(empty($title)){ $title = "untitled.html"; } if(file_exists("/Users/tolleetlege/Documents/memo_folder/".$title)){ echo "Use another filename!\n"; }else{ $html = "<html>\n"; $html .= " <head>\n"; $html .= " <title>".ereg_replace("\.html$","",$title)."</title>\n"; $html .= " </head>\n"; $html .= " <body>\n\n\n"; $html .= " </body>\n"; $html .= "</html>\n"; file_put_contents("/Users/tolleetlege/Documents/memo_folder/".$title,$html); echo "w3m /Users/tolleetlege/Documents/memo_folder/".$title."\n"; } ?>書類フォルダにmemo_folderというのを用意しておいて、そこに新規メモファイルができるようにしている(ユーザ名はtolleetlege)。名前はmemo xxx.htmlというように打てば、xxx.htmlがファイル名になるようにしてみた。既に同じファイル名があると、変えてくれという表示が出て終わってしまう。htmlの外枠だけ作って、w3mで自動的に開かせたかったのだが、どうしたら開くのか判らない。仕方がないので、ファイルを開くためのコマンドが表示されるようにしてみた。ちょっと情けない。これが、MacOSXのアプリケーションなら、open -a mi /path/file.htmlというような一行を、execでPHPから実行させることができるのだが、exec("w3m /path/file.html")とやっても何も起こらないのだ。どうすればいいんだろう。