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

>>>