2013-08-06 2 views
0

temp.bgf에게펄 중첩 루프 : 배열 - 최소 거리

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 무엇을 의미하는지 명확히 수 없습니다. 나는 초보자이다. – user2605011

+0

이것은 foreach 루프 구문의 일부입니다. 'foreach (@targets) {[...]}'는 ** @ targets **의 요소를 반복하고 각 반복의 현재 요소에 ** $ _ **를 설정합니다. 'foreach $ ap (@targets) {[...]}'는 ** $ _ ** 대신에 각 요소에 대해 ** $ ap **를 사용합니다. –

+0

필드가 간격 띄우기 간격으로 정의되고 위치 좌표가 아니라는 것을 확인할 때까지이 대답을 사용하지 마십시오. 각 필드가 한 행에 설정된 수의 공백을 차지한다면이 스크립트는 눈치 채지 않고 미묘하게 실패 할 수 있습니다 ... – wespiserA