0

1 つのデータ セットを取り、そのデータの各値を別のデータ セットで減算しようとしています。

例えば:

Data set one (1, 2, 3)
Data set two (1, 2, 3, 4, 5)

だから私はそのようなものを手に入れるべき(1 - (1 .. 5))です(2 - (1..5))

私は現在持っています:

#!/usr/bin/perl
use strict;
use warnings;

my $inputfile = $ARGV[0];

open( INPUTFILE, "<", $inputfile ) or die $!;

my @array = <INPUTFILE>;

my $protein = 'PROT';
my $chain   = 'P';
my $protein_coords;

for ( my $line = 0; $line <= $#array; ++$line ) {
    if ( $array[$line] =~ m/\s+$protein\s+/ ) {
        chomp $array[$line];
        my @splitline = ( split /\s+/, $array[$line] );
        my %coordinates = (
            x => $splitline[5],
            y => $splitline[6],
            z => $splitline[7],
        );
        push @{ $protein_coords->[0] }, \%coordinates;
    }
}

print "$protein_coords->[0]->[0]->{'z'} \n";

my $lipid1 = 'MEM1';
my $lipid2 = 'MEM2';
my $lipid_coords;

for ( my $line = 0; $line <= $#array; ++$line ) {
    if ( $array[$line] =~ m/\s+$lipid1\s+/ || $array[$line] =~ m/\s+$lipid2\s+/ ) {
        chomp $array[$line];
        my @splitline = ( split /\s+/, $array[$line] );
        my %coordinates = (
            x => $splitline[5],
            y => $splitline[6],
            z => $splitline[7],
        );
        push @{ $lipid_coords->[1] }, \%coordinates;
    }
}

print "$lipid_coords->[1]->[0]->{'z'} \n";

$protein_coords->[0]->[$ticker]->{'z'}のすべての値から の各値を差し引いたものを取得しようとしています$lipid_coords->[1]->[$ticker]->{'z'}

(z2-z1)^2私の全体的な目的は、方程式を見つけることd = sqrt((x2-x1)^2+(y2-y1)^2-(z2-z1)^2)です。これが一度できれば、XとYもできると思います。技術的には、同じ PDB 内のすべての脂質原子に対して PDB ファイル内のすべての原子間の距離を見つけ、5A 未満の距離の ResID を出力しようとしています。

4

3 に答える 3

3

2 つの配列のすべての組み合わせを繰り返すには、2 つの for ループを埋め込むだけです。

use strict;
use warnings;

my @dataone = (1, 2, 3);
my @datatwo = (1, 2, 3, 4, 5);

for my $one (@dataone) {
    for my $two (@datatwo) {
        print "$one - $two\n";
    }
}

出力:

1 - 1
1 - 2
1 - 3
1 - 4
1 - 5
2 - 1
2 - 2
2 - 3
2 - 4
2 - 5
3 - 1
3 - 2
3 - 3
3 - 4
3 - 5
于 2014-10-02T19:38:57.287 に答える
1

これにより、セット1の各要素からセット2の各要素を差し引いた結果が得られます。これは、あなたが求めていた方法だと思います。

#!/usr/bin/perl

use strict;
use warnings;

my @set1 = (1, 2, 3);
my @set2 = (1, 2, 3, 4, 5);

my @set3 = ();
for my $val (@set1) {
    push @set3, map { $val - $_ } @set2;
}

local $" = ', ';
print "@set3\n";

system 'pause';

結果は、(1 - (1..5)、2 - (1..5)、3 - (1..5)) を含む配列になります。

スクリプト実行後の @set3 の内容:

0, -1, -2, -3, -4, 1, 0, -1, -2, -3, 2, 1, 0, -1, -2

他のすべてのタンパク質と脂質のものは私の頭をはるかに超えていますが、これが少なくとも少し役立つことを願っています. これで、残りの結果を取得するために使用できる、減算された要素を含む配列が得られます!


編集:

ループをこの 1 つのライナーに置き換えることができます :)

my @set3 = map { my $v = $_; map { $v - $_ } @set2 } @set1;

map はかなり気の利いた機能です!

于 2014-10-02T19:53:40.300 に答える
0

これを行う最も簡単な方法は、ファイル 2 を調べている間に計算を行うことです。

for (my $line = 0; $line <= $#array; ++$line) {
    if (($array[$line] =~ m/\s+$lipid1\s+/) | ($array[$line] =~ m/\s+$lipid2\s+/)) {  
        chomp $array[$line];
        my @splitline = (split /\s+/, $array[$line]);
        my %coordinates = (x => $splitline[5],
                           y => $splitline[6],
                           z => $splitline[7],
                          );
        push @{$lipid_coords->[1]}, \%coordinates;

        # go through each of the sets of protein coors in your array...
        for my $p (@{$protein_coords->[0]}) {
            # you can store this value however you want...
            my $difference = $protein_coords->[0][$p]{z} - $coordinates{z};
        }
    }
}

私があなただったら、何らかの形式の一意の識別子を使用して、各組み合わせのデータにアクセスできるようにします。たとえば、形式のハッシュを作成し$difference->{<protein_id>}{<lipid_id>} = <difference>ます。

于 2014-10-02T19:44:25.167 に答える