2

所以我试图将一条互补的 DNA 链翻译成它各自的氨基酸。到目前为止,我有这个代码:

#!/usr/bin/perl

open (INFILE, "sumaira2.out");
open (OUTFILE3, ">>sumaira3.out");

%aacode = (
  TTT => "F", TTC => "F", TTA => "L", TTG => "L",
  TCT => "S", TCC => "S", TCA => "S", TCG => "S",
  TAT => "Y", TAC => "Y", TAA => "STOP", TAG => "STOP",
  TGT => "C", TGC => "C", TGA => "STOP", TGG => "W",
  CTT => "L", CTC => "L", CTA => "L", CTG => "L",
  CCT => "P", CCC => "P", CCA => "P", CCG => "P",
  CAT => "H", CAC => "H", CAA => "Q", CAG => "Q",
  CGT => "R", CGC => "R", CGA => "R", CGG => "R",
  ATT => "I", ATC => "I", ATA => "I", ATG => "M",
  ACT => "T", ACC => "T", ACA => "T", ACG => "T",
  AAT => "N", AAC => "N", AAA => "K", AAG => "K",
  AGT => "S", AGC => "S", AGA => "R", AGG => "R",
  GTT => "V", GTC => "V", GTA => "V", GTG => "V",
  GCT => "A", GCC => "A", GCA => "A", GCG => "A",
  GAT => "D", GAC => "D", GAA => "E", GAG => "E",
  GGT => "G", GGC => "G", GGA => "G", GGG => "G",
); # this is the hash table for the amino acids

while ($line=<INFILE>){
  $codon = $codon.$line;
  @array = split "",$codon;
} # splits all the characters in the text

for ($count = 0; $count<scalar@array; $count= $count + 3) {
  $codon = $codon.$array[$count].$array[$count+1].$array[$count+2];
  $aminoacid = $aacode{$codon};
} # tells how to read the codon and execute the hash table

$protein = $protein.$aminoacid; #catenate the string

print OUTFILE3 $protein;

我的 infile 已经有反向互补 DNA,我只是想翻译它。出于某种原因,我的输出中没有任何内容。我不知道出了什么问题,因为终端也没有给我任何错误。任何帮助将不胜感激。

这是我要翻译的文件示例:

TCGTCGCCTCCCCAACCTAGGTAGTCCGTTGCTGCCCGACGACGGCCGGTAGTCGCCT GCGTCCCTCCTGAAAGGCGTTGGCCGGCAAGCTACGCCGTGGCTACCGGAAGCGCGTCCCCATCAC GCGGTCCTAACTGAACGCGACGGGATGGAGAGTGATCACTCCCCGCCGTCGCGTAGTTCGCCACTC

并且它继续运行 17 行。

4

5 回答 5

1

也许以下内容会有所帮助:

use strict;
use warnings;

my %aacode = (
  TTT => "F", TTC => "F", TTA => "L", TTG => "L",
  TCT => "S", TCC => "S", TCA => "S", TCG => "S",
  TAT => "Y", TAC => "Y", TAA => "STOP", TAG => "STOP",
  TGT => "C", TGC => "C", TGA => "STOP", TGG => "W",
  CTT => "L", CTC => "L", CTA => "L", CTG => "L",
  CCT => "P", CCC => "P", CCA => "P", CCG => "P",
  CAT => "H", CAC => "H", CAA => "Q", CAG => "Q",
  CGT => "R", CGC => "R", CGA => "R", CGG => "R",
  ATT => "I", ATC => "I", ATA => "I", ATG => "M",
  ACT => "T", ACC => "T", ACA => "T", ACG => "T",
  AAT => "N", AAC => "N", AAA => "K", AAG => "K",
  AGT => "S", AGC => "S", AGA => "R", AGG => "R",
  GTT => "V", GTC => "V", GTA => "V", GTG => "V",
  GCT => "A", GCC => "A", GCA => "A", GCG => "A",
  GAT => "D", GAC => "D", GAA => "E", GAG => "E",
  GGT => "G", GGC => "G", GGA => "G", GGG => "G",
); # this is the hash table for the amino acids

my $compDNA = uc do { local $/; <> };
$compDNA =~ s/\s+//g;

my @codons = unpack '(A3)*', $compDNA;
my @aminoAcids = map { exists $aacode{$_} ? $aacode{$_} : "?$_?" } @codons;
print join '', @aminoAcids;

用法:perl script.pl compDNA_File [>aminoAcid_File]

最后一个可选参数将输出定向到文件。

首先,整个文件被 slurped(并转换为全部大写)到一个变量中。接下来,删除所有空格。 unpack用于创建三字符元素(密码子)的列表。 map用于使用您提供的哈希将密码子翻译成氨基酸。(请注意,如果没有密码子的键,则插入密码子,并用问号括起来。)最后,这些氨基酸被join编辑成一个字符串,结果被print编辑。

于 2014-02-04T04:11:27.267 回答
0

好了朋友们,

所以我问了我的教授,我的代码有很多问题。首先,我使用 $codon 两次,同时希望它做两件不同的事情(我在 while 循环中使用了一次,在 for 循环中使用了一次)。所以它将整个 infile 视为一个 $codon,然后在它之后执行哈希表。第二个错误(正如其他人之前提到的)是 $protein 不在 for 循环中,因此只会给我最后一个氨基酸。无论如何,这是更正的功能代码:

open (INFILE, "sumaira2.out");
open (OUTFILE3, ">sumaira3.out");

%aacode = (
TTT => "F", TTC => "F", TTA => "L", TTG => "L",
TCT => "S", TCC => "S", TCA => "S", TCG => "S",
TAT => "Y", TAC => "Y", TAA => "STOP", TAG => "STOP",
TGT => "C", TGC => "C", TGA => "STOP", TGG => "W",
CTT => "L", CTC => "L", CTA => "L", CTG => "L",
CCT => "P", CCC => "P", CCA => "P", CCG => "P",
CAT => "H", CAC => "H", CAA => "Q", CAG => "Q",
CGT => "R", CGC => "R", CGA => "R", CGG => "R",
ATT => "I", ATC => "I", ATA => "I", ATG => "M",
ACT => "T", ACC => "T", ACA => "T", ACG => "T",
AAT => "N", AAC => "N", AAA => "K", AAG => "K",
AGT => "S", AGC => "S", AGA => "R", AGG => "R",
GTT => "V", GTC => "V", GTA => "V", GTG => "V",
GCT => "A", GCC => "A", GCA => "A", GCG => "A",
GAT => "D", GAC => "D", GAA => "E", GAG => "E",
GGT => "G", GGC => "G", GGA => "G", GGG => "G",
); # this is the hash table for the amino acids

while ($line=<INFILE>){
$line =~ s/\s+$//;
$sequence = $sequence.$line;
@array = split "",$sequence;
 } # splits all the characters in the text

for ($count = 0; $count<=scalar @array-3; $count= $count + 3) {
$codon = $array[$count].$array[$count+1].$array[$count+2];
$aminoacid = $aacode{$codon};
$protein = $protein.$aminoacid; #catenate the string

} # tells how to read the codon and execute the hash table


print OUTFILE3 $protein;

再次感谢大家的帮助,很抱歉我花了这么长时间才回来!

于 2014-02-07T19:00:54.587 回答
0

你不想放

print OUTFILE3 $protein;

在你的 for 循环中,你打印出你正在处理的每一个蛋白质,而不是你在 for 循环完成运行后剩下的最后一个,像这样?

for ($count = 0; $count<scalar@array; $count= $count + 3) {
  $codon = $codon.$array[$count].$array[$count+1].$array[$count+2];
  $aminoacid = $aacode{$codon};

  print OUTFILE3 $aminoacid;

} # tells how to read the codon and execute the hash table
于 2014-02-04T03:30:08.043 回答
0

尝试下面的脚本执行为scriptname < sumaira2.out >> sumaira3.out.
如果它按预期工作,则设置$DEBUG为零以删除调试输出。

#!/usr/bin/perl
use strict; use warnings;

my $DEBUG = 2;

my %aacode = (
TTT => "F", TTC => "F", TTA => "L", TTG => "L",
TCT => "S", TCC => "S", TCA => "S", TCG => "S",
TAT => "Y", TAC => "Y", TAA => "STOP", TAG => "STOP",
TGT => "C", TGC => "C", TGA => "STOP", TGG => "W",
CTT => "L", CTC => "L", CTA => "L", CTG => "L",
CCT => "P", CCC => "P", CCA => "P", CCG => "P",
CAT => "H", CAC => "H", CAA => "Q", CAG => "Q",
CGT => "R", CGC => "R", CGA => "R", CGG => "R",
ATT => "I", ATC => "I", ATA => "I", ATG => "M",
ACT => "T", ACC => "T", ACA => "T", ACG => "T",
AAT => "N", AAC => "N", AAA => "K", AAG => "K",
AGT => "S", AGC => "S", AGA => "R", AGG => "R",
GTT => "V", GTC => "V", GTA => "V", GTG => "V",
GCT => "A", GCC => "A", GCA => "A", GCG => "A",
GAT => "D", GAC => "D", GAA => "E", GAG => "E",
GGT => "G", GGC => "G", GGA => "G", GGG => "G",
); # this is the hash table for the amino acids

my ($codon, $protein)  = ('','');
while (<STDIN>){
  chomp; # remove end of line characters
  s/\s//g; # remove whitespaces
  $codon .= $_;
}

print STDERR "DBG Codon: ", $codon, "\n" if $DEBUG >= 1;

my @aminoacids = ( $codon =~ /(...)/sg );

print STDERR "Aminoacids: ", join(" ", @aminoacids), "\n" if $DEBUG >= 2;

for my $aminoacid (@aminoacids) {
  die "Unknown aminoacid: $aminoacid\n" unless exists $aacode{$aminoacid};
  $protein .=  $aacode{$aminoacid};
}

print STDERR "DBG Protein: ", $protein, "\n" if $DEBUG >= 1;

print $protein, "\n";
于 2014-02-04T03:32:13.363 回答
0

我强烈推荐使用 BioPerl 来解决这些类型的任务,或者其他一些库/工具包。原因是除了有3个阅读框外,还有16个密码子表。在我看来,人们已经在这个问题上花费了太多精力(我也没有看到任何正确的解决方案),并且做任何不平凡的事情都需要更多的工作和代码。这是一个使用标准密码子表进行翻译的简单示例。

#!/usr/bin/env perl

use strict;
use warnings;
use Bio::SeqIO;

my $usage = "$0 nt.fasta";
my $file  = shift or die $usage;
my $seqio = Bio::SeqIO->new(-file => $file); 

my $seqobj = $seqio->next_seq;   # create a Bio::Seq object
my $trans  = $seqobj->translate; # call the translate method 
                                 # on the Bio::Seq object

print $trans->seq;               # $trans is a Bio::Seq object, 
                                 # so we call the seq method to get the sequence

您可以针对多个序列稍作修改,或使用不同的密码子表。您还可以包含自定义密码子表。BioPerl HOWTO页面上有一个很好的翻译序列的教程。

编辑:我尝试的另外两个解决方案仅适用于序列,但不要像我假设的那样解析 Fasta 格式。一个主要的实际考虑是您应该在翻译中插入一个符号(默认是 BioPerl 的星号,但您可以将其更改为任何您喜欢的)而不是单词“STOP”,因为它不会被任何其他工具识别. 肉眼也很难辨别。

于 2014-02-05T23:01:54.157 回答