C2DB數(shù)據(jù)的讀取

C2DB數(shù)據(jù)庫是根據(jù)已知二維材料替換元素得到擴(kuò)充數(shù)據(jù)路镇辉,其包含PBE、HSE苞七、結(jié)構(gòu)穩(wěn)定性器予、convexhull以及真空能級等性質(zhì),可以作為研究二維材料的數(shù)據(jù)庫之一浙芙,這里給出其數(shù)據(jù)庫中的結(jié)構(gòu)提取腳本登刺,方便大家前處理遇到的困苦,加快自己的ideal的推進(jìn)嗡呼。方法比較簡單粗暴莽夫哲學(xué)(亞歷山大砍戈耳狄俄斯之結(jié))(https://zh.wikipedia.org/wiki/%E4%BA%9A%E5%8E%86%E5%B1%B1%E5%A4%A7%E5%A4%A7%E5%B8%9D)
)纸俭。
最近C2DB做了更新,目前我基于的是其2018年的文章中涉及的數(shù)據(jù)庫,之前還能下南窗,現(xiàn)在也找不到下載的地方了揍很。

'''
Created on 14:35, Mar. 25, 2021

@author: yilinZhang 
@address: Jilin University

These files are needed: c2db.db
'''
import numpy as np
import pandas as pd
import os


def prehandle_c2db():
    import json
    import sqlite3
    # Step1: connect database and get the features
    con = sqlite3.connect("c2db.db")
    df = pd.read_sql_query("SELECT * FROM systems", con)

    # Step2: convert database to csv
    key_value_pairs = []
    for line in df.key_value_pairs:
        key_value_pairs.append(json.loads(line))
    key_value_pairs = pd.DataFrame(key_value_pairs)

    # Step3: rename formula
    formula_values = list(key_value_pairs['folder'].str.split('/'))
    flag = []
    for line in formula_values:
        flag.append(line[-2])
    key_value_pairs['formula'] = flag

    # Step4: sorted the vbm
    key_value_pairs['vbm_to_evac'] = key_value_pairs['vbm'] - key_value_pairs['evac']
    # key_value_pairs['cbm_to_evac'] = key_value_pairs['cbm'] - key_value_pairs['evac']
    hasBandGap = key_value_pairs[key_value_pairs['vbm_to_evac'] <= 0]#肯定要滿足價(jià)帶不能超過靜電勢能吧
    # hasBandGap = hasBandGap[hasBandGap['gap'] > 0.3]

    hasBandGap = hasBandGap[hasBandGap['ehull'] <= 0]# convexhull也要滿足一下
    # hasBandGap = hasBandGap[hasBandGap['dynamic_stability_level'] == 3]
    hasBandGap = hasBandGap.sort_values(by=['vbm_to_evac'], axis=0)
    hasBandGap.to_csv('sorted_by_vbm_to_evac.csv')


def writePOSCAR(atom):

    with open(path + os.sep + filename + '_POSCAR', 'w') as f:
        f.write(self.parameters['SystemName'] + '\n')
        f.write(str(self.parameters['ScalingFactor']) + '\n')

        LatticeMatrix = self.parameters['LatticeMatrix']
        for i in range(len(LatticeMatrix)):
            f.write(float2line(LatticeMatrix[i]))

        AtomsInfo = self.parameters['AtomsInfo']
        string = ['', '']
        for key in AtomsInfo.keys():
            string[0] += key + '    '
            string[1] += str(AtomsInfo[key]) + '    '
        string[0] += '\n'
        string[1] += '\n'
        f.write(string[0])
        f.write(string[1])

        f.write(self.parameters['CoordinateType'] + '\n')

        ElementsPositionMatrix = self.parameters['ElementsPositionMatrix'].copy(
        )
        for key in ElementsPositionMatrix.keys():
            arr = ElementsPositionMatrix[key]
            for i in range(len(arr)):
                f.write(float2line(arr[i]))


def output_structure():
    import ase.db
    from ase.io import write
    dbpath = os.path.join(os.getcwd(), 'c2db.db')
    db = ase.db.connect(dbpath)

    def float2line(mart):
        '''
        將矩陣轉(zhuǎn)換成可輸出的字符串形式
        '''
        string = ''
        for line in mart:
            for s in line:
                string += '%21.10f' % float(s)
            string += '\n'
        return string

    def count_element(mart):
        string = ['', '']
        elements = sorted(set(mart), key=mart.index)
        for key in elements:
            string[0] += key + '    '
            string[1] += str(mart.count(key)) + '    '
        string[0] += '\n'
        string[1] += '\n'
        return string

    # with open('bandAlignment_CSV_names', 'r') as f:
    #     lines = f.readlines()

    # for i in range(len(lines)):
    #     os.chdir(lines[i].strip()[:-4])
    csv = pd.read_csv('sorted_by_vbm_to_evac.csv')
    for i in range(len(csv)):
        atom = db.get_atoms(uid=csv.iloc[i]['uid'], add_additional_information=True)
        write('{}.cif'.format(csv.iloc[i]['formula']), atom, format='cif')
        with open(csv.iloc[i]['formula'] + '.vasp', 'w') as f:
            f.write(csv.iloc[i]['uid'] + '\n')
            f.write('1.0\n')
            f.write(float2line(atom.get_cell()))
            atomInfo = count_element(atom.get_chemical_symbols())
            f.write(atomInfo[0])
            f.write(atomInfo[1])
            f.write('Cartesian\n')
            f.write(float2line(atom.get_positions()))


if __name__ == "__main__":
    prehandle_c2db()
    # after_handle()
    output_structure()
    os.system('rm *.cif')

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市万伤,隨后出現(xiàn)的幾起案子窒悔,更是在濱河造成了極大的恐慌,老刑警劉巖敌买,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件简珠,死亡現(xiàn)場離奇詭異,居然都是意外死亡放妈,警方通過查閱死者的電腦和手機(jī)北救,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來芜抒,“玉大人珍策,你說我怎么就攤上這事≌梗” “怎么了攘宙?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我蹭劈,道長疗绣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任铺韧,我火速辦了婚禮多矮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘哈打。我一直安慰自己塔逃,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布料仗。 她就那樣靜靜地躺著湾盗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪立轧。 梳的紋絲不亂的頭發(fā)上格粪,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天,我揣著相機(jī)與錄音氛改,去河邊找鬼帐萎。 笑死,一個(gè)胖子當(dāng)著我的面吹牛胜卤,可吹牛的內(nèi)容都是我干的吓肋。 我是一名探鬼主播,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼瑰艘,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了肤舞?” 一聲冷哼從身側(cè)響起紫新,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎李剖,沒想到半個(gè)月后芒率,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡篙顺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年偶芍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片德玫。...
    茶點(diǎn)故事閱讀 38,643評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡匪蟀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出宰僧,到底是詐尸還是另有隱情材彪,我是刑警寧澤,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站段化,受9級特大地震影響嘁捷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜显熏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一雄嚣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧喘蟆,春花似錦缓升、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至尺棋,卻和暖如春封锉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背膘螟。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工成福, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人荆残。 一個(gè)月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓奴艾,卻偏偏與公主長得像,于是被迫代替她去往敵國和親内斯。 傳聞我的和親對象是個(gè)殘疾皇子蕴潦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評論 2 348

推薦閱讀更多精彩內(nèi)容