4

私は4つのファイルを持っています。ファイル 1 (inupt_22.txt という名前) は、2 つの列 (スペース区切り) を含む入力ファイルです。最初の列は、リガンドコード (特定のリガンドの 3 文字/数字コード) のアルファベット順のリストです。2 番目の列は、各リガンドコードに対応する PDB コード (Protein Data Bank コード) のリストです (ソートされていないリストです)。ここに画像の説明を入力

ファイル 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 (構造データ ファイル) です。リガンドは、1つまたは複数のフラグメントを含むことができます。たとえば、ここで 803 はリガンドコードで、2 つのフラグメントがあります。したがって、ファイルは次のようになります: 4 つのドル記号 ( $$$$) の後に配位子コード (この例では 803) が次の行に続きます。すべてのフラグメントは同じことに従います。次に、各フラグメントの 5 行目 ( の 3 行目$$$$.\n803) には、803 リガンドの最初のフラグメントでは 7、次のフラグメントでは 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 (Crystalographic Information file) です。このファイルは次のリンクから取得できます: File_3 このファイルは、いくつかのリガンド分子の個々の cif ファイルのコレクションです。ファイルの各部分は で始まりますdata_ligandcode。この例では、 になりますdata_803。コレクション内の各小さなファイルの先頭から 46 行の後に、分子に関する構造情報を提供するブロックがあります。このブロックの行数は固定されていません。ただし、このブロックはハッシュ記号 ( #) で終了します。このブロックでは、53-56 と 62-63 の 2 つの列が重要です。62-63 列には、ファイル 2 から取得した番号と一致する番号が含まれます。また、53-56 には、C1 (Carbon 1)などの原子名が含まれます。この列は、ファイル 4 との一致に使用できます。

ファイル 4 は、各リガンドとその標的タンパク質との相互作用に関する情報を含む Grow.out ファイルです。ファイル名は、各リガンドに対してファイル 1 で指定された PDBcode です。たとえば、リガンド 803 の場合、PDB コードは 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 引数の使用open
  • use strict;
  • use warnings;

やってはいけないこと

  • (再) 定義され$a$b
    それらは既に定義されています。
  • 再実装slurp(不十分)
  • 同じファイルを複数回読み取ります。の行ごとに 1 回
    開きました。SD_2.txtinput_22.txt
  • シンボルを使用する範囲外で定義されたシンボル。
    $j$k@arrayおよび@array1が 2 回定義されていますが、使用されている定義は 1 つだけです。
  • ある種のエラーチェックなしで使用openされます。 または_close
    open ... or die;use autodie;
  • 裸のファイルハンドルを使用しました。INFILEなど
    代わりに使用open my $FH, ...

ただし、これらのほとんどは、1 回限りのプログラムの場合、それほど大きな問題ではありません。

于 2012-06-06T22:07:59.717 に答える