如果满足条件,则计算结果的大小并将文件移动到另一个文件夹中

时间:2018-02-05 09:40:27

标签: perl

我试图计算蛋白质(ATOM)和配体原子(HETATM)之间的距离。我从pdb文件和配体原子获得的蛋白质原子我已经分离了不同数量的txt文件。我使用substring将坐标分隔成一个数组,我给出了每个坐标名称(x, y and z)。具有配体坐标的文件如下所示:

文件1:

HETATM 2244  C1  QWE H 373      17.735 -17.178  22.612  1.00 26.29           C  
HETATM 2245  C2  QWE H 373      18.543 -17.350  21.462  1.00 26.22           C  
HETATM 2246  C3  QWE H 373      19.877 -17.046  21.558  1.00 26.06           C  
HETATM 2247  C4  QWE H 373      20.401 -16.566  22.766  1.00 26.60           C  
HETATM 2248  C4A QWE H 373      19.613 -16.358  23.893  1.00 27.46           C  
HETATM 2249  C5  QWE H 373      20.084 -15.791  25.046  1.00 28.32           C  
HETATM 2250  C6  QWE H 373      19.241 -15.568  26.114  1.00 27.47           C  
HETATM 2251  C7  QWE H 373      17.893 -15.971  26.028  1.00 27.79           C  
HETATM 2252  C8  QWE H 373      17.370 -16.510  24.879  1.00 26.51           C  
HETATM 2253  C8A QWE H 373      18.205 -16.689  23.809  1.00 26.70           C  

文件2:

  HETATM 2225  N   TYS I 363      15.901   2.361  -4.748  1.00 44.75           N  
    HETATM 2226  CA  TYS I 363      16.482   2.005  -3.448  1.00 44.52           C  
    HETATM 2227  CB  TYS I 363      15.434   1.805  -2.340  1.00 42.26           C  
    HETATM 2228  CG  TYS I 363      14.580   3.049  -2.234  1.00 39.78           C  
    HETATM 2229  CD1 TYS I 363      15.156   4.304  -2.015  1.00 37.81           C  
    HETATM 2230  CD2 TYS I 363      13.219   2.924  -2.545  1.00 40.71           C  
    HETATM 2231  CE1 TYS I 363      14.343   5.432  -2.005  1.00 38.74           C

ATOM文件分离的蛋白质坐标(pdb)如下所示:

ATOM   2190  O   GLU I 357       7.971  -5.002  -1.496  1.00 41.97           O  
ATOM   2191  CB  GLU I 357       4.752  -5.053  -1.745  1.00 42.96           C  
ATOM   2192  CG  GLU I 357       3.774  -4.690  -2.826  1.00 44.81           C  
ATOM   2193  CD  GLU I 357       3.513  -3.238  -3.102  1.00 46.56           C  
ATOM   2194  OE1 GLU I 357       3.364  -2.632  -2.025  1.00 45.88           O  
ATOM   2195  OE2 GLU I 357       3.416  -2.667  -4.193  1.00 47.58           O  

我编写了一个脚本来计算这些蛋白质和配体原子之间的距离,如果满足特定条件的结果,它应该将ligand txt files移动到另一个文件夹中。

这是结果的一部分:

QWE#I#363.txt
16
11.2
2.40023269705252
3.77980634424569
4.84684722267991
4.8225354327366
4.96742287308016
5.0893916139358
5.44698035612393
5.53698961530541
5.69511940173338
6.58882887924706
8.17976515555306
8.36770577876636
8.60629182633264
8.94395818415985
4.50089380012459
5.57823843161979

这是剧本:

#!/usr/local/bin/perl

use strict;
use warnings;
use File::Glob;

mkdir "covalently_bound";
mkdir"5<dist>2";
mkdir"5<dist>4";
mkdir"6<dist>5"

for my $pdbs (glob '*pdb')
{
    printf "%s\n", $pdbs;
    open my $pdb, "<" ,$pdbs;

    while (my $pdb_lines = <$pdb>)
    {
        chomp($pdb_lines);

        if($pdb_lines=~/^ATOM /)
        {
            my @prot_atoms= split '\t', $pdb_lines;
            #print "@prot_atoms\n";
            my @pdb_coord = (substr($pdb_lines, 30, 8),substr($pdb_lines,38,8),substr($pdb_lines,46,8));
            #print "@pdb_coord\n";
            my $x = substr($pdb_lines, 30, 8);
            my $y = substr($pdb_lines,38,8);
            my $z = substr($pdb_lines,46,8);

            foreach my $txt (glob '*txt')
            {
                printf "%s\n", $txt;
                open my $fh, "<" ,$txt;
                my @lines= <$fh>;
                my $file_sz = scalar@lines;
                print "$file_sz\n";
                #print "@lines\n";
                my $c;

                for ($c=0; $c<=$#lines; $c++)
                {
                    chomp ($lines[$c]);

                    if ($lines[$c] =~ m/^HETATM/)
                    {   
                         my @lig_atoms= split '\t', $lines [$c];
                         #print "@lig_atoms\n";
                         my @lig_coord = (substr($lines [$c], 30, 8),substr($lines [$c],38,8),substr($lines [$c],46,8));
                         #print "@lig_coord\n";
                         my $x1 = substr($lines [$c],30, 8);
                         my $y1 = substr($lines [$c],38,8);
                         my $z1 = substr($lines [$c],46,8);

                         my $dist = sqrt( ($x-$x1)**2 + ($y-$y1)**2 + ($z-$z1)**2 );
                         print "$dist\n";
                         #my $dist_sz = ?;     #Here I am not sure how to calculate the size of the result and to include it into if loop.

                         if ($dist < 2)
                         {
                             close ($fh);   
                             system ("mv $txt covalently_bound");
                             last;
                         }

                         if ($dist_sz >= 70% and 4<$dist>2 )
                         {
                             system ("mv $txt 4<dist>2");
                         }

                         if ($dist_sz >= 70% and 5<$dist>4)
                         {
                             system ("mv $txt 5<dist>4");
                         }

                         if ($dist_sz >= 70% and 6<$dist>5)
                         {
                             system ("mv $txt 6<dist>5");
                         } 
                    }   
                }
            }
        }
    }    
}

脚本正在运行,我没有收到任何错误,但我遇到了两个我不知道如何解决的问题:

1st:

我想计算每个配体原子(HETATM)和所有蛋白质原子(ATOM)之间的距离。所以,HETATM1ATOM1; HETATM2ATOM1; HETATM3ATOM1等等。

2nd:

每次计算(或每个配体文件)的距离结果应该很大。我想检查每个结果的大小,并设置一个条件,如果结果的70%多于不同数字之间的值,则将其移动到另一个目录中。

我不知道我该怎么做这两件事,一直在挣扎几天,如果有人可以提供帮助或给出一些建议我会很感激!

0 个答案:

没有答案