MS

 view release on metacpan or  search on metacpan

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

    # for the parent class MS::Reader::XML
    # ---------------------------------------------------------------------------#

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

    $self->{__record_classes} = {
        spectrum     => 'MS::Reader::MzML::Spectrum',
        chromatogram => 'MS::Reader::MzML::Chromatogram',
    };

    $self->{_skip_inside} = { map {$_ => 1} qw/
        spectrum
        chromatogram
        indexList
    / };

    $self->{_make_index} = { map {$_ => 'id'} qw/
        spectrum
        chromatogram
    / };

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

    $self->{_make_named_hash} = { map {$_ => 'id'} qw/
        cv
        dataProcessing
        instrumentConfiguration
        referenceableParamGroup
        sample
        scanSettings
        software
        sourceFile
    / };

    $self->{_make_anon_array} = { map {$_ => 1} qw/
        analyzer
        contact
        detector
        processingMethod
        referenceableParamGroupRef
        source
        sourceFileRef
        target
    / };

}


sub _load_new {

    my ($self) = @_;

    $self->SUPER::_load_new();

    if (
           defined $self->{indexedmzML}->{fileChecksum}
        && defined $self->{indexedmzML}->{fileChecksum}->{pcdata}
        && length $self->{indexedmzML}->{fileChecksum}->{pcdata}
        && $self->{indexedmzML}->{fileChecksum}->{pcdata} ne '0'
    ) {

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

    }

    # Outer <mzML> may optionally be wrapped in <indexedmxML> tags. For
    # consistent downstream handling, everything outside <mzML> should be
    # discarded before returning.
    if (defined $self->{indexedmzML}) {
        $self->{mzML}->{$_} = $self->{indexedmzML}->{mzML}->{$_}
            for (keys %{ $self->{indexedmzML}->{mzML} });
        delete $self->{indexedmzML};
    }

    return;

}

sub fetch_spectrum {

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

}

sub next_spectrum {

    my ($self, %args) = @_;
    my $ref = $self->{run}->{spectrumList};
    return $self->next_record( $ref, %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] + FLOAT_TOL);

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

    my $i = $sorted[$lower]->[0]; #return closest scan index >= $ret
    my $ref = $self->{run}->{spectrumList};
    while (defined $ms_level



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