個人的には 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)))
のように、名前空間が違うので注意が必要。