プログラミングのネタ帳

30代からプログラミングをはじめた。記憶力が悪いのでメモ代わりに。

pubchem でxyz形式のファイルを作成する

pubchempyで対象の分子のcomformer オブジェクトがあり、かつ3dのデータがあるのであれば、xyzファイルを書き出して、

xyz形式は

1行目:原子の数

2:行目空白行

3行目以降:原子記号_or_id x座標 y座標 z座標

・・・

 

3dデータをもつcomformerオブジェクトである必要があります。

それ入手は以下の記事を参照してください。

 

 

myprograming-tips.hatenablog.jp

 

 

 


#関数名 make_xyzfile(compound_obj_3d,compound_obj_2d)
#機能
#  cmp_objから座標を生成し、xyzファイルを書き出す
#  書き出したファイルを読みコンソールへの表示もする
#引数(compound_obj_3d,compound_obj_2d) 1:3d情報をもつcompoundオブジェクト, 2: 2d情報のcompoundオブジェクト 
#戻り値(int) 1:最後まで実行できたら1を返す
def make_xyzfile(cmp_3d,cmp_2d):
    atm=cmp_3d.atoms
    with open(str(cmp_2d.iupac_name)+".xyz","w") as f:
        print(len(atm),end='\n',file=f)
        print("#",file=f)
        for x in atm:
            print("{} {:6.3} {:6.3} {:6.3}".format(x.element,float(x.x),float(x.y),float(x.z)),file=f)
    with open("hoge.xyz","r") as f:
        print("---write down my-written-xyzfile---")
        print(f.read())
    return 1
    

工夫として、生成するxyzファイルの名前をiupac_name.xyz としています。3d情報をもつcompoundオブジェクトは一部のプロパティを持たないためです。 (そのような仕様なのか、分からない。compound_3d.iupac_nameとしてもNoneをかえす。)

そのため2dと3dの両方のcompoundオブジェクトを渡し、使用しています

これで、xyzファイルができるので、可視化ソフトにかませると分子の描画を秒で行うとこができます。