Пример #1
0
def get_csv(group, para_type):
    ### group = 'CH3ab' para_type = 'da'
    ### local file
    cons_dir = '../data/' + group + '_data/' + group + '_cons'
    cifs_dir = '../data/' + group + '_data/' + group + '_cifs'
    ### MS file
    MS_dir = os.path.join(os.path.expanduser('~'),
                          'Documents/USRP/DopRutile_Files/Documents')
    MS_cifs_dir = os.path.join(MS_dir, group + '_cifs')
    ### csv file
    csv_name = group + '_data_' + time.strftime("%Y%m%d",
                                                time.localtime()) + '.csv'
    csv_path = os.path.join(os.path.expanduser('~'),
                            'Desktop/CH4_DS/' + csv_name)
    ### pd.DataFrame
    row_index = 1
    group_df = pd.DataFrame()
    ###
    for file_name in os.listdir(cons_dir):
        f = os.path.join(cons_dir, file_name)
        if re.match(r'.*.cif', file_name):
            os.remove(f)
    for con_name in os.listdir(cons_dir):
        if row_index % 4 == 0:
            print('{:<5}{:^5}{:<30}{:^3}'.format(row_index, ' --> ', con_name,
                                                 ' | '))
        else:
            print('{:<5}{:^5}{:<30}{:^3}'.format(row_index, ' --> ', con_name,
                                                 ' | '),
                  end='')
        ###
        con = os.path.join(cons_dir, con_name)
        abc, elements, numbers, xyzs, l1, l2, group_dict = sc.std_contcars(
            con, group)
        ##
        cif_name = os.path.basename(con) + '.cif'
        p2c.write_cif(con + '.cif', abc, elements, numbers, xyzs)
        ##
        total_paras = gp.get_paras(abc, l1, l2, group, group_dict, cif_name,
                                   para_type)
        ###
        if row_index == 1:
            group_df = pd.DataFrame(columns=tuple(total_paras.keys()))
        group_df.loc[row_index] = list(total_paras.values())
        row_index += 1
        ###
        cif = os.path.join(cifs_dir, cif_name)
        ###
        ms_xsd = os.path.join(MS_cifs_dir, os.path.basename(con) + '.xsd')
        if not os.path.exists(ms_xsd):
            ms_cif = os.path.join(MS_cifs_dir, cif_name)
            shutil.copy(con + '.cif', cif)
            shutil.move(con + '.cif', ms_cif)
        else:
            os.remove(con + '.cif')
    ###
    group_df = group_df.sort_values(by=['cell', 'name', 'dop'], ascending=True)
    group_df = group_df.reset_index(drop=True)
    print('\n', group_df.shape[1], '\n')
    group_df.to_csv(csv_path)
Пример #2
0
def std_cons(CONTCAR):
    abc, elements, numbers, xyzs = p2c.get_cell(CONTCAR)
    contcar_name = os.path.basename(CONTCAR)
    dopM = contcar_name.split('_')[-3]
    ### Special edition
    if 'IrO2' in CONTCAR:
        for xyz in xyzs:
            xyz[1] = 1 - xyz[1]
    ### round xyz by 8
    for xyz in xyzs:
        for i in range(len(xyz)):
            xyz[i] = round(xyz[i], 8)
    ### std xyz
    for xyz in xyzs:
        if xyz[2] >= 0.99:
            xyz[2] -= 1.00
    ### make dict
    element_dict = {}
    count = 0
    for element, number in zip(elements, numbers):
        for i in range(int(number)):
            element_dict[element + str(i + 1)] = xyzs[count]
            count += 1
    ###
    metals = ['Ti', 'V', 'Ge', 'Mo', 'Ru', 'Rh', 'Os', 'Ir']
    ### first layer
    H_dict = {}
    O_dict = {}
    M_dict = {}
    for element_name in element_dict.keys():
        if element_name.strip(string.digits) == 'H':
            H_dict[element_name] = element_dict[element_name]
        elif element_name.strip(string.digits) == 'O':
            O_dict[element_name] = element_dict[element_name]
        elif element_name.strip(string.digits) in metals:
            M_dict[element_name] = element_dict[element_name]
    ##
    def tuple2dict(t):
        d = {}
        for name, xyz in t:
            d[name] = xyz
        return d

    ##
    def get_layer(O_dict, M_dict):
        ##
        O_dict_z = sorted(O_dict.items(), key=lambda e: e[1][2], reverse=True)
        # get O1 O2
        O12_dict = tuple2dict(O_dict_z[:2])
        O12_dict_x = sorted(O12_dict.items(),
                            key=lambda e: e[1][0],
                            reverse=True)
        O1_tuple = O12_dict_x[1]
        O2_tuple = O12_dict_x[0]
        # get O3 O4 O5 O6
        O3456_dict = tuple2dict(O_dict_z[2:6])
        O3456_dict_y = sorted(O3456_dict.items(),
                              key=lambda e: e[1][1],
                              reverse=True)
        #
        O34_dict = tuple2dict(O3456_dict_y[-2:])
        O34_dict_x = sorted(O34_dict.items(),
                            key=lambda e: e[1][0],
                            reverse=True)
        O3_tuple = O34_dict_x[1]
        O4_tuple = O34_dict_x[0]
        #
        O56_dict = tuple2dict(O3456_dict_y[:2])
        O56_dict_x = sorted(O56_dict.items(),
                            key=lambda e: e[1][0],
                            reverse=True)
        O5_tuple = O56_dict_x[1]
        O6_tuple = O56_dict_x[0]
        # get O7 O8
        O78_dict = tuple2dict(O_dict_z[6:8])
        O78_dict_x = sorted(O78_dict.items(),
                            key=lambda e: e[1][0],
                            reverse=True)
        O7_tuple = O78_dict_x[1]
        O8_tuple = O78_dict_x[0]
        ## get M1 M2 M3 M4
        M_dict_z = sorted(M_dict.items(), key=lambda e: e[1][2], reverse=True)
        M1234_dict = tuple2dict(M_dict_z[:4])
        M1234_dict_y = sorted(M1234_dict.items(),
                              key=lambda e: e[1][1],
                              reverse=True)
        #
        M12_dict = tuple2dict(M1234_dict_y[-2:])
        M12_dict_x = sorted(M12_dict.items(),
                            key=lambda e: e[1][0],
                            reverse=True)
        M1_tuple = M12_dict_x[1]
        M2_tuple = M12_dict_x[0]
        #
        M34_dict = tuple2dict(M1234_dict_y[:2])
        M34_dict_x = sorted(M34_dict.items(),
                            key=lambda e: e[1][0],
                            reverse=True)
        M3_tuple = M34_dict_x[1]
        M4_tuple = M34_dict_x[0]
        ##
        layer = {}
        layer['O1'] = list(O1_tuple)
        O_dict.pop(O1_tuple[0])
        layer['O2'] = list(O2_tuple)
        O_dict.pop(O2_tuple[0])
        layer['O3'] = list(O3_tuple)
        O_dict.pop(O3_tuple[0])
        layer['O4'] = list(O4_tuple)
        O_dict.pop(O4_tuple[0])
        layer['O5'] = list(O5_tuple)
        O_dict.pop(O5_tuple[0])
        layer['O6'] = list(O6_tuple)
        O_dict.pop(O6_tuple[0])
        layer['O7'] = list(O7_tuple)
        O_dict.pop(O7_tuple[0])
        layer['O8'] = list(O8_tuple)
        O_dict.pop(O8_tuple[0])
        layer['M1'] = list(M1_tuple)
        M_dict.pop(M1_tuple[0])
        layer['M2'] = list(M2_tuple)
        M_dict.pop(M2_tuple[0])
        layer['M3'] = list(M3_tuple)
        M_dict.pop(M3_tuple[0])
        layer['M4'] = list(M4_tuple)
        M_dict.pop(M4_tuple[0])
        return O_dict, M_dict, layer

    ###
    def get_Hab(H_dict):
        Hab_dict = {}
        #
        H_dict_y = sorted(H_dict.items(), key=lambda e: e[1][1], reverse=True)
        H1_tuple = H_dict_y[0]
        #
        Hab_dict['H1'] = list(H1_tuple)
        return Hab_dict

    ### adjust atom location
    def mv_xyz(xyz, d, s):
        if d == 'x':
            xyz[0] = xyz[0] + s
        elif d == 'y':
            xyz[1] = xyz[1] + s
        elif d == 'z':
            xyz[2] = xyz[2] + s
        return xyz

    ##
    O2_dict, M2_dict, l1 = get_layer(O_dict, M_dict)
    O3_dict, M3_dict, l2 = get_layer(O2_dict, M2_dict)
    Hab_dict = get_Hab(H_dict)

    ##  C   D
    ##    A   B
    ##      C   D
    def adjust_AtomPair(A, B, C, D, loc):
        if D[1][0] < A[1][0]:
            C[1] = mv_xyz(C[1], 'x', 1)
            D[1] = mv_xyz(D[1], 'x', 1)
        if C[1][0] > B[1][0]:
            C[1] = mv_xyz(C[1], 'x', -1)
            D[1] = mv_xyz(D[1], 'x', -1)
        if loc == 1:
            if C[1][0] < A[1][0] and (A[1][0] < D[1][0] < B[1][0]):
                C[1] = mv_xyz(C[1], 'x', 1)
                C, D = D, C
        elif loc == -1:
            if (A[1][0] < C[1][0] < B[1][0]) and B[1][0] < D[1][0]:
                D[1] = mv_xyz(D[1], 'x', -1)
                C, D = D, C
        return C, D

    ## set O1 O2 unchanged
    if l1['O3'][1][1] < l1['M1'][1][1]:
        l1['O3'][1] = mv_xyz(l1['O3'][1], 'y', 1)
        l1['O4'][1] = mv_xyz(l1['O4'][1], 'y', 1)
        l1['O3'], l1['O5'] = l1['O5'], l1['O3']
        l1['O4'], l1['O6'] = l1['O6'], l1['O4']
    ##
    if l1['O1'][1][0] > l1['M1'][1][0]:
        l1['O2'][1] = mv_xyz(l1['O2'][1], 'x', -1)
        l1['O1'], l1['O2'] = l1['O2'], l1['O1']
    ##
    if l1['M3'][0].strip(string.digits) == dopM:
        l1['M4'][1] = mv_xyz(l1['M4'][1], 'x', -1)
        l1['M3'], l1['M4'] = l1['M4'], l1['M3']
    ##
    l1['O3'], l1['O4'] = adjust_AtomPair(l1['O1'], l1['O2'], \
            l1['O3'], l1['O4'], 1)
    ##
    l1['O5'], l1['O6'] = adjust_AtomPair(l1['O1'], l1['O2'], \
            l1['O5'], l1['O6'], 1)
    ##
    l1['M1'], l1['M2'] = adjust_AtomPair(l1['O1'], l1['O2'], \
            l1['M1'], l1['M2'], 1)
    ##
    l1['M3'], l1['M4'] = adjust_AtomPair(l1['M1'], l1['M2'], \
            l1['M3'], l1['M4'], -1)
    #l1['M3'], l1['M4'] = l1['M4'], l1['M3']
    ##
    l1['O7'], l1['O8'] = adjust_AtomPair(l1['M1'], l1['M2'], \
            l1['O7'], l1['O8'], -1)
    ##
    l2['O1'], l2['O2'] = adjust_AtomPair(l1['M1'], l1['M2'], \
            l2['O1'], l2['O2'], -1)
    ##
    ##
    std_layer = []
    for i in l1.values():
        std_layer.append(i)
    for i in l2.values():
        std_layer.append(i)
    ### change xyz
    for A in std_layer:
        element_dict[A[0]] = A[1]
    ##
    xyzs = []
    for key, value in element_dict.items():
        xyzs.append(value)
    ### round xyz by 8
    for xyz in xyzs:
        for i in range(len(xyz)):
            xyz[i] = round(xyz[i], 8)
    ###
    cif_name = os.path.basename(CONTCAR) + '.cif'
    p2c.write_cif(CONTCAR + '.cif', abc, elements, numbers, xyzs)
    return abc, l1, l2, Hab_dict, cif_name
Пример #3
0
def std_cons(CONTCAR):
    abc, elements, numbers, xyzs = p2c.get_cell(CONTCAR)
    contcar_name = os.path.basename(CONTCAR)
    dopM = contcar_name.split('_')[-3]
    ### Special edition
    if 'IrO2' in CONTCAR:
        for xyz in xyzs:
            if xyz[1] > 0.75:
                xyz[1] = xyz[1] - 1
    ### round xyz by 8
    for xyz in xyzs:
        for i in range(len(xyz)):
            xyz[i] = round(xyz[i], 8)
    ### std xyz
    for xyz in xyzs:
        if xyz[2] >= 0.99:
            xyz[2] -= 1.00
    ### make dict
    ## get element name and number
    element_dict = {}
    count = 0
    for element, number in zip(elements, numbers):
        for i in range(int(number)):
            element_dict[element + str(i + 1)] = xyzs[count]
            count += 1
    ###
    metals = ['Ti', 'V', 'Ge', 'Mo', 'Ru', 'Rh', 'Os', 'Ir']
    ### first layer
    H_dict = {}
    C_dict = {}
    O_dict = {}
    M_dict = {}
    for element_name in element_dict.keys():
        if element_name.strip(string.digits) == 'H':
            H_dict[element_name] = element_dict[element_name]
        elif element_name.strip(string.digits) == 'C':
            C_dict[element_name] = element_dict[element_name]
        elif element_name.strip(string.digits) == 'O':
            O_dict[element_name] = element_dict[element_name]
        elif element_name.strip(string.digits) in metals:
            M_dict[element_name] = element_dict[element_name]
    ##
### adjust atom location

    def mv_xyz(xyz, d, s):
        if d == 'x':
            xyz[0] = xyz[0] + s
        elif d == 'y':
            xyz[1] = xyz[1] + s
        elif d == 'z':
            xyz[2] = xyz[2] + s
        return xyz

    ##
    O2_dict, M2_dict, l1 = get_layer(O_dict, M_dict)
    O3_dict, M3_dict, l2 = get_layer(O2_dict, M2_dict)
    CH3_dict = get_CH3(H_dict, C_dict)

    ##  C   D
    ##    A   B
    ##      C   D
    def adjust_AtomPair(A, B, C, D, loc):
        if D[1][0] < A[1][0]:
            C[1] = mv_xyz(C[1], 'x', 1)
            D[1] = mv_xyz(D[1], 'x', 1)
        if C[1][0] > B[1][0]:
            C[1] = mv_xyz(C[1], 'x', -1)
            D[1] = mv_xyz(D[1], 'x', -1)
        if loc == 1:
            if C[1][0] < A[1][0] and (A[1][0] < D[1][0] < B[1][0]):
                C[1] = mv_xyz(C[1], 'x', 1)
                C, D = D, C
        elif loc == -1:
            if (A[1][0] < C[1][0] < B[1][0]) and B[1][0] < D[1][0]:
                D[1] = mv_xyz(D[1], 'x', -1)
                C, D = D, C
        return C, D

    ## set O1 O2 unchanged
    if l1['O3'][1][1] < l1['M1'][1][1]:
        l1['O3'][1] = mv_xyz(l1['O3'][1], 'y', 1)
        l1['O4'][1] = mv_xyz(l1['O4'][1], 'y', 1)
        l1['O3'], l1['O5'] = l1['O5'], l1['O3']
        l1['O4'], l1['O6'] = l1['O6'], l1['O4']
    ##
    if l1['O1'][1][0] > l1['M1'][1][0]:
        l1['O2'][1] = mv_xyz(l1['O2'][1], 'x', -1)
        l1['O1'], l1['O2'] = l1['O2'], l1['O1']
    ##
    if l1['M3'][0].strip(string.digits) == dopM:
        l1['M4'][1] = mv_xyz(l1['M4'][1], 'x', -1)
        l1['M3'], l1['M4'] = l1['M4'], l1['M3']
    ##
    l1['O3'], l1['O4'] = adjust_AtomPair(l1['O1'], l1['O2'], \
            l1['O3'], l1['O4'], 1)
    ##
    l1['O5'], l1['O6'] = adjust_AtomPair(l1['O1'], l1['O2'], \
            l1['O5'], l1['O6'], 1)
    ##
    l1['M1'], l1['M2'] = adjust_AtomPair(l1['O1'], l1['O2'], \
            l1['M1'], l1['M2'], 1)
    ##
    l1['M3'], l1['M4'] = adjust_AtomPair(l1['M1'], l1['M2'], \
            l1['M3'], l1['M4'], -1)
    #l1['M3'], l1['M4'] = l1['M4'], l1['M3']
    ##
    l1['O7'], l1['O8'] = adjust_AtomPair(l1['M1'], l1['M2'], \
            l1['O7'], l1['O8'], -1)
    ##
    l2['O1'], l2['O2'] = adjust_AtomPair(l1['M1'], l1['M2'], \
            l2['O1'], l2['O2'], -1)
    ##
    ##
    std_layer = []
    for i in l1.values():
        std_layer.append(i)
    for i in l2.values():
        std_layer.append(i)
    ### change xyz
    for A in std_layer:
        element_dict[A[0]] = A[1]
    ##
    xyzs = []
    for key, value in element_dict.items():
        xyzs.append(value)
    ### round xyz by 8
    for xyz in xyzs:
        for i in range(len(xyz)):
            xyz[i] = round(xyz[i], 8)
    ###
    cif_name = os.path.basename(CONTCAR) + '.cif'
    p2c.write_cif(CONTCAR + '.cif', abc, elements, numbers, xyzs)
    return abc, l1, l2, CH3_dict, cif_name