MS
view release on metacpan or search on metacpan
lib/MS/Protein.pm view on Meta::CPAN
package MS::Protein;
use strict;
use warnings;
use Carp;
use Exporter qw/import/;
use List::Util qw/sum/;
use List::MoreUtils qw/any uniq/;
use Scalar::Util qw/blessed/;
use MS::Mass qw/:all/;
use MS::CV qw/:MS regex_for/;
use MS::Peptide;
use parent qw/MS::Peptide/;
BEGIN {
*ec = \&extinction_coefficient;
*pI = \&isoelectric_point;
*ai = \&aliphatic_index;
*mw = \&molecular_weight;
}
our @EXPORT_OK = qw/
digest
isoelectric_point
pI
molecular_weight
mw
gravy
aliphatic_index
ai
n_residues
n_atoms
extinction_coefficient
ec
charge_at_pH
/;
our %EXPORT_TAGS = (
all => \@EXPORT_OK,
);
# build lookup tables
my $kyte_doolittle = _kyte_doolittle();
my $pK = _pK();
my $pKt = _pKt();
sub molecular_weight {
my ($seq, $type) = @_;
return sum( map {aa_mass($_, $type) // return undef}
split('', $seq) ) + formula_mass('H2O');
}
sub n_atoms {
my ($seq) = @_;
my %counts;
++$counts{$_} for (split '', $seq);
my %atoms = (H => 2, O => 1);
for my $aa (keys %counts) {
my $a = atoms('aa' => $aa);
$atoms{$_} += $a->{$_}*$counts{$aa} for (keys %$a);
}
return \%atoms;
}
sub n_residues {
my ($seq) = @_;
my %counts;
++$counts{$_} for (split '', $seq);
return \%counts;
}
sub aliphatic_index {
my ($seq) = @_;
$seq = "$seq";
my $mf_A = $seq =~ tr/A//;
my $mf_V = $seq =~ tr/V//;
my $mf_IL = $seq =~ tr/IL//;
return ($mf_A + 2.9*$mf_V + 3.9*$mf_IL) * 100 / length($seq);
}
sub extinction_coefficient {
my ($seq, %args) = @_;
my $is_reduced = $args{reduced};
$seq = "$seq";
my $Y = $seq =~ tr/Y//;
my $W = $seq =~ tr/W//;
my $C = $seq =~ tr/C//;
return $is_reduced
? 1490*$Y + 5500*$W
: 1490*$Y + 5500*$W + 125*int($C/2);
}
sub gravy {
my ($seq) = @_;
return sum( map {$kyte_doolittle->{$_}} split( '', $seq) )
( run in 0.735 second using v1.01-cache-2.11-cpan-99c4e6809bf )