cctbx における crystal.symmetry や miller.set の周辺

久しぶりにやや精神の具合がよいので、昔のメモを復習しつつ公開。こんなことをして何になるのかという気持ちは拭えないが、もうどうでもよいのだ。

crystal.symmetry は、結晶の格子定数と空間群を管理するクラス。ソースコードcctbx/crystal/__init__.py 周辺。

格子定数から考えてありえない空間群を指定すると、ちゃんと指摘してくれる。

p4 = cctbx.crystal.symmetry((10, 10, 1, 90, 90, 90), space_group="P 4")
cctbx.crystal.symmetry((10, 3, 1, 90, 90, 90), space_group="P 4") # エラー
# "Space group is incompatible with unit cell parameters."

以前記述したように、指数は (h, k, l) というタプルの flex 配列で管理する。これと crystal.symmetry オブジェクトを組み合わせて、miller.set オブジェクトを作る。ソースコードcctbx/miller/__init__.py あたり。

from cctbx.array_family import flex
indices = flex.miller_index(((1,2,3), (2,3,4)))
miller_set = cctbx.miller.set(p4, indices, False)

第3引数は anomalous_flag。省略可能だが、そうすると expand_to_p1() などが呼べなくなる。anomalous_flag() で確認可能だが、変更はできないようだ。

miller_set.show_summary()
# Number of Miller indices: 2
# Anomalous flag: False
# Unit cell: (10, 10, 1, 90, 90, 90)
# Space group: P 4 (No. 75)

miller_set.show_comprehensive_summary()
# Number of Miller indices: 2
# Anomalous flag: False
# Unit cell: (10, 10, 1, 90, 90, 90)
# Space group: P 4 (No. 75)
# Systematic absences: 0
# Centric reflections: 0
# Resolution range: 0.332411 0.248991
# Completeness in resolution range: 0.000896057
# Completeness with d_max=infinity: 0.000502765

# 個別に情報を引き出すためには、以下のようなメソッドがある
miller_set.d_max_min()
# (0.3324112476572668, 0.24899052235614633)
miller_set.d_min_along_a_b_c_star()
# (5.0, 3.333333333333333, 0.25)
# 他にもいろいろ...

miller_indices_as_pdb_file('test.pdb')
# 逆空間の座標を PDB ファイルとして出力できる

調子がよいかと思ったが、くたびれてしまったので、ここで公開。