みかんせい
構造式検索エンジンがあるので、実際に検索できるwebアプリを作ってみた

クエリを書くのには JSME Molecule Editor http://peter-ertl.com/jsme/ を利用した。
*javascriptベースの化合物描画ツール。BSD licenseライセンス
*器は、dhtmlxにて作成

Your borwser is not supporting object tag. Please use one of the latest browsers.
Go to http://web.chaperone.jp/c/index.html

全体はdhtmlxのdhtmlxLayoutを使ってフレーム分けさせて、右側はさらにdhtmlxTabbarを埋め込んで
dhtmlxGridとdhtmlxDataViewをタブで切り替えさせている。
*dhtmlxのソースは、http://web.chaperone.jp/c/index.htmlから参照してください
*dhtmlxのフリー版でenableSmartRendering機能を使うにはXMLでのデータ受け渡しが必要。json対応にはPRO版が必要みたい

dhtmlxGrid

グリッド表示の部分は下記のように

   :
  myGrid.init();
  myGrid.enableSmartRendering(true,20);
  myGrid.load("g.php","xml");

とスクロールする度にPostgreSQLから動的にデータをロードさせてみた。っで、その際のphpコードを下記に示す
*実際には、これにjsmeで描いた構造を受けて検索する部分を入れる

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
<?php
$posStart =0;
$count = 50;
if ( isset($_GET['posStart']) ) $posStart = $_GET['posStart'];
if ( isset($_GET['count'])    ) $count = $_GET['count'];
 
$dsn = "pgsql:dbname=chemdb host=localhost port=5432";
$user="caster";
$password="caster";
 
$dbh = new PDO($dsn, $user, $password);
$sql = "SELECT pubchem_compound_cid FROM pubchem WHERE 1=1";
 
if ( $posStart == 0 ){
    $sqlCount = "SELECT count(*) as cnt FROM (".$sql.") as tbl";
    $sth = $dbh->query($sqlCount);
    $res = $sth->fetch(PDO::FETCH_NUM);
    $output="<rows total_count='".$res[0]."' pos='".$posStart."'>";
    $sth=null;
    $res=null;
}else{
    $output="<rows pos='".$posStart."'>";
}
 
$sql .= " LIMIT :limit OFFSET :offset";
$sth = $dbh->prepare($sql);
$sth->execute(array(':limit'=> $count, ':offset'=> $posStart) );
while($res = $sth->fetch(PDO::FETCH_NUM)){
    $output .= "<row id='".$res[0]."'><cell><![CDATA[<IMG SRC='http://web.chaperone.jp/depict?".$res[0]."' />]]></cell>
<cell>".$res[0]."</cell></row>";
}
$output .= "</rows>";
 
$dbh=null;
header("Content-Type: text/xml");
print $output;
?>

としている。

動的スクロールだが、移動が激しいと途中で途切れてしまいます。ここらはdhtmlxのソースに書かれたパラメータを調整する必要がある。

dhtmlxDataView

構造式のパネル表示部分

  myDataView = myTabbar.tabs("b1").attachDataView({
     type:{
          template:"#data#<br/>#id#",
          height:100
     }
  });
  myDataView.load("dv.php","xml");

として、こんな感じのphpスクリプトにした
*以前pythonで描いたがphpで作り直した

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
<?php
$posStart = 0;
$count = 500;
if ( isset($_GET['posStart']) ) $posStart = $_GET['posStart'];
if ( isset($_GET['count'])    ) $count = $_GET['count'];
 
$dsn = "pgsql:dbname=chemdb host=localhost port=5432";
$user="caster";
$password="caster";
 
$dbh = new PDO($dsn, $user, $password);
$sql = "SELECT pubchem_compound_cid FROM pubchem WHERE 1=1";
 
if ( $posStart == 0 ){
    $sqlCount = "SELECT count(*) as cnt FROM (".$sql.") as tbl";
    $sth = $dbh->query($sqlCount);
    $res = $sth->fetch(PDO::FETCH_NUM);
    $output="<data total_count='".$res[0]."' pos='".$posStart."'>";
    $sth = null;
    $res = null;
}else{
    $output="<data pos='".$posStart."'>";
}
 
$sql .= " LIMIT :limit OFFSET :offset";
$sth = $dbh->prepare($sql);
$sth->execute(array(':limit'=> $count, ':offset'=> $posStart) );
while($res = $sth->fetch(PDO::FETCH_NUM)){
    $output .= "<item id='".$res[0]."'><mol><![CDATA[<IMG SRC='http://web.chaperone.jp/depict?".$res[0]."' />]]></mol></item>";
}
$output .= "</data>";
 
$dbh = null;
header("Content-Type: text/xml");
print $output;
?>

部分構造検索

JSMEで描いた構造式はsmilesにもmol形式でも取り出せる。ここではmol形式でクエリーを受け取ってRDKitに流してみる。
まずはボタンの制御のためにjqueryライブラリを設置して、検索ボタンを押下したらJSMEと連携してMOLデータを取得する

$(function(){
  $('#run').click(function(e){               <-- 「検索ボタンを押下したら」
      console.log(jsmeApplet.molFile() );    <-- 「console.logにmol形式で表示する」
  });
});

こんな感じで。


トップ   編集 添付 複製 名前変更     ヘルプ   最終更新のRSS
Last-modified: 2016-10-16 (日) 22:01:24 (250d)