Вывод на печать в предопределенном формате Perl - PullRequest
3 голосов
/ 08 января 2012

Я генерирую трехмерные координаты (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 не являются сгенерированными из программы.Я поместил произвольные значения.Пожалуйста, помогите мне.

Ответы [ 3 ]

4 голосов
/ 08 января 2012

Вы хотите использовать параметры формата 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
.
1 голос
/ 08 января 2012

Вы можете использовать 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', '', @$_;
}

Возможно, имеет смысл использовать модуль perl, разработанный для формата PDB, такой как Chemistry :: File :: PDB или * 1007.* Bio :: Структура :: IO :: PDB

1 голос
/ 08 января 2012

Предположительно, вы можете заменить существующее:

        push @arr_grid, "$x  $y  $z\n";

некоторым подходящим вариантом:

        push @arr_grid, sprintf("%8.2f  %8.2f  %8.2f\n", $x, $y, $z);

Это дает вам контроль над форматом чисел.

...