Skip to content

Commit 1f00980

Browse files
authored
Merge pull request #166 from mwang87/ms2-peak-highlight
MS2 peak highlight
2 parents 4dfb6e0 + 84ed02f commit 1f00980

File tree

2 files changed

+61
-55
lines changed

2 files changed

+61
-55
lines changed

app.py

Lines changed: 32 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1531,35 +1531,40 @@ def draw_spectrum(usi, ms2_identifier, export_format, plot_theme, xic_mz):
15311531
spectrum_type = "MS"
15321532
button_elements = []
15331533

1534-
if "MS2" in ms2_identifier or "MS3" in ms2_identifier:
1535-
spectrum_type = "MS2"
1536-
1537-
mzs = [peak[0] for peak in peaks]
1538-
ints = [peak[1] for peak in peaks]
1539-
neg_ints = [intensity * -1 for intensity in ints]
1540-
1541-
interactive_fig = go.Figure(
1542-
data=go.Scatter(x=mzs, y=ints,
1543-
mode='markers',
1544-
marker=dict(size=1),
1545-
error_y=dict(
1546-
symmetric=False,
1547-
arrayminus=[0]*len(neg_ints),
1548-
array=neg_ints,
1549-
width=0
1550-
),
1551-
hoverinfo="x",
1552-
text=mzs
1553-
)
1534+
# Drawing the spectrum object
1535+
mzs = [peak[0] for peak in peaks]
1536+
ints = [peak[1] for peak in peaks]
1537+
neg_ints = [intensity * -1 for intensity in ints]
1538+
1539+
# Figuring out which labels to show
1540+
mzs_text = ms2._get_ms_peak_labels(mzs, ints)
1541+
1542+
interactive_fig = go.Figure(
1543+
data=go.Scatter(x=mzs, y=ints,
1544+
mode='markers+text',
1545+
marker=dict(size=1),
1546+
error_y=dict(
1547+
symmetric=False,
1548+
arrayminus=[0]*len(neg_ints),
1549+
array=neg_ints,
1550+
width=0
1551+
),
1552+
hoverinfo="x",
1553+
textposition="top right",
1554+
text=mzs_text
15541555
)
1556+
)
1557+
1558+
interactive_fig.update_layout(title='{}'.format(ms2_identifier))
1559+
interactive_fig.update_layout(template=plot_theme)
1560+
interactive_fig.update_xaxes(title_text='m/z')
1561+
interactive_fig.update_yaxes(title_text='intensity')
1562+
interactive_fig.update_xaxes(showline=True, linewidth=1, linecolor='black')
1563+
interactive_fig.update_yaxes(showline=True, linewidth=1, linecolor='black')
1564+
interactive_fig.update_yaxes(range=[0, max(ints) * 1.1])
15551565

1556-
interactive_fig.update_layout(title='{}'.format(ms2_identifier))
1557-
interactive_fig.update_layout(template=plot_theme)
1558-
interactive_fig.update_xaxes(title_text='m/z')
1559-
interactive_fig.update_yaxes(title_text='intensity')
1560-
interactive_fig.update_xaxes(showline=True, linewidth=1, linecolor='black')
1561-
interactive_fig.update_yaxes(showline=True, linewidth=1, linecolor='black')
1562-
interactive_fig.update_yaxes(range=[0, max(ints)])
1566+
if "MS2" in ms2_identifier or "MS3" in ms2_identifier:
1567+
spectrum_type = "MS2"
15631568

15641569
masst_dict = {}
15651570
masst_dict["workflow"] = "SEARCH_SINGLE_SPECTRUM"
@@ -1573,37 +1578,9 @@ def draw_spectrum(usi, ms2_identifier, export_format, plot_theme, xic_mz):
15731578

15741579
button_elements = [USI_button, html.Br(), masst_button]
15751580

1576-
15771581
if "MS1" in ms2_identifier:
15781582
spectrum_type = "MS1"
15791583

1580-
mzs = [peak[0] for peak in peaks]
1581-
ints = [peak[1] for peak in peaks]
1582-
neg_ints = [intensity * -1 for intensity in ints]
1583-
1584-
interactive_fig = go.Figure(
1585-
data=go.Scatter(x=mzs, y=ints,
1586-
mode='markers',
1587-
marker=dict(size=1),
1588-
error_y=dict(
1589-
symmetric=False,
1590-
arrayminus=[0]*len(neg_ints),
1591-
array=neg_ints,
1592-
width=0
1593-
),
1594-
hoverinfo="x",
1595-
text=mzs
1596-
)
1597-
)
1598-
1599-
interactive_fig.update_layout(title='{}'.format(ms2_identifier))
1600-
interactive_fig.update_layout(template=plot_theme)
1601-
interactive_fig.update_xaxes(title_text='m/z')
1602-
interactive_fig.update_yaxes(title_text='intensity')
1603-
interactive_fig.update_xaxes(showline=True, linewidth=1, linecolor='black')
1604-
interactive_fig.update_yaxes(showline=True, linewidth=1, linecolor='black')
1605-
interactive_fig.update_yaxes(range=[0, max(ints)])
1606-
16071584
USI_button = html.A(dbc.Button("View Vector Metabolomics USI", color="primary", className="mr-1", block=True), href=usi_url, target="_blank")
16081585

16091586
button_elements = [USI_button]

ms2.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,35 @@
99
from tqdm import tqdm
1010
from utils import _spectrum_generator
1111

12+
def _get_ms_peak_labels(mzs, ints, partitions=8):
13+
max_mz = max(mzs)
14+
min_mz = min(mzs)
15+
mz_radius = (max_mz - min_mz) / partitions
16+
17+
labeled_peaks = set()
18+
19+
for i in range(partitions):
20+
try:
21+
segment_min_mz = min_mz + mz_radius * i
22+
segment_max_mz = min_mz + mz_radius * (i+1)
23+
24+
segment_peaks = [(mz, ints[i]) for i, mz in enumerate(mzs) if mz >= segment_min_mz and mz <= segment_max_mz]
25+
sorted_segment_peaks = sorted(segment_peaks, key=lambda x: x[1], reverse=True)
26+
segment_most_intense_peak = sorted_segment_peaks[0]
27+
28+
labeled_peaks.add(segment_most_intense_peak[0])
29+
except:
30+
pass
31+
32+
mzs_text = []
33+
for mz in mzs:
34+
if mz in labeled_peaks:
35+
mzs_text.append("{:.2f}".format(mz))
36+
else:
37+
mzs_text.append("")
38+
39+
return mzs_text
40+
1241
def _get_ms2_peaks(usi, local_filename, scan_number):
1342
# Let's first try to get the spectrum from disk
1443
precursor_mz = 0

0 commit comments

Comments
 (0)