#https://qiita.com/ojiya/items/b97d25b896741ad99b79
#https://qiita.com/ojiya/items/a1f1dd358de1231ea157
# https://qiita.com/ojiya/items/9ba8bfadab96cdddb0b9
#Pymatgenチュートリアル④ 構造を扱う https://qiita.com/ojiya/items/e98a9dd5cb6cd7ad38ca
#Pymatgenチュートリアル⑤ Structure型のデータを作る https://qiita.com/ojiya/items/37b594150115531481f0
#Pymatgenチュートリアル⑥ XRDのシミュレーションをする https://qiita.com/ojiya/items/1b154c3698cff91c8a2b



from pymatgen.core.periodic_table import Element
from pymatgen.core.composition import Composition
from pymatgen.io.cif import CifParser


path = 'SrTiO3.cif'
parser = CifParser(path)
mat0 = parser.get_structures()[0]
print("")
print(type(mat0))
print(mat0.as_dict())

print("")
print(mat0)

print(mat0.formula)
print(mat0.get_space_group_info())
print(mat0.lattice)

print("")
print("Charge guess")
ox_guess = mat0.composition.oxi_state_guesses()
print("Guessed charges: ", ox_guess)
print("Total charge:", mat0.charge)

print("")
print("Charge specify")
charges = {'Sr': 3.0, 'Ti': 3.0, 'O': -1.0}
mat0.add_oxidation_state_by_element(charges)
print("Specified charges: ", charges)
print("Total charge:", mat0.charge)

print("")
print(type(mat0.sites))
print(mat0.sites)
print(mat0.sites[0])

metal_sites = []
for site in mat0.sites:
    if site.specie.is_metal:
       metal_sites.append(site) 
print(metal_sites)

#distance：2つのサイト間の距離を求める。
#round(少数点数、整数)：少数点数を、整数桁目で四捨五入した値を得る。
mm_dist = [round(metal1.distance(neighbor), 4) for neighbor in neighbors_metal]

#numpyのnonzeroを使って、0以外の値を取り出す。
mm_dist_nonzero = np.array(mm_dist)[np.nonzero(mm_dist)]

#minを使って、最小値を得る。
mm_min = min(mm_dist_nonzero)
print(mm_min)
#出力結果：3.8674


print("")
metal1 = metal_sites[0]
neighbors = mat0.get_neighbors(metal1, 5)
print(neighbors)

"""
mat = parser.get_structures(primitive=False, symmetrized=False)[0]
print(type(mat))
"""









"""
#普通の元素記号でデータを持ってくることができる
print("")
print("Element: Si")
si = Element('Si')
print(type(si))
print(type(si.data))
print(si.data)
print(si.full_electronic_structure)
print(si.is_metal)
print(si._atomic_radius)


#Compositionの中に、文字列で普通に組成式を入れればいい
print("")
print("Compound: Ti3O5")
ti3o5 = Composition("Ti3O5")
print(type(ti3o5))
print(ti3o5.to_data_dict)
print(ti3o5.elements)
print(ti3o5.to_reduced_dict)
print(ti3o5.to_reduced_dict.keys())
print(ti3o5.reduced_formula)


#よくある小数点の添字をもった化合物を扱う
#半端な組成の化合物を持ってくる
mat_3_0 = Composition('Ti2.98O5.10')

#添字の数字だけを取り出す
sub_num = mat_3_0.to_reduced_dict.values()
#添字の数字の中の最大値で添字を全て割る = 規格化
max_sub = max(sub_num)
std_sub = [i/max_sub for i in sub_num]

#規格化した添字を持つ式に直す
#もうちょいうまい書き方があるが、ここはこれでいいことにする
mat_3_1 = Composition(str(mat_3_0.elements[0]) + str(std_sub[0])
+str(mat_3_0.elements[1]) + str(std_sub[1]))
print(mat_3_1)

#モデルにしたい化合物の組成式を持ってきて、上と同じことをする
mat_4_0 = Composition('Ti3O5')
sub_num = mat_4_0.to_reduced_dict.values()
max_sub = max(sub_num)
std_sub = [i/max_sub for i in sub_num]

mat_4_1 = Composition(str(mat_4_0.elements[0]) + str(std_sub[0])
+str(mat_4_0.elements[1]) + str(std_sub[1]))
print(mat_4_1)

#2つの式が、ある許容範囲以内で同じものかを判別する。
#判断したい式.almost_equals(基準にする式)という式で、bool型の値を返す
#例えば、論文に登場した式が、あるデータベースに含まれるか判断したいときに使える
print(mat_4_1.almost_equals(mat_4_1))

#出力結果：Ti0.58431373 O1
#Ti0.6 O1
#True
"""
