Last active
January 1, 2016 08:19
-
-
Save MattOates/8117240 to your computer and use it in GitHub Desktop.
Snippet for translating DNA to amino acid sequences, trying to use the most Perl6ish looking code.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
use v6; | |
class BioInfo::Sequence { | |
has Str $.seq; | |
has Str @.residues; | |
submethod BUILD (Str :$seq, Str :@residues) { | |
die X::BioInfo::UnknownResidue.new(seq => $seq, residues => @residues); | |
$!seq := $seq; | |
@!residues := @residues; | |
} | |
} | |
class BioInfo::NucleotideSequence is BioInfo::Sequence { | |
method translate (:$table='standard') { | |
#Get all the combinations of bases that map to the @aminos ordering | |
#my @codons = map *~*~*, (@!bases X @!bases X @!bases); | |
my @codons = [X~] @.residues.item xx 3; | |
#Translation table | |
#TODO add in the weirdy beardy translation tables | |
my %aminos = {standard => <F F L L S S S S | |
Y Y * * C C * W | |
L L L L P P P P | |
H H Q Q R R R R | |
I I I M T T T T | |
N N K K S S R R | |
V V V V A A A A | |
D D E E G G G G>}; | |
#Create a map of the codons to amino acids | |
my %codon_table = zip @codons, %aminos{$table}; | |
#Take all of the codons mapped to aminos and join them together | |
return %codon_table{map *~*~*, $.seq.uc.comb}.join; | |
} | |
} | |
class BioInfo::DNASequence is BioInfo::NucleotideSequence { | |
has Str @.residues = ('T','C','A','G'); | |
} | |
class BioInfo::RNASequence is BioInfo::NucleotideSequence { | |
has Str @.residues = ('U','C','A','G'); | |
} | |
class X::BioInfo::UnknownResidue is Exception { | |
has Str $!seq; | |
has Str @!residues; | |
method message { | |
return "Valid residue " ~ @!residues ~ " was not recognised in " ~ $!seq; | |
} | |
} | |
my $dna = BioInfo::DNASequence.new(seq => 'GTCATAGTCATAGTCATAGTCATA'); | |
my $rna = BioInfo::DNASequence.new(seq => 'GUCAUAGUCAUAGUCAUAGUCAUA'); | |
say $dna.translate; | |
say $rna.translate; |
return %codon_table{map *~*~*, $!seq.uc.comb}.join
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
my @codons = [X~] $@!bases xx 3