我有四个文件。文件 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 个片段的脚本。请帮助我使这个脚本工作。我将不胜感激。