* CCP4i APIを使ってみる [#m538780a]
 CCP4iは奥が深いインタフェースですが、このインタフェースのAPI(Application Programming Interface)を使ってみます。~
 通常はCCP4iのタスクとして実行しますが、ここではbltwishプロンプトから使ってみます。まだ遊んでみただけなのでとりあえずCCP4iのデータベースを操作するメソッドをちょっとだけ。たぶん、こんな使い方はイレギュラーだと思います(^^;。~
 なお、環境はVer.6.1.1です。
 
 ** 初期化 [#k62d6151]
 CCP4i APIを使用するためにはファイルをインポートする必要があります。必要なファイルは以下の通りです。
 
 - $CCP4I_TOP/src/system.tcl
 - $CCP4I_TOP/src/utils.tcl
 
 最低限これらのファイルをsourceします。なお、system.tclを読み込む際にはOPSYSを設定します。だいたいこんな感じ。
  % bltwish
 でbltwishプロンプトに入った後、必要なファイルをsourceします。
  wish> array set system {OPSYS UNIX}
  wish> source [file join $env(CCP4I_TOP) bin $system(OPSYS) startup.tcl]
  wish> source [file join $env(CCP4I_TOP) src system.tcl]
  table <- 戻り値
  wish> source [file join $env(CCP4I_TOP) src utils.tcl]
 これが基本の初期化みたいです。はじめのset systemでUNIXをセットし、続いてstartup.tclで必要な変数が代入されます。
 
 ** dbCCP4iを使う [#t32b78af]
 CCP4iはdbCCP4iというデータベースを使いタスク情報の管理をしています。まずはこのデータベースにAPIを使ってアクセスしてみます。&color(red){なお、この時にはdbCCP4iが起動してる必要があるので、CCP4iを起動しておきます};。~
 上記の初期化に続いて、
  wish> source [file join $env(CCP4I_TOP) src database.tcl]
  wish> source [file join $env(CCP4I_TOP) src projectdb.tcl]
  wish> DbInitialise
  wrong # args: should be "dbccp4i_open_project project args
  wish> dbccp4i_open_project PROJECT
  1 <- 0の時は接続できてません。
 で、プロジェクトPROJECTに接続されるはずです。例えばタスクのタイトルを取得してみます。
  wish> dbccp4i_get_data PROJECT 16 TITLE
  Rigid body refinement using isotropic B factors
 こんな感じで取得できます。また、タイトルをセットする場合は、
  wish> dbccp4i_set_data PROJECT 16 TITLE "This is TEST"
  1
 とすると、開いているCCP4iインタフェースのタスクリスト中のタイトルが数秒で書き換わります。ちなみに日本語は通りません&sad;~
 遊び終わったらデータベースへの接続を切断しておきます。
  wish> dbccp4i_close_project PROJECT
 #br
 ドキュメントをちゃんと読んだ訳ではないので結構強引な使い方かもしれませんが、やっぱりCCP4は奥が深いですね・・・
 
 ** 参考サイト [#z6dc3510]
 - CCP4i Documentation for Programmers -- http://www.ccp4.ac.uk/dist/ccp4i/help/programmers/intro.html
 
 * メモ [#w9c0e82a]
 内部関数を使わずにデータベースを操作する。
 内部関数を使わずにデータベースを操作する。~
 tclshをインタラクティブモードで使用した。
 
 ** 初期化 [#qd023100]
  array set system {OPSYS UNIX RUN_MODE script}
  source [file join $env(CCP4I_TOP) bin $system(OPSYS) startup.tcl]
  source [file join $env(CCP4I_TOP) src system.tcl]
  source [file join $env(CCP4I_TOP) src utils.tcl]
  
  source [file join $env(CCP4I_TOP) src CCP4_utils.tcl]
  
  source [file join $env(CCP4I_TOP) src database.tcl]
  source [file join $env(CCP4I_TOP) src projectdb.tcl]
  tclsh> array set system {OPSYS UNIX RUN_MODE script}
  tclsh> source [file join $env(CCP4I_TOP) bin $system(OPSYS) startup.tcl]
  tclsh> source [file join $env(CCP4I_TOP) src system.tcl]
  tclsh> source [file join $env(CCP4I_TOP) src utils.tcl]
  tclsh> source [file join $env(CCP4I_TOP) src CCP4_utils.tcl]
  tclsh> source [file join $env(CCP4I_TOP) src database.tcl]
  tclsh> source [file join $env(CCP4I_TOP) src projectdb.tcl]
 
 ** DB初期化 [#o6e37ff3]
  SetCurrentProject M2 <-- 対象となるプロジェクトを選択
  DbInitialise         <-- dbCCP4i初期化(dbccp4i起動)
 ** DBへの接続初期化 [#o6e37ff3]
 DbInitialise()でデータベース接続を初期化するとdbccp4iコマンドが自動的に起動する。
  tclsh> SetCurrentProject M2 <-- 対象となるプロジェクトを選択
  tclsh> DbInitialise         <-- dbCCP4i初期化(dbccp4i起動)
  12:24:36 DbOpen: db loaded okay
  12:24:36 DbInitialise: CURRENT_PROJECT = M2
  12:24:36 DbInitialise: PROJECT_DATABASE = /home/nobrin/xtal/M2/MR2/CCP4i/CCP4_DATABASE
 
 ** データ取得 [#eb81c4c4]
  DbGetJobData 2 TITLE
  tclsh> DbGetJobData 2 TITLE
  TEST
 
 ** データ入力 [#qd327bf1]
  DbSetJobData 2 TITLE "タイトル"
  DbUpdateStatus       <-- 変更を反映する
 DbUpdateStatus()を実行しないとデータベースに反映されないようだ(コミットのようなもの?)。
  tclsh> DbSetJobData 2 TITLE "タイトル"
  tclsh> DbUpdateStatus       <-- 変更を反映する
 
 ** 接続断 [#ba169896]
  DbClose              <-- 接続終了
  tclsh> DbClose              <-- 接続終了
  12:24:48 DbClose: closing M2
  tclsh> exit
 現行プロセスを終了してしばらくするとdbccp4iプロセスがシャットダウンされる。