YASARA : グローバル/ローカル座標とTransferコマンド

2023年7月25日火曜日

【YASARA】

t f B! P L
 YASARAのグローバル座標とローカル座標の違い,少しわかりにくいかなと思います.それで,両者の違いを理解するのに役立ちそうな操作例を考えてみました.コンソールからの操作が中心になりますが,よろしければ,次の内容を順次実行してみてください.

まず,次のコマンドを実行します.各コマンドの詳細は気にせず,テキスト全体をコピーして,コンソールにペーストして実行すればOKです.

ShowSphere Radius=0.2,Color=Red,Alpha=100,Level=2,ScaleY=1.0,ScaleZ=1.0
PosObj 1
MoveObj 1, Z=-50
NameObj 1,Origin
ShowArrow Start=Point,X=0.0,Y=0.0,Z=0.0,End=Point,X=3.0,Y=0.0,Z=0.0,Radius=0.1,Heads=1,Color=Red
NameObj 2,X-red
ShowArrow Start=Point,X=0.0,Y=0.0,Z=0.0,End=Point,X=0.0,Y=3.0,Z=0.0,Radius=0.1,Heads=1,Color=Blue
NameObj 3,Y-blue
ShowArrow Start=Point,X=0.0,Y=0.0,Z=0.0,End=Point,X=0.0,Y=0.0,Z=3.0,Radius=0.1,Heads=1,Color=Yellow
NameObj 4,Z-yellow

すると,画面上に次のような座標軸が表示されます.ここからしばらくの間,マウスを用いた回転等の操作は行わないようにしてください



回転操作や並進操作を加えない状態であれば,この座標軸は,グローバル座標に一致しています.つまり,画面中央に原点,右方向にx軸,上方向にy軸,画面奥に向かってz軸です.デフォルトの座標系は左手系ですが,もし右手系に変えていれば,x軸の方向が左向きになります.

続けて,2つの水分子を読み込みます.どちらも,SDFファイル形式で,次のように座標を少し変えています.


1つ目の水分子(Water_A)
water_A
 OpenBabel07222321223D

  3  2  0  0  0  0  0  0  0  0999 V2000
    0.0000    0.0000    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
    0.9700    0.0000    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
   -0.1562    0.9877    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
  2  1  1  0  0  0  0
  3  1  1  0  0  0  0
M  END
$$$$


2つ目の水分子(Water_B)
water_B
 OpenBabel07222321223D

  3  2  0  0  0  0  0  0  0  0999 V2000
    0.0000    0.0000    1.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
   -0.9700    0.0000    1.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
    0.1562    0.9877    1.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
  2  1  1  0  0  0  0
  3  1  1  0  0  0  0
M  END
$$$$


ダウンロード

water_A.sdf

water_B.sdf


この2つのファイルを保存したディレクトリに移動し(下の例では,c:\tempに保存していると仮定),続けて,次の内容でLoadSDFとMoveObjコマンドを順次実行します.

CD c:\temp
LoadSDF water_A.sdf,Center=Yes
LoadSDF water_B.sdf,Center=Yes
MoveObj 5, Z=-50
MoveObj 6, Z=-50

SDFでは,1つ目の水分子では酸素原子を原点(0,0,0)に,2つ目の水分子では(0,0,1)に配置していますが,Center=Yesとしてセンタリングを有効化しているので,水分子の重心位置がローカル座標の原点になっています.また,読み込み直後,デフォルトでは,グローバル座標(0,0,50)を基準として配置されるので,MoveObjコマンドでZ方向に-50移動させています.


では,この状態で,PosAtomコマンドでグローバル座標とローカル座標の実際の値を調べてみます.CoordSys=globalをつけて実行するとグローバル座標,つけなければローカル座標が表示されます.

PosAtom 1,CoordSys=global
PosAtom 1
PosAtom 4,CoordSys=global
PosAtom 4

このコマンドの実行結果は,次のようになります.この時点では,両水分子の酸素原子の座標は,グローバル座標とローカル座標で同じ値になっています.なお,左手系の座標をつかっているため,x座標の正負が反転しています.

>PosAtom 1,CoordSys=global
Atom 1  O   UNL    1  A global position: X=0.271, Y=-0.329, Z=0.000 A
>PosAtom 1
Atom 1  O   UNL    1  A local position: X=0.271, Y=-0.329, Z=0.000 A
>PosAtom 4,CoordSys=global
Atom 4  O   UNL    1  A global position: X=-0.271, Y=-0.329, Z=0.000 A
>PosAtom 4
Atom 4  O   UNL    1  A local position: X=-0.271, Y=-0.329, Z=0.000 A

さて,ここで,MoveAllコマンドですべてのオブジェクトをx方向に+2,z方向に+2移動した後,一つ目の水分子の酸素原子の座標を調べてみます.

MoveAll X=2, Z=2
PosAtom 1,CoordSys=global
PosAtom 1

すると,次の出力のように,ローカル座標は前回と同じ値ですが,グローバル座標の方は,x,yともに+2となっています.

>PosAtom 1,CoordSys=global
Atom 1  O   UNL    1  A global position: X=2.271, Y=-0.329, Z=2.000 A
>PosAtom 1
Atom 1  O   UNL    1  A local position: X=0.271, Y=-0.329, Z=0.000 A

画面上の表示は,次のようになっていて,すべてのオブジェクトが画面の右(x軸)方向に,また奥(z軸)方向に移動しています.


この状態で,次のようにして,2つの水分子のRMSDを調べてみると,

RMSDObj 6,5,Match=AtomName+AltLoc,Flip=No,Unit=Obj

RMSDの値は,0.9964 Aとなっています.

>RMSDObj 6,5,Match=AtomName+AltLoc,Flip=No,Unit=Obj
Object  6 (water_B) and Object  5 (water_A) have 0.9964 A RMSD

続けて,2つ目の水分子のみ,x軸方向に-4移動させて,RMSDを求めると,

MoveObj 6, X=-4
RMSDObj 6,5,Match=AtomName+AltLoc,Flip=No,Unit=Obj

一方の水分子が左側に移動して,


次のような出力になります.RMSDは,前と同じ値0.9964 Aとなっていますが,出力中に比較したオブジェクトのグローバル座標が異なっているとのメッセージが補足されます.

>RMSDObj 6,5,Match=AtomName+AltLoc,Flip=No,Unit=Obj
Object  6 (water_B) and Object  5 (water_A) have 0.9964 A RMSD, but the objects have different global coordinates, so the RMSD will not match what you see on screen unless you superpose them.

このような時は,オブジェクトを別のオブジェクトの座標系に移すことができるTransferコマンドが役に立ちます.

操作対象をオブジェクトとしたTransferObjコマンドは,Local引数で,ローカル座標系の原子座標にどのような変換を適用するか定義することができます.Local引数のパラメータは,デフォルトのMatchの他,KeepとFixの3つから選ぶことができます.


例えば,次のようにして,Local=Keepとして,2つ目の水分子を1つ目の水分子のローカル座標に移すと,

TransferObj 6,5,Local=Keep
RMSDObj 6,5,Match=AtomName+AltLoc,Flip=No,Unit=Obj

最初に分子構造を読み込んだ時に行ったセンタリング等の処理を保持したまま,変換が行われます.

続けて,一旦,Undoコマンドで変換前の状態に戻し,今度は,Local=Matchとして実行すると,

Undo
TransferObj 6,5,Local=Match
RMSDObj 6,5,Match=AtomName+AltLoc,Flip=No,Unit=Obj

2つ目の水分子は,センタリング前,元のSDFで定義していた原子座標の値(全原子,z=1)が反映され,画面奥方向に移動します.

最後に,Local=Fixとして実行すると,

Undo
TransferObj 6,5,Local=Fix
RMSDObj 6,5,Match=AtomName+AltLoc,Flip=No,Unit=Obj

2つ目の水分子はTransfer実行前の座標を固定した状態で,1つ目の水分子の座標系に移されます.

それぞれ,RMSDの値を含む実行結果は,以下の通りです.

>TransferObj 6,5,Local=Keep - OK
>RMSDObj 6,5,Match=AtomName+AltLoc,Flip=No,Unit=Obj
Object  6 (water_B) and Object  5 (water_A) have 0.9964 A RMSD
>Undo - OK
>TransferObj 6,5,Local=Match - OK
>RMSDObj 6,5,Match=AtomName+AltLoc,Flip=No,Unit=Obj
Object  6 (water_B) and Object  5 (water_A) have 1.5123 A RMSD
>Undo - OK
>TransferObj 6,5,Local=Fix - OK
>RMSDObj 6,5,Match=AtomName+AltLoc,Flip=No,Unit=Obj
Object  6 (water_B) and Object  5 (water_A) have 4.1222 A RMSD
>

なお,SDFファイルのロード時にセンタリングを行わないと,ローカル座標は元のSDFで定義された座標となり,KeepとMatchの挙動は同じものになるようです.

これ以降は,マウスで回転や並進操作,MoveAtomコマンド等の操作を行いながら,PosAtomコマンドで座標を各自確認してみてください.

MoveAtom 1,1
PosAtom 1,CoordSys=global
PosAtom 1
MoveAtom 1,-1
MoveAtom 1,X=1
PosAtom 1

当たり前ですが,SupObjコマンドで重ね合わせを行うと,2つの水分子はぴったり重なります. 

>Undo - OK
>SupObj 6,5,Match=AtomName+AltLoc,Flip=No,Unit=Obj
Object  6 (water_B) and Object  5 (water_A) have 0.0000 A RMSD over 3 matched atoms
>RMSDObj 6,5,Match=AtomName+AltLoc,Flip=No,Unit=Obj
Object  6 (water_B) and Object  5 (water_A) have 0.0000 A RMSD

最後に,TransferObjコマンド(Local=Match)をタンパク質構造に適用するとどうなるか試してみます.

Clear
LoadPDB 1ke6,Download=latest
LoadPDB 1ke7,Download=latest
TransferObj 2,1,Local=Match
ZoomAll

この2つの構造(PDF形式)は,ローカル座標は揃っていますが,位置は大きくずれています.


こちらもUndoしながら,Local=Keep,Fixなどいろいろ試してみてください.


また,よろしければ,次のYASARA FAQの”Q1.基本的な用語について”,Local coordinate systemとGlobal coordinate systemもご参考になさってください.


YASARA よくある質問


以上,グローバル座標とローカル座標の操作,確認例でした.ご参考にしていただければ幸いです.






code-prettify

このブログを検索

ページビューの合計

人気の投稿

QooQ