ASE全称为Atomic Simulation Environment,是一款基于python程序语言的工具包合集,可以用于设置、操作、运行、可视化和分析原子模拟。ASE可以与很多DFT程序进行对接(如,Abinit, CP2K, NWChem, Gaussian, Vasp 等)。
与上一篇openbabel的安装相似,可以直接使用命令conda install ase进行安装。
在本文主要介绍ase转换文件格式的功能,ase支持很多种文件格式(如,vasp,xsd,xyz,cif等),详细清单可见官网。科研生活中,我们可能得到一系列由vasp产生的poscar文件,需要在Materials Studio(简称MS)上使用,一般操作是使用vesta打开poscar文件,然后输出为MS可以识别的cif文件,MS打开cif文件后,需要保存为xsd文件才能进行计算。那么我想,有没有什么简便的方法可以直接实现将poscar文件转为xsd文件呢。使用openbabel并不能转换为xsd文件,于是我发现了ase的ase.io.read()与ase.io.write()函数。
【功能为:Read Atoms object(s) from file】
官方关于ase.io.read()的使用为:
ase.io.read(filename: Union[str, pathlib.PurePath, IO], index: Optional[Any] = None, format: Optional[str] = None, parallel: bool = True, do_not_split_by_at_sign: bool = False, **kwargs)
一般我们只需要提供文件名称及其类型就行,比如:
ase.io.read(filename, format=files_format)
如,我需要读取文件‘POSCAR’,文件类型为‘vasp’,则函数调用时应为:
ase.io.read(‘POSCAR’, format=‘vasp’)
【功能为:Write Atoms object(s) to file】
官方关于ase.io.write()的使用为:
ase.io.write(filename: Union[str, pathlib.PurePath, IO], images: Union[ase.atoms.Atoms, Sequence[ase.atoms.Atoms]], format: Optional[str] = None, parallel: bool = True, append: bool = False, **kwargs: dict)
其使用与ase.io.read()的相类似,不同地是需要指定需要写入文件的atoms objects,其实就是原子信息,输入的类型可以是Atoms object or list of Atoms objects。由ase.io.read()函数可以知道,一份有关原子信息的文件其实就是atoms object。所以:
ase.io.write(‘test.xsd’, atoms object,format=‘xsd’)
这里test.xsd是希望得到的文件格式的文件名+后缀名,POSCAR是指读取的文件,format=‘xsd’是指信息写入文件的文件类型。
所以ase转换文件格式的原理是:
比如,由VASP得到一份POSCAR文件,这里实现将其文件格式转换为xsd格式的文件,文件名为test。
代码思路就是(调用ase.io模块):
from ase.io import read,write
poscar_file=read('POSCAR',format='vasp')
xsd_file=write('test.xsd',poscar_file,format='xsd')
注意:文件名需要带有文件格式后缀
结合for循环遍历文件输入\输出atoms object,即可实现批量操作。
def poscar_to_xsd(file_PATH):
#file_PATH为储存所有待转换格式的文件的文件夹路径
tqdm=os.listdir(file_PATH)#文件夹中的文件列表
for i in range(0,len(tqdm)):#逐次遍历文件夹下的文件
inputfile = os.path.join(file_PATH,tqdm[i])#对应文件夹下的某份文件
outputfile=inputfile+'.xsd'#定义转换格式后的文件名字
poscar_file=read(inputfile,format='vasp')#读入文件
xsd_file=write(outputfile,poscar_file,format='xsd')#将读入的文件写入其他格式的文件
#调用该函数
poscar_to_xsd("C-N-2-defect-1652750340")