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
....