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 )