* CCP4ライブラリを使ってみよう [#i18e557e]
 #floatcontents
 ふと思い立ってCCP4ライブラリをいじってみようと思ったので解説してみます。とりあえずは回折イメージを操作するスクリプトなど作って行けたらと思います。
 #floatcontents
 
 ** CCP4ライブラリとは [#n98d43c0]
 #ref(diffmovie.gif,right,around,nolink)
 CCP4ライブラリとは、CCP4のプログラムがよく行う操作をまとめてあるライブラリのことです(たぶん)。例えばCCP4 6.1.1の標準的なバイナリインストールでは$CCP4_LIB以下にlibDiffractionImage.so、libccp4map.soがインストールされているはずです。[[CCP4/インストール]]に追加情報として示してますが、6.1.1に標準で添付されるlibccp4map.soは必要なライブラリがリンクされていないため機能しません。手順に従ってアップデートすることをおすすめします。~
 とりあえず回折イメージを扱うlibDiffractionImageで遊んでみたいと思います。これら以外のライブラリは共有ライブラリを自分で作成する必要があるので標準環境ではlibDiffractionImageぐらいしか扱えませんが・・・
 
 - DiffractionImageライブラリ -- http://www.ccp4.ac.uk/html/DiffractionImage.html
 
 右の画像はPerlからDiffractionImageを呼び出し、MLFSOMで作成した回折イメージをJPEGに変換した後、180枚をつないでみたものです。
 #clear
 
 ** Tclからはじめよう! [#kc54611a]
 そんなわけでCCP4iに入っているプログラムから文例を得やすいTclで扱うことから始めてみます。手始めに回折イメージのフォーマット情報を取得するスクリプトです。単なる例なので例外処理などはしてません。
 :getFormat.tcl|
  #!/bin/env tclsh
  load [file join $env(CCP4_LIB) libDiffractionImage.so
  set curimg [new_DiffractionImage set_000001.img]
  puts "[$curimg getFormat]"
 
 スクリプト中の''set_000001.img''の部分には対象となるイメージファイル名を指定します。~
 このようにファイルを作成し、実行属性を付けた後実行するとディテクタ名が表示されるはずです。
  % chmod +x getFormat.tcl
  % ./getFormat.tcl
  MARCCD
 こんな感じです。何か簡単に使えそうな気がしませんか?⌣~
 過去にPerlでイメージのヘッダからディテクタを判別する、などのスクリプトを作成したことがありますが、その努力は何だったんだと言うぐらい簡単にできてしまいます・・・(私はTclを使ったことがないので文法を調べるのに時間がかかりましたが&huh;)~
 getFormat以外の関数はCCP4ソースの''lib/DiffractionImage/DiffractionImage.h''内に定義されています。また、Tclラッパーは''DiffractionImageTclInterface.ccp''で作成してあるようです。ついでにPythonInterfaceもあるのになんでPerlInterfaceがないのかなぁ・・・&sad;
 
 ** Perlから使ってみる [#k723ea8e]
 DiffractionImageライブラリはSWIGの定義ファイルが提供されているため、簡単にPerlでも使用することができます。Tcl、Python、Javaのインタフェースも同様にSWIGを使っているようです(SWIGはその他のスクリプト言語にも対応しています)。そんなわけでPerl用モジュールパッケージを作ってみました。パッケージにDiffractionImageのソースが含まれています。
 - &ref(DiffractionImage-0.2.0.tar.gz); -- 2009-03-25版
 -- CCP4のライセンスはLGPLv3なのでこのパッケージもLGPLv3に従い配布します
 
 *** Change log [#qeff53d9]
 :Ver.0.2.0 -- 2009-03-25|
 - DiffractionImageSwig.iの不具合でjpeg()メソッドが使えないのを修正
 -- jpeg()をコールしたときNo matching function for overloaded 'DiffractionImage_jpeg'というエラーが出たのでDiffractionImageSwig.iに
  %include "std_string.i"
 を追加した
 
 :Ver.0.1.1 -- 2009-03-18|
 - 公開初版
 
 *** aptによるインストール [#ib243e84]
 - swig
 
 *** インストール [#s0d155c0]
 通常のPerlモジュールと同様です。ここではホームディレクトリにインストールしてみます。~
 CCP4が使える環境ならlibDiffImage.aをビルドせずにインストール可能ですが、Vine 4.2では標準のlibDiffImage.aではセグメンテーション違反を起こしたので、ディフォルトではlibDiffImageもビルドします。すでに存在するlibDiffImage.aを使いたい場合は環境変数''DIFFIMG_LIBDIR''を指定してください。DIFFIMG_LIBDIRを指定していない場合は同梱のDiffractionImageライブラリをビルドしてリンクします。
  % tar zxvf DiffractionImage-0.2.0.tar.gz
  % cd DiffractionImage-0.2.0
  % perl Makefile.PL PREFIX=${HOME}
  % make
  % make install
 perl Makefile.PLを実行したときにlibDiffImageのPerlラッパーコードをSWIGで生成し、ビルドします。~
 PREFIX=${HOME}でインストールすると''${HOME}/lib/perl5''以下にインストールされます。使用する際は、
  % setenv PERL5LIB ${HOME}/lib/perl5:${HOME}/lib/perl5/site_perl
 で環境変数''PERL5LIB''をセットします。
 
 *** サンプル [#f76cd082]
 :getFormat.pl|
  #!/usr/bin/perl
  use DiffractionImage;
  my $dif = DiffractionImage::DiffractionImage->new("sample_000001.img");
  print $dif->getFormat();
 
 PERL5LIBでモジュールの場所を指定しておきます。
  % setenv ${HOME}/lib/perl5:${HOME}/lib/perl5/site_perl
  % ./getFormat.pl
  MARCCD
 となるはずです。
 
 :toJpeg.pl|
  #!/usr/bin/perl
  use DiffractionImage;
  my $dif = DiffractionImage::DiffractionImage->new("sample_000001.img");
  $dif->jpeg("test001.jpg",90,-4);
 
 実行すると25%のサイズに縮小したtest001.jpgファイルが作成されます。以前アップした0.1.1ではDiffractionImageライブラリのDiffractionImageSwig.iに不備がありjpegメソッドが使用できませんでしたが、0.2.0で修正しました。
 
 ** Pythonから使ってみる [#df940e6a]
 #anno2(2010-08-24 : 追加 by どぶお)
 
 *** 環境設定 [#meb448b0]
 標準状態ではライブラリにPYTHONPATHが通っていないので環境変数をセットします。CCP4のセットアップファイルを読み込んでからセットします。.cshrcに記述してもOKです。
  % setenv PYTHONPATH ${CLIB}:${PYTHONPATH}
 これで準備OKです。
 
 *** 使い方 [#af21f1a5]
 簡単なサンプルです。
  #!/usr/bin/python
  from DiffractionImage import DiffractionImage
  diff = DiffractionImage()
  diff.loadHeader("foo_000001.img")
  print diff.getFormat()
 こんな感じで使います。
 ~
 CCP4のバイナリはPython 2.4を想定しているのでそれ以外のPythonのバージョンでは以下のような警告が表示されるはずですが、無視してもおそらく問題ありません。
  /usr/local/ccp4-6.1.13/ccp4-6.1.13/share/python/DiffractionImage.py:7: RuntimeWarning: Python C API version mismatch for module lib_DiffractionImage: This Python has API version 1013, module lib_DiffractionImage has version 1012.
    import lib_DiffractionImage
  /usr/local/ccp4-6.1.13/ccp4-6.1.13/share/python/DiffractionImage.py:7: RuntimeWarning: Python C API version mismatch for module swig_runtime_data3: This Python has API version 1013, module swig_runtime_data3 has version 1012.
    import lib_DiffractionImage
 気になる場合はスタンドアロンとしてインストールすることで環境にあったライブラリファイルを作成することができます。
 
 *** スタンドアロンとしてインストールする [#h019f7be]
 DiffractionImageはCCP4に標準で含まれていますが、単独でインストールすることも可能です。ただし、PythonファイルやドキュメントをCCP4ディレクトリにインストールするようになっているのでパッチを当てます。私の環境(Vine 5.1)ではlibtool周りでエラーが発生しましたので、aclocal.m4にもパッチを当てています。
 :libtoolまわりのエラー &Vine5;|
  ../../libtool: line 835: X--tag=CC: command not found
  ../../libtool: line 868: libtool: ignoring unknown tag : command not found
 これも解消します。
 
 - &ref(DiffractionImage-6.1.24-standalone.patch); -- 2010-08-24 作成
 
 本パッチはCCP4 6.1.24のソースで確認しています。確認していませんが、6.1.1以降ならおそらく使えると思います。インストールの手順は以下の通りです。
  % tar zxvf ccp4-6.1.24-core-src.tar.gz
  % cd ccp4-6.1.24/lib/DiffractionImage
  % patch -p1 < DiffractionImage-6.1.24-standalone.patch
  % ./configure --prefix=/home/nobrin/ccp4-6.1.24
  % make
  % make install
 prefixのディレクトリを変更することで任意の場所にインストールされます。ここではユーザーホームディレクトリ以下にインストールしていますが、私はよく/optディレクトリ以下にインストールします。''--prefix=/opt/ccp4-6.1.24''といった感じです。~
 インストールの構成は以下の通り。
  - bin/
     - diffdump.pyなど
  - lib/
     - libDiffractionImageなど
  - share/
     - doc/
         - DiffractionImage.doc, DiffractionImage.html
 こんな感じになります。
 ~
 インストールが成功したらPYTHONPATHを通します。
  % setenv PYTHONPATH /home/nobrin/ccp4-6.1.24/lib:${PYTHONPATH}
 これで使用可能です。
 
 *** ディスカッション [#p52329b6]
 Perlモジュールの不具合等発見された場合の報告もお願いします。
 #comment