MS
view release on metacpan or search on metacpan
lib/MS/Peptide.pm view on Meta::CPAN
prev => ( $start == 1
? ''
: substr $self->seq, $start-2, 1
),
next => ( $start == $self->length
? ''
: substr $self->seq, $end, 1
),
start => $start,
end => $end,
);
if ($start == 1) {
$pep->{n_mod} = $self->{n_mod};
}
if ($end == $self->length) {
$pep->{c_mod} = $self->{c_mod};
}
for my $i ($start..$end) {
my $i2 = $i - $start + 1;
for my $mod ($self->get_mods($i)) {
$pep->add_mod( $i2, $mod );
}
}
return $pep;
}
sub make_heavy {
my ($self, $loc, $atom) = @_;
# $loc and $atom can be scalar or arrayref
my @locs = ref($loc) ? @$loc : ($loc);
my @atoms = ref($atom) ? @$atom : ($atom);
for my $i (@locs) { # 1-based residue
croak "Residue index out of range\n"
if ( $i < 1 && $i > $self->{length});
for my $a (@atoms) {
my $heavy = $heavy{$a} or croak "No heavy atom defined for $a\n";
$self->{atoms}->[$i-1]->{$heavy}
= delete $self->{atoms}->[$i-1]->{$a};
}
}
return 1;
}
sub mz {
my ($self, %args) = @_;
my $type = $args{type} // 'mono';
my $z = $args{charge} // 1;
my $M = formula_mass('H2O', $type)
+ sum map {atoms_mass($_, $type)} @{ $self->{atoms} };
return ($M + $z * elem_mass('H', $type))/$z;
}
sub neutral_mass {
my ($self, %args) = @_;
my $type = $args{type} // 'mono';
return formula_mass('H2O', $type)
+ sum map {atoms_mass($_, $type)} @{ $self->{atoms} };
}
sub add_mod {
my ($self, $loc, $mod) = @_;
# $loc and $atom can be scalar or arrayref
my @locs = ref($loc) ? @$loc : ($loc);
my $atoms = atoms('mod' => $mod)
// croak "Bad modification\n";
for my $i (@locs) { # 1-based residue
croak "Residue index out of range\n"
if ( $i < 1 || $i > $self->{length});
for my $a (keys %$atoms) {
my $delta = $atoms->{$a};
# removal of heavy atoms is a special case
if ( $delta < 0
&& ! exists $self->{atoms}->[$i-1]->{ $a }
&& exists $self->{atoms}->[$i-1]->{ $heavy{$a} }
) {
$a = $heavy{$a};
}
$self->{atoms}->[$i-1]->{$a} += $delta;
}
++$self->{mods}->[$i-1]->{$mod};
}
return 1;
}
sub get_mods {
my ($self, $loc) = @_;
croak "Residue index out of range\n"
if ( $loc < 1 && $loc > $self->{length});
return () if ! defined $self->{mods}->[$loc-1];
return keys %{ $self->{mods}->[$loc-1] };
}
sub has_mod {
my ($self, $loc, $mod) = @_;
my @locs = ref($loc) ? @$loc
: defined $loc ? ($loc)
( run in 0.591 second using v1.01-cache-2.11-cpan-99c4e6809bf )