www.cms-initiative.jp

第17回CMSI神戸ハンズオン 2014年8月18日
FUチュートリアル
- FUをベースにした実践的分子モデリングソフトプログラミング実習 -
神戸大学・北浦和夫
【プログラム】
1. 13:00-13:30 FUの概要
2. 13:30-16:30 wxPythonプログラミング実習
1) ウィンドウの作成
2) 分子構造データファイルの読み込み
3) OpenGLによる分子模型の描画
4) マウスeventの取得と分子模型の回転
(随時休憩を挟む)
3. 16:30-17:00 FUプログラムの改変・機能追加
4. 17:00-17:30 質疑・応答
1
本講習会の目的
京コンピュータのような高性能コンピュータが利用可能になり、巨大分
子や膨大な数の小・中型の分子の量子化学計算が可能になった。これ
に伴い、構造モデルの作成、入力データの作成や結果のグラフ化を効
率よく行える支援プログラムの必要性が高まっている。確立した計算法
によるルーチンワークの場合は別にして、新しいことに挑戦する場合、
既成の計算支援プログラムには必要な機能が無い、あるいは、できる
としても、面倒な操作が必要なことが多い。将来に向けて、大規模計算
を支援するGUIプログラムをみんなで育てていくことが重要だと考える。
各自・各グループが取得した計算ノウハウを計算支援プログラムの形
で蓄積し相互利用できるようになれば、計算化学の活用がいっそう促
進されると期待される。
計算化学者こそが先端的研究を通じて貴重なノウハウを取得してい
るはずであるが、自らGUIプログラムを作成するのは障壁が高いと思わ
れる。本講習会では、FUをベースにして、各自が独自の計算支援ソフト
を開発する際の踏み台として使える分子モデリングソフトのプロトタイプ
を作成する。
なお、講師はpythonやGUIプログラミングの初心者であり、高度な技
術は伝授できないことをあらかじめお断りしておく(何よりもすぐに研究
に役立つことを優先する)。
2
FUの概要
FUは、fumodel,fuplotの2つのプログラムからなる
1. fumodel: タンパク質の構造モデルとFMO計算のため
の入力データの作成を支援するソフトウェア。TINKERと
GAMESSの実行機能もある。
2. fuplot: FMO計算の結果をグラフにするソフトウェア。
(後述する開発版には、上記に加えてfutools(コンソールア
プリケーション)が含まれる)
3. これらの使い方については、'fu user's guide.pdf'を参照
してください
3
FUのmodules
1. pythonプログラム
fuconst.py ... global定数
fuctrl.py ... 入力処理ルーチン
fulib.py ... global関数
fugraph.py ... 棒グラフclass、タイルグラフclass
fumodel.py ... fumodelのmainプログラム
fumole.py ... fuMole class、Atom calss
fupanel.py ... 各種パネル類のclass
fuplot.py ... fuplotのmainプログラム
fuview.py ... OpenGL描画ルーチン
2. Fortranプログラム
fuflib.f, fmopdb.f, fmopdb-sub.f
3.scriptフォルダに拡張機能プログラムがある。
gamess-assist.py, tinker-optimize.py, rms-fit.pyなど
4
pythonによるGUIプログラミングの開発環境
1. pythonの各種GUIツールについては、
https://wiki.python.org/moin/GuiProgrammingを参照されたい。
2. 本講習会では、wxPython(2.8)を用いる。ドキュメントは、
http://xoomer.virgilio.it/infinity77/wxPython/ を参照する。
3. 本講習会は、wxPythonの開発環境を含んだFUを用て実習を行うが、本
格的にプログラミングを行うには次のsite-pakagesをinstallされたい(実習テ
キスト参照)。
python2.7, numpy, scipy, wxPython, PyOpenGL, matplotlib, psutil
4. 公開版はWindows版(32bit mode)のみであるが、開発版(後述)ではMac
OSX 10.9とDebian(64bit mode)でも動く。
5 . 講 師 は 、 統 合 開 発 環 境 と し て W i n d o w s 7 と M a c O SX 1 0 . 9 と も に 、
Eclipse+PyDevを用いている。これは以下のサイトからダウンロードできる。
https://www.eclipse.org/downloads/index-developer.php?release=kepler
PydevはEclipseの’Help'-'Install New Software'メニューで
http://pydev.org/updatesをinstallする。
5
実習要領
まず、USBメモリ内のfu-tutorial-18Aug2014フォルダにある
mymodel.pyファイルとexampleフォルダを、事前準備で作っ
た”c:¥fu-23Dec2013”フォルダにコピーする。
ついで、実習テキストに従って、
1)ウィンドウの作成
2)メニューの作成
3)分子構造データファイル(PDB形式)の読み込
みとOpenGLによる分子模型の描画
4)マウスeventの取得と分子模型の回転
の順番でコードを作成・追加し、分子モデリングソフトのプロトタ
イプを作りあげる。
*FU開発版をご希望の方は、fu-18Aug2014-dev.zipをコピー
してください。
6
プログラミングの準備
1. まず、fu-23Dec2013フォルダーにあるfumodel.exeを起
動する。本実習ではfumodelのメインウィンドウは不要なの
で、PyCrustウインドウから、
>>> fum.frame.Hide()
と入力してメインウィンドウを隠す。
そして、change directoryコマンドでmymodel.pyがある
directryをカレントにしておく(pwd, ls, cdなどのコマンドが使
える)。
2. PyCrustは、wxPythonに含まれるpythonのshellである。
ここから、pythonの命令を実行して会話的にプログラムを開
発・実行できる。
7
Step0: ウインドウの作成
1. エディタでmymodel.pyを開いて、ソースコードを読む。
2. PyCrustからmymodel.pyを実行する。
3. wxFrameとは?
http://xoomer.virgilio.it/infinity77/wxPython/ (サイト3)にア
クセスして、'Frame'で検索し、wx.Frameの項目のwindow
style, event handling, methodsの説明を読む。
8
Step1: FrameにMenuとStatusbarを付ける
1. エディタでmymodel.pyを開いて、実習テキストの黒太字の
コードを追加し、mymodel-1.pyとして保存する。
2. PyCrustからmymodel-1.pyを実行する。
3. StatusBarについて
4. Menuについて('Menu'で検索し、wx.Menuの項目を読む)
menuitem1 = wx.Menu()
menuitem2 = wx.Menu()
menubar = wx.MenuBar()
menubar.Append(menuitem1,"Files")
menubar.Append(menuitem2,"Edit")
self.SetMenuBar(menubar)
のように書く。
5. 本講習では、メニュー項目の追加・削除などが簡単にでき
るfumodelのfuMenu classを用いる。
(ソースコードを参照)
9
Step2: 分子構造データの読み込みと
OpenGLでの分子模型の描画コードの追加
1. エディタでmymodel-1.pyを開いて、実習テキストの黒太字
のコードを追加し、mymodel-2.pyとして保存する。
2. PyCrustからmymodel-2.pyを実行する。
3. File名の取得について(wx.FileDialogの説明を読む)
wcard='pdb file(*.pdb;*.ent)|*.pdb;*.ent'
dlg=wx.FileDialog(self,"Open file...",
os.getcwd(),style=wx.OPEN,wildcard=wcard)
if dlg.ShowModal() == wx.ID_OK:
filename=dlg.GetPath()
でファイラーからファイル名を取得できる(mymodel-1.pyの
OpenFile method)。
10
Step2: 続き
4. glCanvasについて(wx.glvcanvas.GLCanvasの説明を読
む)
size=self.GetClientSize()
w=size.width; h=size.height
attribList = (wx.glcanvas.WX_GL_RGBA, # RGBA
wx.glcanvas.WX_GL_DOUBLEBUFFER, #
Double Buffered
wx.glcanvas.WX_GL_DEPTH_SIZE,32) #
32 bit
canvas=wx.glcanvas.GLCanvas(self,-1,pos=(-1,-1),
size=(w,h),attribList=attribList)
でFrameにglcanvasが配置できる。
カラーコードRGBA:[R,G,B,A]。 それぞれ0-1(Windowsの
11
RGBは0-255)。 Aは透明度。
Step2: 続き
5. OpenGLによる描画について
①fuview.pyモジュールのソースコードを参照。
②fuviewには以下の図形の描画ルーチンがある。
・DrawAtom・・・原子(円または球)
・DrawBonds・・・結合(線または棒)
・DrawChainTube・・・ペプチド鎖(spline fitによる曲線の
チューブ表示)
・DrawArrow・・・矢印 (FUのscript
‘draw_pmi_vector.py’
を参照)
・DrawSphere・・・球
・DrawLabel,DrawText2,DrawText3・・・文字列
③ それぞれ、事前に対応するmethod(原子を描く場合は、
SetDrawAtomDataまたはSetDrawAtomList。前者は描画デ
ータをオブジェクトで、後者はListで渡す場合に用いる)を用い
12
て描画データをセットしてから、OnDraw methodで描画する。
Step3:マウスevent、ウインドウサイズの変
更eventの取得と処理コードを追加する
1. エディタでmymodel-2.pyを開いて、実習テキストの黒太字
のコードを追加し、mymodel-3.pyとして保存する。
2. PyCrustからmymodel-3.pyを実行する。
3. マウスeventの取得(wx.MouseEventの説明を読む)
self.canvas.Bind(wx.EVT_LEFT_DOWN,
self.OnMouseLeftDown)
self.canvas.Bind(wx.EVT_LEFT_UP,
self.OnMouseLeftUp)
self.canvas.Bind(wx.EVT_MOTION,
self.OnMouseMove)
self.canvas.Bind(wx.EVT_MOUSEWHEEL,
self.OnMouseWheel)
4. ウインドウサイズ変更eventの取得
self.canvas.Bind(wx.EVT_SIZE,self.OnResize)
13
Step3:続き
1. 実習テキスト16ページの、「⑥ ここで、PyCrustから
attributeを変更したり、methodを実行してみよう。」の項への
追加。
PyCrustから、
>>> for atom in mdl.mole.mol:
>>> atom.color[3]=0.5
と入力し、透明度をdefaultの1.0(不透明)から0.5に変更する。
>>> mdl.DrawMol(True)
で再描画すると半透明になる。CPKモデルにするとよく分かる。
14
Widgetsの種類(使い方はソースプログラムまたは
サイト1,2,3を参照)
wx.StaticText
wx.RadioButton
wx.SpinCtrl
wx.TreeCtrl
wx.TextCtrl
wx.StaticLine
wx.ComboBox
wx.CheckBox
wx.Button
gamess-assist.py(FUの
script)のウィンドウ
fupanel.pyの
TreeSelector_Frm
classのウィンドウ
15
WidgetsのPanelへの配置について
1. FUでは、widgetの位置を明示的に指定して配置している。exampleフォルダ
にあるwidget-1.py参照。
(w,h)=self.GetClientSize()
panel=wx.Panel(self,wx.ID_ANY,pos=(-1,-1),size=(w,h))
# put buttons on the panel
button1=wx.Button(panel,wx.ID_ANY,"Button1",pos=(20,20),size=(100,40))
button2=wx.Button(panel,wx.ID_ANY,"Button2",pos=(40,60),size=(100,40))
wx.Panelとwx.Buttonについてはサイト1または3参照のこと。
2.一般的には、BoxSizerを用いて配置する。exampleフォルダにあるwidget-2.py参照。
(w,h)=self.GetClientSize()
panel=wx.Panel(self,wx.ID_ANY) #,pos=(-1,-1),size=(w,h))
# put buttons on the panel
sizer=wx.BoxSizer(wx.VERTICAL)
button1=wx.Button(panel,wx.ID_ANY,"Button1",size=(100,40))
button2=wx.Button(panel,wx.ID_ANY,"Button2",size=(100,40))
sizer.Add(button1,flag=wx.LEFT|wx.TOP,border=20)
sizer.Add(button2,flag=wx.LEFT,border=40)
panel.SetSizer(sizer)
16
wx.BoxSizerについてはサイト1または3参照のこと。
FUの機能拡張:scriptについて
1. 起動時設定scripy’fumodelset.py'でscriptメニューに登録
してMenuからptythonプログラムを起動できる(FUのscriptフ
ィルダにソースプログラムを格納しておく)。
・初期設定scrip 'fumodelset.py'のscript menuの設定例
## Add "Script" menu on main window. f
# format: [ ['script file name','comment',checkable],...]
fum.scriptmenu1=('Script', (# This line indicates begin of
data!
('gamess_assist.py','gamess input asist script',False),
('tinker_optimize.py','tinker optimization',False),
('','',False),
('orientate_h-o-bond.py','orientate H-O bonds to make
...
17
FUの機能拡張:scriptの例
1. gamess-assist.pyまたはtinker-optimize.py
gamess-assist.pyはGAMESS-FMOの入力データを作成し
て、実行するscript。tinker-optimize.pyはTINKERで構造最
適化を行うscript。いろんなMOやMM計算支援のプログラム
を作成する際にこれらのscript(pythonプログラム)が参考に
なるだろう。
2. 外部プログラムの実行(threadの生成)について
fupanel.pyモジュールのExecProg_Frm classを使うと簡便
に外部pythonプログラムを実行できる。使用例は、gamessassist.pyスクリプトの ExecuteGAMESS method、または
tinker-optimize.pyスクリプトのExecTinkerOptimize method
を参照されたい。
18
FU開発版(fu-18Aug2014-dev)について
1. 追加された機能: cube dataの描画が可能
2. 修正部分
1) fuview moduleのfuView classに
DrawPolygons methodを追加
2) fucube.py moduleを追加
3) Fortran module (fucubelib)を追加(ソースコードはsrc/f90
フォルダにある)。Fortran moduleがimportできない場合は
pythonコードが使われるので非常に遅く実用的ではない。
3.使い方については、「draw-cube-dataスクリプトの使方.pdf」
を参照のこと。
4. この機能を含めた次期バージョンは本年末ごろに公開予定。
5. 現開発版は、未整理のためソースコードがぐちゃぐちゃである
が、それでよければ希望者に配布する。
19
FUのMac OSX10.9での動作について
1. FU開発版(fu-18Aug2014-dev)は、一部の機能("Edit"-"Copy
bitmap")を除いてMac OSX10.9とDebianで動作する。
2. ただし、stand-aloneで動くパッケージは未作成なので、
pythonの開発環境をinstallしておく必要がある。
3. 開発環境を構築したMacで、shellから、
> python fumodel.py
を実行する。または、py2appを用いてMacのアプリケーション
fumodel.appを作成して実行する。
4. 開発環境の詳細については、開発版の"doc"フォルダ にある
「MacOSXでの動作環境.pdf」を参照されたい。
20
おわりに
・本講習会にご参加いただきましてありがとうございました。
・FUが何らかの形で皆様の研究のお役に立つことを願って
います。
21