Perl嵌套循环:数组 - 计算最小距离

时间:2013-08-06 17:28:15

标签: arrays perl

temp.bgf

ATOM     218  CB   ASN 1   34   -7.84400  -9.19900  -5.03100 C_3    4 0 -0.18000 0   0
ATOM     221  CG   ASN 1   34   -7.37700  -7.83400  -4.55200 C_R    3 0  0.55000 0   0
ATOM     226  C    ASN 1   34   -9.18200 -10.62100  -6.58300 C_R    3 0  0.51000 0   0
ATOM     393  CB   THR 2   69   -3.33000  -7.97700  -7.72000 C_3    4 0  0.14000 0   0
ATOM     397  CG2  THR 2   69   -4.75300  -8.54400  -7.67200 C_3    4 0 -0.27000 0   0
ATOM     401  C    THR 2   69   -2.58000  -9.55700  -5.85500 C_R    3 0  0.51000 0   0
ATOM     417  CB   THR 2   71    1.99100  -9.86800  -2.77000 C_3    4 0  0.14000 0   0
ATOM     421  CG2  THR 2   71    2.86300 -10.15400  -1.55700 C_3    4 0 -0.27000 0   0
ATOM     425  C    THR 2   71   -0.19100 -10.14200  -1.62900 C_R    3 0  0.51000 0   0
ATOM     492  CB   CYS 2   77   -5.17100 -14.77100   4.04000 C_3    4 0 -0.11000 0   0
ATOM     495  SG   CYS 2   77   -6.29600 -14.88500   2.59500 S_3    2 2 -0.23000 0   0
ATOM     497  C    CYS 2   77   -4.65100 -13.75800   6.12000 C_R    3 0  0.51000 0   0
ATOM    2071  CB   SER 7  316   -3.87300  -2.15900   1.02300 C_3    4 0  0.05000 0   0
ATOM    2076  C    SER 7  316   -4.79700  -1.16500  -1.10800 C_R    3 0  0.51000 0   0

target.bgf

ATOM     575  CB   ASP 2   72   -2.80100  -7.45000  -2.09400 C_3    4 0 -0.28000 0   0
ATOM     578  CG   ASP 2   72   -3.74900  -6.45900  -1.31600 C_R    3 0  0.62000 0   0
ATOM     581  C    ASP 2   72   -3.19300  -9.62400  -0.87900 C_R    3 0  0.51000 0   0

我有两个数据文件。第一个文件包含我想要计算距离的残差的数据。第二个文件包含目标残基的坐标。

我想计算两个量之间的最小距离(即ASP和temp.bgf中的残差)。我无法想出一种存储x,y,z值的最佳方法,并比较temp.bgf中的距离。

有关如何进行计算的问题。这是我的想法

 @asp_atoms
 @asn_atoms
 $asnmin, aspmin
 foreach $ap (@asp_atoms)
 {
     foreach $an (@asn_atoms)
     {
         dist = dist($v..$g...);
         if($dist < $min)
         {
                $min = $dist;   
         }
    }
 }

我希望澄清有关如何实现代码的问题。但是,我遇到的问题是如何将值存储在数组中并遍历文件。

另外,为了弄清楚究竟是多么准确(即用什么数字来表示距离,这里是我想要做的一个例子)。

对于具有以下坐标的ASP CB原子:-2.80100 -7.45000 -2.09400 我想计算ASN CB,ASN CG,ASN C原子之间的距离。最小值是打印出来的值。不幸的是,我没有关于最小值的确切值,但我必须打印出小于5个距离的值。然后,ASP CG原子距离将计算到所有ASN原子以查看最小值。所以我想在这里找到最小距离。

1 个答案:

答案 0 :(得分:1)

您可以通过简单地将文件中的每一行拆分到空白区域,然后将结果存储在数组数组中,然后仅切出循环中所需的参数(在本例中为x,y,z)来解决此问题。这不是您问题的完整答案,但它应该让您了解如何实现这一目标。

open (my $temp,"<","temp.bgf");

open (my $target,"<","target.bgf");

my @temps = create_ar($temp);
my @targets = create_ar($target);

sub create_ar {
    my $filehan = shift;
    my @array;

foreach (<$filehan>) {
    push  @array,[split(/\s+/,$_)];
}
    return @array;
}


foreach my $ap (@targets) {

my ($target_X,$target_Y,$target_Z) =  @{$ap}[6,7,8];

    foreach my $an (@temps) {

my ($temp_X,$temp_Y,$temp_Z) = @{$an}[6,7,8];

...

    }

}