這就是最近在研究的目標
最終目標就是用PHP寫出藥物設計DOCKING的程式出來
不過這個目標遠大
所以還是一步一步先來
首先第一個當然就是要讀取 LIGAND 和 PROTEIN 的檔案
並且能把3d圖形顯示出來
所以就先分析了一下普遍藥物LIGAND的檔案 *.mol2 檔
然後做出一些分析......
================待補齊==============
至於輸出結果為以下
寄件者 FQstory |
寄件者 FQstory |
Z軸為 以Z軸為不動 轉動XY平面
X軸為 以X軸為不動 轉動YZ平面
其他的就設定大小和出現位置
不過 當然 這是不能直接轉動的
因為他是PHP麻
他是以圖片輸出 然後顯示出來
=============程式碼==============
<?php
function readligand($name){
$checkprint = 0;
$i = 1;
$fp = fopen($name,"r");
$atom ='';
while(!feof($fp)){
$read = fgets($fp);
if(trim($read) == '@<TRIPOS>ATOM'){
$checkprint = 1;
}elseif(trim($read) == '@<TRIPOS>BOND'){
$checkprint = 2;
$i =1;
}elseif($checkprint > 0){
$atoms ='';
$atom = explode(" ",$read);
for($j=0;$j<count($atom);$j++){ //去除多個空白只留一個
if($atom[$j] != ''){
$atoms = $atoms.' '.$atom[$j];
}
}
$atomr[$checkprint][$i] = explode(" ",$atoms);
if($checkprint == 1){
$atomr[$checkprint][$i][3] = $atomr[$checkprint][$i][3];
$atomr[$checkprint][$i][4] = $atomr[$checkprint][$i][4];
$atomr[$checkprint][$i][5] = $atomr[$checkprint][$i][4];
//$atomr[$checkprint][$i][5] = $atomr[$checkprint][$i][5]*50+400;
}
//echo chop($read)."<br>";
$i++;
}
}
fclose($fp);
return $atomr;
}
function change($x,$y,$z,$xp,$em,$move,$theta,$phi,$turny){
//$r = sqrt($x*$x+$y*$y+$z*$z);
$theta = $theta/180*3.14;
$phi = $phi/180*3.14;
//轉Z軸
$new['x'] = $x*cos($theta)-$y*sin($theta);
$new['y'] = $x*sin($theta)+$y*cos($theta);
$new['z'] = $z;
//轉X軸
$new['x'] = $new['x'];
$new['y'] = $new['y']*cos($phi)+$new['z']*sin($phi);
$new['z'] = $new['y']*sin($phi)+$new['z']*cos($phi);
//轉Y軸
$new['x'] = $new['x']*cos($turny)+$new['z']*sin($turny);
$new['y'] = $new['y'];
$new['z'] = $new['x']*sin($turny)-$new['z']*cos($turny);
$new['x'] = $new['x']*$em+$xp/$move;
$new['y'] = $new['y']*$em+$xp/$move;
//$new['z'] = $new['z']*$xp/$em+$xp/$move;
//$new['x'] = $x*$xp/$em+$xp/$move;
//$new['y'] = $y*$xp/$em+$xp/$move;
return $new;
}
if(@$_POST['show'] == "SHOW"){
$filename = $_POST['filename'];
$theta = $_POST['theta'];
$phi =$_POST['phi'];
$turny =$_POST['turny'];
$em = $_POST['em'];//LIGAND大小,越小越大
$move = $_POST['move'];//離邊界位置 , 預設2
$xp = $_POST['xp'];//圖檔邊長(正方)
// 1.建立新影像
$im = imagecreate($xp,$xp);
// 2. 定義白色顏色的 RGB (背景顏色)
$white = imagecolorallocate($im, 255, 255, 255);
// 3. 定義黑色的 RGB (線的顏色)
$black = imagecolorallocate($im, 0, 0, 0);
$atomr = readligand($filename);//atomsread
for($i =1;$i<=count($atomr[1]);$i++){
$x = $atomr[1][$i][3];
$y = $atomr[1][$i][4];
$z = $atomr[1][$i][5];
$f = $atomr[2][$i][2];//讀取BOND
$l = $atomr[2][$i][3];//讀取BOND
$x1 = $atomr[1][$f][3];
$y1 = $atomr[1][$f][4];
$z1 = $atomr[1][$f][5];
$x2 = $atomr[1][$l][3];
$y2 = $atomr[1][$l][4];
$z2 = $atomr[1][$l][5];
$new = change($x,$y,$z,$xp,$em,$move,$theta,$phi,$turny);//dot
$newf = change($x1,$y1,$z1,$xp,$em,$move,$theta,$phi,$turny);//bond
$newl = change($x2,$y2,$z2,$xp,$em,$move,$theta,$phi,$turny);
imageline($im, $newf['x'], $newf['y'], $newl['x'], $newl['y'], $black);// 4. 開始畫線
imagesetpixel ($im,$new['x'],$new['y'],$black);//畫點
}
// 5. 做成 png 圖檔並輸出
imagejpeg($im, "draw.jpg");
// 6. 完成後將圖檔毀滅
imagedestroy($im);
echo '<img src="draw.jpg" width="'.$xp.'" height="'.$xp.'" />';
}
?>
<form id="form1" name="form1" method="post" action="readligand.php">
<p>檔案名稱:
<input name="filename" type="text" id="filename" value="<?php echo @$_POST['filename'];?>" />
<input type="submit" name="show" id="show" value="SHOW" />
</p>
<p>Z軸:
<input name="theta" type="text" id="theta" value="<?php echo @$_POST['theta'];?>" />
</p>
<p>X軸:
<input name="phi" type="text" id="phi" value="<?php echo @$_POST['phi'];?>" />
</p>
<p>Y軸:
<input name="turny" type="text" id="turny" value="<?php echo @$_POST['turny'];?>" />
</p>
<p>LIGAND SIZE:
<input name="em" type="text" id="em" value="<?php echo @$_POST['em'];?>" />
</p>
<p>邊界:
<input name="move" type="text" id="move" value="<?php echo @$_POST['move'];?>" />
預設2,為圖中心</p>
<p>檔案邊界(像素):
<input name="xp" type="text" id="xp" value="400" />
</p>
<p> </p>
<p> </p>
</form>
已輸出至 <a href="../draw.jpg">draw.jpg</a>
=============程式碼==============
實際測試結果好像有點怪怪的
但又不知道哪邊怪怪的
================END==================
沒有留言:
張貼留言