Source code for ms_deisotope.output.mzmlb

"""
Writing mzMLb
-------------

Using the :mod:`psims` library, :mod:`ms_deisotope.output.mzmlb` can write an mzMLb
file with all associated metadata. This uses the same machinery as :mod:`ms_deisotope.output.mzml`
to accomplish this.

This module also contains a specialized version of :class:`~.MzMLbLoader`,
:class:`~.ProcessedMzMLbLoader`, which can directly reconstruct each
deconvoluted peak list and provides fast access to an extended index of
metadata that :class:`~.MzMLbSerializer` writes to an external file.

All behavior available for the :class:`~.ProcessedMzMLLoader` are available for
:class:`~.ProcessedMzMLbLoader`.


.. code:: python

    import ms_deisotope
    from ms_deisotope.test.common import datafile
    from ms_deisotope.output.mzmlb import MzMLbSerializer

    reader = ms_deisotope.MSFileLoader(datafile("small.mzML"))
    with MzMLbSerializer('small.deconvoluted.mzMLb', n_spectra=len(reader)) as writer:
        writer.copy_metadata_from(reader)
        for bunch in reader:
            bunch.precursor.pick_peaks()
            bunch.precursor.deconvolute()
            for product in bunch.products:
                product.pick_peaks()
                product.deconvolute()
            writer.save(bunch)

"""

import numpy as np

from psims.mzml.writer import COMPRESSION_ZLIB

try:
    from psims.mzmlb.writer import MzMLbWriter as _MzMLbWriter
    is_available = True
except ImportError:
    _MzMLbWriter = None
    is_available = False

from ms_deisotope.data_source.mzmlb import MzMLbLoader

from .common import LCMSMSQueryInterfaceMixin, ScanDeserializerBase, SampleRun
from .mzml import MzMLSerializer as _MzMLSerializer, PeakSetDeserializingMixin, _IonMobility3DSerializerBase


[docs]class MzMLbSerializer(_MzMLSerializer): file_extensions = { "mzmlb", } _format_conversion_term = "Conversion to mzMLb" def _make_writer(self, handle): compression = self.compression compression_opts = None if self.compression == COMPRESSION_ZLIB: compression = 'gzip' compression_opts = 4 self.compression = 'none' return _MzMLbWriter( self.handle, close=self._should_close, h5_compression=compression, h5_compression_options=compression_opts )
class IonMobilityAware3DMzMLbSerializer(_IonMobility3DSerializerBase, MzMLbSerializer): default_data_encoding = MzMLbSerializer.default_data_encoding.copy() default_data_encoding.update({ "feature id array": np.int32, })
[docs]class ProcessedMzMLbLoader(PeakSetDeserializingMixin, MzMLbLoader, ScanDeserializerBase, LCMSMSQueryInterfaceMixin): file_extensions = { "mzmlb", } def __init__(self, source_file, use_index=True, use_extended_index=True): super(ProcessedMzMLbLoader, self).__init__( source_file, use_index=use_index, decode_binary=True) self.extended_index = None self._scan_id_to_rt = dict() self._sample_run = None self._use_extended_index = use_extended_index if self._use_index: if self._use_extended_index: self.require_extended_index() def _dispose(self): self._scan_id_to_rt.clear() self.extended_index.clear() super(ProcessedMzMLbLoader, self)._dispose() def __reduce__(self): return self.__class__, (self.source_file, self._use_index, self._use_extended_index) def _make_sample_run(self): samples = self.samples() sample = samples[0] return SampleRun(name=sample.name, uuid=sample['SampleRun-UUID'], **dict(sample.items())) @property def sample_run(self): if self._sample_run is None: self._sample_run = self._make_sample_run() return self._sample_run
ProcessedMzMLbDeserializer = ProcessedMzMLbLoader