SHELX

SHELXLとは  

SHELXLは構造精密化を行うためのプログラムで、SHELX-97パッケージの中のひとつです。

SHELXLクックブック  

重要コマンドの使用方法などをまとめてみます。

SHELXLのファイルがよく分からない  

問題
SHELXLではいろいろなファイルが出力されて何が何かよく分からない
解説
以下のファイルがあるようです。
拡張子内容解説
.insインストラクションファイル精密化に使う原子座標や命令(instruction)が含まれる
.hkl構造因子データ構造因子データファイル
.res結果ファイル精密化後の原子座標が含まれる
.lstログファイル処理時の詳細ログ
.fcfCIF反射ファイル電子密度を描くときに必要
.pdb出力PDBWPDB命令で出力内容は制御される

.fcfファイルのフォーマット  

LIST 6
LIST 5H,K,L,Fo,Fc,PHIC フォーマットされたきれいなテキストができる

081019現在、SHELXLを使った差フーリェマップ計算をCCP4でやるよい方法がわからず、.insファイル中、このパラメータを変えて

  1. SHELXL
  2. F2MTZ (.fcf -> .mtz)
  3. FFT+MAPMASK
== 御参考まで F2MTZ script ====
f2mtz HKLIN fff04_1.fcf HKLOUT fff04_fofc <<+ > f2mtz.log
CELL 71.33  33.22  25.02  90.00 105.64  90.00
LABOUT H   K  L   FO  FC  PHIC
CTYPE  H   H  H   F   F   P
FORMAT '(3I4,2F10.2,1F7.2)' # このフォーマットでSHELXLから出力されます
SYMM C2 #空間群を入力
+

他にも、SHELXPROを使って、XTALVIEW/O/TURBOマップを計算する方法がありますが、CCP4に重みを持っていくよい方法があったら教えてください(くの)。

水素原子を含める/含めない  

SHELXLで出力されるPDBファイルに含まれる情報をコントロール。

コマンド温度因子内容
WPDB 1isotropic B-factor異方性温度因子を精密化してもPDB出力は等方性温度因子のみ
WPDB 2anisotropic B-factor異方性温度因子をPDB出力
WPDB -1isotropic B-factor with hydrogensWPDB 1を水素原子込みで
WPDB -2anisotropic B-factor with hydrogensWPDB 2を水素原子込みで)

水素原子を含めるためには.resファイル(前回のリファインメント結果)を参照し、REMでコメントとして扱われている以下のような行からREMを削除します

REM HFIX_??? 43 N

これを

HFIX_??? 43 N

など。???には3文字表記の残基種。これにより指定された残基に水素を入れる準備が整う。.resファイルを.insファイルとしてSHELXLを1サイクルでも流せば、出力ファイルにWPDBコマンドで指定された出力形式でPDBが出てきます。

水素原子の名前  

4文字の名前が水素原子につくとややこしくなるから、3文字の名前にしなければいけない! 問題になる水素⇒ダブルコンホメーションの場合

例)Leu残基は水素原子がδ位に結合しているので出力されるPDBの水素原子に

これをモデル修正プログラムで見ようとするとできない!!ので、名前を例えば

などとする必要がある。

HFIXのこと  

水素原子を入れるときはREMコマンドでコメントアウトされているREMを削除してやればよい。
この際、メチル基や水酸基はほうっておくと変なところに水素原子を発生させられるのでHFIXコマンド

  1. 水素原子を電子密度が最大になるトーション角を選択して
  2. トーション角の精密化を含める

という作業が必要。この際にアサインするコマンドとして

メチル基HFIX 33 ⇒ HFIX 137
水酸基HFIX 83 ⇒ HFIX 147

にする必要がある(した方が良い)。
N末のNについては HFIX 137 N_1001 などとする
(N末の残基種による; チェーンが切れているところなども同じ処理)

CONN コマンド  

SHELXLは距離の近い原子座標に自動的に結合を生成してくれる。が、結合ができると温度因子にリストレインがかかる(これもパラメータ DELUでコントロール可能)ので注意が必要。特に水!!; 他にはCl-イオンとか。水分子に対して近くても結合はしないよと言ってあげる方法は

CONN 0 O_1101 > LAST

のようなコマンドで行う。意味は

O_1101 以降の座標(.insファイルにある)について 最後の行(LAST)まで距離が近くても結合なし

というわけ。

水素原子が生えたら  

例)LEU 4文字水素で出力された原子名について、3文字で一義的な名前を付け直す。この作業の手順は

  1. 該当する残基・原子を.res中で編集(原子名を付け替える)
  2. その.resファイルをインプットとしてSHELXLを0サイクル流す!

この作業によって.resファイルに書き込んだ3文字水素原子を持つPDB座標が生成される

超高分解能データの最後に  

L.S. 1
DAMP 0 0
BLOC 1
BOND

と.insに書き込み、以下のコマンドが含まれている行を削除します。

  1. SIMU
  2. DELU
  3. ISOR
  4. BUMP
  5. DFIX
  6. DANG
  7. CHIV
  8. FLAT

これによりフルマトリクスリファインメント、(最終結果に座標や温度因子の)シフト量を加算せず、温度因子抜き、フルマトリックス、結合情報を別ファイルへ保存したリファインメントをやってくれる。
このアウトプットファイル(.lst)をSHELXPROのオプション[E]に突っ込むと、これまでリファインメントやってきた構造の結合距離情報がどのくらい正しいのか?というパラメータ(esd: estimated standard deviation⇒参考:最小二乗法)を出力してくれる。

フルマトリクス精密化時のエラー  

2011-05-30:追加

上記のフルマトリクス精密化を行うときに以下のエラーが出て止まることがあります。

** ARRAY B TOO SMALL FOR THIS PROBLEM **

このときのBというのは温度因子のBでは(たぶん)なく、純粋にプログラム中での配列Bのことです。つまり、配列Bのサイズが不足している、と怒られているわけです。解決するにはSHELXLのソースパラメータを変更して再ビルドが必要になります。

参考

これらによると、shelxh.f(またはshelxh_omp.h)の冒頭にある、

     PARAMETER(LM=3200000,JW=12000000,IM=32000,LU=512)

を修正します。どのぐらいの値にすればいいのかというのはよく分からないのですが、

I compiled a version with LM=3200000 JW=400000000 IM=200000 LU=4096

という報告(上のmsg01418内)があったので、その数値で行いました。shelxh_omp.fではCPUの数とJWの多次元配列を生成するため、CPU数が増えると上限のJWが下がっていきます(後述コラム参照)。そのため、ここの例のように遙かに大きい値を使う場合はOpenMP版ではなく通常版を使うことになるでしょう。64bit環境で行えば上限が増えるはずですが、私は環境がないので試してません。
パラメータを修正したらビルドします(xsse4.2オプションはCPUの種類によって修正してください - コンパイルオプション)。

% ifort -O3 -xsse4.2 -prec-div -heap-arrays shelxh.f shelxlv.f -o shelxh.huge

後は生成されたshelxh.hugeを/usr/local/shelxにコピーして使用します。

LM,JW,IM,LUの最大値は?
配列のサイズに効いてくるのはJWの値なのですが、大きすぎると、

error #7910: A variable may not exceed 2147483647 bytes   [B]
      REAL A(LM),B(JW,maxcpu),C(IM),EF(1880)
-----------------^

というエラーが出ます。ここでポイントになるのはマルチCPU対応版(mp)です。上のエラー例はmp版ですが、Bがmaxcpuによる多次元配列になっています。エラーは「変数の大きさ」なのでJW * maxcpuの配列の場合、CPU数が多いほど上限のJWが下がっていくというわけです。そのため、シングルCPUが最も大きな値を確保できる、ということになります。なお、通常版の場合、定義がB(JW)になっています。
ただ、JW * maxcpu * (REAL; 4byte) < 2,147,483,647なら問題がないかというと、今度はコモンブロックのサイズという制限に引っかかるらしく、たとえJWを上限ギリギリのJW=536870911にすると、

#7911: Adding this variable to common-block-object-list causes the common block size to exceed the maximum of 2147483647 bytes.   [B]
      REAL A(LM),B(JW,maxcpu),C(IM),EF(1880)
-----------------^

というエラーが出ます。この辺りはCOMMONブロックを見てみると、A(LM)やらC(IM)のサイズも含まれるようです。
定義の部分から逆算すれば真の最大値を計算できるはずですが・・・どなたか試してみてください [huh]