Python Turtle Graphics による
分子構造描画プログラム
パソコンで分子計算をしていると計算結果を目で確認したくなることがある.そのための分子描画プログラムは Avogadro等のフリーソフトが利用できるが, Python言語の「Turtle Graphics」を利用すれば, 比較的簡単に自作できることを以前紹介した. しかし, 基本プログラムでは, 遠近感を出す方法として原子のz軸座標に依存して原子サイズを変える方法のみしか考慮していなかったので, 結合の起点, 終点が曖昧で何となく立体感の欠如した図になってしまった. そこで, 今回はz軸の奥から順番に原子を描くことにより手前にある原子で見えない「結合」は隠すように工夫した. そのためにはz軸によって並べ替えを行い, 原子間結合の描画を先行させる必要がある. プログラム中, at, xt, yt, ztは原子種, x座標, y座標, z座標の仮変数であり, z[i]>z[j]の条件を満たした際にデータの入れ替え時に一時保管場所としてその役割を果たす.
なお, プログラムの編集, 実行は, Pythonの統合開発環境, マルチウィンドウ型テキストエディタ IDLE (Integrated DeveLopment Environment)上で行った.
#Program for Molecular Structure Drawing (2019/2/15)
a,x,y,z = [],[],[],[] #配列の確保(入力データ 原子記号, X, Y, Z直角座標系)
print("入力データ")
for line in open('CpcBqCageB631ok.txt').readlines(): #データセットをオープン
data = line[:-2].split(',')
print(data)
a += [data[0]] #a.append(int(data[1]))
x += [float(data[1])]
y += [float(data[2])]
z += [float(data[3])]
#print(a,x,y,z)
n=len(a)
print("原子数 =",n)
print("奥行きで並べ直したデータ")
for i in range(0,n):
for j in range(i,n):
if z[i]>z[j]:
at=a[i];xt=x[i];yt=y[i];zt=z[i]
a[i]=a[j];x[i]=x[j];y[i]=y[j];z[i]=z[j]
a[j]=at;x[j]=xt;y[j]=yt;z[j]=zt
for i in range(0,n):
print(a[i],x[i],y[i],z[i])
print('complete')
#分子描画
import math
from turtle import *
resetscreen()
setworldcoordinates(-6,-6,6,6) #キャンパスの範囲設定
speed(0)
pensize(4)
penup()
zmin=min(z);zmax=max(z);sa=zmax-zmin
print('奥行き =',sa,'Å')
print('原子間距離の計算')
for i in range(0,n):
for j in range(i,n):
d=math.sqrt((x[i]-x[j])**2+(y[i]-y[j])**2+(z[i]-z[j])**2) #原子間距離計算
if d> 1.0 and d<1.7: #結合を描く条件
print(i,j,d)
penup()
goto(x[i],y[i])
pensize(10)
pencolor('black') #AD491E F2CAAA, 674131, D18047等の結合色
pendown()
goto(x[j],y[j])
penup() #結合を白抜きにする場合
goto(x[i],y[i]) #同上
pensize(6) #同上
pencolor('white') #同上
pendown() #同上
goto(x[j],y[j]) #同上
penup() #結合距離表示
goto((x[i]+x[j])/2,(y[i]+y[j])/2) #同上
pencolor('black') #同上
write(round(d,3), True, align="center",font=("Arial", 14, "normal")) #同上
elif d < 0.1:
print(i,j,d)
k=0.5 #要調整, 奥行きによる原子サイズ調整
goto(x[i],y[i])
if a[i] == ' H':
pendown()
dot(4*(sa+z[i]*k),'cyan');print(4*(sa+z[i]*k))
elif a[i] == ' O':
pendown()
dot(6*(sa+z[i]*k),'red');print(4*(sa+z[i]*k))
else:
pendown()
#pencolor('#674131')
dot(5*(sa+z[i]*k),'#674131');print(4*(sa+z[i]*k)) #circle(0.01*(sa+z[i]))
penup()
hideturtle()
上記プログラムによって描いたカゴ型分子 (2,5-methoxycarbonyl-3,4-diphenylcyclopentadenoneとbenzoquinoneの [4+2] 付加体の光反応による [2+2] 付加体)のDFT計算構造 (RB3LYP/6-31G(D)) は以下の通りである.
z軸投影, 原子間距離非表示, k=1.0.
プログラムの「距離表示」の部分を有効にする. k=0.5.
以下, 参考資料
y軸投影(炭素 黒色, 結合 褐色)
x軸投影(炭素 黒色, 結合 褐色)
途中経過をプリントした結果は以下の通りである,最初は入力データ,次がソートしたデータである.結合は1.0-1.7Åの範囲にあるものを結んでいる.
Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 26 2018, 23:26:24)
[Clang 6.0 (clang-600.0.57)] on darwin
Type "copyright", "credits" or "license()" for more information.
>>>
=========== RESTART: /Users/KH/pythonPRG/readcoordCHcpcbqtuika.py ===========
入力データ
[' O', '-1.5943486991', '-0.9202622292', '3.421875870']
[' C', '-0.4241494753', '-1.0751224677', '1.2933843832']
[' C', '-3.1806973572', '2.3422083603', '0.9394511197']
[' C', '-2.1403043002', '1.4138337144', '0.9478603447']
[' C', '-1.962211593', '0.5197917943', '-0.1229930163']
[' C', '2.9996275647', '0.3072509093', '0.450117309']
[' H', '0.3835935487', '3.3212552906', '-4.0497401896']
[' H', '0.2704857873', '1.0045628144', '-3.2641516201']
[' C', '0.5597449641', '3.1064760488', '-2.9991315145']
[' C', '0.7486219936', '-0.1716506418', '1.7146816449']
[' H', '-1.5787800971', '-1.746847537', '-1.8740235875']
[' H', '-4.3007506962', '-2.9782763333', '1.8890123784']
[' O', '2.4215124572', '-2.8117380557', '-1.8589226133']
[' C', '1.714210116', '-2.0788023202', '-1.2125761544']
[' C', '0.7271155244', '1.4704407542', '-1.2019458042']
[' C', '-2.8500761771', '0.6032926564', '-1.2048014001']
[' H', '-3.3460896977', '-2.8942379935', '3.4083117898']
[' C', '-0.7777876674', '-1.638396824', '-1.1459144722']
[' H', '4.8535191342', '1.7546507043', '-0.8208608195']
[' C', '0.2889374417', '-2.3938853402', '0.8738810828']
[' C', '1.0649360846', '3.8429340437', '-0.7639396957']
[' H', '0.3997425599', '-3.1310372768', '1.6694439468']
[' C', '0.6254309943', '0.0505957541', '-0.7005427838']
[' O', '-0.9588223432', '-4.0066300256', '-0.5027141143']
[' C', '1.0028848717', '2.5248569694', '-0.3131737585']
[' C', '-4.0621243393', '2.4062264886', '-0.1402525257']
[' O', '0.898783497', '0.5107175336', '2.6902335664']
[' C', '-0.8122481125', '-0.4576129864', '-0.1237497324']
[' C', '1.7009764896', '-1.8947516776', '0.3073617017']
[' O', '3.5266018491', '0.8899260367', '1.3672616712']
[' O', '3.57612453', '0.1073879172', '-0.7552889951']
[' C', '4.8924804725', '0.667093412', '-0.9203643554']
[' C', '-0.5656519367', '-2.8847145621', '-0.2978885542']
[' H', '2.5411508775', '-2.3740821033', '0.8102942016']
[' H', '0.6677536006', '-0.9526955296', '-2.7753319319']
[' C', '0.4989689403', '1.7872149288', '-2.548496102']
[' H', '0.8947858557', '5.168349111', '-2.4591640354']
[' C', '0.8452349312', '4.1409341287', '-2.1091903147']
[' H', '-2.7395962056', '-0.059578114', '-2.0564499888']
[' C', '1.633704449', '-0.3476904614', '0.4677788022']
[' H', '-4.5663040115', '1.5713953309', '-2.0636791344']
[' H', '5.2043440735', '0.3814321642', '-1.9245913975']
[' H', '1.1800381981', '2.3270826283', '0.7391251523']
[' H', '1.2861036638', '4.6373295914', '-0.0564421821']
[' H', '-4.8728898058', '3.1295210443', '-0.1450316113']
[' H', '-1.4732146286', '1.3892822944', '1.803557911']
[' H', '5.5759293938', '0.2601254347', '-0.1713249727']
[' O', '-2.5161306476', '-2.0462685839', '1.6891062366']
[' H', '-3.2986551216', '3.0167759987', '1.7830009442']
[' C', '0.6176571117', '-1.1451087988', '-1.7057694921']
[' C', '-1.5537192458', '-1.3023073019', '2.2769996656']
[' C', '-3.8903364426', '1.5333465401', '-1.2136449037']
[' C', '-3.6577593471', '-2.3554796987', '2.5103185632']
[' H', '-4.171727308', '-1.4359087983', '2.8008719503']
原子数 = 54
並べ直したデータ
H 0.3835935487 3.3212552906 -4.0497401896
H 0.2704857873 1.0045628144 -3.2641516201
C 0.5597449641 3.1064760488 -2.9991315145
H 0.6677536006 -0.9526955296 -2.7753319319
C 0.4989689403 1.7872149288 -2.548496102
H 0.8947858557 5.168349111 -2.4591640354
C 0.8452349312 4.1409341287 -2.1091903147
H -4.5663040115 1.5713953309 -2.0636791344
H -2.7395962056 -0.059578114 -2.0564499888
H 5.2043440735 0.3814321642 -1.9245913975
H -1.5787800971 -1.746847537 -1.8740235875
O 2.4215124572 -2.8117380557 -1.8589226133
C 0.6176571117 -1.1451087988 -1.7057694921
C -3.8903364426 1.5333465401 -1.2136449037
C 1.714210116 -2.0788023202 -1.2125761544
C -2.8500761771 0.6032926564 -1.2048014001
C 0.7271155244 1.4704407542 -1.2019458042
C -0.7777876674 -1.638396824 -1.1459144722
C 4.8924804725 0.667093412 -0.9203643554
H 4.8535191342 1.7546507043 -0.8208608195
C 1.0649360846 3.8429340437 -0.7639396957
O 3.57612453 0.1073879172 -0.7552889951
C 0.6254309943 0.0505957541 -0.7005427838
O -0.9588223432 -4.0066300256 -0.5027141143
C 1.0028848717 2.5248569694 -0.3131737585
C -0.5656519367 -2.8847145621 -0.2978885542
H 5.5759293938 0.2601254347 -0.1713249727
H -4.8728898058 3.1295210443 -0.1450316113
C -4.0621243393 2.4062264886 -0.1402525257
C -0.8122481125 -0.4576129864 -0.1237497324
C -1.962211593 0.5197917943 -0.1229930163
H 1.2861036638 4.6373295914 -0.0564421821
C 1.7009764896 -1.8947516776 0.3073617017
C 2.9996275647 0.3072509093 0.450117309
C 1.633704449 -0.3476904614 0.4677788022
H 1.1800381981 2.3270826283 0.7391251523
H 2.5411508775 -2.3740821033 0.8102942016
C 0.2889374417 -2.3938853402 0.8738810828
C -3.1806973572 2.3422083603 0.9394511197
C -2.1403043002 1.4138337144 0.9478603447
C -0.4241494753 -1.0751224677 1.2933843832
O 3.5266018491 0.8899260367 1.3672616712
H 0.3997425599 -3.1310372768 1.6694439468
O -2.5161306476 -2.0462685839 1.6891062366
C 0.7486219936 -0.1716506418 1.7146816449
H -3.2986551216 3.0167759987 1.7830009442
H -1.4732146286 1.3892822944 1.803557911
H -4.3007506962 -2.9782763333 1.8890123784
C -1.5537192458 -1.3023073019 2.2769996656
C -3.6577593471 -2.3554796987 2.5103185632
O 0.898783497 0.5107175336 2.6902335664
H -4.171727308 -1.4359087983 2.8008719503
H -3.3460896977 -2.8942379935 3.4083117898
O -1.5943486991 -0.9202622292 3.42187587
complete
奥行き = 7.4716160596 Å
原子間距離の計算 ← i, j および距離の順に表示, I=J, 距離がゼロの場合,原子を円で描く
0 0 0.0
0 2 1.0867097275956363
1 1 0.0
1 4 1.0848556143407246
2 2 0.0
2 4 1.3954267816018284
2 6 1.3941317654678904
3 3 0.0
3 12 1.0878861783271574
4 4 0.0
4 16 1.4019965927331204
5 5 0.0
5 6 1.0865166566389661
6 6 0.0
6 20 1.3952676715903587
7 7 0.0
7 13 1.0867097395568233
8 8 0.0
8 15 1.0848542763837141
9 9 0.0
9 18 1.0896482029573837
10 10 0.0
10 17 1.0878847886471554
11 11 0.0
11 14 1.2063312725667426
12 12 0.0
12 14 1.522317887793267
12 17 1.5824148794265027
12 22 1.562130130992972
13 13 0.0
13 15 1.395428197407343
13 28 1.3941311570632329
14 14 0.0
14 32 1.5310979244695722
15 15 0.0
15 30 1.401993328418676
16 16 0.0
16 22 1.5092065984605518
16 24 1.40632785544649
17 17 0.0
17 25 1.5223197529238284
17 29 1.5621327564276586
18 18 0.0
18 19 1.092794492836433
18 21 1.4399003725405972
18 26 1.092604850533524
19 19 0.0
20 20 0.0
20 24 1.3944057719894176
20 31 1.0865229477765086
21 21 0.0
21 33 1.351036018977768
22 22 0.0
22 29 1.6303029050434663
22 34 1.5938075784810226
23 23 0.0
23 25 1.2063294682043015
24 24 0.0
24 35 1.085279221547612
25 25 0.0
25 37 1.5311043115804257
26 26 0.0
27 27 0.0
27 28 1.086516679868926
28 28 0.0
28 38 1.3952676472329595
29 29 0.0
29 30 1.5092172422942114
29 40 1.5938028778017959
30 30 0.0
30 39 1.4063267358686302
31 31 0.0
32 32 0.0
32 34 1.5568100655666182
32 36 1.0902255539752066
32 37 1.60122855804434
33 33 0.0
33 34 1.514927749234281
33 41 1.2076282464503485
34 34 0.0
34 44 1.539197086170265
35 35 0.0
36 36 0.0
37 37 0.0
37 40 1.556795260825106
37 42 1.0902252163788582
38 38 0.0
38 39 1.3944059348944469
38 45 1.086522820456515
39 39 0.0
39 46 1.085278640327522
40 40 0.0
40 44 1.539202923976193
40 48 1.5149388895558578
41 41 0.0
42 42 0.0
43 43 0.0
43 48 1.3510487701378888
43 49 1.4399018322086075
44 44 0.0
44 50 1.1999484803292246
45 45 0.0
46 46 0.0
47 47 0.0
47 49 1.0896489794228488
48 48 0.0
48 53 1.2076219248801157
49 49 0.0
49 51 1.0927922842193998
49 52 1.0926071140132676
50 50 0.0
51 51 0.0
52 52 0.0
53 53 0.0
>>>