我使用以下代码生成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值不是从程序生成的值。我放置了任意值。请帮我。
答案 0 :(得分:4)
您希望使用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
,如果您希望打印的次数较少,则重置此变量,或者如果您希望仅打印一次,则重置为可笑的高数字。 / p>
输出示例:
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
.
答案 1 :(得分:1)
据推测,您可以替换现有的:
push @arr_grid, "$x $y $z\n";
有一些合适的变体:
push @arr_grid, sprintf("%8.2f %8.2f %8.2f\n", $x, $y, $z);
这使您可以控制数字的格式。
答案 2 :(得分:1)
您可以使用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