XtalEditの基本的な仕組み

From Ecal

Jump to: navigation, search

XtalEditを起動したときにあらわれるEditWindow,ResultWindow,buttonからなるGUIは、原則的には非常にシンプルです。このボタンなどはuserset.confで指定されてます.たとえば、これを空にして起動すると「なにもない」GUIがあらわれます。(起動時のrasmolのバージョンチェックは本来は、このuserset.confにかかれるべきものなのですが、履歴上、そうなってません)。

  • 実際、このGUIとpythonで書かれるコマンドはきれいに分離されていて、自分用のモジュールを書くのに、javaを知ってる必要はありません。まず調べるべきは、UserModule/AkaiKKR/AkaiKKRexport.pyです.
  • AkaiKKR-exportボタンをおすと(userset.confに指定されてるように)、このGUIは、EditWindowの内容を./temp/xxx.csy1にコピーしたあとUserModule/AkaiKKR/AkaiKKRexport.pyを起動し、それが終了するまでまちます。この下のif __name__ == '__main__':以下がメインルーチンです。AkaiKKRexport.pyおよび、それから呼ばれているpythonモジュールは、そのxxx.csy1を入力にして、最終的には./result/ResultWindow.datを書き上げます.それで、そのAkaiKKRexport.pyは終了です。で、コントロールはGUIのほうに戻り、それは./result/ResultWindow.datをResultWindowに表示して終わりです.
  • もし、generator-0のようにEditWindowを書き直したければ、/result/EditWindow.datを生成しておいてやれば、GUIの方が書き換えてくれます.
  • pythonはシステムコールなどできるので、rasmolを起動するなども可能になります(UserModule/Rasmol/Rasmol.py)。このときはGUIからみると自分の起動したRasmol.pyの起動する孫プロセスです.Rasmol.pyはこれを独立なプロセスとして起動し、もとのプロセスからは切り離してます。

現在のXtalEditの標準形式は上のINTRODUCTIONにかかれたもの(csy1形式)ですが

  • 現在のXtalEditの標準形式は上のINTRODUCTIONにかかれたもの(csy1形式)です。コード個別の入力情報は<Rasmol.>...</Rasmol>や<AkaiKKR>...</AkaiKKR>

などのセクションで対応するということになっています.で、csy1形式では

au=0.529177
a =  3.82/au   #  a is in a.u.
c =  6.26/au   #  c is in a.u.
CV1 = 1/2.* a * EX - 1/2. *sqrt(3) * a * EY
CV2 = 1/2.* a * EX + 1/2. *sqrt(3) * a * EY
CV3 = c * EZ
PV1 =  CV1
PV2 =  CV2
PV3 =  CV3
SITE TYPE=    ZnFe, POS=  1/3. *PV1 + 2/3. *PV2 +  PV3
SITE TYPE=    ZnFe, POS=  2/3. *PV1 + 1/3. *PV2 + 1/2.   *PV3
u= 3./8
SITE TYPE=    S, POS=  1/3. *PV1 + 2/3. *PV2 +   u  *PV3
SITE TYPE=    S, POS=  2/3. *PV1 + 1/3. *PV2 + ( u +1/2. ) *PV3
TYPE ZnFe ATOM = (Zn:0.9)(Fe:0.1)
TYPE S    ATOM = (S:1.0)

というような形です(ZnなどはZ=30と等価です。原子の標準記法を用意してある)。 これ以上のことは本質的に必要ないと思います.上では、予約語は、

a: 基本長さ a.u. (コードによっては基本長さを与える必要があるので)
EX,EY,EZ; 単位ベクトル。
PV1,PV2,PV3: 基本並進ベクトル
CV1,CV2,CV3: Conventional並進ベクトル
SITE (TYPE= xxx, POS = xxx): 原子サイト 一行に書く
TYPE xxx, ATOM = xxx): タイプの定義   一行に書く

となってます。ぼくはユーザーインターフェイスとしてこういう記法を導入したつもりです.

いろいろ調べた結果ですが,結局のところ「結晶構造」以外は他のコードと共有できる情報 はほとんどない(意味が違ったりしますし)。

で、現在は、これをいったんコンバーターでパイソンが読める形に変換してます.それは

import sys
sys.path.append("./UserModule/Common")
from addSite import *
from numpy import * 
EX = array((1., 0., 0.))
EY = array((0., 1., 0.)) 
EZ = array((0., 0., 1.))
Site = {}
Type = {}
au=0.529177
a =  3.82/au   
c =  6.26/au   
CV1 = 1/2.* a * EX - 1/2. *sqrt(3) * a * EY
CV2 = 1/2.* a * EX + 1/2. *sqrt(3) * a * EY
CV3 = c * EZ
PV1 =  CV1
PV2 =  CV2
PV3 =  CV3
addSite(Site,'ZnFe','1/3. *PV1 + 2/3. *PV2 + PV3',1/3. *PV1 + 2/3. *PV2 + PV3)
addSite(Site,'ZnFe','2/3. *PV1 + 1/3. *PV2 + 1/2. *PV3',2/3. *PV1 + 1/3. *PV2 + 1/2. *PV3)
u= 3./8
addSite(Site,'S','1/3. *PV1 + 2/3. *PV2 + u *PV3',1/3. *PV1 + 2/3. *PV2 + u *PV3)
addSite(Site,'S','2/3. *PV1 + 1/3. *PV2 + ( u +1/2. ) *PV3',2/3. *PV1 + 1/3. *PV2 + ( u +1/2. ) *PV3)
Type["ZnFe"]={"ATOM":{ 30:"0.9", 26:"0.1"}}
Type["S"]={"ATOM":{ 16:"1.0"}}

SiteNum  = len(Site)
TypeNum = len(Type)
for Mat in Site.keys():
	EMat=array([0., 0., 0.])
	try:
		Site[Mat]["PosData"]	=	Site[Mat]["PosData"]+EMat
	except:
		Site[Mat]["PosData"] = EMat
		Site[Mat]["POS"]	=	"0."

となります。XtalEdit/temp/xxx.pyです。そのあと様々な処理をおこないます。


問題点は、このコンバーター処理のおかげで「ユーザーインターフェイスはよくなったが、 パイソンのはくエラーメッセージがストレートによめない」ということです。 でどう変えていくべきか思案中です.


XtalEditのEditWindowの最後に
for i in Site:
    print i,Site[i]
for i in Type:
    print i,Type[i]

といれてRunPythonボタンを押すと、

0 {'PosData': array([ 0., 0., 0.]), 'TYPE': 'Si', 'POS': '0. *PV1'}
1 {'PosData': array([ 2.06, 2.06, 2.06]), 'TYPE': 'C', 'POS': '1/4. *PV1 +1/4. *PV2 +1/4. *PV3'}
2 {'PosData': array([ 4.12, 4.12, 4.12]), 'TYPE': 'Vc1', 'POS': '1/2. *PV1 +1/2. *PV2 +1/2. *PV3'}
3 {'PosData': array([ 6.18, 6.18, 6.18]), 'TYPE': 'Vc2', 'POS': '3/4. *PV1 +3/4. *PV2 +3/4. *PV3'}

Vc2 {'ATOM': {0: '1.0'}}
Vc1 {'ATOM': {0: '1.0'}}
Si {'LMX': '3', 'ATOM': {14: '1.0'}}
C {'LMX': '3', 'ATOM': {6: '1.0'}}

などと表示されます。これでだいたいは、どういう形で,pythonのデータに変換されてるかがわかります。

Personal tools