我正在用以下代码为文件生成三维坐标(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 $zn";
}
}
}
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坐标应该是实数(8.2)数据类型,其他坐标都是右对齐的。x、 y、z值不是从程序生成的值。我设置了任意值。请帮帮我。
您希望使用perl的格式选项以预定义的方式显示输出数据。
你可以在这里阅读。
你的例子,改写了一点:
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
.
据推测,您可以替换现有的:
push @arr_grid, "$x $y $zn";
有一些合适的变体:
push @arr_grid, sprintf("%8.2f %8.2f %8.2fn", $x, $y, $z);
这使您可以控制数字的格式。
您可以使用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.3fn", 1, 'O', '', @$_;
}
不过,使用为PDB格式设计的perl模块可能更有意义,例如Chemistry::File::PDB或Bio::Structure::IO::pdb