プログラム設計:msi2mol

2014-08-08 :  PCクリニック
本文の前に、
-・・・ -・-
現時点での、blogramのランクインカテゴリは、
3、3、0、1、0、 2、0、0、0、0(41)で、換算ポイント 60pt 。
「化学業界」一昨日、昼前に4位にアップ。
だが昨日朝、一気に7位にダウン。そして今朝方、6位にアップ。
「Firefox」昨日朝方、3位から一気に6位にダウン。
・-・ - -・

さて、本文。

半年前(2014-02-03)の記事:
NaNO3 を、JSmol で表示すると…
で、
以下の「.xyz」形式で表現した“NaNO3”を対象とした。

5
NaNO3 : Sodium Nitrate
Na 2.170377 7.394214 0.000000
N 5.091654 7.394214 1.398583
O 4.016332 8.015051 1.398583
O 6.166976 8.015051 1.398583
O 5.091654 6.152539 1.398583


この5原子間の結合は4本で、
「.mol」形式で表すと、


OpenBabel08031421173D

5 4 0 0 0 0 0 0 0 0999 V2000
2.1704 7.3942 0.0000 Na 0 0 0 0 0 0 0 0 0 0 0 0
5.0917 7.3942 1.3986 N 0 0 0 0 0 0 0 0 0 0 0 0
4.0163 8.0151 1.3986 O 0 0 0 0 0 0 0 0 0 0 0 0
6.1670 8.0151 1.3986 O 0 0 0 0 0 0 0 0 0 0 0 0
5.0917 6.1525 1.3986 O 0 0 0 0 0 0 0 0 0 0 0 0
1 3 1 0 0 0 0
2 3 1 0 0 0 0
2 4 2 0 0 0 0
2 5 2 0 0 0 0
M END


の様ですね。
(これは“Avogadro”で出力したもの)
(このファイルは、(カラム)固定のフォーマット)


この様に、座標データだけから成るファイルを元に、
原子間の結合データを生成したい。

と思った。


その為には、
先月(2014-07-08)の記事:
共有結合半径:値一覧
で書いた、
 (1)Winmostar
    インストール先にある「atoms1.wmx」ファイルにあった。
 (2)Avogadro
    インストール先の bin フォルダにある「element.txt」ファイルにあった。
 (3)CIF2Cell
    インストール先にある「elementdata.py」ファイルにあった。
  (4)Webサイト
    「Table of covalent radii」と云うタイトルの
    「このページ
などが持っている情報を利用する。

そうすると、欲しいプログラムが作れる。

と云うことで、

“Python”あるいは“Perl”でコード化する為の設計を行った。


入力ファイルは?・・・hoge.xyz
出力ファイルは?・・・hoge,mol
内部データは?
(1)元素毎の“共有結合半径”のテーブル・・・必須
(2)元素記号 vs 元素番号のテーブル・・・・・処理単純化(コード化)の為

そして、
入力ファイル情報を取り込む為のテーブル&カウンタ:
aa・・・原子数
An[]、Ax[]、Ay[]、Az[]・・・各原子の情報
Ak[]・・・元素記号に対応する原子番号

それから、計算結果のテーブル&カウンタ:
bb・・・結合数
B1[]、B2[]・・・結合する原子の一連番号(2つ)

なお、結合種(単結合か二重、三重か)は、ここでは扱わない。


処理概要:

(1)入力ファイル読み込み
 1行目 ---> aa :原子数
 2行目 ---> 読み飛ばし:コメント行
 3行目~aa行:各原子情報 ---> An[]、Ax[]、Ay[]、Az[] に取り込み
そして、
 元素記号 An[] から、原子番号 Ak[] に変換
 ( 内部データの(2)テーブルに依る )

(2)原子間距離計算(結合計算)
 擬似コードで、
 bb=0・・・結合数の初期化
 for k ・・・ 0 ~ aa-2
  for j ・・・ k+1 ~ aa-1
   d1:Ak[k] 原子と、Ak[j] 原子との距離を計算(自乗和の平方根)
   d2:両原子の共有結合半径の和を計算( 内部データの(1)テーブルから )
   if d1 が d2 より小さい時:
    B1[bb]<=k、 B2[bb]<=j
    bb += 1
   end-if
  end-for
 end-for

(3)出力ファイル書き出し
 1~3行目 ---> 適当に:コメント行
 4行目 --->下記
 5行目~aa行:各原子情報 --->下記
   座標データは、%10.4f 連続じゃなくて、空白1つの %9.5f が良さそう
   なんだか良く分からないゼロは5つあれば良さそう
 その後~bb行:原子間結合情報 --->下記
   結合種は単結合に限定
   なんだか良く分からないゼロは2つあれば良さそう
 最後に、
  "M END"
 を書いて、終わり。( 正確には、空白は2つ )

 4行目 --->
  "%3d%3d 0 0 0 0 0 0 0 0999 V2000\n" % ( aa, bb )

 5行目~aa行:各原子情報 --->
  " %9.5f %9.5f %9.5f %-2s 0 0 0 0 0 0\n" % ( Ax[a], Ay[a], Az[a], An[a] )

 その後~bb行:原子間結合情報 --->
  "%3d%3d 1 0 0\n" % ( B1[b], B2[b] )



これで、設計はOK?


要検討事項は、
「共有結合半径の和」だけで十分か???

Winmostar 補足」のように、“トレランス”
即ち、「係数」を指定可にするか?・・・1.05 とか 1.15 とか、・・・
この値を掛けて判定する???


本日はここまで。


Python 学習は続く???


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


140215
関連記事
スポンサーサイト

コメントの投稿

管理者にだけ表示を許可する

おきてがみ/blogram
blogram投票ボタン



おきてがみ

最新記事
カレンダー
09 | 2017/10 | 11
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -
月別アーカイブ
カテゴリ
最新コメント
検索フォーム
リンク
プロフィール

<紙>

Author:<紙>
ようこそ。
「パソコンヲタクの雑記帳」
もろもろなことを綴っています。
パソコン ヲタクってねくら?
画像は kami でなく kani です。

カウンター(fc2、i2i) /Google Analytics


i2i(from 2010-08-24)
Total =
Today  =  
Yesterday=
アンチエイジング

Google Analytics
ブックマーク