cctbx チュートリアルをやってみる 1. flex 配列

個人的には cctbx の設計はどうも直感的ではないのだが、業界の de facto standard になりそうなので、土地勘を身につけていきたい。なんとなくいじっていた部分も含めて、0から再スタートしてみる。

ドキュメントが少ないことが公式メーリングリストでも話題になる cctbx だが、まずは Tour of the cctbx が分かりやすい。ページでの順序と逆転するが、scitbx.array_family.flex から始める。

flex は、サイズ固定の配列である。cctbx.python として、Python インタプリタを起動したあと、

from scitbx.array_family import flex
a = flex.double(10) # 要素数10、0.0 に初期化
a.size()
a = flex.double((1, 2, 3)) # タプルで初期値を渡す例
a[0] # 1.0
a[2] # 3.0
a[3] # エラー
a[-1] # 3.0 逆向きにアクセス
a[-3] # 1.0
tuple(a) # built-in tuple に変換することで、まとめて確認可能
b = flex.double([1,2,3]) # 配列でも初期化可能
tuple(a + b) # R みたいにベクトル演算可能
tuple(flex.sqrt(a)) # ベクトル化された関数もある
b = flex.double([1,2,3,4])
tuple(a + b) # 要素数が揃わないとエラー
m = flex.int(flex.grid(2, 3)) # 多次元配列
m[1, 2] = 12
m[0, 1] = 01
tuple(m) # (0, 1, 0, 0, 0, 12) 手前の添字ほど、外側のループ(slow scan) になるようだ

cctbx では、一般的な数学・科学計算関係は scitbx (science toolbox?) に入れて、結晶学固有のモジュールは cctbx に入れることになっている。ミラー指数の配列などは、

from cctbx.array_family import flex
flex.miller_index(((1,2,3), (2,3,4)))

のように、名前空間が違うので注意が必要。