【问题标题】:How to take out certain elements from a pdb file如何从 pdb 文件中取出某些元素
【发布时间】:2017-12-09 00:13:54
【问题描述】:

我正在尝试从 pdb 文件中取出某些列。我已经在我的代码中删除了所有以 ATOM 开头的行。出于某种原因,我的子功能不起作用,我不知道在哪里或如何调用它们。 我的代码是:

open (FILE, $ARGV[0])
    or die "Could not open file\n";

my @newlines;
 while ( my $line = <FILE> ) {
    if ($line =~ m/^ATOM.*/) {
    push @newlines, $line;
    }
}

my $atomcount = @newlines;
#print "@newlines\n";
#print "$atomcount\n";

##############################################################
#This function will take out the element from each line
#The element is from column 77 and contains one or two letters

sub atomfreq {
    foreach my $record1(@newlines) {
      my $element = substr($record1, 76, 2);
      print "$element\n";
      return;
    }
}

################################################################
#This function will take out the residue name from each line
#The element is from column 18 and contains 3 letters

sub resfreq {
    foreach my $record2(@newlines) {
      my $residue = substr($record2, 17, 3);
      print "$residue\n";
      return;
    }
}

【问题讨论】:

    标签: bash shell perl pdb-files


    【解决方案1】:

    正如@Ossip 在this answer 中所说,您只需要调用您的函数:

    sub atomfreq {
        ...
    }
    
    sub resfreq {
        ...
    }
    
    atomfreq();
    resfreq();
    

    但是我不确定这些函数是否符合您的预期,因为 cmets 暗示他们应该从 @987654325 打印 每个 $residue$element @ 大批。您已经在for 循环中放置了一个return 语句,它将立即从整个函数(及其for 循环)返回,因此它只会打印第一个$residue$element。因为函数不应该返回任何内容,所以您可以删除该语句:

    sub atomfreq {
        foreach my $record1(@newlines) {
            my $element = substr($record1, 76, 2);
            print "$element\n";
        }
    }
    
    sub resfreq {
        foreach my $record2(@newlines) {
            my $residue = substr($record2, 17, 3);
            print "$residue\n";
        }
    }
    
    atomfreq();
    resfreq();
    

    【讨论】:

    • 哦,我明白了。感谢您的帮助。也可以计算每个元素的数量以及在同一个函数中按字母顺序排列吗??
    • 因为您遍历完整的@newlines,所以$residues 的数量与@newlines 中的元素数量完全相同。无需计算它们。
    • 对不起。我没有说清楚。 atomfreq 函数的输出包含 C、O、N 等字母。我如何按字母顺序排序并计算 C、O、N 或其他元素的呈现方式?再次感谢。
    • 嗯,这将是一个新问题,但我可以给你一个提示:将 $residue 作为键存储在哈希中,并在每次迭代中将值加一(如 my %count; for ... { $residue=...; $count{$residue} += 1; } )。
    【解决方案2】:

    您可以直接在其他代码下调用它们,如下所示:

    atomfreq();
    resfreq();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-22
      • 1970-01-01
      • 1970-01-01
      • 2018-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多