Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 从mol2文件计算欧氏距离_Regex_Perl - Fatal编程技术网

Regex 从mol2文件计算欧氏距离

Regex 从mol2文件计算欧氏距离,regex,perl,Regex,Perl,这是我的程序,我想计算两个原子在不同时间的欧几里德距离。所以我可以修改这个程序使之成为可能。我的输入是 1 I -6.2528 -0.8879 0.3208 I 1 LIG1 -0.0425 2 O -0.1927 0.3708 -0.4256 O.3 1 LIG1 -0.4750 3 N 2.7475 3.2931 0.6111 N.3 1

这是我的程序,我想计算两个原子在不同时间的欧几里德距离。所以我可以修改这个程序使之成为可能。我的输入是

  1 I          -6.2528   -0.8879    0.3208 I       1  LIG1       -0.0425
  2 O          -0.1927    0.3708   -0.4256 O.3     1  LIG1       -0.4750
  3 N           2.7475    3.2931    0.6111 N.3     1  LIG1       -0.2164
  4 C           0.6554    0.0834    0.6881 C.3     1  LIG1        0.1896
  5 C           1.3107    1.3881    1.1695 C.3     1  LIG1        0.0670
  6 C           1.6435   -0.9764    0.2598 C.ar    1  LIG1        0.0172
  7 C           2.1448    2.0726    0.0863 C.3     1  LIG1        0.0928
  8 C          -1.5245    0.1089   -0.2623 C.ar    1  LIG1        0.1349
  9 C           2.1274   -1.8960    1.1905 C.ar    1  LIG1       -0.0008
 10 C           2.0723   -1.0350   -1.0663 C.ar    1  LIG1       -0.0008
 11 C          -2.4708    1.1273   -0.3768 C.ar    1  LIG1        0.0125
 12 C           3.0398   -2.8742    0.7949 C.ar    1  LIG1       -0.0002
 13 C           2.9846   -2.0133   -1.4618 C.ar    1  LIG1       -0.0002
 14 C          -1.9331   -1.1945    0.0206 C.ar    1  LIG1        0.0370
 15 C           3.4684   -2.9327   -0.5314 C.ar    1  LIG1       -0.0000
 16 C           3.5783    3.9360   -0.3969 C.3     1  LIG1        0.1075
这是我的节目

#!/usr/bin/perl -w
use strict;

my $num = 0;

my @arrayx;
my @arrayy;
my @arrayz;

while (<>) {
    # remove new line char
    chomp;

    # Find x, y, z coordinates and store in separate arrays
    if (/^ATOM/) {
        my @line = $_ =~ m/^(.....).(.....).(....).(...)..(....)....(........)(........)               (........)/;

        my $x = $line[5];
        $arrayx[$num] = $x;

        my $y = $line[6];
        $arrayy[$num] = $y;

        my $z = $line[7];
        $arrayz[$num] = $z;

        ++$num;
    }
}

# Calculate distance between all atom coordinates
for my $i ( 0 .. $num ) {
    for my $j ( $i + 1 .. $num ) {

        # skip if j array element does not exist
        unless ( defined( $arrayx[$j] )
            && defined( $arrayy[$j] )
            && defined( $arrayz[$j] ) )
        {
            print "Skipping i:$i j:$j\n";
            sleep(1);
            next;
        }

        my $dist =
          sqrt( ( $arrayx[$i] - $arrayx[$j] )**2 +
              ( $arrayy[$i] - $arrayy[$j] )**2 +
              ( $arrayz[$i] - $arrayz[$j] )**2 );
        print "$dist\n";
    }
}
#/usr/bin/perl-w
严格使用;
我的$num=0;
我的@arrayx;
我的@arrayy;
我的@arrayz;
而(){
#删除新行字符
咀嚼;
#查找x、y、z坐标并存储在单独的数组中
如果(/^ATOM/){
我的@line=$=~m/^(…)(…)(…)(…)(…)(…)(…)(…)(…)(…)(…)(…)(…)/;
my$x=$line[5];
$arrayx[$num]=$x;
my$y=$line[6];
$arrayy[$num]=$y;
my$z=$line[7];
$arrayz[$num]=$z;
++$num;
}
}
#计算所有原子坐标之间的距离
对于我的$i(0..$num){
对于我的$j($i+1..$num){
#如果j数组元素不存在,则跳过
除非(定义为($arrayx[$j]))
&&已定义($arrayy[$j])
&&已定义($arrayz[$j]))
{
打印“跳过i:$i j:$j\n”;
睡眠(1);
下一个
}
我的$dist=
sqrt(($arrayx[$i]-$arrayx[$j])**2+
($arrayy[$i]-$arrayy[$j])**2+
($arrayz[$i]-$arrayz[$j])**2;
打印“$dist\n”;
}
}

您不清楚问题出在哪里。现在还不清楚到底发生了什么,应该发生什么。尤其是应该发生的事情。我不知道mol2格式,更不知道如何计算不同时间的欧几里德距离

但是:你的评论暗示问题出在线路上

my @line = $_ =~ m/^(.....).(.....).(....).(...)..(....)....(........ (........)               (........)/;
我不完全确定你在这里想干什么。您是否尝试将粘贴文本文件(mol2?)中某行的字段放入数组
@line
?如果是,试试看

my @line = split ' ', $_;
相反。这将删除任何前导空格,然后在任意数量的空格处拆分字符串。因此,如果以这种方式拆分第一个示例行,则以
$line[2]
==-6.2528,
$line[3]
=-0.8879,
$line[4]
==0.3208结束
假设这些是你想要的数字。

你发布了一些样本数据,但实际上你没有告诉我们这是什么意思。我怀疑第二、第三和第四列分别指x、y和z,但您应该确认这一点

如果是这种情况,那么下面是代码的清理版本。也许它会帮助你:

#!/usr/bin/perl -w
use strict;

my @data;

while (<DATA>) {
    chomp;

    # Find x, y, z coordinates and store in separate arrays
    my @line = split;

    push @data, {
        x => $line[2],
        y => $line[3],
        z => $line[4],
        name => $line[5],
    };
}

# Calculate distance between all atom coordinates
for my $i ( 0 .. $#data ) {
    for my $j ( $i + 1 .. $#data ) {

        my $dist =
          sqrt( ( $data[$i]{x} - $data[$j]{x} )**2 +
              ( $data[$i]{y} - $data[$j]{y} )**2 +
              ( $data[$i]{z} - $data[$j]{z} )**2 );

        printf "%-6s %-6s %f\n", $data[$i]{name}, $data[$j]{name}, $dist;
    }
}

__DATA__
  1 I          -6.2528   -0.8879    0.3208 I       1  LIG1       -0.0425
  2 O          -0.1927    0.3708   -0.4256 O.3     1  LIG1       -0.4750
  3 N           2.7475    3.2931    0.6111 N.3     1  LIG1       -0.2164
  4 C           0.6554    0.0834    0.6881 C.3     1  LIG1        0.1896
  5 C           1.3107    1.3881    1.1695 C.3     1  LIG1        0.0670
  6 C           1.6435   -0.9764    0.2598 C.ar    1  LIG1        0.0172
  7 C           2.1448    2.0726    0.0863 C.3     1  LIG1        0.0928
  8 C          -1.5245    0.1089   -0.2623 C.ar    1  LIG1        0.1349
  9 C           2.1274   -1.8960    1.1905 C.ar    1  LIG1       -0.0008
 10 C           2.0723   -1.0350   -1.0663 C.ar    1  LIG1       -0.0008
 11 C          -2.4708    1.1273   -0.3768 C.ar    1  LIG1        0.0125
 12 C           3.0398   -2.8742    0.7949 C.ar    1  LIG1       -0.0002
 13 C           2.9846   -2.0133   -1.4618 C.ar    1  LIG1       -0.0002
 14 C          -1.9331   -1.1945    0.0206 C.ar    1  LIG1        0.0370
 15 C           3.4684   -2.9327   -0.5314 C.ar    1  LIG1       -0.0000
 16 C           3.5783    3.9360   -0.3969 C.3     1  LIG1        0.1075

问题是什么?您显示的代码是否无效?有什么问题?它会产生错误吗?你试过什么?你有什么问题?请在您的问题被标记之前指定。我想计算两个原子之间的欧几里德距离,从而以相同的方式迭代到下一个原子。我的输入是Mol2文件格式。因此,我在正则表达式使用方面存在问题。我编写了此代码,该代码将输入一个Mol2文件,然后读取该行,但正则表达式中存在错误用法。此程序没有按我的预期工作。这不是基于代码中与
/^ATOM/
匹配的完整输入文件。您调用的数字是文件的x、y、z坐标,我要计算一个原子(i)到另一个原子(C)之间的距离在第7位,我的问题是如何读取输入格式,这样我就可以用两个原子的数目(两个原子之间的距离)来计算距离。你试过我的建议了吗?这应该会给你一个坐标在位置2,3和4的数组,等着你想怎么用就怎么用。你做的完全正确,谢谢米勒的大力支持,这对我帮助很大。你能帮我得到原子名称的输出吗?在这个原子名称内,你计算了距离,这样我就能更好地理解输出。我为你做了一个更新,输出了我假设的名称。你现在可能已经明白了,但如果没有,这应该会有帮助。顺便说一句,如果这是正确答案,请随意标记。
I        O.3      6.234280
I        N.3      9.928264
I        C.3      6.985811
I        C.3      7.943991
I        C.ar     7.897032
I        C.3      8.907258
I        C.ar     4.867282
I        C.ar     8.485305
I        C.ar     8.441148
I        C.ar     4.341797
I        C.ar     9.514335
I        C.ar     9.474901
I        C.ar     4.340960
I        C.ar     9.970415
I        C.3      10.974317
O.3      N.3      4.273097
O.3      C.3      1.429056
O.3      C.3      2.416496
O.3      C.ar     2.378309
....