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 )