4

我有四个文件。文件 1(命名为 inupt_22.txt)是一个包含两列(空格分隔)的输入文件。第一列是按字母顺序排列的配体代码列表(特定配体的三个字母/数字代码)。第二列是每个配体代码各自的 PDB 代码(蛋白质数据库代码)列表(尽管是未排序的列表)。在此处输入图像描述

文件 1 (input_22.txt):

    803      1cqp    
    AMH      1b2i    
    ASC      1f9g    
    ETS      1cil    
    MIT      1dwc    
    TFP      1ctr     
    VDX      1db1     
    ZMR      1a4g      

文件 2(命名为 SD_2.txt)是每个配体片段的 SDF(结构数据文件)。配体可以包含一个或多个片段。例如,这里的 803 是配体代码,它有两个片段。所以文件看起来像:四个美元符号$$$$(每个片段都遵循相同的内容。接下来,在每个片段的第 5 行(从 开始的第三行$$$$.\n803),有一个数字表示下一行中的行数,例如第一个片段中的 7 和 803 配体的下一个片段中的 10。现在,下一个行块包含一列 (61-62),其中包含引用片段中原子的特定数字。例如在 803 的第一个片段中,这些数字是 15、16、17、19、20、21、22。这些数字需要在文件 3 中匹配。在此处输入图像描述

文件 2 (SD_2.txt) 看起来像:

$$$$    
803    
  SciTegic05101215222D    


  7  7  0  0  0  0            999 V2000    
    3.0215   -0.5775    0.0000 C   0  0  0  0  0  0  0  0  0 15  0  0     
    2.3070   -0.9900    0.0000 C   0  0  0  0  0  0  0  0  0 16  0  0     
    1.5926   -0.5775    0.0000 C   0  0  0  0  0  0  0  0  0 17  0  0      
    1.5926    0.2475    0.0000 C   0  0  0  0  0  0  0  0  0 19  0  0      
    2.3070    0.6600    0.0000 C   0  0  0  0  0  0  0  0  0 20  0  0      
    2.3070    1.4850    0.0000 O   0  0  0  0  0  0  0  0  0 21  0  0      
    3.0215    0.2475    0.0000 O   0  0  0  0  0  0  0  0  0 22  0  0      
  1  2  1  0      
  1  7  1  0       
  2  3  1  0     
  3  4  1  0      
  4  5  1  0      
  5  6  2  0     
  5  7  1  0      
M  END      
> <Name>      
803      

> <Num_Rings>      
1      

> <Num_CSP3>       
4     

> <Fsp3>       
0.8         

> <Fstereo>       
0      

$$$$      
803       
  SciTegic05101215222D       

 10 11  0  0  0  0            999 V2000       
   -1.7992    -1.7457    0.0000 C   0  0  0  0  0  0  0  0  0  1  0  0        
   -2.5137    -1.3332    0.0000 C   0  0  0  0  0  0  0  0  0  2  0  0        
   -2.5137    -0.5082    0.0000 C   0  0  0  0  0  0  0  0  0  3  0  0        
   -1.7992    -0.0957    0.0000 C   0  0  0  0  0  0  0  0  0  5  0  0        
   -1.0847   -0.5082    0.0000 C   0  0  0  0  0  0  0  0  0  6  0  0       
   -0.3702    -0.0957    0.0000 C   0  0  0  0  0  0  0  0  0  7  0  0        
    0.3442     -0.5082    0.0000 C   0  0  0  0  0  0  0  0  0  8  0  0       
    0.3442     -1.3332    0.0000 C   0  0  0  0  0  0  0  0  0  9  0  0        
   -0.3702     -1.7457    0.0000 C   0  0  0  0  0  0  0  0  0 11  0  0      
   -1.0847    -1.3332    0.0000 C   0  0  0  0  0  0  0  0  0 12  0  0       
  1  2  1  0        
  1 10  1  0      
  2  3  1  0      
  3  4  1  0      
  4  5  2  0      
  5  6  1  0      
  5 10  1  0     
  6  7  2  0      
  7  8  1  0      
  8  9  1  0     
 10  9  1  0      
M  END        
> <Name>       
803       

> <Num_Rings>     
2     

> <Num_CSP3>     
6     

> <Fsp3>     
0.6      

> <Fstereo>      
0.1      

文件 3 是 CIF(晶体信息文件)。该文件可从以下链接获得:File_3 该文件是多个配体分子的单个 cif 文件的集合。文件中的每个部分都以data_ligandcode. 对于我们的示例,它将是data_803. 在集合中每个小文件开始的 46 行之后,有一个块提供有关分子的结构信息。此块中的行数不固定。但是,此块以哈希符号 ( #) 结束。在此块中,有两列很重要,它们是 53-56 和 62-63。62-63 列包含可以从文件 2 获得的数字匹配的数字。并且,53-56 包含原子名称等C1 (Carbon 1)。此列可用于与文件 4 匹配。

文件 4 是一个 Grow.out 文件,其中包含有关每个配体与其靶蛋白相互作用的信息。文件名是文件 1 中针对每个配体给出的 PDBcode。例如,对于配体 803,PDBcode 是 1cqp。因此,grow.out 文件的名称为 1cqp。1cqp 在这个文件中,那些行很重要,那些包含配体代码(例如 803)和从文件 3 的 53-56 列获得的原子名称。

任务:我需要一个从文件 1 中读取配体代码的脚本,然后转到文件 2 搜索$$$$ . \nLigandcode然后从第 61-62 列中获取每个片段的编号。然后在下一步中,我的脚本应该将这些数字传递给文件 3,并匹配文件 3 的第 62-63 列中包含这些数字的行,然后提取第 53-56 列(原子名称)中的信息。最后一步是打开名为 PDBcode 的文件 4,然后打印包含配体代码和从文件 3 获得的原子名称的行。打印应在输出文件中完成。

我是一名生物医学研究的学生。我没有计算机科学背景。但是,我必须使用 Perl 编程来完成某些任务。对于上面提到的任务,我写了一个脚本,但它不能正常工作,我找不到它背后的原因。我写的脚本是:

#!/usr/bin/perl
use strict;
use warnings;
use Text::Table;
use Carp qw(croak);

{

    my $a;
    my $b;
    my $input_file = "input_22.txt";
    my @lines = slurp($input_file);
    for my $line (@lines){
        my ($ligandcode, $pdbcode) = split(/\t/, $line);
        my $i=0;
        my $k=0;

        my @array;
        my @array1;

        open (FILE, '<', "SD_2.txt");


        while (<FILE>) {
            my $i=0;
            my $k=0;

            my @array;
            my @array1;

            if ( $_=~/\x24\x24\x24\x24/ . /\n$ligandcode/) {


                my $nextline1 = <FILE>;
                my $nextline2 = <FILE>;
                my $nextline3 = <FILE>;
                my $nextline4= <FILE>;

                my $totalatoms= substr( $nextline4, 1,2);
                print $totalatoms,"\n";
                while ($i<$totalatoms)
                  {

                      my $nextlines= <FILE>;

                      my $sub= substr($nextlines, 61, 2);
                      print $sub;
                      $array[$i] = $sub;
                      open (FH, '<', "components.txt");

                      while (my $ship=<FH>) {
                          my $var="data_$ligandcode";
                          if ($ship=~/$var/)


                            {

                                while ($k<=44)
                                  {
                                      $k++;
                                      my $nextline = <FH>;

                                  }

                                my $j=0;
                                my $nextline3;
                                do
                                  {

                                      $nextline3=<FH>;
                                      print $nextline3;

                                      my $part= substr($nextline3, 62, 2);
                                      my $part2= substr($nextline3, 53, 4);
                                      $array1[$j] = $part;
                                      if ($array1[$j] eq $array[$i])
                                        {
                                            print $part2, "\n";
                                            open (GH, '<', "$pdbcode"); 
                                            open (OH, ">>out_grow.txt");
                                            while (my $grow = <GH>)
                                              {
                                                  if ( $grow=~/$ligandcode/){
                                                      print OH $grow if $grow=~/$part2/; 
                                                  }}
                                            close (GH);
                                            close (OH);
                                        }

                                      $j++;
                                  } while $nextline3 !~/\x23/;
                            }
                      }
                      $i++;
                      close (FH);
                  }

            }}

        close (FILE);

    }
}


##Slurps a file into a list
sub slurp {
    my ($file) = @_;
    my (@data, @data_chomped);
    open IN, "<", $file or croak "can't open $file\n";
    @data = <IN>;
    for my $line (@data){
        chomp($line);
        push (@data_chomped, $line);
    }
    close IN;
    return (@data_chomped);
}

如果我在文件 1 中列出 400 个分子的列表,我想让它成为一个运行速度快且总共适用于 1000 个片段的脚本。请帮助我使这个脚本工作。我将不胜感激。

4

1 回答 1

1

您需要将代码分解为可管理的步骤。

  1. 从文件创建数据结构

    use Slurp;
    
    my @input = map{
      [ split /\s+/, $_, 2 ]
    } slurp $input_filename;
    
    # etc
    
  2. input_22.txt使用这些数据结构处理 的每个元素。

我真的认为你应该研究PerlMol。毕竟,使用 Perl 的一半原因是CPAN


你做得好的事情

  • 使用 3-argopen
  • use strict;
  • use warnings;

你不应该做的事情

  • (重新)定义$a并且$b
    它们已经为您定义了。
  • 重新实现slurp(差)
  • 多次读取同一个文件。您为每行
    打开一次.SD_2.txtinput_22.txt
  • 在您使用它们的范围之外定义的符号。
    $j, $k,@array@array1定义了两次,但只使用了其中一个定义。
  • 使用open并且close没有某种错误检查。
    要么open ... or die;use autodie;
  • 您使用了裸字文件句柄。IN, FILEetc
    而是使用open my $FH, ...

不过,对于一次性计划而言,其中大多数都不是什么大不了的事。

于 2012-06-06T22:07:59.717 回答