Skip to content

Commit f016c44

Browse files
committed
Add FAIMS splitting script
1 parent 60055a3 commit f016c44

File tree

4 files changed

+72
-7
lines changed

4 files changed

+72
-7
lines changed

examples/faims_split.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import click
2+
import ms_deisotope
3+
from ms_deisotope import output
4+
5+
from ms_deisotope.output import MzMLSerializer
6+
from ms_deisotope.data_source import query
7+
8+
from ms_deisotope.tools.utils import register_debug_hook
9+
10+
11+
@click.command('faims-split')
12+
@click.argument("source_file", type=click.Path(exists=True, readable=True))
13+
@click.argument("output_prefix")
14+
def main(source_file, output_prefix):
15+
reader = ms_deisotope.MSFileLoader(source_file)
16+
17+
sinks = {}
18+
n = len(reader)
19+
i = 0
20+
last = 0
21+
interval = 1000
22+
demultiplexer = query.FAIMSDemultiplexingIterator(reader, 30)
23+
24+
for heads in demultiplexer:
25+
empty_channels = 0
26+
for channel, value in heads.items():
27+
if value is not None:
28+
if channel not in sinks:
29+
click.echo("Opening new channel for CV %r" % (channel, ))
30+
writer = MzMLSerializer(
31+
open(output_prefix + "_%r.mzML" % (channel, ), 'wb'),
32+
len(reader), deconvoluted=False)
33+
writer.copy_metadata_from(reader)
34+
method = writer.build_processing_method(1, False, False, False, ["ion mobility seperation"])
35+
writer.add_data_processing(method)
36+
sinks[channel] = writer
37+
writer.save_scan(value)
38+
i += 1
39+
else:
40+
empty_channels += 1
41+
if empty_channels == len(heads):
42+
click.echo("All channels empty, finishing")
43+
break
44+
if i - last >= interval:
45+
click.echo("Processed %d spectra (%0.3f%%)" % (i, i * 100.0 / n))
46+
last = i
47+
48+
click.echo("Closing buffers.")
49+
for sink in sinks.values():
50+
click.echo("Closing %r" % (sink, ))
51+
sink.close()
52+
53+
if __name__ == "__main__":
54+
main.main()
55+
56+
57+

ms_deisotope/data_source/query.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -598,6 +598,10 @@ def _check(self, scan):
598598
if scan.drift_time == self.compensation_voltage:
599599
return scan
600600

601+
@property
602+
def key(self):
603+
return self.compensation_voltage
604+
601605

602606
class QueueIterator(ScanIteratorProxyBase):
603607
def __init__(self, scan_source, data=None):
@@ -623,7 +627,7 @@ def __init__(self, scan_source, buffer_size=10, *args, **kwargs):
623627
scan_source, *args, **kwargs)
624628
self.channels = dict()
625629
self.buffer_size = buffer_size
626-
self.feed()
630+
self.has_more = self.feed()
627631

628632
@property
629633
def iteration_mode(self):
@@ -667,13 +671,15 @@ def feed(self):
667671
return True
668672

669673
def __next__(self):
674+
if not self.has_more:
675+
raise StopIteration()
670676
meta = {}
671677
for channel_name, (scan_filter, queue) in self.channels.items():
672678
if queue.has_value():
673679
meta[channel_name] = next(scan_filter)
674680
else:
675681
meta[channel_name] = None
676-
self.feed()
682+
self.has_more = self.feed()
677683
return meta
678684

679685

ms_deisotope/data_source/scan/base.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1625,10 +1625,12 @@ def annotate_precursor(self, *args, **kwargs):
16251625
--------
16261626
:func:`ms_deisotope.plot.annotate_scan_single`
16271627
'''
1628-
pinfo = self.scan.precursor_information
1629-
if pinfo is None:
1630-
return
1631-
precursor = pinfo.precursor
1628+
precursor = kwargs.get("precursor")
1629+
if precursor is None:
1630+
pinfo = self.scan.precursor_information
1631+
if pinfo is None:
1632+
return
1633+
precursor = pinfo.precursor
16321634
return self._plot_api.annotate_scan_single(precursor, self.scan, *args, **kwargs)
16331635

16341636
def label_peaks(self, *args, **kwargs):

ms_deisotope/output/mzml.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -986,7 +986,7 @@ def extract_scan_event_parameters(self, scan):
986986
})
987987
traits = scan_event.traits.items()
988988
for name, value in traits:
989-
param = {"name": name, "value": value, 'unit_name': getattr(value, 'unit_info', None)}
989+
param = {"name": str(name), "value": value, 'unit_name': getattr(value, 'unit_info', None)}
990990
scan_parameters.append(param)
991991
scan_window_list = list(scan_event)
992992
return scan_parameters, scan_window_list

0 commit comments

Comments
 (0)