MS

 view release on metacpan or  search on metacpan

lib/MS/Reader/MzXML.pm  view on Meta::CPAN

use List::Util qw/first/;

use MS::Reader::MzXML::Spectrum;

sub _pre_load {

    my ($self) = @_;

    # ---------------------------------------------------------------------------#
    # These tables are the main configuration point between the parser and the
    # specific document schema. For more information, see the documentation
    # for the parent class MS::Reader::XML
    # ---------------------------------------------------------------------------#

    #$self->{_toplevel} = 'msRun';
    $self->{__rt_index} = undef;

    $self->{__record_classes} = {
        scan => 'MS::Reader::MzXML::Spectrum',
    };

    $self->{_skip_inside} = { map {$_ => 1} qw/
        scan
        index
    / };

    $self->{_make_index} = {
        scan => 'num',
    };

    $self->{_make_named_array} = {
        userParam => 'name',
    };

    $self->{_make_named_hash} = {
        msInstrument        => 'msInstrumentID',
        nameValue           => 'name',
        processingOperation => 'name',
        spot                => 'spotID',
    };

    $self->{_make_anon_array} = { map {$_ => 1} qw/
        comment
        event
        dataProcessing
        parentFile
    / };

}


sub _load_new {

    my ($self) = @_;

    $self->SUPER::_load_new();

    if (defined $self->{mzXML}->{sha1}) {

        # compare supplied and calculated SHA1 sums to validate
        my $sha1_given = $self->{mzXML}->{sha1}->{pcdata};
        croak "ERROR: SHA1 digest mismatch\n"
            if ($sha1_given ne $self->_calc_sha1);

    }

    # Outer <msRun> may optionally be wrapped in <mzXML> tags. For
    # consistent downstream handling, everything outside <msRun> should be
    # discarded before returning.
    if (defined $self->{mzXML}) {
        $self->{msRun} = $self->{mzXML}->{msRun};
        delete $self->{mzXML};
    }

    return;

}

sub fetch_spectrum {

    my ($self, $idx, %args) = @_;
    return $self->fetch_record($self->{msRun}, $idx, %args);

}

sub next_spectrum {

    my ($self, %args) = @_;
    return $self->next_record( $self->{msRun}, %args );

}

sub find_by_time {

    my ($self, $rt, $ms_level) = @_;

    # lazy load
    if (! defined $self->{__rt_index}) {
        $self->_index_rt();
    }

    my @sorted = @{ $self->{__rt_index} };

    croak "Retention time out of bounds"
        if ($rt < 0 || $rt > $self->{__rt_index}->[-1]->[1]);

    # binary search
    my ($lower, $upper) = (0, $#sorted);
    while ($lower != $upper) {
        my $mid = int( ($lower+$upper)/2 );
        ($lower,$upper) = $rt < $sorted[$mid]->[1]
            ? ( $lower , $mid   )
            : ( $mid+1 , $upper );
    }

    my $i = $sorted[$lower]->[0]; #return closest scan index >= $ret
    while (defined $ms_level
      && $self->fetch_record($self->{msRun} => $i)->ms_level() != $ms_level) {
        ++$i;
    }
    return $i;



( run in 0.709 second using v1.01-cache-2.11-cpan-39bf76dae61 )