将materialstudio的xtd轨迹文件导出为xyz轨迹文件的方法 | 宜武汇-ag真人国际厅网站

将material studio的xtd轨迹文件导出为xyz轨迹文件的方法

material studio(ms)的xtd文件包含了原子或者粗粒化模拟中的bead的轨迹信息。这是ms的私有格式,为了能将轨迹放到其它程序,比如vmd中做更灵活细致的分析,需要转换为通用轨迹格式。xtd文件内含的实际轨迹信息实际上储存在同目录下的同名的.trj隐藏文件里(二进制文件),一种转换成通用格式的方法是利用ms自带的trj2ascii.exe程序将.trj文件内容转换成普通文本文件,然后再写个程序将其转换成其它轨迹格式。但这样步骤稍微麻烦些。

另一种做法是直接利用ms内部支持的perl脚本,循环每一帧每一个原子或bead,将其坐标属性写入到外部文本文件。比如按照常见的xyz坐标格式来写,就可以生成xyz轨迹了,可以被vmd等程序直接载入。

#!perl
#**********************************************************
#*                                                        *
#*     xtd2xyz – convert xtd files into xyz ormat        *
#*                                                        *
#**********************************************************
# version: 0.1
# author: andrea minoia
# date: 08/09/2010
#
# convert ms trajectory xtd file into xyz trajectory file.
# backup of files that are about to be overwritten is managed
# by ms. the most recent file is that with higher index number (n)
# the script has to be in the same directory of the
# structure to modify and the user has to update the
# variable $doc (line 31) according to the name of the
# file containing the trajectory.
# the xmol trajectory is stored in trj.txt file and it is not
# possible to rename the file within ms, nor it is possible to
# automatically export it as xyz or car file. you should manage
# the new trajectory manually for further use (e.g. vmd)
#
# modificator: sobereva ()
# date: 2012-may-23
# the range of the frames to be outputted can be altered by line 49 and 51

use strict;
use materialsscript qw(:all);

#open the multiframe trajectory structure file or die
my $doc = $documents{“./benzene.xtd”};

if (!$doc) {die “no document”;}

my $trajectory = $doc->trajectory;

if ($trajectory->numframes>1) {

    print “found “.$trajectory->numframes.” frames in the trajectory\n”;
    # open new xmol trajectory file
    my $xmolfile=documents->new(“trj.txt”);
   
    #get atoms in the structure
#    my $atoms = $doc->atoms;
    my $atoms = $doc->displayrange->atoms;
    my ;

    # loops over the frames
    my $framebegin=1;
    my $frameend=$trajectory->numframes;
#    my $frameend=10;
    for (my $frame=$framebegin; $frame<=$frameend; $frame){
        $trajectory->currentframe = $frame;
        #write header xyz
        $xmolfile->append(sprintf “%i \n”, $natoms);
        $xmolfile->append(sprintf “%s %i \n”, “frame”,$frame);
        foreach my $atom (@$atoms) {
            # write atom symbol and x-y-z- coordinates
            $xmolfile->append(sprintf “%s %f  %f  %f \n”,$atom->elementsymbol, $atom->x, $atom->y,

$atom->z);
        }   
    }
    #close trajectory file
    $xmolfile->close;
}
else {
    print “the ” . $doc->name . ” is not a multiframe trajectory file \n”;
}

使用时先将这些内容复制到一个文本文件里,后缀名改为.pl。然后在ms里将这个.pl加入到项目中。要转换哪个目录下的xtd文件就把这pl文件挪到哪个目录中,并且把my $doc = $documents{“./benzene.xtd”}; 当中的文件名改成要转换的文件名。之后,保持此脚本文件窗口处于激活状态,选tools-scripting-debug(或者直接按f5,或者按工具栏的蓝色三角按钮)就开始对xtd文件进行转换,转换结束后在当前目录下会输出trj.txt文件。将其后缀改为.xyz之后就能被vmd等程序直接读取了。

debug模式对于大体系、帧数较多的轨迹转换起来颇慢,可以用tools-scripting-run on server模式来运行,这样转换速度明显快得多,trj.txt将会生成到新的目录,当前目录下的其它文件也会被强行复制过去一份。

此脚本默认转换所有帧。如果想转换指定帧数范围,就把my $framebegin=1;和my $frameend=10;改成自定的起止帧号就行了,需要先将my $frameend=10;前面的注释去掉。

如果是周期性体系,那么在ms当中看起来轨迹是什么样转换过去就是什么样。比如,如果在display style-lattice中在某个方向上多显示一个周期,那么转换出的轨迹在相应方向上也会多出一倍原子。default、in-cell、original的显示模式下转换出的原子坐标也会相应地可能有所不同。

上面的这个名为xtd2xyz脚本只能转换全原子模拟的轨迹,如forcite的xtd轨迹,却不能转换粗粒化模拟的轨迹,如mesocite的以bead描述粒子的xtd轨迹。我将之修改成下面的xtdbead2xyz脚本,专门用来转换粗粒化模拟的轨迹(但不能转换全原子的),用法同前。

#!perl
# xtdbead2xyz – convert the xtd files containing beads into xyz format
# creator: sobereva ()
# date:    2012-may-23

use strict;
use materialsscript qw(:all);

#open the multiframe trajectory structure file or die
my $doc = $documents{“./bilayer.xtd”};

if (!$doc) {die “no document”;}

my $trajectory = $doc->trajectory;

if ($trajectory->numframes>1) {

    print “found “.$trajectory->numframes.” frames in the trajectory\n”;
    # open new xmol trajectory file
    my $xmolfile=documents->new(“trj.txt”);
   
    #get atoms in the structure
    my $beads = $doc->displayrange->beads;
    my ;

    # loops over the frames
    my $framebegin=1;
    my $frameend=$trajectory->numframes;
#    my $frameend=10;
    for (my $frame=$framebegin; $frame<=$frameend; $frame){
        $trajectory->currentframe = $frame;
        #write header xyz
        $xmolfile->append(sprintf “%i \n”, $nbeads);
        $xmolfile->append(sprintf “%s %i \n”, “frame”,$frame);
        foreach my $bead (@$beads) {
            # write atom symbol and x-y-z- coordinates
            $xmolfile->append(sprintf “%s %f  %f  %f \n”,$bead->name, $bead->x, $bead->y, $bead-

>z);
        }   
    }
    #close trajectory file
    $xmolfile->close;
}
else {
    print “the ” . $doc->name . ” is not a multiframe trajectory file \n”;
}

 

原文链接:http://sobereva.com/143

网络摘文,本文作者:15h,如若转载,请注明出处:https://www.15cov.cn/2023/08/27/将materialstudio的xtd轨迹文件导出为xyz轨迹文件的方法/

发表评论

邮箱地址不会被公开。 必填项已用*标注

网站地图