2017-02-11 8 views
2

したがって、pymatgenを使用して、私は構造体オブジェクトを持っています。私がしたいのは、構造内のすべての結合角を得ることです。すべての原子をループしてすべての結合角を得ることができますが、どれだけ離れているかにかかわらず、すべての原子を含むことになりますが、もちろん問題になります。pymatgenを使用して構造内のすべての結合角度を取得する方法は?

ここで、 "get_neighbors"関数を使用して各中心アトムの近傍を見つけることができますが、ここからどこに行くのかはわかりません。特に、get_angle関数は整数値。以下は

私がこれまで持っているコードです。だから私は隣人の配列を持っていると私は、彼らがあまりにも対応する原子を知って、今私はすべての隣接原子に対して角度を取得する必要があり

import pymatgen as mg 
import numpy as np 


s = mg.Structure.from_file('POSCAR') 

atoms = s.atomic_numbers 

van = [x for x in atoms if x == 23] 
length = len(van) 
nb = ['NONE']*length 

x = 0 

while x < length: 

    nb[x] = s.get_neighbors(s[x],2.4) 
    x += 1 

ご協力いただければ幸いです。

答えて

0

更新:

だから私はこれを行う方法を考え出しました。私は実際に各隣接原子をデカルト座標に変換しました。次に、隣接する原子が結合している中心原子の座標を引いた。最後に、2つのベクトルをそれぞれの大きさの積で割った内積を計算し、これらの値の逆余弦を取って角度を求めました。私が使用したコードは以下の通りです。これは物事を行う最もエレガントな方法ではないかもしれませんが、仕事を終わらせます。誰かが改善している場合は、自由にコメントしてください。

import random 
import itertools as iter 
import pymatgen as mg 
import numpy as np 
import math 


def all_angles(POSCAR,amin,amax): 

    s = mg.Structure.from_file(POSCAR) 

    atoms = s.atomic_numbers 

    van = [x for x in atoms if x == 23] 
    length = len(van) 
    nb = ['NONE']*length 

    x = 0 
    n = 0 

    while x < length: 

     nb[x] = s.get_neighbors(s[x],2.4) 
     x += 1 

    w = 100 
    h = len(van) 
    oxygen = [[0 for x in range(w)] for y in range(h)] 

    x = 0 
    y = 0 

    while x < len(nb): 

     y = 0 
     n = 0 

     while y < len(nb[x]): 

      oxygen[x][n] = (nb[x][y][0]).coords 
      n += 1 
      y += 1 

     x += 1 

    x = 0 

    while x < len(oxygen): 
     oxygen[x] = [n for n in oxygen[x] if not isinstance(n,int)] 
     x += 1 

    van = [x for x in range(0,len(van))] 

    x = 0 
    while x < len(van): 
     van[x] = s[van[x]].coords 
     x += 1 

    van = [np.array(x) for x in van] 

    x = 0 
    while x < len(van): 

     oxygen[x] = [np.subtract(oxygen[x][y],van[x]) for y in range(0,len(oxygen[x]))] 
     x += 1 

    combo = [[0 for x in range(0,1000)] for y in range(0,len(van))] 

    r = 0 

    while r < len(van): 
     x = 0 
     for subset in iter.combinations(oxygen[r],2): 
      combo[r][x] = subset 
      x += 1 
     r += 1 

    x = 0 
    while x < len(combo): 
     combo[x] = [c for c in combo[x] if c != 0] 
     x += 1 


    angles = [[0 for x in range(0,1000)] for y in range(0,len(van))] 

    x = 0 

    while x < len(combo): 

     group = combo[x] 

     y = 0 

     while y < len(group): 
      angles[x][y] = math.degrees(math.acos(np.dot(group[y][0],group[y][1])/(np.linalg.norm(group[y][0])*np.linalg.norm(group[y][1])))) 
      y += 1 

     angles[x] = [round(n,3) for n in angles[x] if n != 0 and n > amin and n < amax] 

     x += 1 

    angles = np.concatenate(angles,axis=0)  

    return angles 
関連する問題