Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

分子を表示させる雑記 その3

More than 1 year has passed since last update.

classとかのオブジェクト指向に関してはまだ理解できていないので、

副関数ぽくだだだっとべたっと書き書き。

model.py
# -*- coding: utf-8 -*-
import os,sys
import numpy as np
import tkinter as tk
from tkinter import filedialog
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

def fileread(x,a):
    with open(x,encoding='utf-8') as B1:
        txt = B1.read()
        c=txt.splitlines()
    b=0
    while b < a:
        del c[:(c.index('')+1)]
        b+=1
    if a==2:
        c=c[1:-1]
    else:
        c=c[:-1]
    return c

def plopoint(C,a,b):
    if a==0:#mol
        A = C[0].split()
        mol_number = int(A[0])
        mol_bond = int(A[1])
        MOL = [(C[i].split())[b] for i in range(1,mol_number)]
        return MOL
    else:
        mol_number = int(len(C))
        COM = [(C[i].split())[b] for i in range(mol_number)]
        return COM

def bond(wx):
    return  np.linalg.norm(wx)

def angle(x,y):
    cos=(np.dot(x,y))/(bond(x)*bond(y))
    return np.rad2deg(np.arccos(cos))


def btn_click1():#mol
    cood = tk.StringVar()
    typ = [('', '*')]
    dir = 'C:\\pg'
    fle = filedialog.askopenfilenames(filetypes = typ, initialdir = dir)#filenameだと階層ごとにばらばらに分割
    fle=list(fle)
    cood= fileread(fle[0],1)
    text.insert('1.0', cood)
    M = plopoint(cood,0,3)
    X = np.array(plopoint(cood,0,0), dtype=float)
    Y = np.array(plopoint(cood,0,2), dtype=float)
    Z = np.array(plopoint(cood,0,1), dtype=float)
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')
    ax.scatter(X, Y, Z)
    plt.show()

def btn_click2():#com
    cood = tk.StringVar()
    typ = [('', '*')]
    dir = 'C:\\pg'
    fle = filedialog.askopenfilenames(filetypes = typ, initialdir = dir)
    fle=list(fle)
    cood= fileread(fle[0],2)
    text.insert('1.0', cood)
    M = plopoint(cood,1,0)
    X = np.array(plopoint(cood,1,1), dtype=float)
    Y = np.array(plopoint(cood,1,2), dtype=float)
    Z = np.array(plopoint(cood,1,3), dtype=float)
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')
    ax.scatter(X, Y, Z)
    plt.show()

def btn_click3():#com bond
    cood = tk.StringVar()
    typ = [('', '*')]
    dir = 'C:\\pg'
    fle = filedialog.askopenfilenames(filetypes = typ, initialdir = dir)
    fle=list(fle)
    cood= fileread(fle[0],2)
    M = plopoint(cood,1,0)
    X = np.array(plopoint(cood,1,1), dtype=float)
    Y = np.array(plopoint(cood,1,2), dtype=float)
    Z = np.array(plopoint(cood,1,3), dtype=float)
    mat = np.c_[X,Y,Z]
    a = txt1.get()
    b = txt2.get()
    ab = bond(mat[int(a)]-mat[int(b)])
    text.insert('1.0',ab)

def btn_click4():#com ang
    cood = tk.StringVar()
    typ = [('', '*')]
    dir = 'C:\\pg'
    fle = filedialog.askopenfilenames(filetypes = typ, initialdir = dir)
    fle=list(fle)
    cood= fileread(fle[0],2)
    M = plopoint(cood,1,0)
    X = np.array(plopoint(cood,1,1), dtype=float)
    Y = np.array(plopoint(cood,1,2), dtype=float)
    Z = np.array(plopoint(cood,1,3), dtype=float)
    mat = np.c_[X,Y,Z]
    a = txt3.get()
    b = txt4.get()
    c = txt5.get()
    abc = angle(mat[int(a)]-mat[int(b)],mat[int(c)]-mat[int(b)])
    text.insert('1.0',abc)

def btn_click5():#com dihe
    cood = tk.StringVar()
    typ = [('', '*')]
    dir = 'C:\\pg'
    fle = filedialog.askopenfilenames(filetypes = typ, initialdir = dir)
    fle=list(fle)
    cood= fileread(fle[0],2)
    M = plopoint(cood,1,0)
    X = np.array(plopoint(cood,1,1), dtype=float)
    Y = np.array(plopoint(cood,1,2), dtype=float)
    Z = np.array(plopoint(cood,1,3), dtype=float)
    mat = np.c_[X,Y,Z]
    a = txt6.get()
    b = txt7.get()
    c = txt8.get()
    d = txt9.get()
    bc=np.cross(mat[int(a)]-mat[int(b)],mat[int(c)]-mat[int(b)])
    cd=np.cross(mat[int(c)]-mat[int(b)],mat[int(d)]-mat[int(b)])
    abcd = angle(bc,cd)
    text.insert('1.0',abcd)

#全体画面の設定
root=tk.Tk()
root.title("GVtypeM")
root.geometry('1200x1200')
root.minsize(300,400)

#ファイルのボタン
button1 = tk.Button(root,text="mol", command=btn_click1)
button1.pack(anchor="n",side="left")
button2 = tk.Button(root,text="com", command=btn_click2)
button2.pack(anchor="n",side="left")

#計算(距離)
lbl = tk.Label(text='番号')
lbl.pack(fill = 'x', padx=20, side = 'top')
txt1 = tk.Entry(width=20)
txt1.pack(fill = 'x', padx=20, side = 'top')
txt2 = tk.Entry(width=20)
txt2.pack(fill = 'x', padx=20, side = 'top')
button3 = tk.Button(root,text="距離", command=btn_click3)
button3.pack(fill = 'x', padx=20, side = 'top')

#角度
lbl2 = tk.Label(text='番号')
lbl2.pack(fill = 'x', padx=20, side = 'top')
txt3 = tk.Entry(width=20)
txt3.pack(fill = 'x', padx=20, side = 'top')
txt4 = tk.Entry(width=20)
txt4.pack(fill = 'x', padx=20, side = 'top')
txt5 = tk.Entry(width=20)
txt5.pack(fill = 'x', padx=20, side = 'top')
button4 = tk.Button(root,text="角度", command=btn_click4)
button4.pack(fill = 'x', padx=20, side = 'top')

#二面角
lbl3 = tk.Label(text='番号')
lbl3.pack(fill = 'x', padx=20, side = 'top')
txt6 = tk.Entry(width=20)
txt6.pack(fill = 'x', padx=20, side = 'top')
txt7 = tk.Entry(width=20)
txt7.pack(fill = 'x', padx=20, side = 'top')
txt8 = tk.Entry(width=20)
txt8.pack(fill = 'x', padx=20, side = 'top')
txt9 = tk.Entry(width=20)
txt9.pack(fill = 'x', padx=20, side = 'top')
button5 = tk.Button(root,text="二面角", command=btn_click5)
button5.pack(fill = 'x', padx=20, side = 'top')


#原子の座標のリストを表示させる場所
text = tk.Text(root)
text.pack(fill = 'x', padx=20, side = 'bottom')

#gridならブロックで自動的に割り当ててくれる
#text_widget.grid(column=7, row=7, sticky=(tk.N, tk.S, tk.E, tk.W))
#root.columnconfigure(0, weight=1)
#root.rowconfigure(0, weight=1)

root.mainloop()

mol,comファイルから座標を取り出してプロットデータに突っ込んだり、

指定したところに計算を行うとかはできるようになった。

なお全てファイルのパスからなにまで全て手動の模様。

ただプロットなりにした点を選択して、選択した点の距離や角度に、ができてない。

さらなるグラフィカルな操作というかなんというか。

3Dグラフィックスとかの分野に片足を突っ込むのは分かるんですけど、

Pythonで何をすればいいのかが全く分からないんですよね。

GaussviewやWinmostarの分子モデリング部分って本当にPythonで作れるんですかね?

誰か教えてクレメンス

以上!





rev.py
    molnum  = list(range(len(cood)))
    for m, n, x, y, z in zip(molnum,M, X, Y, Z):
        label = m,n
        ax.text(x, y, z, label)
    plt.show()

を追加することでプロットした座標に原子と、

原子それぞれの要素の数字を表示することができるようになった。

が、メモリドカ食いで草生える。

原子ごとに色を変えるとかした方がメモリ的には優しいのかもしれない。

あとはカーソルで要素を拾ってくるとかが良いのかもしれない。

B3LYP
Fortran90は最強の言語なんだ!(集中線)
https://itamim0721.hatenablog.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away