CCP4ライブラリを使ってみよう  

ふと思い立ってCCP4ライブラリをいじってみようと思ったので解説してみます。とりあえずは回折イメージを操作するスクリプトなど作って行けたらと思います。

CCP4ライブラリとは  

diffmovie.gif

CCP4ライブラリとは、CCP4のプログラムがよく行う操作をまとめてあるライブラリのことです(たぶん)。例えばCCP4 6.1.1の標準的なバイナリインストールでは$CCP4_LIB以下にlibDiffractionImage.so、libccp4map.soがインストールされているはずです。CCP4/インストールに追加情報として示してますが、6.1.1に標準で添付されるlibccp4map.soは必要なライブラリがリンクされていないため機能しません。手順に従ってアップデートすることをおすすめします。
とりあえず回折イメージを扱うlibDiffractionImageで遊んでみたいと思います。これら以外のライブラリは共有ライブラリを自分で作成する必要があるので標準環境ではlibDiffractionImageぐらいしか扱えませんが・・・

右の画像はPerlからDiffractionImageを呼び出し、MLFSOMで作成した回折イメージをJPEGに変換した後、180枚をつないでみたものです。

Tclからはじめよう!  

そんなわけで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

こんな感じです。何か簡単に使えそうな気がしませんか? [smile]
過去にPerlでイメージのヘッダからディテクタを判別する、などのスクリプトを作成したことがありますが、その努力は何だったんだと言うぐらい簡単にできてしまいます・・・(私はTclを使ったことがないので文法を調べるのに時間がかかりましたが [huh])
getFormat以外の関数はCCP4ソースのlib/DiffractionImage/DiffractionImage.h内に定義されています。また、TclラッパーはDiffractionImageTclInterface.ccpで作成してあるようです。ついでにPythonInterfaceもあるのになんでPerlInterfaceがないのかなぁ・・・ [sad]

Perlから使ってみる  

DiffractionImageライブラリはSWIGの定義ファイルが提供されているため、簡単にPerlでも使用することができます。Tcl、Python、Javaのインタフェースも同様にSWIGを使っているようです(SWIGはその他のスクリプト言語にも対応しています)。そんなわけでPerl用モジュールパッケージを作ってみました。パッケージにDiffractionImageのソースが含まれています。

Change log  

Ver.0.2.0 -- 2009-03-25
Ver.0.1.1 -- 2009-03-18

aptによるインストール  

インストール  

通常の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をセットします。

サンプル  

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から使ってみる  

2010-08-24 : 追加 by どぶお

環境設定  

標準状態ではライブラリにPYTHONPATHが通っていないので環境変数をセットします。CCP4のセットアップファイルを読み込んでからセットします。.cshrcに記述してもOKです。

% setenv PYTHONPATH ${CLIB}:${PYTHONPATH}

これで準備OKです。

使い方  

簡単なサンプルです。

#!/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

気になる場合はスタンドアロンとしてインストールすることで環境にあったライブラリファイルを作成することができます。

スタンドアロンとしてインストールする  

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
これも解消します。

本パッチは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}

これで使用可能です。

ディスカッション  

Perlモジュールの不具合等発見された場合の報告もお願いします。