我发现很多帖子来计算原子之间的距离,即使我已经编写了我自己的代码。现在我希望它的行数非常少,我写了类似下面的内容
#!/usr/bin/perl -w
@ARGV = <>;
for ( $i = 0; $i <= $#ARGV; $i++ ) {
@temp = split( /\s+/, $ARGV[$i] );
if ( $temp[0] eq "ATOM" and $temp[2] eq "CA" ) {
( $n1, $ax, $ay, $az ) = @temp[ 5, 6, 7, 8 ];
if ( $temp[0] eq "ATOM" and $temp[2] eq "CA" ) {
( $n2, $bx, $by, $bz ) = @temp[ 5, 6, 7, 8 ];
}
$dista = sprintf( "%0.3f",
sqrt( ( $ax - $bx )**2 + ( $ay - $by )**2 + ( $az - $bz )**2 ) );
print "$n1\t$n2\t$dista\n";
}
}
示例输入文件为http://www.rcsb.org/pdb/files/5PTI.pdb。当我运行该程序时,它没有采取下一个&#34; CA&#34;原子计算距离,我想首先计算&#34; CA&#34;对所有其他&#34; CA&#34;原子和第二个CA到所有其他CA等等。我知道我的代码中缺少循环,我试图包含但是出了问题。我在哪里可以修改我的代码以获得正确的结果。
答案 0 :(得分:0)
我会这样做
use strict;
use warnings;
sub get_ca_atom {
my @result = split;
return
$result[0] eq 'ATOM'
&& $result[2] eq 'CA'
&& @result > 8 ? [ @result[ 5 .. 8 ] ] : ();
}
my @atoms = map get_ca_atom, <>;
while (@atoms) {
my $a = shift @atoms;
for my $b (@atoms) {
my $dist
= sqrt( ( $$a[1] - $$b[1] )**2
+ ( $$a[2] - $$b[2] )**2
+ ( $$a[3] - $$b[3] )**2 );
printf "%s\t%s\t%0.3f\n", $$a[0], $$b[0], $dist;
}
}
但实际上我想将主要算法中的原子内部处理与主要算法分开,并尽可能地传达代码的意图。没有什么比在没有记住这一点的情况下编写几个月后处理自己的代码更糟糕了。
use strict;
use warnings;
# handle CA ATOM record
use constant { ATOM_TAG => 0, ATOM_TYPE => 2 };
use constant ATOM_SPLICE => ( 5 .. 8 );
use constant { NAME => 0, X => 1, Y => 2, Z => 3 };
sub get_ca_atom {
my @result = split;
return
$result[ATOM_TAG] eq 'ATOM'
&& $result[ATOM_TYPE] eq 'CA'
&& @result > (ATOM_SPLICE)[-1] ? [ @result[ATOM_SPLICE] ] : ();
}
sub get_name { shift->[NAME] }
sub distance {
my ( $a, $b ) = @_;
sqrt( ( $$a[X] - $$b[X] )**2
+ ( $$a[Y] - $$b[Y] )**2
+ ( $$a[Z] - $$b[Z] )**2 );
}
# end of handle CA ATOM record
my @atoms = map get_ca_atom, <>;
while (@atoms) {
my $a = shift @atoms;
for my $b (@atoms) {
my $dist = distance( $a, $b );
printf "%s\t%s\t%0.3f\n", get_name($a), get_name($b), $dist;
}
}
然后您可以根据需要使用主算法。例如,上面的代码将所有文件内容读入内存,这在实际任务中最不应该是一个问题。但是,如果您希望仅保留CA ATOMS,只需将map
的行更改为以下内容。
my @atoms;
while (<>) {
my $atom = get_ca_atom;
push @atoms, $atom if $atom;
}
正如您所看到的,代码的意图在更多行中慢慢丢失,但有时可能相反。对代码的主要反对意见是传达意图,即使它意味着更多的代码行。特别是你不应该将低级别与高级别混合,这就是我在第二个代码示例中将distance
和get_name
分开的原因。
如果您希望按原样顺序处理原子,可以使用以下代码,但请注意您不会节省内存,因为无论如何都需要存储@atoms
来计算距离。
my @atoms;
while (<>) {
my $atom = get_ca_atom;
next unless $atom;
for my $a (@atoms) {
my $dist = distance( $atom, $a );
printf "%s\t%s\t%0.3f\n", get_name($a), get_name($atom), $dist;
}
push @atoms, $atom;
}
注意输出的顺序不同。还要注意我使用next unless $atom;
而不是使用if ($atom) {
并将其余的循环包含在块中。原因是我想强调:如果它不符合您的预期,请跳过它。如果您想用第三种不同的输出顺序给自己惊喜,可以用{{push
替换unshift
1}}。
答案 1 :(得分:0)
为了比较所有不同的原子对,您需要不按顺序访问文件数据,因此最好在进行计算之前将所有相关数据读入内存。
此程序使用while
循环将所有CA
ATOM
个数字和位置读取到@data
,然后使用双精度计算每个不同对之间的距离嵌套for
循环
use strict;
use warnings;
my @data;
while ( <> ) {
my @fields = split;
next unless $fields[0] eq 'ATOM' and $fields[2] eq 'CA';
push @data, [ @fields[5..8] ];
}
for my $i (0 .. $#data-1) {
my ($an, $ax, $ay, $az) = @{ $data[$i] };
for my $j ($i+1 .. $#data) {
my ($bn, $bx, $by, $bz) = @{ $data[$j] };
my ($dx, $dy, $dz) = ($ax-$bx, $ay-$by, $az-$bz);
my $dist = sqrt($dx*$dx + $dy*$dy + $dz*$dz);
printf "%3d %3d %6.3f\n", $an, $bn, $dist;
}
}
<强>输出强>
1 2 3.772
1 3 6.357
1 4 8.230
1 5 6.883
1 6 8.835
1 7 11.836
1 8 14.819
1 9 16.272
1 10 18.781
1 11 22.069
1 12 23.577
1 13 27.304
1 14 28.550
1 15 30.435
1 16 29.411
1 17 27.994
1 18 25.290
1 19 23.197
1 20 19.549
1 21 16.377
1 22 13.683
1 23 10.803
1 24 12.584
1 25 10.300
1 26 13.713
1 27 14.787
1 28 11.633
1 29 13.140
1 30 13.576
1 31 16.899
1 32 19.413
1 33 20.494
1 34 23.292
1 35 22.504
1 36 25.633
1 37 25.598
1 38 24.936
1 39 22.477
1 40 19.299
1 41 16.005
1 42 12.638
1 43 11.659
1 44 14.746
1 45 15.146
1 46 18.399
1 47 17.588
1 48 15.860
1 49 15.021
1 50 13.194
1 51 11.300
1 52 10.500
1 53 9.874
1 54 7.246
1 55 5.502
1 56 7.255
1 57 8.869
1 58 12.364
2 3 3.712
2 4 5.264
2 5 5.705
2 6 7.882
2 7 9.931
2 8 13.310
2 9 14.660
2 10 16.571
2 11 19.974
2 12 20.988
2 13 24.611
2 14 26.005
2 15 28.222
2 16 27.436
2 17 26.450
2 18 23.863
2 19 22.267
2 20 18.602
2 21 15.926
2 22 13.079
2 23 10.991
2 24 13.023
2 25 11.272
2 26 14.827
2 27 16.369
2 28 13.696
2 29 14.802
2 30 14.428
2 31 17.305
2 32 19.214
2 33 19.670
2 34 22.010
2 35 20.704
2 36 23.494
2 37 23.285
2 38 22.198
2 39 19.454
2 40 16.542
2 41 13.059
2 42 9.817
2 43 9.717
2 44 13.047
2 45 14.062
2 46 17.571
2 47 17.545
2 48 16.496
2 49 16.013
2 50 13.461
2 51 11.599
2 52 12.013
2 53 11.355
2 54 7.839
2 55 6.843
2 56 9.812
2 57 12.211
2 58 15.658
3 4 3.765
3 5 5.298
3 6 5.675
3 7 7.436
3 8 11.137
3 9 13.211
3 10 14.962
3 11 18.642
3 12 19.458
3 13 22.991
3 14 24.871
3 15 27.175
3 16 26.862
3 17 25.995
3 18 23.864
3 19 22.429
3 20 18.984
3 21 16.478
3 22 13.154
3 23 11.180
3 24 12.363
3 25 10.420
3 26 13.564
3 27 15.868
3 28 13.932
3 29 15.417
3 30 15.143
3 31 17.475
3 32 19.250
3 33 19.132
3 34 21.369
3 35 20.109
3 36 22.662
3 37 22.879
3 38 21.582
3 39 18.587
3 40 15.998
3 41 12.239
3 42 9.840
3 43 9.607
3 44 13.335
3 45 15.232
3 46 18.951
3 47 19.301
3 48 18.221
3 49 18.412
3 50 15.954
3 51 13.507
3 52 14.244
3 53 14.343
3 54 10.830
3 55 9.041
3 56 11.810
3 57 14.209
3 58 17.229
4 5 3.820
4 6 5.318
4 7 5.362
4 8 8.786
4 9 10.091
4 10 11.574
4 11 15.140
4 12 15.971
4 13 19.569
4 14 21.246
4 15 23.537
4 16 23.146
4 17 22.377
4 18 20.242
4 19 19.031
4 20 15.631
4 21 13.511
4 22 10.308
4 23 9.277
4 24 10.980
4 25 10.254
4 26 13.570
4 27 15.521
4 28 13.857
4 29 14.475
4 30 13.337
4 31 15.229
4 32 16.434
4 33 16.013
4 34 17.953
4 35 16.460
4 36 18.973
4 37 19.118
4 38 17.898
4 39 15.038
4 40 12.292
4 41 8.585
4 42 6.257
4 43 6.086
4 44 9.793
4 45 12.070
4 46 15.828
4 47 16.653
4 48 16.036
4 49 16.682
4 50 13.996
4 51 11.475
4 52 13.125
4 53 13.565
4 54 9.951
4 55 8.588
4 56 11.858
4 57 14.982
4 58 17.912
5 6 3.786
5 7 5.549
5 8 8.148
5 9 9.417
5 10 12.003
5 11 15.345
5 12 17.034
5 13 20.795
5 14 22.183
5 15 23.943
5 16 23.209
5 17 21.821
5 18 19.548
5 19 17.663
5 20 14.226
5 21 11.392
5 22 8.020
5 23 5.923
5 24 7.697
5 25 6.909
5 26 10.530
5 27 12.000
5 28 10.100
5 29 10.716
5 30 9.947
5 31 12.216
5 32 14.072
5 33 14.342
5 34 16.948
5 35 16.188
5 36 19.251
5 37 19.710
5 38 19.200
5 39 16.885
5 40 13.668
5 41 10.418
5 42 7.851
5 43 5.721
5 44 9.267
5 45 10.954
5 46 14.616
5 47 14.695
5 48 13.357
5 49 14.154
5 50 12.112
5 51 9.007
5 52 10.078
5 53 11.232
5 54 8.148
5 55 5.688
5 56 8.503
5 57 11.702
5 58 14.362
6 7 3.831
6 8 6.572
6 9 9.275
6 10 11.961
6 11 15.547
6 12 17.196
6 13 20.827
6 14 22.748
6 15 24.452
6 16 24.212
6 17 22.799
6 18 21.078
6 19 19.207
6 20 16.153
6 21 13.423
6 22 9.721
6 23 7.486
6 24 7.340
6 25 5.698
6 26 8.505
6 27 11.057
6 28 10.121
6 29 11.598
6 30 11.538
6 31 13.190
6 32 15.162
6 33 14.966
6 34 17.633
6 35 17.217
6 36 20.067
6 37 21.104
6 38 20.504
6 39 18.040
6 40 15.210
6 41 11.855
6 42 10.280
6 43 8.110
6 44 11.650
6 45 13.922
6 46 17.544
6 47 17.700
6 48 16.106
6 49 17.323
6 50 15.639
6 51 12.259
6 52 13.014
6 53 14.602
6 54 11.760
6 55 8.788
6 56 10.724
6 57 13.305
6 58 15.397
7 8 3.788
7 9 6.501
7 10 8.500
7 11 12.241
7 12 13.561
7 13 17.118
7 14 19.243
7 15 21.116
7 16 21.202
7 17 20.145
7 18 18.765
7 19 17.426
7 20 14.643
7 21 12.683
7 22 9.085
7 23 8.406
7 24 8.404
7 25 8.354
7 26 10.628
7 27 13.077
7 28 12.781
7 29 13.456
7 30 12.474
7 31 13.236
7 32 14.271
7 33 13.178
7 34 15.234
7 35 14.441
7 36 16.903
7 37 18.077
7 38 17.268
7 39 14.740
7 40 12.239
7 41 9.000
7 42 8.569
7 43 6.762
7 44 10.022
7 45 13.081
7 46 16.670
7 47 17.588
7 48 16.646
7 49 18.349
7 50 16.355
7 51 13.074
7 52 14.771
7 53 16.437
7 54 13.415
7 55 11.103
7 56 13.508
7 57 16.519
7 58 18.574
8 9 3.829
8 10 6.391
8 11 9.730
8 12 11.714
8 13 15.183
8 14 17.246
8 15 18.615
8 16 18.817
8 17 17.467
8 18 16.564
8 19 15.151
8 20 12.958
8 21 11.376
8 22 8.076
8 23 8.330
8 24 7.464
8 25 8.810
8 26 10.170
8 27 12.231
8 28 12.876
8 29 12.969
8 30 11.707
8 31 11.373
8 32 11.921
8 33 10.304
8 34 12.345
8 35 12.170
8 36 14.656
8 37 16.484
8 38 16.239
8 39 14.329
8 40 11.939
8 41 9.623
8 42 10.141
8 43 7.644
8 44 9.770
8 45 12.967
8 46 16.144
8 47 17.164
8 48 16.234
8 49 18.629
8 50 17.098
8 51 13.644
8 52 15.542
8 53 17.852
8 54 15.331
8 55 12.977
8 56 14.899
8 57 17.929
8 58 19.411
9 10 3.796
9 11 6.560
9 12 9.191
9 13 12.815
9 14 14.244
9 15 15.405
9 16 15.226
9 17 13.799
9 18 12.745
9 19 11.505
9 20 9.462
9 21 8.624
9 22 6.111
9 23 8.130
9 24 8.288
9 25 10.836
9 26 12.463
9 27 13.537
9 28 14.017
9 29 13.030
9 30 10.756
9 31 9.762
9 32 9.230
9 33 7.106
9 34 8.767
9 35 8.406
9 36 11.173
9 37 12.963
9 38 13.196
9 39 11.907
9 40 9.274
9 41 7.975
9 42 9.009
9 43 6.426
9 44 7.058
9 45 10.329
9 46 13.110
9 47 14.574
9 48 14.241
9 49 16.984
9 50 15.450
9 51 12.315
9 52 14.872
9 53 17.243
9 54 15.016
9 55 13.356
9 56 15.411
9 57 18.781
9 58 20.275
10 11 3.828
10 12 5.496
10 13 9.172
10 14 10.923
10 15 12.620
10 16 12.993
10 17 12.458
10 18 11.905
10 19 11.855
10 20 10.354
10 21 10.795
10 22 9.077
10 23 11.601
10 24 12.078
10 25 14.440
10 26 16.059
10 27 17.305
10 28 17.774
10 29 16.703
10 30 14.136
10 31 12.928
10 32 11.515
10 33 8.580
10 34 8.535
10 35 6.945
10 36 8.611
10 37 10.409
10 38 10.097
10 39 8.733
10 40 6.955
10 41 6.570
10 42 9.147
10 43 8.045
10 44 7.942
10 45 11.516
10 46 13.970
10 47 16.239
10 48 16.684
10 49 19.362
10 50 17.428
10 51 14.794
10 52 17.795
10 53 19.775
10 54 17.311
10 55 16.195
10 56 18.651
10 57 22.165
10 58 23.882
11 12 3.829
11 13 6.896
11 14 7.832
11 15 8.935
11 16 9.358
11 17 8.968
11 18 9.167
11 19 9.914
11 20 9.600
11 21 11.270
11 22 10.756
11 23 13.943
11 24 14.437
11 25 17.339
11 26 18.680
11 27 19.414
11 28 20.142
11 29 18.516
11 30 15.604
11 31 13.656
11 32 11.238
11 33 7.743
11 34 6.051
11 35 4.259
11 36 5.107
11 37 7.753
11 38 8.381
11 39 8.497
11 40 7.487
11 41 8.904
11 42 11.750
11 43 10.782
11 44 9.363
11 45 12.346
11 46 13.858
11 47 16.459
11 48 17.387
11 49 20.381
11 50 18.730
11 51 16.466
11 52 19.658
11 53 21.770
11 54 19.716
11 55 18.921
11 56 21.179
11 57 24.715
11 58 26.195
12 13 3.798
12 14 5.872
12 15 8.412
12 16 9.787
12 17 10.835
12 18 11.309
12 19 12.940
12 20 12.564
12 21 14.413
12 22 13.731
12 23 16.751
12 24 17.446
12 25 19.934
12 26 21.458
12 27 22.598
12 28 23.145
12 29 21.769
12 30 18.861
12 31 17.257
12 32 14.923
12 33 11.528
12 34 9.487
12 35 6.828
12 36 5.623
12 37 7.368
12 38 6.441
12 39 6.083
12 40 6.825
12 41 8.668
12 42 12.254
12 43 12.427
12 44 11.299
12 45 14.440
12 46 16.010
12 47 19.024
12 48 20.323
12 49 23.002
12 50 20.893
12 51 18.915
12 52 22.282
12 53 23.962
12 54 21.538
12 55 21.023
12 56 23.674
12 57 27.301
12 58 29.102
13 14 3.879
13 15 6.705
13 16 9.300
13 17 11.362
13 18 12.772
13 19 15.105
13 20 15.435
13 21 17.730
13 22 17.366
13 23 20.477
13 24 21.031
13 25 23.571
13 26 24.880
13 27 26.028
13 28 26.780
13 29 25.340
13 30 22.400
13 31 20.523
13 32 17.874
13 33 14.332
13 34 11.618
13 35 9.221
13 36 6.442
13 37 8.090
13 38 7.079
13 39 7.719
13 40 9.752
13 41 12.037
13 42 15.744
13 43 16.183
13 44 14.857
13 45 17.760
13 46 18.893
13 47 22.081
13 48 23.627
13 49 26.366
13 50 24.297
13 51 22.512
13 52 25.936
13 53 27.588
13 54 25.210
13 55 24.803
13 56 27.451
13 57 31.078
13 58 32.820
14 15 3.805
14 16 5.952
14 17 8.843
14 18 10.375
14 19 13.401
14 20 14.307
14 21 17.253
14 22 17.705
14 23 21.206
14 24 22.143
14 25 25.041
14 26 26.510
14 27 27.150
14 28 27.737
14 29 25.808
14 30 22.545
14 31 20.510
14 32 17.400
14 33 14.104
14 34 10.779
14 35 8.226
14 36 4.525
14 37 5.440
14 38 5.667
14 39 8.155
14 40 10.012
14 41 13.178
14 42 16.588
14 43 17.017
14 44 14.871
14 45 17.120
14 46 17.488
14 47 20.842
14 48 22.838
14 49 25.579
14 50 23.675
14 51 22.349
14 52 25.908
14 53 27.494
14 54 25.489
14 55 25.493
14 56 28.046
14 57 31.725
14 58 33.414
15 16 3.763
15 17 6.550
15 18 9.298
15 19 12.391
...等