【问题标题】:Perl Nested Loop: Arrays - Calculating Minimum DistancePerl 嵌套循环:数组 - 计算最小距离
【发布时间】:2013-08-07 03:13:03
【问题描述】:

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

目标.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 个距离单位的值。然后,将计算所有 ASN 原子的 ASP CG 原子距离以查看最小值。所以我想在这里找到最小距离。

【问题讨论】:

    标签: arrays perl


    【解决方案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];
    
    ...
    
        }
    

    }

    【讨论】:

    • 您能否澄清一下 $ap(@targets) 在语法上的含义。我是 perl 的初学者。
    • 它是 foreach 循环语法的一部分。 foreach (@targets) { [...] } 循环遍历 @targets 的元素,并在每次迭代中将 $_** 设置为当前元素。 foreach $ap (@targets) { [...] } 对每个元素使用 **$ap** 而不是 **$_
    • 在确认字段是由基于间隔的间隙而不是位置坐标定义之前,请勿使用此答案。如果每个字段在一行中占用一定数量的空格,则此脚本可能会在您不注意的情况下巧妙地失败...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-25
    • 1970-01-01
    • 2013-09-16
    • 2017-11-24
    • 2018-10-21
    • 1970-01-01
    • 2013-02-02
    相关资源
    最近更新 更多