2013-08-06 82 views
0

temp.bgfPerl的嵌套循環:陣列 - 計算最小距離

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 

target.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個單位距離的值。然後,ASP CG原子距離將被計算到所有的ASN原子來查看最小值。所以我試圖在這裏找到最小距離。

回答

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]; 

... 

    } 

}

+0

你能否澄清一下$ AP(@targets)表示syntatically。我是perl的初學者。 – user2605011

+0

它是foreach循環語法的一部分。 'foreach(@targets){[...]}循環** @ targets **的元素,並在每次迭代中將** $ **設置爲當前元素。 'foreach $ ap(@targets){[...]}'爲每個元素使用** $ ap **而不是** $ _ **。 –

+0

直到您確認字段由基於間隔的間隙(而非位置座標)定義之前,請勿使用此答案。如果每個字段在一行中佔用一定數量的空格,則該腳本可能會在您沒有注意到的情況下巧妙地失敗。 – wespiserA