我正在用下面的代码生成一个文件的3D坐标(x,y,z)。
for (my $x = 0.000; $x < 4.200; $x += 1.400) {
for (my $y = 0.000; $y < 4.200; $y += 1.400) {
for (my $z = 0.000; $z < 4.200; $z += 1.400) {
push @arr_grid, "$x $y $z\n";
}
}
}
foreach (@arr_grid) {
say "HETATM 1 O HOH 1 $_ O";
}现在,我的问题是,我希望获得具有精确格式(PDB)的输出,其索引值如下:
1-6 7-11 13-16 18-20 23-26 31-38 39-46 47-54 77-78
(Name) (S.No) (x) (y) (z)
HETATM 1 O HOH 1 -8.863 16.944 14.289 N
HETATM 100 O HOH 16 -15.352 11.525 5.325 N
HETATM 117 O HOH 16 -12.954 9.717 5.182 C
HETATM 126 O HOH 17 -19.225 11.667 -0.391 C
HETATM 1005 O HOH 97 9.246 23.287 11.503 O 这里的x,y,z坐标应该是real(8.2)数据类型,其他坐标是右对齐的。x,y,z值不是由程序生成的值。我放置了任意值。请帮帮我。
发布于 2012-01-08 11:55:43
您希望使用perl的格式选项以预定义的方式显示输出数据。
你可以在here上读到它。
您的示例,稍微重写了一下:
for ($x = 0.000; $x < 4.200; $x += 1.400) {
for ($y = 0.000; $y < 4.200; $y += 1.400) {
for ($z = 0.000; $z < 4.200; $z += 1.400) {
write;
}
}
}
format STDOUT_TOP =
1-6 7-11 13-16 18-20 23-26 31-38 39-46 47-54 77-78
(Name) (S.No) (x) (y) (z)
.
format STDOUT =
HETATM 1 O HOH 1 @<<<<<< @<<<<<< @<<<<<< N
$x $y $z
.FORMAT_TOP每$= (或$FORMAT_LINES_PER_PAGE)打印一次,所以如果你想要更少的打印,重置这个变量,或者如果你只想打印一次,重置一个高得离谱的数字。
输出示例:
1-6 7-11 13-16 18-20 23-26 31-38 39-46 47-54 77-78
(Name) (S.No) (x) (y) (z)
HETATM 1 O HOH 1 0 0 0 N
HETATM 1 O HOH 1 0 0 1.4 N
HETATM 1 O HOH 1 0 0 2.8 N
HETATM 1 O HOH 1 0 0 4.2 N
HETATM 1 O HOH 1 0 1.4 0 N
HETATM 1 O HOH 1 0 1.4 1.4 N
HETATM 1 O HOH 1 0 1.4 2.8 N
HETATM 1 O HOH 1 0 1.4 4.2 N我还有一个问题:当我打印带有小数点的数字时,比如
HETATM 1 O HOH 1 -10 -3.4 -8 N
HETATM 1 O HOH 1 -10 -3.4 -6.6 N
HETATM 1 O HOH 1 -10 -3.4 -5.2 N
HETATM 1 O HOH 1 -10 -3.4 -3.8 N
HETATM 1 O HOH 1 -10 -3.4 -2.4 N
HETATM 1 O HOH 1 -10 -3.4 -1 N
HETATM 1 O HOH 1 -10 -3.4 0.4 N
HETATM 1 O HOH 1 -10 -3.4 1.8 N
HETATM 1 O HOH 1 -10 -3.4 3.2 N
HETATM 1 O HOH 1 -10 -3.4 4.6 N
HETATM 1 O HOH 1 0 -3.4 6 N在上面的列中,我需要打印相同索引中的小数点。当我进行计算和更新值时,小数点会发生移位。我需要像这样的输出
HETATM 1 O HOH 1 -10 -3.4 -8.0 N
HETATM 1 O HOH 1 -10 -3.4 -6.6 N
HETATM 1 O HOH 1 -10 -3.4 -5.2 N
HETATM 1 O HOH 1 -10 -3.4 -3.8 N
HETATM 1 O HOH 1 -10 -3.4 -2.4 N
HETATM 1 O HOH 1 -10 -3.4 -1.0 N
HETATM 1 O HOH 1 -10 -3.4 0.4 N
HETATM 1 O HOH 1 -10 -3.4 1.8 N
HETATM 1 O HOH 1 -10 -3.4 3.2 N
HETATM 1 O HOH 1 -10 -3.4 4.6 N
HETATM 1 O HOH 1 -10 -3.4 6.0 N编辑1个
转储文件的示例:
open(DUMPFILE,">output.txt");
for ($x = 0.000; $x < 4.200; $x += 1.400) {
for ($y = 0.000; $y < 4.200; $y += 1.400) {
for ($z = 0.000; $z < 4.200; $z += 1.400) {
write DUMPFILE;
}
}
}
close(DUMPFILE);
format DUMPFILE_TOP =
1-6 7-11 13-16 18-20 23-26 31-38 39-46 47-54 77-78
(Name) (S.No) (x) (y) (z)
.
format DUMPFILE =
HETATM 1 O HOH 1 @<<<<<< @<<<<<< @<<<<<< N
$x $y $z
.发布于 2012-01-08 11:44:33
想必,您可以替换现有的:
push @arr_grid, "$x $y $z\n";使用以下一些适当的变体:
push @arr_grid, sprintf("%8.2f %8.2f %8.2f\n", $x, $y, $z);这使您可以控制数字的格式。
发布于 2012-01-08 11:44:44
可以使用printf指定间距、对齐方式和有效数字。像这样的东西可能会起作用:
my @arr_grid;
for (my $x = 0.000; $x < 4.200; $x += 1.400) {
for (my $y = 0.000; $y < 4.200; $y += 1.400) {
for (my $z = 0.000; $z < 4.200; $z += 1.400) {
push @arr_grid, [$x, $y, $z];
}
}
}
foreach (@arr_grid) {
printf "HETATM%5d %2s%2s HOH 1 %8.3f%8.3f%8.3f\n", 1, 'O', '', @$_;
}不过,使用为PDB格式设计的perl模块(如Chemistry::File::PDB或Bio::Structure::IO::pdb )可能更有意义。
https://stackoverflow.com/questions/8775050
复制相似问题