2012-01-05 17 views
-3

私はそれぞれが3次元点の集合の座標を持つ2つの配列を持っています。私は翻訳を適用して両方を重ね合わせた。私は2番目の配列(スティック)から特定のカットオフ距離を持つ配列からいくつかのポイント(赤いボール)を削除したいと思います。ある配列内の点のセットを別の配列内の別の点のセットから削除する。 Perl

use List::Util 'max'; 


open(FILE,"1L2Y.pdb"); 
@pro_cont=<FILE>; 
######################## CENTROID OF sticks ########################################## 
foreach (@pro_cont){ 
if (/^ATOM/){ 
$lines++; 
@array=split('',$_); 
@[email protected][31..38]; 
$x=join('',@x); 
$x=~s/\s//g; 
@[email protected][39..46]; 
$y=join('',@y); 
$y=~s/\s//g; 
@[email protected][47..54]; 
$z=join('',@z); 
$z=~s/\s//g; 
$sum_x+=$x; 
$sum_y+=$y; 
$sum_z+=$z; 
}} 
$avg_x=sprintf "%.3f",($sum_x/$lines); 
$avg_y=sprintf "%.3f",($sum_y/$lines); 
$avg_z=sprintf "%.3f",($sum_z/$lines); 

print "The centroid of protein is $avg_x, $avg_y, $avg_z \n"; 
################################################################################################ 


######################RADIUS OF sticks###################################### 
foreach (@pro_cont){ 
if (/^ATOM/){ 
$lines++; 
@array=split('',$_); 
@[email protected][31..38]; 
$x=join('',@x); 
$x=~s/\s//g; 
@[email protected][39..46]; 
$y=join('',@y); 
$y=~s/\s//g; 
@[email protected][47..54]; 
$z=join('',@z); 
$z=~s/\s//g; 
$dx=$avg_x-$x; 
$dy=$avg_y-$y; 
$dz=$avg_z-$z; 
$distance=sqrt(($dx**2)+($dy**2)+($dz**2)); 
push(@array_distance,$distance); 
}} 
$max=max(@array_distance); 
$radius=sprintf "%.1f",$max; 
print "The Radius of protein is $radius \n"; 
############################################################################### 

################ points GRID ########################### 
@arr_grid=(); 
$g=0; 
$diameter=$radius*2; 
for($i=0.000;$i<=$diameter;$i+=2.000){ 
for($j=0.000;$j<=$diameter;$j+=2.000){ 
for($k=0.000;$k<=$diameter;$k+=2.000){ 
$i=~ s/(....).*/$1/g; 
$j=~ s/(....).*/$1/g; 
$k=~ s/(....).*/$1/g; 

@arr_grid[$g]=$i."  ".$j."  ".$k."\n"; 
$g++; 
}}} 
$c=scalar @arr_grid; 
for($l=0;$l<$c;$l++){ 
#print "HETATM  O     @arr_grid[$l]\n"; 
} 
foreach (@arr_grid){ 
@line=split('\s+',$_); 
@[email protected][0]; 
$x_grid=join('',@x_grid); 
$x_grid=~s/\s//g; 
@[email protected][1]; 
$y_grid=join('',@y_grid); 
$y_grid=~s/\s//g; 
@[email protected][2]; 
$z_grid=join('',@z_grid); 
$z_grid=~s/\s//g; 
$sum_x_grid+=$x_grid; 
$sum_y_grid+=$y_grid; 
$sum_z_grid+=$z_grid; 
} 
$avg_x_grid=sprintf "%.3f",($sum_x_grid/$c); 
$avg_y_grid=sprintf "%.3f",($sum_y_grid/$c); 
$avg_z_grid=sprintf "%.3f",($sum_z_grid/$c); 

print "Centroid of grid is $avg_x_grid,$avg_y_grid,$avg_z_grid"; 
$diff_x=sprintf"%.0f",($avg_x_grid-$avg_x); 
$diff_y=sprintf"%.0f",($avg_y_grid-$avg_y); 
$diff_z=sprintf"%.0f",($avg_z_grid-$avg_z); 

foreach (@arr_grid){ 
@line=split('\s+',$_); 
@[email protected][0]; 
$x_grid=join('',@x_grid); 
$x_grid=~s/\s//g; 
@[email protected][1]; 
$y_grid=join('',@y_grid); 
$y_grid=~s/\s//g; 
@[email protected][2]; 
$z_grid=join('',@z_grid); 
$z_grid=~s/\s//g; 
$i=$x_grid-$diff_x; 
$j=$y_grid-$diff_y; 
$k=$z_grid-$diff_z; 
print "HETATM  O     $i  $j  $k\n"; 
} 



foreach (@arr_grid){ 
@line=split('\s+',$_); 
@[email protected][0]; 
$x_grid=join('',@x_grid); 
$x_grid=~s/\s//g; 
@[email protected][1]; 
$y_grid=join('',@y_grid); 
$y_grid=~s/\s//g; 
@[email protected][2]; 
$z_grid=join('',@z_grid); 
$z_grid=~s/\s//g; 
$dx_grid=$avg_x_grid-$x_grid; 
$dy_grid=$avg_y_grid-$y_grid; 
$dz_grid=$avg_z_grid-$z_grid; 
$distance_grid=sqrt(($dx_grid**2)+($dy_grid**2)+($dz_grid**2)); 

if($distance_grid <=10){ 
#print "HETATM  O     $x_grid  $y_grid  $z_grid\n"; 
}} 

とコードが進むが、私は私がnegetive票を持って、なぜ私は、行うことができますワットやった、任意のホーム仕事をしていなくて、このQUE投稿DINT、私は理解くぼみ。

+1

この画像は、Photoshopでそれらの点を取り除く手助けをしたい場合に役立ちます。Perlでそれを使いたい場合は、関連するPerlコードの共有が何千倍も便利です。 – flesk

答えて

1
foreach my $s (@sticks) { 
     my @keepers=(); 
     foreach my $p (@points) { 
     push @keepers, $p if $s->distance($p) > $cutoff; 
     } 
     @[email protected]; 
} 

上記の擬似コードは次で、コピーの多くを行います(あなたは(スプライス場合、私は内側のループが何をするか分からない)、それのうち、現在のポイントそれを見て、あまりにも怠惰&午前。それは、

関連する問題