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 )