Основная проблема здесь - чтение данных.Во-первых, обратите внимание, что нельзя использовать split с текстовыми файлами PDB, поскольку поля определяются положением, а не разделителями.См. Описание координатного файла (формат PDB) .
Чтобы разделить запись ATOM для различных полимеров цепей , вы можете начать с упрощенной версии, такой как
my $iblock = 0;
my @atoms = ();
while (my $line = <IN>) {
chomp($line);
# Switch blocks at TER lines
if ($line =~ /^TER/) {
$iblock++;
# Read ATOM lines
} elsif ($line =~ m/^ATOM/) {
my @xyz = (substr($line,7-1,9),substr($line,16-1,9),substr($line,25-1,9));
printf "Block %d: atom at (%s)\n",$iblock,join (",",@xyz);
push @{$atoms[$iblock]},\@xyz;
# Parse additional line types (if needed)
} else {
...
}
}
За этим следует цикл по всем парам координат из разных блоков, структурированный следующим образом:
# 1st block
for my $iblock1 (0..$#atoms) {
# 2nd block
for my $iblock2 ($iblock1+1..$#atoms) {
# Compare all pairs of atoms
...
my $xyz1 (@{$atoms[$iblock1]}) {
for my $xyz2 (@{$atoms[$iblock2]}) {
# Calculate distance and compare with $max_dist
...
}
}
# Print the maximal distance between these two blocks
...
}
}
Конечно, код может быть более общим, если используется более сложная структура данных или применяется одна из них.из доступных парсеров PDB, таких как Bioperl .