def ConnValListCom(filename, migrant=None, rad_flag=True, rad_dict=None): with zopen(filename, "rt") as f: input_string = f.read() parser = CifParser_new.from_string(input_string) stru = parser.get_structures(primitive=False)[0] species = [str(sp).replace("Specie ","") for sp in stru.species] elements = [re.sub('[^a-zA-Z]','',sp) for sp in species] if migrant not in elements: raise ValueError("The input migrant ion not in the input structure! Please check it.") coord_list,effec_radii = get_local_envir_fromstru(stru) radii = {} if rad_flag: if rad_dict: radii = rad_dict else: radii = effec_radii atmnet = AtomNetwork.read_from_RemoveMigrantCif(filename, migrant, radii, rad_flag) vornet,edge_centers,fcs,faces = atmnet.perform_voronoi_decomposition(True) add_fcs_vornet = vornet.add_facecenters(faces) prefixname = filename.replace(".cif","") conn = connection_values_list(prefixname+".resex",add_fcs_vornet) return conn
def BIComputation(filename, migrant, rad_flag=True, lower=0.0, upper=0.0, rad_dict=None): with zopen(filename, "rt") as f: input_string = f.read() parser = CifParser_new.from_string(input_string) stru = parser.get_structures(primitive=False)[0] species = [str(sp).replace("Specie ","") for sp in stru.species] elements = [re.sub('[^a-zA-Z]','',sp) for sp in species] if migrant not in elements: raise ValueError("The input migrant ion not in the input structure! Please check it.") coordination_list, radii = get_local_envir_fromstru(stru) radii = {} if rad_flag: if rad_dict: radii = rad_dict else: radii = effec_radii atmnet = AtomNetwork.read_from_RemoveMigrantCif(filename, migrant, radii, rad_flag) prefixname = filename.replace(".cif","") vornet,edge_centers,fcs,faces = atmnet.perform_voronoi_decomposition(True) add_fcs_vornet = vornet.add_facecenters(faces) writeVaspFile(prefixname+"_origin.vasp",atmnet,add_fcs_vornet) if lower and not upper: writeVaspFile(prefixname+"_selected.vasp",atmnet, add_fcs_vornet, lower, 10.0) if not lower and upper: writeVaspFile(prefixname+"_selected.vasp",atmnet, add_fcs_vornet, 0.0, upper) if lower and upper: writeVaspFile(prefixname+"_selected.vasp",atmnet, add_fcs_vornet, lower, upper)
def getIonicRadii(filename): with zopen(filename, "rt") as f: input_string = f.read() parser = CifParser_new.from_string(input_string) stru = parser.get_structures(primitive=False)[0] coordination_list, radii = get_local_envir_fromstru(stru) print(radii) return radii
def LocalEnvirCom(stru, migrant): # stru = Structure.from_file(filename) # val_eval = ValenceIonicRadiusEvaluator(stru) # radii = val_eval.radii coordination_list, radii = get_local_envir_fromstru(stru) # 为了防止保存的半径信息无法匹配此处对半径信息做特殊处理,如Ag+的半径会保存为Ag、Ag+、Ag1+ # radii_keys = list(radii.keys()) # for key in radii_keys: # radii[re.sub('[^a-zA-Z]','',key)] = radii[key] # if re.search('[A-Z][a-z]*\+|[A-Z][a-z]*\-', key) != None: # s1 = re.sub('\+','1+',key) # radii[re.sub('\-','1-',s1)] = radii[key] # minRad = 0 # for label in radii: # if migrant in label: # # 取最小值作为迁移离子半径 # if minRad == 0: # minRad = radii[label] # elif radii[label] < minRad: # minRad = radii[label] coord_tmp = [] nei_dis_tmp = [] min_nei_dis_tmp = [] migrant_paras = [] migrant_radii = [] for i in coordination_list: if migrant in i["label"]: #获取最邻近配位 nearest_atom = i["coord_nei"][0] #最邻近配位原子的label nei_label = nearest_atom[0]._atom_site_label #到最邻近配位原子中心的距离 nei_dis = nearest_atom[1] #最邻近配位原子的半径 nei_radius = radii[nei_label] alpha_tmp = (nei_dis - nei_radius)/radii[i["label"]] #获取所有label迁移离子配位数 coord_tmp.append(i["coord_num"]) #获取不同label迁移离子到最邻近配位原子中心的距离与表面距离 nei_dis_tmp.append(nei_dis) #获取所有label迁移离子到最邻近配位原子表面的距离 min_nei_dis_tmp.append(nei_dis - nei_radius) migrant_paras.append(alpha_tmp) migrant_radii.append(radii[i["label"]]) nei_dises = list(zip(coord_tmp, zip(nei_dis_tmp, min_nei_dis_tmp))) migrant_alpha = float(sum(migrant_paras))/len(migrant_paras) if migrant_alpha > 1.0: migrant_alpha = 1.0 migrant_radius = float(sum(migrant_radii))/len(migrant_radii) return radii,migrant_radius,migrant_alpha,nei_dises,coordination_list
def ChannelCom(filename, probe_rad = None, migrant=None, rad_flag=True, rad_dict=None, symprec=0.01): with zopen(filename, "rt") as f: input_string = f.read() parser = CifParser_new.from_string(input_string) stru = parser.get_structures(primitive=False)[0] radii = {} if rad_flag: if rad_dict: radii = rad_dict else: coordination_list, effec_radii = get_local_envir_fromstru(stru) radii = effec_radii species = [str(sp).replace("Specie ","") for sp in stru.species] elements = [re.sub('[^a-zA-Z]','',sp) for sp in species] if migrant: if migrant not in elements: raise ValueError("The input migrant ion not in the input structure! Please check it.") atmnet = AtomNetwork.read_from_RemoveMigrantCif(filename, migrant, radii, rad_flag) else: atmnet = AtomNetwork.read_from_CIF(filename, radii, rad_flag) vornet,edge_centers,fcs,faces = atmnet.perform_voronoi_decomposition(True) add_fcs_vornet = vornet.add_facecenters(faces) sitesym = parser.get_sym_opt() sym_vornet,voids = get_labeled_vornet(add_fcs_vornet, sitesym, symprec) prefixname = filename.replace(".cif","") writeNETFile(prefixname+"_origin.net",atmnet,sym_vornet) channels = Channel.findChannels(sym_vornet, atmnet, probe_rad, prefixname+".net") dims = [] for i in channels: dims.append(i["dim"]) return dims