我试图计算蛋白质(ATOM
)和配体原子(HETATM
)之间的距离。我从pdb
文件和配体原子获得的蛋白质原子我已经分离了不同数量的txt
文件。我使用substring
将坐标分隔成一个数组,我给出了每个坐标名称(x, y and z
)。具有配体坐标的文件如下所示:
文件1:
HETATM 2244 C1 QWE H 373 17.735 -17.178 22.612 1.00 26.29 C
HETATM 2245 C2 QWE H 373 18.543 -17.350 21.462 1.00 26.22 C
HETATM 2246 C3 QWE H 373 19.877 -17.046 21.558 1.00 26.06 C
HETATM 2247 C4 QWE H 373 20.401 -16.566 22.766 1.00 26.60 C
HETATM 2248 C4A QWE H 373 19.613 -16.358 23.893 1.00 27.46 C
HETATM 2249 C5 QWE H 373 20.084 -15.791 25.046 1.00 28.32 C
HETATM 2250 C6 QWE H 373 19.241 -15.568 26.114 1.00 27.47 C
HETATM 2251 C7 QWE H 373 17.893 -15.971 26.028 1.00 27.79 C
HETATM 2252 C8 QWE H 373 17.370 -16.510 24.879 1.00 26.51 C
HETATM 2253 C8A QWE H 373 18.205 -16.689 23.809 1.00 26.70 C
文件2:
HETATM 2225 N TYS I 363 15.901 2.361 -4.748 1.00 44.75 N
HETATM 2226 CA TYS I 363 16.482 2.005 -3.448 1.00 44.52 C
HETATM 2227 CB TYS I 363 15.434 1.805 -2.340 1.00 42.26 C
HETATM 2228 CG TYS I 363 14.580 3.049 -2.234 1.00 39.78 C
HETATM 2229 CD1 TYS I 363 15.156 4.304 -2.015 1.00 37.81 C
HETATM 2230 CD2 TYS I 363 13.219 2.924 -2.545 1.00 40.71 C
HETATM 2231 CE1 TYS I 363 14.343 5.432 -2.005 1.00 38.74 C
与ATOM
文件分离的蛋白质坐标(pdb
)如下所示:
ATOM 2190 O GLU I 357 7.971 -5.002 -1.496 1.00 41.97 O
ATOM 2191 CB GLU I 357 4.752 -5.053 -1.745 1.00 42.96 C
ATOM 2192 CG GLU I 357 3.774 -4.690 -2.826 1.00 44.81 C
ATOM 2193 CD GLU I 357 3.513 -3.238 -3.102 1.00 46.56 C
ATOM 2194 OE1 GLU I 357 3.364 -2.632 -2.025 1.00 45.88 O
ATOM 2195 OE2 GLU I 357 3.416 -2.667 -4.193 1.00 47.58 O
我编写了一个脚本来计算这些蛋白质和配体原子之间的距离,如果满足特定条件的结果,它应该将ligand txt files
移动到另一个文件夹中。
这是结果的一部分:
QWE#I#363.txt
16
11.2
2.40023269705252
3.77980634424569
4.84684722267991
4.8225354327366
4.96742287308016
5.0893916139358
5.44698035612393
5.53698961530541
5.69511940173338
6.58882887924706
8.17976515555306
8.36770577876636
8.60629182633264
8.94395818415985
4.50089380012459
5.57823843161979
这是剧本:
#!/usr/local/bin/perl
use strict;
use warnings;
use File::Glob;
mkdir "covalently_bound";
mkdir"5<dist>2";
mkdir"5<dist>4";
mkdir"6<dist>5"
for my $pdbs (glob '*pdb')
{
printf "%s\n", $pdbs;
open my $pdb, "<" ,$pdbs;
while (my $pdb_lines = <$pdb>)
{
chomp($pdb_lines);
if($pdb_lines=~/^ATOM /)
{
my @prot_atoms= split '\t', $pdb_lines;
#print "@prot_atoms\n";
my @pdb_coord = (substr($pdb_lines, 30, 8),substr($pdb_lines,38,8),substr($pdb_lines,46,8));
#print "@pdb_coord\n";
my $x = substr($pdb_lines, 30, 8);
my $y = substr($pdb_lines,38,8);
my $z = substr($pdb_lines,46,8);
foreach my $txt (glob '*txt')
{
printf "%s\n", $txt;
open my $fh, "<" ,$txt;
my @lines= <$fh>;
my $file_sz = scalar@lines;
print "$file_sz\n";
#print "@lines\n";
my $c;
for ($c=0; $c<=$#lines; $c++)
{
chomp ($lines[$c]);
if ($lines[$c] =~ m/^HETATM/)
{
my @lig_atoms= split '\t', $lines [$c];
#print "@lig_atoms\n";
my @lig_coord = (substr($lines [$c], 30, 8),substr($lines [$c],38,8),substr($lines [$c],46,8));
#print "@lig_coord\n";
my $x1 = substr($lines [$c],30, 8);
my $y1 = substr($lines [$c],38,8);
my $z1 = substr($lines [$c],46,8);
my $dist = sqrt( ($x-$x1)**2 + ($y-$y1)**2 + ($z-$z1)**2 );
print "$dist\n";
#my $dist_sz = ?; #Here I am not sure how to calculate the size of the result and to include it into if loop.
if ($dist < 2)
{
close ($fh);
system ("mv $txt covalently_bound");
last;
}
if ($dist_sz >= 70% and 4<$dist>2 )
{
system ("mv $txt 4<dist>2");
}
if ($dist_sz >= 70% and 5<$dist>4)
{
system ("mv $txt 5<dist>4");
}
if ($dist_sz >= 70% and 6<$dist>5)
{
system ("mv $txt 6<dist>5");
}
}
}
}
}
}
}
脚本正在运行,我没有收到任何错误,但我遇到了两个我不知道如何解决的问题:
1st:
我想计算每个配体原子(HETATM
)和所有蛋白质原子(ATOM
)之间的距离。所以,HETATM1
与ATOM1
; HETATM2
与ATOM1
; HETATM3
与ATOM1
等等。
2nd:
每次计算(或每个配体文件)的距离结果应该很大。我想检查每个结果的大小,并设置一个条件,如果结果的70%
多于不同数字之间的值,则将其移动到另一个目录中。
我不知道我该怎么做这两件事,一直在挣扎几天,如果有人可以提供帮助或给出一些建议我会很感激!