私は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 個のフラグメントに対して機能するスクリプトを作成したいと考えています。このスクリプトを機能させるために親切に助けてください。感謝します。