Repository: bittremieux/spectrum_utils (language: python)

Issue:
Peptide annotating neutral losses
Not sure if its an option


Discussion / hints:

Fix patch:
diff --git a/docs/src/mirror.png b/docs/src/mirror.png
index 0d64520..cac77b1 100644
Binary files a/docs/src/mirror.png and b/docs/src/mirror.png differ
diff --git a/docs/src/mirror_iplot.json b/docs/src/mirror_iplot.json
index d3099c0..3ee5da3 100644
--- a/docs/src/mirror_iplot.json
+++ b/docs/src/mirror_iplot.json
@@ -1,1 +1,1 @@
-{"config": {"view": {"width": 400, "height": 300}, "mark": {"tooltip": null}}, "layer": [{"data": {"name": "data-dd4a51636c0bd94a0d623613e3c7e3f2"}, "mark": {"type": "rule", "size": 2}, "encoding": {"color": {"type": "nominal", "field": "color", "legend": null, "scale": null}, "tooltip": [{"type": "quantitative", "field": "exp_mz", "format": ".4f", "title": "Experimental m/z"}, {"type": "quantitative", "field": "intensity", "format": ".0%", "title": "Intensity"}], "x": {"type": "quantitative", "axis": {"grid": true, "title": "m/z", "titleFontStyle": "italic"}, "field": "exp_mz", "scale": {"nice": true, "padding": 5, "zero": false}}, "y": {"type": "quantitative", "axis": {"format": "%", "grid": true, "title": "Intensity"}, "field": "intensity", "scale": {"nice": true, "padding": 5}}}}, {"data": {"name": "data-f44a73c9099b1d7467e35fad7f0c126d"}, "mark": {"type": "rule", "size": 2}, "encoding": {"color": {"type": "nominal", "field": "color", "legend": null, "scale": null}, "tooltip": [{"type": "nominal", "field": "fragment", "title": "Fragment"}, {"type": "quantitative", "field": "exp_mz", "format": ".4f", "title": "Experimental m/z"}, {"type": "quantitative", "field": "calc_mz", "format": ".4f", "title": "Theoretical m/z"}, {"type": "quantitative", "field": "intensity", "format": ".0%", "title": "Intensity"}], "x": {"type": "quantitative", "axis": {"grid": true, "title": "m/z", "titleFontStyle": "italic"}, "field": "exp_mz", "scale": {"nice": true, "padding": 5, "zero": false}}, "y": {"type": "quantitative", "axis": {"format": "%", "grid": true, "title": "Intensity"}, "field": "intensity", "scale": {"nice": true, "padding": 5}}}}, {"data": {"name": "data-f44a73c9099b1d7467e35fad7f0c126d"}, "mark": {"type": "text", "align": "left", "angle": 270, "baseline": "middle", "dx": 5}, "encoding": {"color": {"type": "nominal", "field": "color", "legend": null, "scale": null}, "text": {"type": "nominal", "field": "fragment"}, "tooltip": [{"type": "nominal", "field": "fragment", "title": "Fragment"}, {"type": "quantitative", "field": "exp_mz", "format": ".4f", "title": "Experimental m/z"}, {"type": "quantitative", "field": "calc_mz", "format": ".4f", "title": "Theoretical m/z"}, {"type": "quantitative", "field": "intensity", "format": ".0%", "title": "Intensity"}], "x": {"type": "quantitative", "axis": {"grid": true, "title": "m/z", "titleFontStyle": "italic"}, "field": "exp_mz", "scale": {"nice": true, "padding": 5, "zero": false}}, "y": {"type": "quantitative", "axis": {"format": "%", "grid": true, "title": "Intensity"}, "field": "intensity", "scale": {"nice": true, "padding": 5}}}}, {"layer": [{"data": {"name": "data-105aa932cf427a135f94978ae3197b43"}, "mark": {"type": "rule", "size": 2}, "encoding": {"color": {"type": "nominal", "field": "color", "legend": null, "scale": null}, "tooltip": [{"type": "quantitative", "field": "exp_mz", "format": ".4f", "title": "Experimental m/z"}, {"type": "quantitative", "field": "intensity", "format": ".0%", "title": "Intensity"}], "x": {"type": "quantitative", "axis": {"grid": true, "title": "m/z", "titleFontStyle": "italic"}, "field": "exp_mz", "scale": {"nice": true, "padding": 5, "zero": false}}, "y": {"type": "quantitative", "axis": {"format": "%", "grid": true, "title": "Intensity"}, "field": "intensity", "scale": {"nice": true, "padding": 5}}}}, {"data": {"name": "data-9b85a631b8790d5ecf907b83c75c93de"}, "mark": {"type": "rule", "size": 2}, "encoding": {"color": {"type": "nominal", "field": "color", "legend": null, "scale": null}, "tooltip": [{"type": "nominal", "field": "fragment", "title": "Fragment"}, {"type": "quantitative", "field": "exp_mz", "format": ".4f", "title": "Experimental m/z"}, {"type": "quantitative", "field": "calc_mz", "format": ".4f", "title": "Theoretical m/z"}, {"type": "quantitative", "field": "intensity", "format": ".0%", "title": "Intensity"}], "x": {"type": "quantitative", "axis": {"grid": true, "title": "m/z", "titleFontStyle": "italic"}, "field": "exp_mz", "scale": {"nice": true, "padding": 5, "zero": false}}, "y": {"type": "quantitative", "axis": {"format": "%", "grid": true, "title": "Intensity"}, "field": "intensity", "scale": {"nice": true, "padding": 5}}}}, {"data": {"name": "data-9b85a631b8790d5ecf907b83c75c93de"}, "mark": {"type": "text", "align": "right", "angle": 270, "baseline": "middle", "dx": -5}, "encoding": {"color": {"type": "nominal", "field": "color", "legend": null, "scale": null}, "text": {"type": "nominal", "field": "fragment"}, "tooltip": [{"type": "nominal", "field": "fragment", "title": "Fragment"}, {"type": "quantitative", "field": "exp_mz", "format": ".4f", "title": "Experimental m/z"}, {"type": "quantitative", "field": "calc_mz", "format": ".4f", "title": "Theoretical m/z"}, {"type": "quantitative", "field": "intensity", "format": ".0%", "title": "Intensity"}], "x": {"type": "quantitative", "axis": {"grid": true, "title": "m/z", "titleFontStyle": "italic"}, "field": "exp_mz", "scale": {"nice": true, "padding": 5, "zero": false}}, "y": {"type": "quantitative", "axis": {"format": "%", "grid": true, "title": "Intensity"}, "field": "intensity", "scale": {"nice": true, "padding": 5}}}}]}, {"data": {"name": "data-d28e446509bf496330247e60d741ef1c"}, "mark": {"type": "rule", "size": 3}, "encoding": {"color": {"value": "lightGray"}, "y": {"type": "quantitative", "field": "sep"}}}], "height": 400, "width": 640, "$schema": "https://vega.github.io/schema/vega-lite/v3.4.0.json", "datasets": {"data-dd4a51636c0bd94a0d623613e3c7e3f2": [{"exp_mz": 384.81170654296875, "intensity": 0.1347966343164444, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 385.5316467285156, "intensity": 0.13618715107440948, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 393.9139709472656, "intensity": 0.20761579275131226, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 450.353271484375, "intensity": 0.11872892081737518, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 476.01226806640625, "intensity": 0.1320141851902008, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 486.1910705566406, "intensity": 0.11960606276988983, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 487.11566162109375, "intensity": 0.10118831694126129, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 489.6593017578125, "intensity": 0.24228128790855408, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 490.420654296875, "intensity": 0.17204438149929047, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 491.5698547363281, "intensity": 0.10035843402147293, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 492.34027099609375, "intensity": 0.1429688036441803, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 493.4735107421875, "intensity": 0.10986005514860153, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 495.0908508300781, "intensity": 0.14720124006271362, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 495.9909362792969, "intensity": 0.13463860750198364, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 498.91326904296875, "intensity": 1.0, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 499.9296569824219, "intensity": 0.14062072336673737, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 618.173583984375, "intensity": 0.12006514519453049, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 637.6349487304688, "intensity": 0.11172182112932205, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 675.1014404296875, "intensity": 0.11535783857107162, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 686.5188598632812, "intensity": 0.16114315390586853, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 703.380615234375, "intensity": 0.1466224193572998, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 704.2476806640625, "intensity": 0.11714968085289001, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 787.4714965820312, "intensity": 0.28355148434638977, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 850.4451904296875, "intensity": 0.10506942123174667, "calc_mz": null, "fragment": null, "color": "#212121"}], "data-f44a73c9099b1d7467e35fad7f0c126d": [{"exp_mz": 201.17984008789062, "intensity": 0.33661869168281555, "calc_mz": 201.12336184721002, "fragment": "a2+", "color": "#388E3C"}, {"exp_mz": 229.19424438476562, "intensity": 0.2951720356941223, "calc_mz": 229.11827646677, "fragment": "b2+", "color": "#1976D2"}, {"exp_mz": 294.3020935058594, "intensity": 0.11260532587766647, "calc_mz": 294.14820615047, "fragment": "y2+", "color": "#D32F2F"}, {"exp_mz": 330.31072998046875, "intensity": 0.19125154614448547, "calc_mz": 330.16595646677, "fragment": "b3+", "color": "#1976D2"}, {"exp_mz": 407.1297607421875, "intensity": 0.19195693731307983, "calc_mz": 407.23226615047, "fragment": "y3+", "color": "#D32F2F"}, {"exp_mz": 445.3630676269531, "intensity": 0.10890834778547287, "calc_mz": 445.19289646677, "fragment": "b4+", "color": "#1976D2"}, {"exp_mz": 570.3690185546875, "intensity": 0.17414335906505585, "calc_mz": 570.2955961504699, "fragment": "y4+", "color": "#D32F2F"}, {"exp_mz": 608.4764404296875, "intensity": 0.12017770856618881, "calc_mz": 608.2562264667699, "fragment": "b5+", "color": "#1976D2"}, {"exp_mz": 685.4700927734375, "intensity": 0.3566066026687622, "calc_mz": 685.32253615047, "fragment": "y5+", "color": "#D32F2F"}, {"exp_mz": 721.4369506835938, "intensity": 0.11645428836345673, "calc_mz": 721.34028646677, "fragment": "b6+", "color": "#1976D2"}, {"exp_mz": 786.5166625976562, "intensity": 0.7275916934013367, "calc_mz": 786.3702161504699, "fragment": "y6+", "color": "#D32F2F"}, {"exp_mz": 868.5552978515625, "intensity": 0.17438450455665588, "calc_mz": 868.3756914667699, "fragment": "b7+", "color": "#1976D2"}], "data-105aa932cf427a135f94978ae3197b43": [{"exp_mz": 120.08062744140625, "intensity": -0.20309153199195862, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 129.10226440429688, "intensity": -0.28379932045936584, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 130.0860137939453, "intensity": -0.2064698040485382, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 136.07591247558594, "intensity": -0.2592397630214691, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 141.10186767578125, "intensity": -0.21103499829769135, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 156.10171508789062, "intensity": -0.1389589160680771, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 183.11285400390625, "intensity": -0.2986920475959778, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 184.09695434570312, "intensity": -0.13844630122184753, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 202.1262969970703, "intensity": -0.23598144948482513, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 212.13876342773438, "intensity": -0.1392442137002945, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 217.08145141601562, "intensity": -0.13989390432834625, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 230.1500701904297, "intensity": -0.25525304675102234, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 235.10760498046875, "intensity": -0.22834664583206177, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 266.14990234375, "intensity": -0.1320052295923233, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 267.1122131347656, "intensity": -0.1533510386943817, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 276.1372985839844, "intensity": -0.13091954588890076, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 284.16094970703125, "intensity": -0.12916362285614014, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 301.0603332519531, "intensity": -0.12664447724819183, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 330.950439453125, "intensity": -0.3201085031032562, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 332.9672546386719, "intensity": -0.13372111320495605, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 343.2332458496094, "intensity": -0.19663077592849731, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 346.93072509765625, "intensity": -0.3175579309463501, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 364.93994140625, "intensity": -0.27765077352523804, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 380.1451721191406, "intensity": -0.28097909688949585, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 414.7584228515625, "intensity": -0.1287359595298767, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 430.93255615234375, "intensity": -0.21536634862422943, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 448.94378662109375, "intensity": -0.4192318320274353, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 466.7406005859375, "intensity": -0.13815641403198242, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 466.9552307128906, "intensity": -0.13667228817939758, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 493.22845458984375, "intensity": -0.20132042467594147, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 498.7388916015625, "intensity": -0.1963195949792862, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 499.24053955078125, "intensity": -0.13058100640773773, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 506.2981262207031, "intensity": -0.30510541796684265, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 508.96502685546875, "intensity": -0.3953304886817932, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 571.2944946289062, "intensity": -0.12536148726940155, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 603.3489379882812, "intensity": -0.25961530208587646, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 621.3248901367188, "intensity": -0.3234120309352875, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 686.3241577148438, "intensity": -0.21477943658828735, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 722.3724975585938, "intensity": -0.5693522095680237, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 723.3729858398438, "intensity": -0.2893936038017273, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 787.3787841796875, "intensity": -0.3176353871822357, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 788.371337890625, "intensity": -0.13256199657917023, "calc_mz": null, "fragment": null, "color": "#212121"}], "data-9b85a631b8790d5ecf907b83c75c93de": [{"exp_mz": 147.11236572265625, "intensity": -0.24031491577625275, "calc_mz": 147.11280115047, "fragment": "y1+", "color": "#D32F2F"}, {"exp_mz": 201.123291015625, "intensity": -1.0, "calc_mz": 201.12336184721002, "fragment": "a2+", "color": "#388E3C"}, {"exp_mz": 229.1180419921875, "intensity": -0.39402323961257935, "calc_mz": 229.11827646677, "fragment": "b2+", "color": "#1976D2"}, {"exp_mz": 294.1481628417969, "intensity": -0.37631675601005554, "calc_mz": 294.14820615047, "fragment": "y2+", "color": "#D32F2F"}, {"exp_mz": 407.2305908203125, "intensity": -0.31135132908821106, "calc_mz": 407.23226615047, "fragment": "y3+", "color": "#D32F2F"}, {"exp_mz": 570.296630859375, "intensity": -0.3690528869628906, "calc_mz": 570.2955961504699, "fragment": "y4+", "color": "#D32F2F"}, {"exp_mz": 685.3226928710938, "intensity": -0.3848315179347992, "calc_mz": 685.32253615047, "fragment": "y5+", "color": "#D32F2F"}, {"exp_mz": 786.3701782226562, "intensity": -0.5883658528327942, "calc_mz": 786.3702161504699, "fragment": "y6+", "color": "#D32F2F"}], "data-d28e446509bf496330247e60d741ef1c": [{"sep": 0}]}}
+{"config": {"view": {"continuousWidth": 400, "continuousHeight": 300}}, "layer": [{"data": {"name": "data-9c1fcc2e18ebeeca09fe2b2416c8b41d"}, "mark": {"type": "rule", "size": 2}, "encoding": {"color": {"type": "nominal", "field": "color", "legend": null, "scale": null}, "tooltip": [{"type": "quantitative", "field": "exp_mz", "format": ".4f", "title": "Experimental m/z"}, {"type": "quantitative", "field": "intensity", "format": ".0%", "title": "Intensity"}], "x": {"type": "quantitative", "axis": {"grid": true, "title": "m/z", "titleFontStyle": "italic"}, "field": "exp_mz", "scale": {"nice": true, "padding": 5, "zero": false}}, "y": {"type": "quantitative", "axis": {"format": "%", "grid": true, "title": "Intensity"}, "field": "intensity", "scale": {"nice": true, "padding": 5}}}}, {"data": {"name": "data-3b4e94211c555789b7d60ef39578a0f0"}, "mark": {"type": "rule", "size": 2}, "encoding": {"color": {"type": "nominal", "field": "color", "legend": null, "scale": null}, "tooltip": [{"type": "nominal", "field": "fragment", "title": "Fragment"}, {"type": "quantitative", "field": "exp_mz", "format": ".4f", "title": "Experimental m/z"}, {"type": "quantitative", "field": "calc_mz", "format": ".4f", "title": "Theoretical m/z"}, {"type": "quantitative", "field": "intensity", "format": ".0%", "title": "Intensity"}], "x": {"type": "quantitative", "axis": {"grid": true, "title": "m/z", "titleFontStyle": "italic"}, "field": "exp_mz", "scale": {"nice": true, "padding": 5, "zero": false}}, "y": {"type": "quantitative", "axis": {"format": "%", "grid": true, "title": "Intensity"}, "field": "intensity", "scale": {"nice": true, "padding": 5}}}}, {"data": {"name": "data-3b4e94211c555789b7d60ef39578a0f0"}, "mark": {"type": "text", "align": "left", "angle": 270, "baseline": "middle", "dx": 5}, "encoding": {"color": {"type": "nominal", "field": "color", "legend": null, "scale": null}, "text": {"type": "nominal", "field": "fragment"}, "tooltip": [{"type": "nominal", "field": "fragment", "title": "Fragment"}, {"type": "quantitative", "field": "exp_mz", "format": ".4f", "title": "Experimental m/z"}, {"type": "quantitative", "field": "calc_mz", "format": ".4f", "title": "Theoretical m/z"}, {"type": "quantitative", "field": "intensity", "format": ".0%", "title": "Intensity"}], "x": {"type": "quantitative", "axis": {"grid": true, "title": "m/z", "titleFontStyle": "italic"}, "field": "exp_mz", "scale": {"nice": true, "padding": 5, "zero": false}}, "y": {"type": "quantitative", "axis": {"format": "%", "grid": true, "title": "Intensity"}, "field": "intensity", "scale": {"nice": true, "padding": 5}}}}, {"layer": [{"data": {"name": "data-0dcde8dd45f6bd2ef5f3ff14bbb41702"}, "mark": {"type": "rule", "size": 2}, "encoding": {"color": {"type": "nominal", "field": "color", "legend": null, "scale": null}, "tooltip": [{"type": "quantitative", "field": "exp_mz", "format": ".4f", "title": "Experimental m/z"}, {"type": "quantitative", "field": "intensity", "format": ".0%", "title": "Intensity"}], "x": {"type": "quantitative", "axis": {"grid": true, "title": "m/z", "titleFontStyle": "italic"}, "field": "exp_mz", "scale": {"nice": true, "padding": 5, "zero": false}}, "y": {"type": "quantitative", "axis": {"format": "%", "grid": true, "title": "Intensity"}, "field": "intensity", "scale": {"nice": true, "padding": 5}}}}, {"data": {"name": "data-952724485d9f043edd5a997ab65e1349"}, "mark": {"type": "rule", "size": 2}, "encoding": {"color": {"type": "nominal", "field": "color", "legend": null, "scale": null}, "tooltip": [{"type": "nominal", "field": "fragment", "title": "Fragment"}, {"type": "quantitative", "field": "exp_mz", "format": ".4f", "title": "Experimental m/z"}, {"type": "quantitative", "field": "calc_mz", "format": ".4f", "title": "Theoretical m/z"}, {"type": "quantitative", "field": "intensity", "format": ".0%", "title": "Intensity"}], "x": {"type": "quantitative", "axis": {"grid": true, "title": "m/z", "titleFontStyle": "italic"}, "field": "exp_mz", "scale": {"nice": true, "padding": 5, "zero": false}}, "y": {"type": "quantitative", "axis": {"format": "%", "grid": true, "title": "Intensity"}, "field": "intensity", "scale": {"nice": true, "padding": 5}}}}, {"data": {"name": "data-952724485d9f043edd5a997ab65e1349"}, "mark": {"type": "text", "align": "right", "angle": 270, "baseline": "middle", "dx": -5}, "encoding": {"color": {"type": "nominal", "field": "color", "legend": null, "scale": null}, "text": {"type": "nominal", "field": "fragment"}, "tooltip": [{"type": "nominal", "field": "fragment", "title": "Fragment"}, {"type": "quantitative", "field": "exp_mz", "format": ".4f", "title": "Experimental m/z"}, {"type": "quantitative", "field": "calc_mz", "format": ".4f", "title": "Theoretical m/z"}, {"type": "quantitative", "field": "intensity", "format": ".0%", "title": "Intensity"}], "x": {"type": "quantitative", "axis": {"grid": true, "title": "m/z", "titleFontStyle": "italic"}, "field": "exp_mz", "scale": {"nice": true, "padding": 5, "zero": false}}, "y": {"type": "quantitative", "axis": {"format": "%", "grid": true, "title": "Intensity"}, "field": "intensity", "scale": {"nice": true, "padding": 5}}}}]}, {"data": {"name": "data-d28e446509bf496330247e60d741ef1c"}, "mark": {"type": "rule", "size": 3}, "encoding": {"color": {"value": "lightGray"}, "y": {"type": "quantitative", "field": "sep"}}}], "height": 600, "width": 800, "$schema": "https://vega.github.io/schema/vega-lite/v4.8.1.json", "datasets": {"data-9c1fcc2e18ebeeca09fe2b2416c8b41d": [{"exp_mz": 150.05535888671875, "intensity": 0.0028035021387040615, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 151.15435791015625, "intensity": 0.0007706634351052344, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 152.0706787109375, "intensity": 0.04751180112361908, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 152.10694885253906, "intensity": 0.0068117897026240826, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 153.07510375976562, "intensity": 0.002670838264748454, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 155.0811767578125, "intensity": 0.0011984413722530007, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 155.11805725097656, "intensity": 0.007712709251791239, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 156.1020050048828, "intensity": 0.045062076300382614, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 157.0613555908203, "intensity": 0.0008650011732243001, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 157.10696411132812, "intensity": 0.0018806037260219455, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 157.13287353515625, "intensity": 0.001641691429540515, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 159.07618713378906, "intensity": 0.0015497819986194372, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 159.0908203125, "intensity": 0.0011473484337329865, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 162.05517578125, "intensity": 0.005610977299511433, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 165.1022491455078, "intensity": 0.001953940372914076, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 166.05245971679688, "intensity": 0.0013859504833817482, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 166.08628845214844, "intensity": 0.0022739616688340902, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 167.08201599121094, "intensity": 0.0015588593669235706, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 167.11810302734375, "intensity": 0.002182955387979746, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 169.1338348388672, "intensity": 0.006783465389162302, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 170.0612030029297, "intensity": 0.000921877333894372, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 171.07650756835938, "intensity": 0.015080750919878483, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 171.11273193359375, "intensity": 0.003156373742967844, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 171.149169921875, "intensity": 0.004933262709528208, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 173.0561981201172, "intensity": 0.004462226293981075, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 173.07049560546875, "intensity": 0.0013506271643564105, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 173.09226989746094, "intensity": 0.0015109031228348613, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 173.12838745117188, "intensity": 0.01862287148833275, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 174.0550079345703, "intensity": 0.004735028836876154, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 175.07138061523438, "intensity": 0.0027899849228560925, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 175.1191864013672, "intensity": 0.006549657788127661, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 178.05044555664062, "intensity": 0.008730685338377953, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 179.0550079345703, "intensity": 0.0011262883199378848, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 180.10203552246094, "intensity": 0.010275598615407944, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 180.1143798828125, "intensity": 0.000810971250757575, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 181.06118774414062, "intensity": 0.0029894059989601374, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 181.0962371826172, "intensity": 0.0011966344900429249, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 181.13380432128906, "intensity": 0.0010659571271389723, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 183.05592346191406, "intensity": 0.0017291762633249164, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 183.11293029785156, "intensity": 0.08148464560508728, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 183.14901733398438, "intensity": 0.005347880069166422, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 184.0968780517578, "intensity": 0.02805979922413826, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 184.1150665283203, "intensity": 0.005539336707442999, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 185.05616760253906, "intensity": 0.0011801541550084949, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 185.09255981445312, "intensity": 0.005660776048898697, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 187.10821533203125, "intensity": 0.0013664260040968657, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 187.144287109375, "intensity": 0.011669350787997246, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 188.0729217529297, "intensity": 0.001059759291820228, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 189.07154846191406, "intensity": 0.0015190207632258534, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 189.08692932128906, "intensity": 0.014274196699261665, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 191.08078002929688, "intensity": 0.001458441372960806, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 193.09759521484375, "intensity": 0.0030517983250319958, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 195.11328125, "intensity": 0.00891362689435482, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 197.12828063964844, "intensity": 0.007219075690954924, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 197.16458129882812, "intensity": 0.0014074891805648804, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 199.07139587402344, "intensity": 0.012401890009641647, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 199.0863800048828, "intensity": 0.0010388405062258244, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 199.09182739257812, "intensity": 0.0010135245975106955, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 199.1077880859375, "intensity": 0.011095271445810795, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 199.1448974609375, "intensity": 0.0013965197140350938, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 199.18112182617188, "intensity": 0.0021988183725625277, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 200.8300323486328, "intensity": 0.0012674066238105297, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 202.1268310546875, "intensity": 0.08577597886323929, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 203.12872314453125, "intensity": 0.002327880822122097, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 207.11245727539062, "intensity": 0.0028056602459400892, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 210.12442016601562, "intensity": 0.0018578916788101196, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 211.10787963867188, "intensity": 0.013081626035273075, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 211.14390563964844, "intensity": 0.0018581110052764416, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 212.0919647216797, "intensity": 0.0017046581488102674, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 212.13943481445312, "intensity": 0.01251738891005516, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 213.12220764160156, "intensity": 0.004362850915640593, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 215.12100219726562, "intensity": 0.0017470583552494645, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 215.1383056640625, "intensity": 0.0094812773168087, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 216.09628295898438, "intensity": 0.0011419373331591487, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 217.0607147216797, "intensity": 0.002134880982339382, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 217.08181762695312, "intensity": 0.055323898792266846, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 217.10223388671875, "intensity": 0.002213073894381523, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 217.13693237304688, "intensity": 0.006249331869184971, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 218.0854949951172, "intensity": 0.005198511760681868, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 221.1284942626953, "intensity": 0.0013174426276236773, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 223.10914611816406, "intensity": 0.0015392007771879435, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 225.1239776611328, "intensity": 0.0026831652503460646, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 226.08145141601562, "intensity": 0.0011733996216207743, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 226.11932373046875, "intensity": 0.0012825087178498507, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 226.15431213378906, "intensity": 0.0016906625824049115, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 227.0658721923828, "intensity": 0.002051581395789981, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 227.10337829589844, "intensity": 0.0030910372734069824, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 227.12399291992188, "intensity": 0.0009350517648272216, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 228.1340789794922, "intensity": 0.01237582229077816, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 230.12191772460938, "intensity": 0.013179795816540718, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 230.14990234375, "intensity": 0.0458509586751461, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 231.15403747558594, "intensity": 0.0014984329463914037, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 232.13768005371094, "intensity": 0.0014830916188657284, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 233.12890625, "intensity": 0.002034940291196108, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 233.164306640625, "intensity": 0.0016012238338589668, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 234.10812377929688, "intensity": 0.001383215538226068, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 235.14398193359375, "intensity": 0.0016976619372144341, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 240.13458251953125, "intensity": 0.00812892522662878, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 242.14968872070312, "intensity": 0.0024838352110236883, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 243.11471557617188, "intensity": 0.005109462887048721, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 243.13507080078125, "intensity": 0.0013056292664259672, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 244.09872436523438, "intensity": 0.002930381568148732, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 244.16552734375, "intensity": 0.008188045583665371, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 245.07644653320312, "intensity": 0.0027823636773973703, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 245.1109619140625, "intensity": 0.0013614339986816049, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 245.1329803466797, "intensity": 0.005987968295812607, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 245.16021728515625, "intensity": 0.001487879897467792, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 246.13504028320312, "intensity": 0.0023413687013089657, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 246.1807098388672, "intensity": 0.0010665531735867262, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 246.63623046875, "intensity": 0.0010860481997951865, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 247.10899353027344, "intensity": 0.0015687373233959079, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 247.1458282470703, "intensity": 0.001405069138854742, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 249.08953857421875, "intensity": 0.001495743403211236, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 249.1597442626953, "intensity": 0.010002139955759048, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 250.15699768066406, "intensity": 0.0010549856815487146, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 251.10260009765625, "intensity": 0.013699132017791271, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 251.17205810546875, "intensity": 0.0015916781267151237, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 254.16038513183594, "intensity": 0.0019956668838858604, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 258.1467590332031, "intensity": 0.009019480086863041, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 259.1095886230469, "intensity": 0.001623037038370967, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 260.1434631347656, "intensity": 0.011612232774496078, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 261.1256408691406, "intensity": 0.013270745053887367, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 262.1510925292969, "intensity": 0.0023867879062891006, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 263.13958740234375, "intensity": 0.00226285750977695, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 264.14208984375, "intensity": 0.0021660425700247288, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 265.15460205078125, "intensity": 0.009636102244257927, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 266.1494140625, "intensity": 0.018678268417716026, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 267.09710693359375, "intensity": 0.010115453973412514, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 267.1291198730469, "intensity": 0.00196291645988822, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 268.1332702636719, "intensity": 0.0012958759907633066, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 269.1845397949219, "intensity": 0.0017585593741387129, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 271.1101379394531, "intensity": 0.0015054987743496895, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 272.161376953125, "intensity": 0.0012322511756792665, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 274.64520263671875, "intensity": 0.001140754553489387, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 275.140625, "intensity": 0.0019158110953867435, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 276.1356201171875, "intensity": 0.01478102058172226, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 277.08502197265625, "intensity": 0.0012463650200515985, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 277.12176513671875, "intensity": 0.0021101771853864193, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 277.154296875, "intensity": 0.009221477434039116, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 278.1534729003906, "intensity": 0.07977484911680222, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 279.0975036621094, "intensity": 0.02188016101717949, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 279.15948486328125, "intensity": 0.009759257547557354, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 280.098388671875, "intensity": 0.0018344686832278967, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 280.1514587402344, "intensity": 0.0019024611683562398, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 281.1261901855469, "intensity": 0.0011570124188438058, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 283.14422607421875, "intensity": 0.002214273903518915, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 284.1604919433594, "intensity": 0.017939668148756027, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 285.14215087890625, "intensity": 0.0016810153611004353, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 288.1391906738281, "intensity": 0.0011296749580651522, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 289.1201477050781, "intensity": 0.0011645066551864147, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 290.108642578125, "intensity": 0.0012295035412535071, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 291.13232421875, "intensity": 0.010519261471927166, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 292.1357727050781, "intensity": 0.0023322803899645805, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 293.0765380859375, "intensity": 0.0065674916841089725, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 293.1181335449219, "intensity": 0.00183215388096869, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 293.1491394042969, "intensity": 0.018938938155770302, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 295.0942077636719, "intensity": 0.01854114606976509, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 295.15447998046875, "intensity": 0.011424398981034756, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 296.0946960449219, "intensity": 0.0027124742045998573, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 299.13946533203125, "intensity": 0.0012349220924079418, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 304.1294860839844, "intensity": 0.00467372452840209, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 304.1660461425781, "intensity": 0.0016278792172670364, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 306.1464538574219, "intensity": 0.0012138180900365114, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 307.12945556640625, "intensity": 0.002729636151343584, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 308.1266784667969, "intensity": 0.002462053205817938, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 311.13507080078125, "intensity": 0.0014988170005381107, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 312.1545715332031, "intensity": 0.0138216158375144, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 315.16754150390625, "intensity": 0.0013295478420332074, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 317.189453125, "intensity": 0.0067473785020411015, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 318.129150390625, "intensity": 0.0016205881256610155, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 319.1655578613281, "intensity": 0.0015531597891822457, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 320.12518310546875, "intensity": 0.0013470923295244575, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 322.1409606933594, "intensity": 0.002023387933149934, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 322.1837463378906, "intensity": 0.0013911213027313352, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 323.17449951171875, "intensity": 0.00118489027954638, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 324.0958557128906, "intensity": 0.0063692922703921795, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 325.2246398925781, "intensity": 0.0013689491897821426, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 331.1667175292969, "intensity": 0.0013121882220730186, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 332.1630859375, "intensity": 0.0056574102491140366, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 332.1966857910156, "intensity": 0.0023801778443157673, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 333.1361999511719, "intensity": 0.0024615912698209286, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 334.13983154296875, "intensity": 0.0022322959266602993, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 337.1877136230469, "intensity": 0.002272942801937461, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 338.1408386230469, "intensity": 0.0020397785119712353, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 341.21759033203125, "intensity": 0.005565574858337641, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 343.19696044921875, "intensity": 0.0019801959861069918, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 343.2342224121094, "intensity": 0.026030024513602257, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 344.23681640625, "intensity": 0.005362342111766338, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 348.1115417480469, "intensity": 0.0020749892573803663, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 349.1601867675781, "intensity": 0.0013936496106907725, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 351.2022705078125, "intensity": 0.0017963334685191512, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 352.1496276855469, "intensity": 0.0019976040348410606, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 355.1986083984375, "intensity": 0.0027255844324827194, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 356.19757080078125, "intensity": 0.00156371237244457, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 360.1927795410156, "intensity": 0.002763312542811036, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 361.12054443359375, "intensity": 0.0017213746905326843, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 362.1343994140625, "intensity": 0.008105169981718063, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 368.14520263671875, "intensity": 0.00260019744746387, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 368.8841247558594, "intensity": 0.0016876746667549014, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 370.88153076171875, "intensity": 0.004788515157997608, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 372.18707275390625, "intensity": 0.0013965311227366328, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 374.1711120605469, "intensity": 0.0021030642092227936, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 375.2132568359375, "intensity": 0.0015196283347904682, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 376.1152648925781, "intensity": 0.0023342047352343798, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 378.12921142578125, "intensity": 0.009659127332270145, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 378.20330810546875, "intensity": 0.002027058508247137, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 379.12982177734375, "intensity": 0.0022459207102656364, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 380.145263671875, "intensity": 0.07971428334712982, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 381.1464538574219, "intensity": 0.01496316958218813, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 382.1656494140625, "intensity": 0.0012487530475482345, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 384.68255615234375, "intensity": 0.0048201438039541245, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 385.18206787109375, "intensity": 0.0015249571297317743, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 389.2156677246094, "intensity": 0.01801009103655815, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 390.12615966796875, "intensity": 0.005098419729620218, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 390.1711120605469, "intensity": 0.0018380822148174047, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 391.238037109375, "intensity": 0.0364091657102108, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 392.18206787109375, "intensity": 0.020103489980101585, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 392.240234375, "intensity": 0.009231260046362877, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 393.1863708496094, "intensity": 0.004418458789587021, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 393.6887512207031, "intensity": 0.0027850205078721046, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 394.1269226074219, "intensity": 0.016928113996982574, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 394.1817932128906, "intensity": 0.0019497108878567815, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 395.125732421875, "intensity": 0.007091971579939127, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 396.1401062011719, "intensity": 0.08866950869560242, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 397.1436767578125, "intensity": 0.017941387370228767, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 397.19964599609375, "intensity": 0.0018227273831143975, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 398.7243347167969, "intensity": 0.0018349963938817382, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 401.2229919433594, "intensity": 0.001520317979156971, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 406.119140625, "intensity": 0.002194619970396161, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 406.1664123535156, "intensity": 0.0022744135931134224, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 408.1768798828125, "intensity": 0.018052490428090096, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 408.2355651855469, "intensity": 0.008182461373507977, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 409.17437744140625, "intensity": 0.009785570204257965, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 410.1632080078125, "intensity": 0.0027720134239643812, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 411.1470947265625, "intensity": 0.0105686504393816, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 413.198486328125, "intensity": 0.001675336854532361, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 419.16278076171875, "intensity": 0.001900229137390852, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 424.189208984375, "intensity": 0.006788124330341816, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 427.1813659667969, "intensity": 0.014049929566681385, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 434.15869140625, "intensity": 0.004947120323777199, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 438.1591796875, "intensity": 0.002165586221963167, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 441.22320556640625, "intensity": 0.006136029027402401, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 441.7251892089844, "intensity": 0.001993156038224697, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 443.4877624511719, "intensity": 0.002560313092544675, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 447.22418212890625, "intensity": 0.0021838920656591654, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 449.2178039550781, "intensity": 0.00297098932787776, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 451.2281799316406, "intensity": 0.00200630072504282, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 454.18719482421875, "intensity": 0.001703316462226212, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 455.2070617675781, "intensity": 0.001912111067213118, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 456.1942443847656, "intensity": 0.002639027312397957, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 457.20379638671875, "intensity": 0.001747987582348287, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 457.73443603515625, "intensity": 0.007460512220859528, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 458.2295227050781, "intensity": 0.007203794550150633, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 461.2078857421875, "intensity": 0.0018714835168793797, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 461.6672058105469, "intensity": 0.022246502339839935, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 462.1690673828125, "intensity": 0.01518880482763052, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 462.66534423828125, "intensity": 0.00392258120700717, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 463.22125244140625, "intensity": 0.001762326224707067, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 465.2395935058594, "intensity": 0.010574576444923878, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 466.7384338378906, "intensity": 0.007733647245913744, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 467.2439880371094, "intensity": 0.00240517221391201, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 468.1683654785156, "intensity": 0.016267435625195503, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 468.5038146972656, "intensity": 0.006641255225986242, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 468.8381652832031, "intensity": 0.0020555921364575624, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 475.2208251953125, "intensity": 0.012033408507704735, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 476.2301330566406, "intensity": 0.0022977946791797876, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 478.5061340332031, "intensity": 0.0016809748485684395, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 481.2286071777344, "intensity": 0.013696657493710518, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 482.2329406738281, "intensity": 0.0017200480215251446, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 483.2173156738281, "intensity": 0.0017147925682365894, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 489.7347412109375, "intensity": 0.002124811988323927, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 490.2303161621094, "intensity": 0.00799971166998148, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 491.21075439453125, "intensity": 0.0065628415904939175, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 493.22979736328125, "intensity": 0.031000683084130287, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 494.2367858886719, "intensity": 0.005558603908866644, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 495.2466735839844, "intensity": 0.0020612517837435007, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 498.7380065917969, "intensity": 0.008196225389838219, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 499.180419921875, "intensity": 0.00256107235327363, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 499.2433776855469, "intensity": 0.005503145977854729, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 502.29876708984375, "intensity": 0.006590996403247118, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 503.2153625488281, "intensity": 0.005147680174559355, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 506.2979736328125, "intensity": 0.05400080978870392, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 507.2139892578125, "intensity": 0.008274776861071587, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 507.3029479980469, "intensity": 0.013491841964423656, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 508.22113037109375, "intensity": 0.0026495433412492275, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 509.2239074707031, "intensity": 0.03926444053649902, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 510.229248046875, "intensity": 0.01056002639234066, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 519.2100830078125, "intensity": 0.0028328869957476854, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 523.218994140625, "intensity": 0.0016726620960980654, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 527.1832885742188, "intensity": 0.006000025197863579, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 538.22998046875, "intensity": 0.001698524341918528, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 539.2218627929688, "intensity": 0.005774547345936298, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 544.2365112304688, "intensity": 0.0018440989078953862, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 545.2294311523438, "intensity": 0.0020951421465724707, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 547.2365112304688, "intensity": 0.0023589693009853363, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 548.285888671875, "intensity": 0.009239580482244492, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 549.2827758789062, "intensity": 0.002512131119146943, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 550.2734375, "intensity": 0.001968534430488944, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 551.2608032226562, "intensity": 0.003041723510250449, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 552.27392578125, "intensity": 0.006994000636041164, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 554.3021240234375, "intensity": 0.0025252681225538254, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 558.2590942382812, "intensity": 0.0018263664096593857, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 562.248291015625, "intensity": 0.009408933110535145, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 563.2490844726562, "intensity": 0.002130672102794051, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 568.2846069335938, "intensity": 0.009372586384415627, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 571.2163696289062, "intensity": 0.002752030035480857, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 571.300048828125, "intensity": 0.03217678889632225, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 572.2940063476562, "intensity": 0.005975484848022461, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 573.2216186523438, "intensity": 0.0018914982210844755, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 576.2680053710938, "intensity": 0.007450631819665432, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 578.2454833984375, "intensity": 0.007164762821048498, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 579.240478515625, "intensity": 0.0027090762741863728, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 588.2251586914062, "intensity": 0.0021315799094736576, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 589.216552734375, "intensity": 0.002814881969243288, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 590.2476196289062, "intensity": 0.013185546733438969, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 591.24658203125, "intensity": 0.002746300073340535, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 594.2771606445312, "intensity": 0.0028155760373920202, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 603.3386840820312, "intensity": 0.008204622194170952, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 606.2410278320312, "intensity": 0.010381950065493584, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 607.247314453125, "intensity": 0.002903613494709134, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 621.3260498046875, "intensity": 0.05336622893810272, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 622.2498168945312, "intensity": 0.005751725286245346, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 622.3396606445312, "intensity": 0.014483418315649033, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 624.2669677734375, "intensity": 0.0024784093257039785, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 639.2877197265625, "intensity": 0.005657575558871031, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 640.2659301757812, "intensity": 0.015392347238957882, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 641.272705078125, "intensity": 0.006715257186442614, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 649.2831420898438, "intensity": 0.0019549329299479723, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 652.2927856445312, "intensity": 0.0026056659407913685, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 658.2869873046875, "intensity": 0.0022532185539603233, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 661.3648681640625, "intensity": 0.006536299362778664, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 666.3076171875, "intensity": 0.0018123963382095098, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 667.3101196289062, "intensity": 0.00729668652638793, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 668.302001953125, "intensity": 0.00517605384811759, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 669.3223266601562, "intensity": 0.006576949264854193, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 670.3338623046875, "intensity": 0.002106674248352647, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 673.3258666992188, "intensity": 0.0019747165497392416, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 678.3484497070312, "intensity": 0.0026679441798478365, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 683.3060913085938, "intensity": 0.0023875946644693613, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 684.3152465820312, "intensity": 0.001870065345428884, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 686.325927734375, "intensity": 0.034174639731645584, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 687.3264770507812, "intensity": 0.007020979654043913, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 703.33447265625, "intensity": 0.011295613832771778, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 704.3676147460938, "intensity": 0.011699803173542023, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 705.3640747070312, "intensity": 0.00525832362473011, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 719.3206176757812, "intensity": 0.005972533021122217, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 720.3448486328125, "intensity": 0.0028620983939617872, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 722.3718872070312, "intensity": 0.1677124947309494, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 723.3745727539062, "intensity": 0.05542946979403496, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 724.377685546875, "intensity": 0.00867200456559658, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 732.3583984375, "intensity": 0.010504391975700855, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 736.3513793945312, "intensity": 0.0029208799824118614, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 742.3342895507812, "intensity": 0.0058514708653092384, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 743.4525756835938, "intensity": 0.0050524151884019375, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 756.3646850585938, "intensity": 0.00182347244117409, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 768.3623046875, "intensity": 0.019639739766716957, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 769.3590087890625, "intensity": 0.0062381811439991, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 770.363037109375, "intensity": 0.011592509225010872, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 771.3642578125, "intensity": 0.00516934972256422, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 780.3240966796875, "intensity": 0.0017231660895049572, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 784.3544311523438, "intensity": 0.012083208188414574, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 785.3605346679688, "intensity": 0.011905166320502758, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 787.3731689453125, "intensity": 0.09224351495504379, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 788.3648071289062, "intensity": 0.02292587421834469, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 796.3541259765625, "intensity": 0.017091121524572372, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 797.3524169921875, "intensity": 0.006966445595026016, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 827.432373046875, "intensity": 0.006801292300224304, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 837.3410034179688, "intensity": 0.01160343736410141, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 845.4363403320312, "intensity": 0.0025301880668848753, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 847.3785400390625, "intensity": 0.002377202035859227, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 891.4296264648438, "intensity": 0.011183329857885838, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 892.435302734375, "intensity": 0.0020198191050440073, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 909.4404907226562, "intensity": 0.0017175693064928055, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 910.448974609375, "intensity": 0.0019373194081708789, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 911.3892822265625, "intensity": 0.0017831774894148111, "calc_mz": null, "fragment": null, "color": "#212121"}], "data-3b4e94211c555789b7d60ef39578a0f0": [{"exp_mz": 201.12342834472656, "intensity": 1.0, "calc_mz": 201.12336184721002, "fragment": "a2+", "color": "#388E3C"}, {"exp_mz": 229.1182861328125, "intensity": 0.12362688779830933, "calc_mz": 229.11827646677, "fragment": "b2+", "color": "#1976D2"}, {"exp_mz": 294.1481018066406, "intensity": 0.09775182604789734, "calc_mz": 294.14820615047, "fragment": "y2+", "color": "#D32F2F"}, {"exp_mz": 330.1664733886719, "intensity": 0.01699785329401493, "calc_mz": 330.16595646677, "fragment": "b3+", "color": "#1976D2"}, {"exp_mz": 407.2345275878906, "intensity": 0.04010431468486786, "calc_mz": 407.23226615047, "fragment": "y3+", "color": "#D32F2F"}, {"exp_mz": 417.21624755859375, "intensity": 0.01148946862667799, "calc_mz": 417.19798184721, "fragment": "a4+", "color": "#388E3C"}, {"exp_mz": 445.1958923339844, "intensity": 0.00603132788091898, "calc_mz": 445.19289646677, "fragment": "b4+", "color": "#1976D2"}, {"exp_mz": 570.2952880859375, "intensity": 0.116341732442379, "calc_mz": 570.2955961504699, "fragment": "y4+", "color": "#D32F2F"}, {"exp_mz": 608.2478637695312, "intensity": 0.00200505624525249, "calc_mz": 608.2562264667699, "fragment": "b5+", "color": "#1976D2"}, {"exp_mz": 685.32275390625, "intensity": 0.08550902456045151, "calc_mz": 685.32253615047, "fragment": "y5+", "color": "#D32F2F"}, {"exp_mz": 721.355224609375, "intensity": 0.001617116155102849, "calc_mz": 721.34028646677, "fragment": "b6+", "color": "#1976D2"}, {"exp_mz": 786.3702392578125, "intensity": 0.21691974997520447, "calc_mz": 786.3702161504699, "fragment": "y6+", "color": "#D32F2F"}], "data-0dcde8dd45f6bd2ef5f3ff14bbb41702": [{"exp_mz": 110.07059478759766, "intensity": -0.008299429900944233, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 120.08062744140625, "intensity": -0.041246164590120316, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 129.10226440429688, "intensity": -0.08054205030202866, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 130.0860137939453, "intensity": -0.042629774659872055, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 134.99298095703125, "intensity": -0.00932526309043169, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 136.07591247558594, "intensity": -0.06720524281263351, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 138.09109497070312, "intensity": -0.012821473181247711, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 141.10186767578125, "intensity": -0.04453577101230621, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 141.76382446289062, "intensity": -0.006814171560108662, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 147.1224822998047, "intensity": -0.005775532219558954, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 155.1168670654297, "intensity": -0.010386997833848, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 156.10171508789062, "intensity": -0.019309578463435173, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 171.07586669921875, "intensity": -0.012307228520512581, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 175.08607482910156, "intensity": -0.00820414163172245, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 175.1188201904297, "intensity": -0.014013419859111309, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 181.0976104736328, "intensity": -0.006657105404883623, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 183.11285400390625, "intensity": -0.0892169326543808, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 184.09695434570312, "intensity": -0.019167378544807434, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 189.08668518066406, "intensity": -0.011302907951176167, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 199.07208251953125, "intensity": -0.007027905900031328, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 202.1262969970703, "intensity": -0.05568723753094673, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 212.13876342773438, "intensity": -0.019388949498534203, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 215.1390380859375, "intensity": -0.008286112919449806, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 217.08145141601562, "intensity": -0.019570302218198776, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 230.11839294433594, "intensity": -0.007626713719218969, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 230.1500701904297, "intensity": -0.06515411287546158, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 235.10760498046875, "intensity": -0.052142184227705, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 237.5552520751953, "intensity": -0.007682231720536947, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 238.4727325439453, "intensity": -0.00868980959057808, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 261.1269226074219, "intensity": -0.011668271385133266, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 261.1536865234375, "intensity": -0.011763500049710274, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 266.14990234375, "intensity": -0.017425378784537315, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 267.1122131347656, "intensity": -0.023516539484262466, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 276.1372985839844, "intensity": -0.017139924690127373, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 279.0971984863281, "intensity": -0.015170121565461159, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 284.16094970703125, "intensity": -0.016683239489793777, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 295.9517822265625, "intensity": -0.008779431693255901, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 301.0603332519531, "intensity": -0.01603882387280464, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 303.0617980957031, "intensity": -0.008436904288828373, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 330.950439453125, "intensity": -0.10246945172548294, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 332.9672546386719, "intensity": -0.017881331965327263, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 337.182373046875, "intensity": -0.009878508746623993, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 343.2332458496094, "intensity": -0.03866365924477577, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 346.93072509765625, "intensity": -0.10084302723407745, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 352.34954833984375, "intensity": -0.009011656045913696, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 352.6845397949219, "intensity": -0.009394717402756214, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 364.93994140625, "intensity": -0.07708994299173355, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 376.8848876953125, "intensity": -0.01453874260187149, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 378.7596435546875, "intensity": -0.010065495036542416, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 380.1451721191406, "intensity": -0.07894925773143768, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 414.7584228515625, "intensity": -0.016572946682572365, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 430.93255615234375, "intensity": -0.046382658183574677, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 440.42022705078125, "intensity": -0.011254245415329933, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 448.94378662109375, "intensity": -0.1757553219795227, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 466.7406005859375, "intensity": -0.01908719353377819, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 466.9552307128906, "intensity": -0.018679315224289894, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 493.22845458984375, "intensity": -0.04052990674972534, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 498.7388916015625, "intensity": -0.03854138031601906, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 499.24053955078125, "intensity": -0.017051396891474724, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 506.2981262207031, "intensity": -0.09308931976556778, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 508.96502685546875, "intensity": -0.15628619492053986, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 550.770751953125, "intensity": -0.015288774855434895, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 571.2944946289062, "intensity": -0.015715502202510834, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 603.3489379882812, "intensity": -0.06740010529756546, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 621.3248901367188, "intensity": -0.10459533333778381, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 640.267578125, "intensity": -0.011592824943363667, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 660.8516235351562, "intensity": -0.013740002177655697, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 686.3241577148438, "intensity": -0.04613020271062851, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 703.3303833007812, "intensity": -0.014731225557625294, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 722.3724975585938, "intensity": -0.32416194677352905, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 723.3729858398438, "intensity": -0.08374866098165512, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 787.3787841796875, "intensity": -0.10089222341775894, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 788.371337890625, "intensity": -0.017572680488228798, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 819.415283203125, "intensity": -0.012236426584422588, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 887.7566528320312, "intensity": -0.013798175379633904, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 998.4473876953125, "intensity": -0.01264112163335085, "calc_mz": null, "fragment": null, "color": "#212121"}], "data-952724485d9f043edd5a997ab65e1349": [{"exp_mz": 147.11236572265625, "intensity": -0.05775125324726105, "calc_mz": 147.11280115047, "fragment": "y1+", "color": "#D32F2F"}, {"exp_mz": 201.123291015625, "intensity": -1.0, "calc_mz": 201.12336184721002, "fragment": "a2+", "color": "#388E3C"}, {"exp_mz": 229.1180419921875, "intensity": -0.1552543193101883, "calc_mz": 229.11827646677, "fragment": "b2+", "color": "#1976D2"}, {"exp_mz": 294.1481628417969, "intensity": -0.14161427319049835, "calc_mz": 294.14820615047, "fragment": "y2+", "color": "#D32F2F"}, {"exp_mz": 330.1653747558594, "intensity": -0.012781236320734024, "calc_mz": 330.16595646677, "fragment": "b3+", "color": "#1976D2"}, {"exp_mz": 407.2305908203125, "intensity": -0.09693964570760727, "calc_mz": 407.23226615047, "fragment": "y3+", "color": "#D32F2F"}, {"exp_mz": 570.296630859375, "intensity": -0.13620002567768097, "calc_mz": 570.2955961504699, "fragment": "y4+", "color": "#D32F2F"}, {"exp_mz": 685.3226928710938, "intensity": -0.1480952948331833, "calc_mz": 685.32253615047, "fragment": "y5+", "color": "#D32F2F"}, {"exp_mz": 786.3701782226562, "intensity": -0.34617432951927185, "calc_mz": 786.3702161504699, "fragment": "y6+", "color": "#D32F2F"}], "data-d28e446509bf496330247e60d741ef1c": [{"sep": 0}]}}
\ No newline at end of file
diff --git a/docs/src/plotting.md b/docs/src/plotting.md
index ed13397..cc7ac0d 100644
--- a/docs/src/plotting.md
+++ b/docs/src/plotting.md
@@ -31,36 +31,34 @@ of code is required to do the actual plotting:
 
 ```python
 import matplotlib.pyplot as plt
+import pandas as pd
 import spectrum_utils.plot as sup
 import spectrum_utils.spectrum as sus
-from pyteomics import mgf
-
-
-spectra = []
-for spectrum_dict in mgf.read('spectra.mgf'):
-    if 'DLTDYLMK' in spectrum_dict['params']['title']:
-        identifier = spectrum_dict['params']['title']
-        precursor_mz = spectrum_dict['params']['pepmass'][0]
-        precursor_charge = spectrum_dict['params']['charge'][0]
-        mz = spectrum_dict['m/z array']
-        intensity = spectrum_dict['intensity array']
-        retention_time = float(spectrum_dict['params']['rtinseconds'])
-        peptide = 'DLTDYLMK'
-        modifications = {6: 15.994915}
-
-        # Create the MS/MS spectrum.
-        spectra.append(sus.MsmsSpectrum(identifier, precursor_mz,
-                                        precursor_charge, mz, intensity,
-                                        retention_time=retention_time,
-                                        peptide=peptide,
-                                        modifications=modifications)
-                       .filter_intensity(0.01, 50)
-                       .scale_intensity('root')
-                       .annotate_peptide_fragments(0.5, 'Da', ion_types='aby'))
+import urllib.parse
+
+
+peptide, modifications = 'DLTDYLMK', {6: 15.994915}
+usi_top = 'mzspec:MSV000079960:DY_HS_Exp7-Ad1:scan:30372'
+peaks_top = pd.read_csv(
+    f'https://metabolomics-usi.ucsd.edu/csv/?usi={urllib.parse.quote(usi_top)}')
+spectrum_top = sus.MsmsSpectrum(usi_top, 507.7484, 2,
+                                peaks_top['mz'].values,
+                                peaks_top['intensity'].values,
+                                peptide=peptide,
+                                modifications=modifications)
+usi_bottom = 'mzspec:MSV000080679:j11962_C1orf144:scan:10671'
+peaks_bottom = pd.read_csv(
+    f'https://metabolomics-usi.ucsd.edu/csv/?usi={urllib.parse.quote(usi_bottom)}')
+spectrum_bottom = sus.MsmsSpectrum(usi_bottom, 507.7484, 2,
+                                   peaks_bottom['mz'].values,
+                                   peaks_bottom['intensity'].values,
+                                   peptide=peptide,
+                                   modifications=modifications)
 
 fig, ax = plt.subplots(figsize=(12, 6))
-spectrum_top, spectrum_bottom = spectra
-sup.mirror(spectrum_top, spectrum_bottom, ax=ax)
+sup.mirror(spectrum_top.annotate_peptide_fragments(0.5, 'Da', ion_types='aby'),
+           spectrum_bottom.annotate_peptide_fragments(0.5, 'Da', ion_types='aby'),
+           ax=ax)
 plt.show()
 plt.close()
 ```
@@ -84,28 +82,22 @@ See below for example interactive plots of a single spectrum and a mirror plot.
 <script src="https://cdn.jsdelivr.net/npm/vega-embed@4"></script>
 
 ```python
+import pandas as pd
 import spectrum_utils.iplot as sup
 import spectrum_utils.spectrum as sus
-from pyteomics import mgf
-
-
-# Read the spectrum from an MGF file using Pyteomics.
-spectrum_dict = mgf.get_spectrum(
-    'spectra.mgf',
-    'mzspec:PXD004732:01650b_BC2-TUM_first_pool_53_01_01-3xHCD-1h-R2:scan:'
-    '41840:WNQLQAFWGTGK/2')
-identifier = spectrum_dict['params']['title']
-precursor_mz = spectrum_dict['params']['pepmass'][0]
-precursor_charge = spectrum_dict['params']['charge'][0]
-mz = spectrum_dict['m/z array']
-intensity = spectrum_dict['intensity array']
-retention_time = float(spectrum_dict['params']['rtinseconds'])
-peptide = 'WNQLQAFWGTGK'
+import urllib.parse
 
+
+# Get the spectrum peaks using its USI.
+usi = 'mzspec:PXD004732:01650b_BC2-TUM_first_pool_53_01_01-3xHCD-1h-R2:scan:41840'
+peaks = pd.read_csv(
+    f'https://metabolomics-usi.ucsd.edu/csv/?usi={urllib.parse.quote(usi)}')
 # Create the MS/MS spectrum.
-spectrum = sus.MsmsSpectrum(
-    identifier, precursor_mz, precursor_charge, mz, intensity,
-    retention_time=retention_time, peptide=peptide)
+precursor_mz = 718.3600
+precursor_charge = 2
+spectrum = sus.MsmsSpectrum(usi, precursor_mz, precursor_charge,
+                            peaks['mz'].values, peaks['intensity'].values,
+                            peptide='WNQLQAFWGTGK')
 
 # Process the MS/MS spectrum.
 fragment_tol_mass = 10
@@ -125,36 +117,34 @@ spectrum = (spectrum.set_mz_range(min_mz=100, max_mz=1400)
 <div id="spectrum"></div>
 
 ```python
+import pandas as pd
 import spectrum_utils.iplot as sup
 import spectrum_utils.spectrum as sus
-from pyteomics import mgf
-
-
-spectra = []
-for spectrum_dict in mgf.read('../docs/spectra.mgf'):
-    if 'DLTDYLMK' in spectrum_dict['params']['title']:
-        identifier = spectrum_dict['params']['title']
-        precursor_mz = spectrum_dict['params']['pepmass'][0]
-        precursor_charge = spectrum_dict['params']['charge'][0]
-        mz = spectrum_dict['m/z array']
-        intensity = spectrum_dict['intensity array']
-        retention_time = float(spectrum_dict['params']['rtinseconds'])
-        peptide = 'DLTDYLMK'
-        modifications = {6: 15.994915}
-
-        # Create the MS/MS spectrum.
-        spectra.append(sus.MsmsSpectrum(identifier, precursor_mz,
-                                        precursor_charge, mz, intensity,
-                                        retention_time=retention_time,
-                                        peptide=peptide,
-                                        modifications=modifications)
-                       .filter_intensity(0.01, 50)
-                       .scale_intensity('root')
-                       .annotate_peptide_fragments(0.5, 'Da', ion_types='aby'))
-
-spectrum_top, spectrum_bottom = spectra
-(sup.mirror(spectrum_top, spectrum_bottom).properties(width=800, height=600)
-                                          .save('mirror_iplot.json'))
+import urllib.parse
+
+
+peptide, modifications = 'DLTDYLMK', {6: 15.994915}
+usi_top = 'mzspec:MSV000079960:DY_HS_Exp7-Ad1:scan:30372'
+peaks_top = pd.read_csv(
+    f'https://metabolomics-usi.ucsd.edu/csv/?usi={urllib.parse.quote(usi_top)}')
+spectrum_top = sus.MsmsSpectrum(usi_top, 507.7484, 2,
+                                peaks_top['mz'].values,
+                                peaks_top['intensity'].values,
+                                peptide=peptide,
+                                modifications=modifications)
+usi_bottom = 'mzspec:MSV000080679:j11962_C1orf144:scan:10671'
+peaks_bottom = pd.read_csv(
+    f'https://metabolomics-usi.ucsd.edu/csv/?usi={urllib.parse.quote(usi_bottom)}')
+spectrum_bottom = sus.MsmsSpectrum(usi_bottom, 507.7484, 2,
+                                   peaks_bottom['mz'].values,
+                                   peaks_bottom['intensity'].values,
+                                   peptide=peptide,
+                                   modifications=modifications)
+
+(sup.mirror(spectrum_top.annotate_peptide_fragments(0.5, 'Da', ion_types='aby'),
+            spectrum_bottom.annotate_peptide_fragments(0.5, 'Da', ion_types='aby'))
+ .properties(width=800, height=600)
+ .save('mirror_iplot.json'))
 ```
 
 <div id="mirror"></div>
diff --git a/docs/src/processing.md b/docs/src/processing.md
index 2ebdcc3..e659bd1 100644
--- a/docs/src/processing.md
+++ b/docs/src/processing.md
@@ -13,7 +13,7 @@ y, or z ions for peptide spectra.
 - Using `MsmsSpectrum.annotate_molecule_fragment(...)` using SMILES strings to
 annotate peaks with molecule (sub)structures.
 - Using `MsmsSpectrum.annotate_mz_fragment(...)` to annotate peaks with their
-_m_/_z_ value or user-provided custom strings.
+_m_/_z_ value.
 
 Peak annotations can be visualized using the spectrum_utils plotting
 functionality.
@@ -26,28 +26,26 @@ _m_/_z_ values:
 
 ```python
 import matplotlib.pyplot as plt
+import pandas as pd
 import spectrum_utils.spectrum as sus
 import spectrum_utils.plot as sup
-from pyteomics import mgf
-
-
-spectrum_dict = mgf.get_spectrum('spectra.mgf', 'CCMSLIB00000840351')
-identifier = spectrum_dict['params']['title']
-precursor_mz = spectrum_dict['params']['pepmass'][0]
-precursor_charge = spectrum_dict['params']['charge'][0]
-mz = spectrum_dict['m/z array']
-intensity = spectrum_dict['intensity array']
-
-spectrum = sus.MsmsSpectrum(
-    identifier, precursor_mz, precursor_charge, mz, intensity)
+import urllib.parse
+
+usi = 'mzspec:GNPS:GNPS-LIBRARY:accession:CCMSLIB00000840351'
+peaks = pd.read_csv(
+    f'https://metabolomics-usi.ucsd.edu/csv/?usi={urllib.parse.quote(usi)}')
+precursor_mz = 633.2680
+precursor_charge = 1
+spectrum = sus.MsmsSpectrum(usi, precursor_mz, precursor_charge,
+                            peaks['mz'].values, peaks['intensity'].values)
 spectrum.filter_intensity(0.05)
 
-charge, tol_mass, tol_mode = 1, 0.5, 'Da'
+tol_mass, tol_mode = 0.5, 'Da'
 annotate_fragment_mz = [133.102, 147.080, 195.117, 237.164, 267.174, 295.170,
                         313.181, 355.192, 377.172, 391.187, 451.209, 511.231,
                         573.245, 633.269]
 for fragment_mz in annotate_fragment_mz:
-    spectrum.annotate_mz_fragment(fragment_mz, charge, tol_mass, tol_mode)
+    spectrum.annotate_mz_fragment(fragment_mz, tol_mass, tol_mode)
 
 fig, ax = plt.subplots(figsize=(12, 6))
 sup.spectrum(spectrum, ax=ax)
@@ -104,7 +102,43 @@ oxidated methionine:
 peptide = 'DLTDYLMK'
 modifications = {6: 15.994915}
 
-spectrum = sus.spectrum.MsmsSpectrum(
+spectrum = sus.MsmsSpectrum(
     identifier, precursor_mz, precursor_charge, mz, intensity,
     peptide=peptide, modifications=modifications)
 ```
+
+
+## Neutral losses
+
+Besides the canonical a, b, c, x, y, and z ions, each of these ions can also be
+automatically annotated with a neutral loss (or gain). Neutral losses need to
+be specified by their identifier (molecular formula) and their mass difference:
+
+```python
+spectrum.annotate_peptide_fragments(0.05, 'Da', ion_types='aby',
+                                    neutral_losses={'NH3': -17.026549,
+                                                    'H2O': -18.010565})
+```
+
+The above example will consider all peaks with an optional ammonia (NH3) or
+water (H2O) neutral loss.
+
+Common neutral losses to consider are:
+
+| Neutral loss/gain | Molecular formula | Mass difference |
+| --- | --- | --- |
+| Hydrogen | H | 1.007825 |
+| Ammonia | NH3 | 17.026549 |
+| Water | H2O | 18.010565 |
+| Carbon monoxide | CO | 27.994915 |
+| Carbon dioxide | CO2 | 43.989829 |
+| Formamide | HCONH2 | 45.021464 |
+| Formic acid | HCOOH | 46.005479 |
+| Methanesulfenic acid | CH4OS | 63.998301 |
+| Sulfur trioxide | SO3 | 79.956818 |
+| Metaphosphoric acid | HPO3 | 79.966331 |
+| Mercaptoacetamide | C2H5NOS | 91.009195 |
+| Mercaptoacetic acid | C2H4O2S | 91.993211 |
+| Phosphoric acid | H3PO4 | 97.976896 |
+
+Note that typically the neutral _loss_ mass difference should be negative.
diff --git a/docs/src/quickstart.md b/docs/src/quickstart.md
index dc64170..34d2da3 100644
--- a/docs/src/quickstart.md
+++ b/docs/src/quickstart.md
@@ -15,32 +15,28 @@ intense peaks.
 IO functionality is not included in spectrum_utils. Instead you can use
 excellent libraries to read a variety of mass spectrometry data formats such as
 [Pyteomics](https://pyteomics.readthedocs.io/) or
-[pymzML](https://pymzml.readthedocs.io/).
+[pymzML](https://pymzml.readthedocs.io/), or from retrieve spectra from
+external resources, for example, using their
+[Universal Spectrum Identifier](https://www.psidev.info/usi).
 
 ```python
 import matplotlib.pyplot as plt
+import pandas as pd
 import spectrum_utils.plot as sup
 import spectrum_utils.spectrum as sus
-from pyteomics import mgf
+import urllib.parse
 
 
-# Read the spectrum from an MGF file using Pyteomics.
-spectrum_dict = mgf.get_spectrum(
-    'spectra.mgf',
-    'mzspec:PXD004732:01650b_BC2-TUM_first_pool_53_01_01-3xHCD-1h-R2:scan:'
-    '41840:WNQLQAFWGTGK/2')
-identifier = spectrum_dict['params']['title']
-precursor_mz = spectrum_dict['params']['pepmass'][0]
-precursor_charge = spectrum_dict['params']['charge'][0]
-mz = spectrum_dict['m/z array']
-intensity = spectrum_dict['intensity array']
-retention_time = float(spectrum_dict['params']['rtinseconds'])
-peptide = 'WNQLQAFWGTGK'
-
+# Get the spectrum peaks using its USI.
+usi = 'mzspec:PXD004732:01650b_BC2-TUM_first_pool_53_01_01-3xHCD-1h-R2:scan:41840'
+peaks = pd.read_csv(
+    f'https://metabolomics-usi.ucsd.edu/csv/?usi={urllib.parse.quote(usi)}')
 # Create the MS/MS spectrum.
-spectrum = sus.MsmsSpectrum(
-    identifier, precursor_mz, precursor_charge, mz, intensity,
-    retention_time=retention_time, peptide=peptide)
+precursor_mz = 718.3600
+precursor_charge = 2
+spectrum = sus.MsmsSpectrum(usi, precursor_mz, precursor_charge,
+                            peaks['mz'].values, peaks['intensity'].values,
+                            peptide='WNQLQAFWGTGK')
 
 # Process the MS/MS spectrum.
 fragment_tol_mass = 10
@@ -63,10 +59,12 @@ As demonstrated, each of the processing steps can be achieved using a single,
 high-level function call. These calls can be chained together to easily
 perform multiple processing steps.
 
-Note that several processing steps modify the peak _m_/_z_ and intensity values
-and are thus not idempotent.
-
 Spectrum plotting can similarly be achieved using a high-level function call,
 resulting in the following figure:
 
 ![](quickstart.png)
+
+Note that several processing steps modify the peak _m_/_z_ and intensity values
+and are thus not idempotent. It is recommended to make a copy of the
+`MsmsSpectrum` object prior to any processing if the raw peak values need to
+remain available as well.
diff --git a/docs/src/spectra.mgf b/docs/src/spectra.mgf
deleted file mode 100644
index 3a12735..0000000
--- a/docs/src/spectra.mgf
+++ /dev/null
@@ -1,1500 +0,0 @@
-BEGIN IONS
-TITLE=mzspec:PXD004732:01650b_BC2-TUM_first_pool_53_01_01-3xHCD-1h-R2:scan:41840:WNQLQAFWGTGK/2
-RTINSECONDS=2678.94
-PEPMASS=718.36
-CHARGE=2+
-101.07122 81011.57 
-109.68925 4123.349 
-115.86999 4006.9321 
-120.0811 66933.17 
-129.06595 11000.844 
-129.1023 67220.16 
-130.06534 88976.56 
-130.08633 24920.941 
-130.95578 4863.066 
-131.11859 5661.9194 
-132.07968 41732.137 
-136.07567 31081.303 
-141.31848 4782.2046 
-142.21034 5040.6426 
-147.11273 49796.156 
-155.08185 6270.5312 
-159.07605 18098.807 
-159.09169 546127.56 
-160.07516 6226.79 
-160.09506 29613.12 
-170.06009 178521.7 
-171.06319 11150.161 
-175.11871 15695.941 
-186.12335 31083.436 
-187.08667 62828.98 
-197.12814 41016.887 
-199.10913 5672.7583 
-199.17963 12625.682 
-200.10286 21674.656 
-201.10281 22450.273 
-201.12341 17107.639 
-204.11336 15654.782 
-204.13414 120404.91 
-211.14496 11095.885 
-213.15979 11517.213 
-214.09769 124366.77 
-214.1535 45346.207 
-215.10004 11787.429 
-216.64253 9688.401 
-217.13332 6285.3345 
-224.13977 10114.264 
-225.12349 16933.383 
-226.08267 15288.553 
-228.13486 10701.1045 
-229.1201 18149.885 
-233.16495 41805.56 
-239.08228 20613.857 
-242.14993 61143.707 
-243.10875 71694.67 
-244.10834 14007.289 
-245.35168 11060.377 
-253.09628 17671.592 
-256.10834 18029.537 
-261.1596 35232.992 
-273.13486 19302.346 
-282.17978 10412.318 
-284.10266 350351.7 
-285.10632 42339.85 
-287.17343 14224.52 
-289.11084 9759.676 
-301.129 222278.44 
-302.1327 15488.672 
-305.1811 116594.016 
-310.1727 15155.255 
-313.18762 26307.275 
-318.15506 33678.273 
-321.1563 15527.332 
-326.17813 22253.271 
-328.2328 9714.508 
-334.15466 10548.278 
-344.00247 5726.4375 
-344.19284 55536.63 
-345.1581 19797.115 
-347.17093 35993.074 
-352.19876 14344.74 
-353.1817 78794.98 
-356.1928 38641.426 
-361.2311 17308.31 
-362.20374 321167.0 
-363.207 49607.965 
-367.14435 30500.693 
-370.21045 27519.66 
-384.16763 23826.633 
-385.17123 26812.957 
-395.1348 106583.16 
-402.18094 11173.92 
-409.20935 15909.75 
-412.16074 146074.52 
-413.16446 23989.854 
-417.17773 19026.498 
-424.21753 45752.113 
-425.2271 11420.22 
-429.1876 166889.69 
-430.19342 22282.277 
-441.24667 16894.553 
-454.23114 17635.023 
-462.21368 18778.855 
-463.1971 40425.176 
-480.2241 75016.37 
-481.22632 15470.299 
-484.24506 12459.969 
-488.21954 15727.637 
-497.25027 50514.742 
-498.25397 36844.938 
-506.25055 11248.006 
-508.22073 18829.473 
-512.25824 16063.4 
-516.2635 13619.328 
-517.2272 13366.1045 
-521.2413 10708.629 
-523.74426 10835.664 
-525.2426 52481.062 
-526.2479 19239.938 
-530.26794 31166.791 
-538.2638 12338.772 
-542.2722 42192.125 
-545.24817 15621.709 
-548.2805 346269.72 
-549.2873 80146.69 
-550.7827 17259.057 
-555.2859 14637.047 
-559.2943 66929.305 
-559.7948 34878.094 
-571.2866 26068.5 
-587.2942 12426.318 
-599.28723 19593.424 
-599.7854 19109.434 
-600.4091 11150.9 
-608.29016 26131.781 
-629.78845 13620.475 
-636.28156 21111.895 
-639.34784 10257.758 
-646.328 16610.361 
-647.32837 12370.426 
-653.3023 16981.797 
-670.3162 11065.478 
-677.3326 20208.62 
-685.323 17041.19 
-692.32416 11709.368 
-695.3513 243265.67 
-696.3513 71733.34 
-702.3403 10427.157 
-703.35065 13114.231 
-707.32135 13370.711 
-709.8466 17090.348 
-710.34625 35983.938 
-717.88837 23507.3 
-718.3871 179288.53 
-718.88586 18139.242 
-724.3413 24420.232 
-729.36005 11087.336 
-730.32825 12962.59 
-748.37524 25980.557 
-757.3715 18395.598 
-763.14374 10993.147 
-766.2276 17204.465 
-766.38745 319705.3 
-767.39105 107382.64 
-767.7366 10592.768 
-783.813 10974.094 
-831.4068 14374.425 
-835.4187 14261.798 
-858.4285 18317.068 
-859.41895 25027.375 
-869.44836 10635.955 
-871.4104 15698.649 
-876.4352 74991.85 
-877.4197 170194.28 
-878.41345 62863.05 
-886.42194 12419.671 
-887.41785 12949.016 
-894.44464 240654.78 
-895.44763 115458.13 
-904.4519 13719.998 
-905.4429 13071.061 
-906.4541 10587.502 
-972.48206 16986.84 
-989.50586 16629.197 
-990.4984 13235.243 
-1007.53156 242701.9 
-1008.5328 136257.86 
-1017.5188 12841.443 
-1018.51953 11758.576 
-1037.5978 11649.871 
-1046.4642 11818.519 
-1082.4929 12165.414 
-1100.5747 12222.698 
-1117.5706 14005.287 
-1118.574 84136.805 
-1119.5591 41772.547 
-1135.5819 132280.81 
-1136.5898 81302.51 
-1145.5717 11834.507 
-1214.5857 12680.0 
-1215.5576 12015.682 
-1227.598 12064.93 
-1232.5897 26659.176 
-1233.6329 16421.662 
-1249.6306 75185.07 
-1250.6298 61431.11 
-1260.6073 22042.248 
-1261.614 18096.48 
-1272.6572 12666.438 
-END IONS
-
-BEGIN IONS
-TITLE=mzspec:PXD002084:TCGA-AA-A01D-01A-23_W_VU_20121106_A0218_5I_R_FR15:scan:5209:DLTDYLMK/2
-PEPMASS=507.748474121094
-RTINSECONDS=2373.5107000000203
-CHARGE=2+
-130.16445922851562 14.176600456237793 
-144.15029907226562 18.580642700195312 
-145.0997772216797 32.944820404052734 
-146.10662841796875 24.769989013671875 
-147.21878051757812 432.4062194824219 
-148.1580047607422 75.29698944091797 
-152.0559539794922 46.287418365478516 
-153.18751525878906 15.01723575592041 
-155.18405151367188 32.92185974121094 
-156.16380310058594 269.0245666503906 
-157.19134521484375 71.14859008789062 
-158.1749725341797 31.27341079711914 
-159.0936279296875 181.55467224121094 
-160.12728881835938 18.59253692626953 
-161.2062225341797 21.5468692779541 
-162.1539306640625 70.86749267578125 
-163.08706665039062 20.15288734436035 
-164.24981689453125 12.427539825439453 
-165.03762817382812 29.616422653198242 
-166.2030029296875 44.15125274658203 
-167.3431396484375 89.42369842529297 
-168.5606689453125 75.08866882324219 
-169.30889892578125 148.35546875 
-170.0923614501953 16.295202255249023 
-171.26239013671875 150.90936279296875 
-172.14920043945312 32.8551025390625 
-173.14251708984375 63.000064849853516 
-174.0629119873047 27.61180877685547 
-175.20547485351562 346.67486572265625 
-176.06512451171875 18.893386840820312 
-179.2554473876953 59.46813201904297 
-180.21990966796875 33.58407974243164 
-181.13577270507812 35.35655212402344 
-182.17724609375 31.319013595581055 
-183.2512969970703 808.58154296875 
-184.1317138671875 423.956298828125 
-185.29830932617188 92.97936248779297 
-186.22421264648438 74.06182861328125 
-187.3069305419922 51.526641845703125 
-190.19363403320312 10.808950424194336 
-191.24777221679688 21.93054962158203 
-193.27249145507812 113.05174255371094 
-194.39501953125 62.9003791809082 
-195.23988342285156 54.890384674072266 
-196.20172119140625 79.26834869384766 
-197.21360778808594 92.87860107421875 
-198.1087188720703 28.968442916870117 
-199.26356506347656 70.61508178710938 
-201.17984008789062 18855.32421875 
-202.18572998046875 1125.466064453125 
-203.191650390625 130.68057250976562 
-204.18148803710938 79.6092529296875 
-205.1766357421875 30.4363956451416 
-206.26287841796875 19.81622314453125 
-207.27548217773438 10.763300895690918 
-208.461669921875 11.380395889282227 
-209.2145538330078 42.55521011352539 
-210.22579956054688 78.29435729980469 
-211.27890014648438 43.03289031982422 
-212.0867919921875 196.00527954101562 
-212.69395446777344 18.200271606445312 
-213.35647583007812 235.92959594726562 
-214.25192260742188 65.71371459960938 
-215.3544921875 142.95733642578125 
-217.27279663085938 242.31405639648438 
-218.23605346679688 46.010902404785156 
-219.4154052734375 28.589319229125977 
-220.2430419921875 56.80602264404297 
-221.22998046875 39.95853042602539 
-222.36317443847656 168.64056396484375 
-223.28634643554688 44.43805694580078 
-224.30001831054688 41.40081024169922 
-225.3038330078125 99.08731842041016 
-226.321044921875 90.8618392944336 
-227.27020263671875 530.1327514648438 
-229.19424438476562 14497.998046875 
-230.19107055664062 742.0250854492188 
-231.26109313964844 95.8435287475586 
-232.23348999023438 72.09461975097656 
-233.20889282226562 11.459311485290527 
-234.45181274414062 153.91790771484375 
-235.279541015625 71.45927429199219 
-236.32101440429688 35.11885452270508 
-237.426025390625 116.85889434814453 
-238.37423706054688 32.66848373413086 
-239.12252807617188 73.00459289550781 
-240.24154663085938 61.93109893798828 
-241.43563842773438 42.39219665527344 
-242.32337951660156 25.381330490112305 
-243.3157958984375 67.92469787597656 
-244.37408447265625 254.17578125 
-245.32553100585938 609.4312744140625 
-246.31585693359375 216.6100311279297 
-247.3373260498047 170.5593719482422 
-248.21316528320312 18.392009735107422 
-249.29136657714844 208.8376922607422 
-251.35052490234375 87.8984375 
-252.26405334472656 15.580683708190918 
-253.41302490234375 60.12495422363281 
-254.2822265625 106.75833129882812 
-256.54766845703125 103.18155670166016 
-257.3258972167969 85.76353454589844 
-258.49285888671875 33.021488189697266 
-259.1880187988281 21.81021499633789 
-260.311279296875 98.20370483398438 
-261.3442687988281 58.4863166809082 
-262.453125 105.69125366210938 
-263.3736877441406 93.16018676757812 
-264.4737854003906 162.18075561523438 
-265.33203125 61.64237594604492 
-266.2950134277344 297.28607177734375 
-267.2857971191406 70.6253433227539 
-268.3418884277344 124.72931671142578 
-269.28466796875 36.543209075927734 
-270.3506164550781 70.81133270263672 
-271.3954772949219 61.64683151245117 
-272.3932800292969 133.5714111328125 
-273.34063720703125 43.02778625488281 
-274.3840637207031 172.11842346191406 
-275.3154602050781 71.36497497558594 
-276.3689270019531 490.26556396484375 
-277.3541564941406 250.24795532226562 
-278.3179931640625 13.909971237182617 
-279.5576171875 85.39947509765625 
-280.36297607421875 86.56448364257812 
-281.2756042480469 24.933658599853516 
-282.3358154296875 128.5917205810547 
-283.29803466796875 147.9506072998047 
-284.3243408203125 1527.6448974609375 
-285.2060241699219 1093.8094482421875 
-286.27325439453125 214.68270874023438 
-287.38616943359375 108.15771484375 
-288.3861083984375 121.57390594482422 
-289.5339660644531 105.94024658203125 
-290.3258361816406 39.844146728515625 
-291.21368408203125 72.9103775024414 
-292.1832275390625 70.92529296875 
-293.33544921875 88.07096862792969 
-294.3020935058594 2109.96630859375 
-295.21923828125 299.58038330078125 
-296.29388427734375 193.48635864257812 
-297.461181640625 214.63998413085938 
-298.63873291015625 174.41278076171875 
-299.7322998046875 87.85234069824219 
-301.1483459472656 156.96075439453125 
-302.4022216796875 591.486572265625 
-303.4833068847656 226.48947143554688 
-304.35845947265625 176.8878631591797 
-305.2106018066406 87.79166412353516 
-306.5623779296875 546.0328369140625 
-307.4384765625 98.17959594726562 
-308.28338623046875 65.74390411376953 
-309.41094970703125 111.63729858398438 
-310.4181823730469 135.29286193847656 
-312.26556396484375 967.6683349609375 
-313.3745422363281 202.6256103515625 
-314.51873779296875 142.7120819091797 
-315.3752136230469 89.24518585205078 
-316.5367431640625 137.38633728027344 
-317.4598083496094 25.5479793548584 
-318.4774475097656 105.34056091308594 
-319.55718994140625 102.36206817626953 
-320.6680603027344 74.4513168334961 
-321.3844299316406 92.74372863769531 
-322.4696960449219 78.32272338867188 
-323.2933349609375 157.7412567138672 
-324.3749694824219 133.5015411376953 
-325.50164794921875 294.83135986328125 
-326.4111328125 125.7680435180664 
-327.45635986328125 156.55718994140625 
-328.64532470703125 191.24514770507812 
-330.31072998046875 6086.498046875 
-331.3168640136719 613.5625 
-332.50384521484375 263.1099548339844 
-333.3138732910156 367.3193664550781 
-334.7237854003906 440.1439208984375 
-335.494384765625 338.7238464355469 
-336.519775390625 68.98757934570312 
-337.47308349609375 61.94354248046875 
-338.4784851074219 39.3408203125 
-339.2611083984375 35.54988098144531 
-340.3954162597656 22.651124954223633 
-341.36834716796875 43.683143615722656 
-342.38525390625 145.29632568359375 
-343.4521179199219 270.9710998535156 
-344.42254638671875 156.58224487304688 
-345.1598205566406 75.59661865234375 
-346.31884765625 236.71536254882812 
-347.5166931152344 126.34611511230469 
-348.31768798828125 25.661428451538086 
-349.53009033203125 162.14443969726562 
-350.818115234375 73.61329650878906 
-351.66748046875 141.30397033691406 
-352.4127197265625 146.1426239013672 
-353.4316101074219 76.47642517089844 
-354.8935852050781 160.56094360351562 
-356.29840087890625 149.45797729492188 
-357.4247131347656 238.33468627929688 
-358.8166809082031 39.38264083862305 
-359.4649963378906 49.59750747680664 
-360.5274353027344 134.1815948486328 
-361.35052490234375 588.7325439453125 
-362.42913818359375 120.9933090209961 
-363.5794677734375 240.46701049804688 
-364.3964538574219 176.11041259765625 
-365.2037353515625 317.1766052246094 
-366.29510498046875 143.24111938476562 
-367.490234375 256.6130676269531 
-368.9371032714844 82.47824096679688 
-369.62066650390625 6.70804500579834 
-370.5542297363281 155.066650390625 
-371.4574890136719 106.99351501464844 
-372.3613586425781 53.255889892578125 
-373.3753356933594 166.5732421875 
-374.51165771484375 182.8759002685547 
-375.6975402832031 219.7382354736328 
-376.72808837890625 466.46746826171875 
-377.60443115234375 227.5966796875 
-378.4587097167969 554.3773803710938 
-379.3854675292969 557.6881713867188 
-380.1484375 254.87612915039062 
-381.0235900878906 116.56901550292969 
-382.48809814453125 151.37185668945312 
-383.50457763671875 176.02842712402344 
-384.81170654296875 3023.539794921875 
-385.5316467285156 3086.24169921875 
-386.4540100097656 359.1764831542969 
-387.5240783691406 270.6663818359375 
-388.4363708496094 312.8191223144531 
-389.42889404296875 357.849853515625 
-390.46441650390625 111.58948516845703 
-391.58526611328125 344.50872802734375 
-392.3980407714844 334.5776062011719 
-393.9139709472656 7172.62890625 
-395.1659851074219 288.99932861328125 
-395.8954162597656 66.20970916748047 
-396.53173828125 68.7606201171875 
-397.31927490234375 152.46493530273438 
-397.9209899902344 36.379207611083984 
-398.72332763671875 279.5868835449219 
-400.4443664550781 1107.8953857421875 
-401.5093078613281 1110.578857421875 
-402.4389343261719 773.5986938476562 
-403.4469299316406 225.81414794921875 
-404.43695068359375 146.3900604248047 
-405.4595642089844 263.33929443359375 
-407.1297607421875 6131.47998046875 
-408.23504638671875 799.0343017578125 
-409.39923095703125 487.0179138183594 
-410.5170593261719 178.713623046875 
-411.3804016113281 168.95286560058594 
-412.5989074707031 432.13714599609375 
-413.4334411621094 254.83346557617188 
-414.671630859375 760.55810546875 
-415.4269714355469 322.4102783203125 
-416.2274475097656 319.0356140136719 
-417.23724365234375 329.1602783203125 
-418.343017578125 150.64212036132812 
-419.66021728515625 823.029052734375 
-420.5930480957031 365.58837890625 
-421.42584228515625 162.8372344970703 
-422.6275329589844 430.63775634765625 
-423.4755859375 185.7105712890625 
-424.29534912109375 133.6400146484375 
-425.2980651855469 249.44284057617188 
-426.55865478515625 1473.0283203125 
-427.4266662597656 1122.5166015625 
-428.50494384765625 968.3920288085938 
-429.69189453125 235.64016723632812 
-430.7548522949219 176.24436950683594 
-431.4765319824219 134.00372314453125 
-432.385986328125 369.9739990234375 
-433.4351501464844 406.1750793457031 
-434.4616394042969 119.29351806640625 
-435.41571044921875 367.9092102050781 
-436.4251403808594 666.0912475585938 
-437.3595886230469 1269.652587890625 
-438.1916809082031 387.66326904296875 
-438.8463134765625 62.65609359741211 
-439.87835693359375 265.4013366699219 
-441.2134704589844 887.5042114257812 
-442.1705017089844 438.7386169433594 
-443.1305847167969 158.18360900878906 
-444.38507080078125 433.1226806640625 
-445.3630676269531 1973.6947021484375 
-446.3940124511719 345.1039123535156 
-447.2294006347656 321.47259521484375 
-448.2108459472656 268.6826477050781 
-449.2677917480469 616.583984375 
-450.353271484375 2345.690185546875 
-451.431884765625 641.7542724609375 
-452.7071533203125 141.348876953125 
-453.7667236328125 134.31280517578125 
-454.50628662109375 175.41455078125 
-455.3711242675781 441.4117736816406 
-456.0948181152344 497.1063537597656 
-457.2485046386719 885.5067138671875 
-458.1146240234375 773.3265991210938 
-459.01995849609375 187.12657165527344 
-459.6691589355469 239.8501434326172 
-460.5009460449219 138.81617736816406 
-461.2248840332031 323.6902770996094 
-462.0090026855469 210.13912963867188 
-462.6589050292969 336.7296142578125 
-463.3578186035156 266.0316162109375 
-464.3681335449219 329.9656677246094 
-465.2586364746094 241.50645446777344 
-466.70477294921875 1569.291015625 
-467.3719482421875 222.1005096435547 
-468.1464538574219 253.01669311523438 
-469.38604736328125 280.0226135253906 
-470.47674560546875 522.1521606445312 
-471.463623046875 849.1231079101562 
-472.38800048828125 801.5488891601562 
-473.3519592285156 661.34521484375 
-474.47747802734375 1043.2381591796875 
-475.3898620605469 1400.02587890625 
-476.01226806640625 2900.00537109375 
-476.9722595214844 804.2274169921875 
-477.61541748046875 639.3276977539062 
-479.1650695800781 1612.213134765625 
-480.3678283691406 1467.1356201171875 
-481.8454284667969 751.3356323242188 
-483.1801452636719 504.4932861328125 
-484.1480407714844 475.1331481933594 
-485.26983642578125 1204.61669921875 
-486.1910705566406 2380.477294921875 
-487.11566162109375 1703.798828125 
-488.2023620605469 585.4888916015625 
-489.6593017578125 9767.814453125 
-490.420654296875 4925.36767578125 
-491.5698547363281 1675.966552734375 
-492.34027099609375 3401.262939453125 
-493.4735107421875 2008.340087890625 
-495.0908508300781 3605.624755859375 
-495.9909362792969 3016.45458984375 
-497.21014404296875 1190.3221435546875 
-498.91326904296875 166401.65625 
-499.9296569824219 3290.45703125 
-501.19390869140625 118.3900146484375 
-501.9753112792969 48.479331970214844 
-502.7661437988281 41.8880500793457 
-504.1483459472656 102.13153076171875 
-505.1120910644531 32.93376541137695 
-507.7437438964844 50.84048080444336 
-510.3431701660156 34.924476623535156 
-511.6216125488281 16.71623992919922 
-513.0164794921875 60.88776397705078 
-514.6943969726562 211.87808227539062 
-515.5435791015625 314.83880615234375 
-516.497802734375 458.5650329589844 
-517.3712158203125 237.11483764648438 
-518.5411376953125 177.29855346679688 
-519.3777465820312 368.310791015625 
-520.1959838867188 46.003623962402344 
-520.8447265625 165.22286987304688 
-522.4485473632812 113.80804443359375 
-523.210693359375 276.455810546875 
-524.1777954101562 259.51983642578125 
-524.9659423828125 14.704580307006836 
-526.2811279296875 139.36180114746094 
-527.1416015625 176.83145141601562 
-528.7526245117188 209.0471954345703 
-529.4511108398438 95.94426727294922 
-530.2074584960938 288.1043701171875 
-531.3969116210938 261.014404296875 
-532.5911865234375 88.43158721923828 
-533.4833984375 41.38584518432617 
-534.737060546875 126.69623565673828 
-535.6384887695312 47.233314514160156 
-536.6673583984375 184.04586791992188 
-537.536865234375 45.29487228393555 
-538.240234375 39.63186264038086 
-539.4797973632812 50.19083023071289 
-540.6757202148438 154.4492950439453 
-541.38916015625 61.890933990478516 
-542.4912109375 68.3042984008789 
-543.4703369140625 178.57147216796875 
-544.6409912109375 268.1813049316406 
-545.4583129882812 297.5498962402344 
-546.6232299804688 175.68260192871094 
-547.5594482421875 58.46649932861328 
-548.3103637695312 17.543119430541992 
-549.5655517578125 145.26136779785156 
-550.9180297851562 751.431640625 
-552.3146362304688 432.24798583984375 
-553.3405151367188 45.701175689697266 
-554.0889282226562 71.9545669555664 
-555.0033569335938 175.86441040039062 
-555.9397583007812 98.3998031616211 
-556.732421875 82.03569030761719 
-557.4990234375 216.7923126220703 
-558.5995483398438 283.8289794921875 
-559.663330078125 1631.197021484375 
-560.4888305664062 1378.6429443359375 
-561.5267333984375 333.97210693359375 
-562.3041381835938 412.4930114746094 
-563.272705078125 149.58737182617188 
-564.2230224609375 217.80859375 
-565.3650512695312 281.878173828125 
-566.3946533203125 439.8179016113281 
-567.5405883789062 608.8292236328125 
-568.4244995117188 279.1609802246094 
-570.3690185546875 5046.28125 
-571.453369140625 789.453369140625 
-572.423583984375 332.7960205078125 
-573.4944458007812 135.0482635498047 
-574.7990112304688 394.1178894042969 
-575.5784912109375 497.90008544921875 
-576.7464599609375 230.4698486328125 
-577.6865234375 333.422607421875 
-578.6259155273438 17.321788787841797 
-580.4313354492188 631.661376953125 
-581.64404296875 190.5061492919922 
-582.530517578125 151.60626220703125 
-583.4832153320312 366.2886657714844 
-584.5833740234375 101.75404357910156 
-585.5145263671875 430.9576721191406 
-586.5592041015625 360.35003662109375 
-587.733154296875 81.47421264648438 
-588.583740234375 245.65867614746094 
-589.5426025390625 617.58642578125 
-590.4317626953125 1195.0921630859375 
-591.4236450195312 551.7918701171875 
-592.1157836914062 176.26551818847656 
-592.7750854492188 249.27613830566406 
-593.5565795898438 40.284420013427734 
-594.533447265625 312.74072265625 
-595.9124755859375 445.1578369140625 
-597.366943359375 393.4114990234375 
-598.60107421875 313.6270751953125 
-599.5896606445312 101.45170593261719 
-600.3751831054688 482.7955322265625 
-601.4692993164062 563.092041015625 
-602.7223510742188 908.9708251953125 
-603.39306640625 411.76654052734375 
-604.0040893554688 245.56495666503906 
-604.767333984375 363.8648681640625 
-606.28076171875 229.46978759765625 
-607.3948974609375 330.5382995605469 
-608.4764404296875 2403.286376953125 
-609.5491943359375 643.9612426757812 
-610.5581665039062 235.3016357421875 
-611.3147583007812 138.01788330078125 
-612.184326171875 145.6152801513672 
-613.1279296875 198.4294891357422 
-614.1964721679688 150.65597534179688 
-614.988037109375 325.5605163574219 
-616.5615844726562 652.413330078125 
-618.173583984375 2398.7861328125 
-619.1018676757812 948.708251953125 
-620.3161010742188 288.4476318359375 
-621.2597045898438 208.05322265625 
-622.17138671875 122.54381561279297 
-623.74267578125 1262.390625 
-624.6513061523438 839.7111206054688 
-626.0401000976562 204.92120361328125 
-627.1461791992188 1396.147705078125 
-628.2474975585938 395.8043212890625 
-629.1326904296875 498.3307189941406 
-630.296630859375 507.64068603515625 
-631.3619384765625 341.7635498046875 
-632.2840576171875 51.98260498046875 
-633.5972290039062 455.90020751953125 
-634.3739624023438 150.09669494628906 
-636.1699829101562 158.15017700195312 
-637.6349487304688 2076.986572265625 
-638.5320434570312 754.548095703125 
-640.2220458984375 873.9697265625 
-641.0633544921875 335.72607421875 
-642.2657470703125 78.24833679199219 
-643.0967407226562 302.94720458984375 
-644.229248046875 209.88955688476562 
-644.939453125 218.41102600097656 
-646.4135131835938 261.192138671875 
-647.702392578125 445.20751953125 
-648.4859008789062 321.3846130371094 
-649.4459228515625 113.53007507324219 
-650.7146606445312 95.10588073730469 
-652.4559326171875 295.3724060058594 
-653.0858764648438 106.10993957519531 
-654.522216796875 1139.5374755859375 
-655.7075805664062 211.2117156982422 
-656.737060546875 143.96844482421875 
-657.6803588867188 56.984378814697266 
-658.69482421875 409.76727294921875 
-659.5787353515625 402.11529541015625 
-660.5499267578125 154.36297607421875 
-661.5171508789062 194.76007080078125 
-662.5362548828125 654.58837890625 
-663.51171875 659.03466796875 
-664.5490112304688 556.507568359375 
-665.6212768554688 294.16668701171875 
-666.7156982421875 162.65771484375 
-667.405517578125 339.38299560546875 
-668.3003540039062 410.77886962890625 
-669.6864013671875 115.72148132324219 
-670.7975463867188 203.2272186279297 
-671.6064453125 109.2347640991211 
-672.7137451171875 310.1907043457031 
-673.6954956054688 239.33682250976562 
-675.1014404296875 2214.37841796875 
-676.0216064453125 350.89495849609375 
-677.2919921875 493.6417236328125 
-678.4031982421875 393.104736328125 
-679.498291015625 287.4239807128906 
-680.6812133789062 326.86517333984375 
-681.4645385742188 181.5895538330078 
-682.5050048828125 399.7086486816406 
-683.2474975585938 204.58082580566406 
-685.4700927734375 21161.01171875 
-686.5188598632812 4320.97119140625 
-687.5703735351562 1198.4918212890625 
-688.4932250976562 493.66656494140625 
-689.4117431640625 287.0688171386719 
-690.6383666992188 192.23995971679688 
-691.6990356445312 235.62368774414062 
-692.8929443359375 781.591796875 
-693.66943359375 755.1873779296875 
-694.6361083984375 499.1136779785156 
-695.7527465820312 504.24169921875 
-696.5170288085938 166.4819793701172 
-697.3313598632812 118.8773193359375 
-698.2406616210938 146.25027465820312 
-699.231689453125 163.23219299316406 
-700.2780151367188 59.72370147705078 
-701.4765625 55.432044982910156 
-703.380615234375 3577.3251953125 
-704.2476806640625 2283.7041015625 
-705.4735717773438 691.1679077148438 
-706.475830078125 28.587934494018555 
-707.5875244140625 43.212249755859375 
-708.5181274414062 239.2469482421875 
-709.45068359375 69.77191925048828 
-710.6865234375 232.62283325195312 
-711.650146484375 207.6127471923828 
-712.742919921875 264.6663513183594 
-713.8782348632812 88.93687438964844 
-714.585205078125 213.27627563476562 
-715.7033081054688 256.9784240722656 
-716.6187744140625 197.925048828125 
-717.7088623046875 26.921451568603516 
-718.318115234375 39.436038970947266 
-719.3638916015625 131.42855834960938 
-720.4277954101562 161.349365234375 
-721.4369506835938 2256.673095703125 
-722.526611328125 491.9787292480469 
-723.6627807617188 220.42218017578125 
-724.9949340820312 142.7277069091797 
-725.9398193359375 194.85939025878906 
-726.6674194335938 61.231327056884766 
-727.5325927734375 49.77410125732422 
-728.56396484375 509.5516662597656 
-729.605712890625 1659.1185302734375 
-730.630126953125 841.3507080078125 
-731.66796875 237.495361328125 
-732.7777099609375 95.70489501953125 
-733.5809326171875 45.794010162353516 
-734.5113525390625 49.199432373046875 
-736.342041015625 45.64696502685547 
-737.5616455078125 46.768272399902344 
-738.4984741210938 312.9570617675781 
-739.7108154296875 101.30813598632812 
-740.5606079101562 50.83832550048828 
-741.4522705078125 6.819338798522949 
-742.5238037109375 36.04085159301758 
-743.603515625 28.400989532470703 
-744.7855224609375 32.42270278930664 
-745.7472534179688 49.83304214477539 
-746.5128173828125 9.734918594360352 
-748.4816284179688 5.15634298324585 
-749.5764770507812 58.87364196777344 
-750.4698486328125 11.287109375 
-752.0374145507812 48.980987548828125 
-752.9164428710938 150.099609375 
-753.7025146484375 277.8337707519531 
-754.4798583984375 395.6613464355469 
-755.5980834960938 312.46588134765625 
-756.566650390625 137.05389404296875 
-757.638671875 37.29193878173828 
-758.5775146484375 66.5464096069336 
-759.4078979492188 8.926137924194336 
-760.9588012695312 125.10487365722656 
-761.6846313476562 32.25123596191406 
-762.5870971679688 76.01982879638672 
-763.5723266601562 170.8789825439453 
-764.6372680664062 168.59713745117188 
-765.6655883789062 146.35923767089844 
-766.5416870117188 156.37640380859375 
-767.7383422851562 188.080078125 
-768.4882202148438 1359.0140380859375 
-769.4448852539062 362.67535400390625 
-770.5142822265625 74.84807586669922 
-771.5568237304688 60.693603515625 
-772.676025390625 495.7345886230469 
-773.6422729492188 202.21217346191406 
-774.2965087890625 5.6790452003479 
-775.5855712890625 169.27110290527344 
-776.580322265625 195.51473999023438 
-777.4979858398438 248.5541229248047 
-778.5090942382812 91.40067291259766 
-779.5902709960938 169.6573944091797 
-780.6207885742188 29.60145378112793 
-781.7352905273438 35.16097640991211 
-784.6556396484375 82.49455261230469 
-786.5166625976562 88091.328125 
-787.4714965820312 13378.9345703125 
-788.316162109375 914.671630859375 
-789.4254150390625 194.75665283203125 
-790.3246459960938 43.63690185546875 
-792.4906616210938 16.76891326904297 
-795.5693969726562 27.535858154296875 
-796.681640625 275.9651794433594 
-797.5975952148438 53.9734001159668 
-798.6138305664062 100.9148941040039 
-800.2346801757812 120.54383087158203 
-800.83740234375 27.25942039489746 
-801.6143798828125 256.66937255859375 
-802.6190185546875 319.311767578125 
-803.5703735351562 195.3688201904297 
-804.4441528320312 62.72306823730469 
-805.6820068359375 36.09121322631836 
-806.52783203125 46.04311752319336 
-807.4415283203125 67.45140838623047 
-808.6226196289062 113.98177337646484 
-809.904296875 61.519126892089844 
-810.6666259765625 72.80535888671875 
-811.5090942382812 68.9676284790039 
-812.5196533203125 171.60362243652344 
-813.5093383789062 88.07270812988281 
-814.704833984375 173.9281768798828 
-815.5694580078125 155.70901489257812 
-816.661865234375 90.97869873046875 
-817.544677734375 19.382221221923828 
-818.6382446289062 89.35517883300781 
-820.6349487304688 12.765814781188965 
-821.5369262695312 39.70562744140625 
-822.616455078125 218.53695678710938 
-823.6597900390625 85.49916076660156 
-825.3836669921875 158.85440063476562 
-827.2620849609375 23.555400848388672 
-828.6279296875 86.4776611328125 
-829.6366577148438 223.3659210205078 
-830.5584106445312 181.7923126220703 
-831.6742553710938 177.3546142578125 
-832.568115234375 73.48490905761719 
-833.5706787109375 128.68377685546875 
-834.6455688476562 125.10674285888672 
-835.6715087890625 25.750995635986328 
-837.6204833984375 52.59870147705078 
-838.6375122070312 142.2035675048828 
-839.6619262695312 227.20458984375 
-840.6828002929688 342.1793518066406 
-841.5254516601562 13.566614151000977 
-842.6127319335938 21.452320098876953 
-843.9016723632812 42.067386627197266 
-845.6904907226562 38.94148635864258 
-846.3935546875 6.364024639129639 
-847.7003173828125 25.662471771240234 
-848.767578125 26.694580078125 
-850.4451904296875 1837.0047607421875 
-851.5366821289062 468.6502380371094 
-852.4779663085938 61.203399658203125 
-854.5560913085938 85.17562103271484 
-855.5949096679688 276.0367736816406 
-856.5863037109375 229.78802490234375 
-857.531982421875 68.67520141601562 
-858.8013916015625 34.00149917602539 
-859.607421875 44.928157806396484 
-860.8355102539062 169.77993774414062 
-862.5149536132812 23.506301879882812 
-864.6658325195312 13.557890892028809 
-865.4107666015625 8.891777992248535 
-866.7078857421875 220.2592010498047 
-867.8954467773438 191.01931762695312 
-868.5552978515625 5060.2666015625 
-869.506591796875 1079.5389404296875 
-870.6723022460938 20.776424407958984 
-872.5676879882812 44.81622314453125 
-874.7998046875 52.46726989746094 
-875.559814453125 15.591196060180664 
-876.7122802734375 46.35411071777344 
-877.5009765625 93.80076599121094 
-878.6167602539062 41.31387710571289 
-881.6611938476562 28.499038696289062 
-883.479736328125 56.541255950927734 
-884.6094360351562 93.07997131347656 
-885.58251953125 193.67950439453125 
-888.571044921875 26.04553985595703 
-889.6282348632812 61.976688385009766 
-890.719970703125 46.099456787109375 
-891.4785766601562 32.93434524536133 
-892.5010986328125 105.95917510986328 
-897.2236938476562 13.44013500213623 
-898.658447265625 21.754451751708984 
-899.9387817382812 54.2807502746582 
-900.6980590820312 140.13986206054688 
-901.5789794921875 201.68629455566406 
-902.700439453125 25.210006713867188 
-903.7789306640625 24.751012802124023 
-906.4911499023438 6.287567138671875 
-909.6239013671875 815.778564453125 
-910.4932250976562 117.42790222167969 
-911.7380981445312 169.99288940429688 
-912.6995849609375 43.99165344238281 
-913.810791015625 39.481727600097656 
-914.6016845703125 28.00844383239746 
-915.6906127929688 75.33277893066406 
-916.6320190429688 16.806934356689453 
-917.5349731445312 36.92509460449219 
-918.4453125 28.95514678955078 
-920.20068359375 14.973549842834473 
-926.63232421875 12.86548900604248 
-928.44873046875 13.679736137390137 
-929.5653076171875 4.546746253967285 
-931.3776245117188 10.884681701660156 
-932.5560302734375 54.50730895996094 
-933.4104614257812 6.311009407043457 
-934.2743530273438 37.471641540527344 
-938.6396484375 31.530256271362305 
-942.7876586914062 12.850442886352539 
-945.3975219726562 11.809403419494629 
-947.8072509765625 5.030373573303223 
-951.83251953125 12.820455551147461 
-952.7631225585938 33.98192596435547 
-953.6924438476562 33.91472625732422 
-955.57080078125 10.781294822692871 
-956.6090698242188 13.263768196105957 
-959.7523803710938 9.175971031188965 
-961.13134765625 18.0068302154541 
-963.6138916015625 40.982669830322266 
-964.8112182617188 20.89535140991211 
-970.6709594726562 41.571693420410156 
-971.6825561523438 19.737865447998047 
-972.7871704101562 15.219499588012695 
-974.0771484375 9.646513938903809 
-975.6880493164062 16.44073486328125 
-980.8613891601562 9.168793678283691 
-985.036376953125 19.537158966064453 
-985.91015625 13.121347427368164 
-986.77294921875 11.08083438873291 
-987.7811889648438 10.236368179321289 
-989.6275024414062 10.258447647094727 
-990.9072875976562 16.872180938720703 
-996.6832275390625 22.033512115478516 
-997.8851318359375 26.844980239868164 
-1000.3485107421875 18.40115737915039 
-1003.5776977539062 25.845645904541016 
-1004.1806640625 18.51443099975586 
-1004.7940063476562 22.12333106994629 
-1005.7604370117188 15.687753677368164 
-1006.52392578125 6.42317008972168 
-1011.7171630859375 22.460159301757812 
-1019.238525390625 22.709638595581055 
-1020.5240478515625 14.864013671875 
-END IONS
-
-BEGIN IONS
-TITLE=mzspec:MSV000080679:j11962_C1orf144:scan:10671:DLTDYLMK/2
-PEPMASS=507.744695112329
-RTINSECONDS=2511.03
-CHARGE=2+
-110.07059478759766 1748.574951171875 
-120.08062744140625 8689.9951171875 
-129.10226440429688 16969.09375 
-130.0860137939453 8981.5029296875 
-134.99298095703125 1964.7037353515625 
-136.07591247558594 14159.212890625 
-138.09109497070312 2701.306640625 
-141.10186767578125 9383.0693359375 
-141.76382446289062 1435.6514892578125 
-147.11236572265625 12167.388671875 
-147.1224822998047 1216.8245849609375 
-155.1168670654297 2188.396484375 
-156.10171508789062 4068.260498046875 
-171.07586669921875 2592.96240234375 
-175.08607482910156 1728.4990234375 
-175.1188201904297 2952.433349609375 
-181.0976104736328 1402.559814453125 
-183.11285400390625 18796.771484375 
-184.09695434570312 4038.301025390625 
-189.08668518066406 2381.365966796875 
-199.07208251953125 1480.682373046875 
-201.123291015625 210686.140625 
-202.1262969970703 11732.529296875 
-212.13876342773438 4084.98291015625 
-215.1390380859375 1745.7691650390625 
-217.08145141601562 4123.19140625 
-229.1180419921875 32709.93359375 
-230.11839294433594 1606.8428955078125 
-230.1500701904297 13727.068359375 
-235.10760498046875 10985.6357421875 
-237.5552520751953 1618.539794921875 
-238.4727325439453 1830.8223876953125 
-261.1269226074219 2458.343017578125 
-261.1536865234375 2478.406494140625 
-266.14990234375 3671.285888671875 
-267.1122131347656 4954.60888671875 
-276.1372985839844 3611.14453125 
-279.0971984863281 3196.13427734375 
-284.16094970703125 3514.92724609375 
-294.1481628417969 29836.166015625 
-295.9517822265625 1849.70458984375 
-301.0603332519531 3379.15771484375 
-303.0617980957031 1777.538818359375 
-330.1653747558594 2692.829345703125 
-330.950439453125 21588.892578125 
-332.9672546386719 3767.348876953125 
-337.182373046875 2081.264892578125 
-343.2332458496094 8145.89697265625 
-346.93072509765625 21246.228515625 
-352.34954833984375 1898.6309814453125 
-352.6845397949219 1979.3367919921875 
-364.93994140625 16241.783203125 
-376.8848876953125 3063.111572265625 
-378.7596435546875 2120.660400390625 
-380.1451721191406 16633.513671875 
-407.2305908203125 20423.83984375 
-414.7584228515625 3491.690185546875 
-430.93255615234375 9772.18359375 
-440.42022705078125 2371.113525390625 
-448.94378662109375 37029.2109375 
-466.7406005859375 4021.4072265625 
-466.9552307128906 3935.47265625 
-493.22845458984375 8539.08984375 
-498.7388916015625 8120.134765625 
-499.24053955078125 3592.492919921875 
-506.2981262207031 19612.62890625 
-508.96502685546875 32927.3359375 
-550.770751953125 3221.133056640625 
-570.296630859375 28695.45703125 
-571.2944946289062 3311.03857421875 
-603.3489379882812 14200.267578125 
-621.3248901367188 22036.787109375 
-640.267578125 2442.447509765625 
-660.8516235351562 2894.828125 
-685.3226928710938 31201.626953125 
-686.3241577148438 9718.994140625 
-703.3303833007812 3103.6650390625 
-722.3724975585938 68296.4296875 
-723.3729858398438 17644.681640625 
-786.3701782226562 72934.1328125 
-787.3787841796875 21256.59375 
-788.371337890625 3702.3203125 
-819.415283203125 2578.04541015625 
-887.7566528320312 2907.084228515625 
-998.4473876953125 2663.30908203125 
-END IONS
-
-BEGIN IONS
-TITLE=CCMSLIB00000840351
-PEPMASS=633.268
-CHARGE=1
-51.022404	65.219513
-57.033543	178.758606
-57.060638	13.01786
-59.048389	119.898499
-77.038834	174.211502
-79.054993	30.226851
-81.068611	73.107452
-83.007782	96.371223
-91.053917	318.245392
-95.047295	111.400002
-95.410011	33.23214
-97.023956	33.06377
-97.064423	269.643311
-97.091843	18.674999
-103.053055	133.184402
-103.083054	10.25
-105.070007	176.388596
-107.086349	153.520294
-109.061783	79.19104
-109.101196	171.006302
-119.084389	100.160698
-121.065315	35.69397
-123.07972	170.066299
-125.060165	121.209297
-125.090508	13
-131.086426	241.673492
-131.116791	12.075
-131.483856	24.066669
-133.065002	584.328186
-133.100433	1712.910034
-133.137772	55.059212
-133.169098	18.245001
-133.193298	61.002361
-133.253448	20.03879
-133.313492	10.2
-133.344345	27.89286
-134.100769	83.1875
-135.040146	53.223209
-135.079269	139.881699
-139.073074	17.30769
-140.488083	17.65761
-143.878708	40.041672
-147.081009	599.477722
-147.147247	19
-149.093262	148.001694
-150.140015	18.48077
-152.061646	85.744263
-154.42601	14.00961
-155.083374	188.242004
-157.101166	190.833298
-159.115234	103.514397
-159.914749	27.005951
-161.057037	97.691368
-161.094711	80.678574
-161.127411	28.728451
-163.074661	585.018616
-165.089966	179.935501
-166.074738	32.75
-167.085052	348.66861
-169.09552	33.96011
-169.4216	17.65761
-169.768234	17.25
-171.115738	199.347198
-173.057037	89.127434
-173.095169	103.25
-173.722183	51.041672
-175.074463	95.440788
-175.111511	660.332214
-177.126205	704.44519
-177.924072	29.761909
-178.072662	41
-178.767105	29.69397
-179.08606	39.4879
-180.092194	109.952698
-181.101318	553.501221
-181.338409	18.00379
-181.367905	55.0947
-181.469635	18.025
-181.493332	30.941179
-182.111588	45.471149
-183.07959	162.753403
-183.11763	732.15387
-183.15979	19.125
-183.368637	21.6
-183.755264	12.02273
-184.121201	33.391129
-185.093491	76.208344
-185.130966	231.311401
-185.225525	27.84211
-185.249084	16.03125
-187.111557	199.190308
-189.126221	312.662903
-191.088486	22.75
-193.060577	119.432098
-193.101151	323.956909
-193.137543	29.01786
-194.067291	10.125
-194.111053	37.005951
-195.078812	156.720093
-195.116394	2204.672119
-195.177032	31.148809
-195.197891	22.65761
-195.286133	20.64286
-195.328217	11.8
-195.373657	23
-196.087021	80.009613
-196.118362	58.09375
-196.830856	14.03125
-197.006668	25.47368
-197.097092	355.288513
-197.131912	584.531128
-197.554153	26.07692
-198.13385	185.664093
-198.171005	17.125
-199.110794	274.111298
-199.530411	18.008329
-202.079605	102.398598
-203.105713	62.284088
-203.144058	52.80357
-205.065186	21.796049
-205.100159	126.026299
-205.11969	62.165539
-206.107559	66.922752
-207.116852	359.290894
-207.485565	42.049999
-208.086411	139.001099
-208.124313	292
-209.092941	160.665497
-209.132416	1030.79895
-209.319122	14.28571
-209.367752	20.111111
-209.395935	15.04167
-210.100784	166.802597
-210.711792	29.875
-211.112671	820.544678
-211.14653	394.052887
-211.276825	33.603569
-211.42868	25.694441
-212.120163	350.408997
-213.126282	97.005432
-215.102951	21.57065
-219.102448	18.225
-219.553314	20.450001
-220.118744	47.115379
-221.084076	49.445992
-221.129517	170.555603
-221.296448	112.004204
-221.401535	76.889526
-221.560547	29.17308
-221.894043	16.285721
-222.102829	137.286697
-222.140137	297.040192
-223.110962	649.504578
-223.148392	612.740173
-224.117828	153.008301
-224.155472	939.099426
-224.218475	43.361111
-224.242172	31.225
-224.330078	31.65407
-224.48909	11.125
-224.639633	14.28571
-224.856857	17
-225.063492	61.329922
-225.126953	1114.563965
-225.163147	1282.646973
-225.290222	24.235291
-225.562317	86.851639
-225.593292	27.25
-226.030441	22.285721
-226.136597	110.0401
-226.165115	87.864723
-226.675858	14.57143
-227.024384	11.68056
-227.107498	178.337601
-227.14238	140.278397
-227.164291	110.005798
-227.178085	73.133057
-227.401184	30.65761
-227.489517	28.644739
-229.122559	197.545502
-229.152435	147.114197
-229.477997	18.285721
-230.408035	56.445309
-233.131897	159.087006
-234.104782	141.555695
-234.131851	38.57143
-235.11142	66.055557
-235.148911	494.247711
-235.211166	18.55682
-235.228439	13.18382
-235.436661	27.51524
-235.591644	20.78241
-235.650299	11.08654
-235.857254	26
-236.110535	106.156303
-236.906403	41.25
-237.127426	332.97879
-237.163422	3605.25
-237.22142	72.211197
-237.248917	60.349491
-237.306396	35.28017
-237.362259	22.20833
-237.459946	55.008339
-237.63118	45.612289
-237.684814	10.06618
-237.713928	26.39674
-237.976318	18.55682
-238.132538	40.926281
-238.163239	133.180603
-239.105453	321.128113
-239.140915	256.661194
-239.180008	223.326202
-239.215424	48.34914
-240.116211	117.695702
-240.159332	14
-241.114929	28.926279
-241.157303	207.7612
-241.191422	243.515198
-241.877457	16.17308
-243.103027	19.10227
-243.131973	104.041702
-243.174271	231.100204
-243.455093	10.00961
-243.954926	50.410259
-247.104553	97.924454
-247.145721	43.197578
-249.130051	33.416672
-249.164444	864.859619
-250.164474	68.246948
-251.139252	131.004501
-251.18335	319.16449
-251.22702	18.04891
-252.082748	15.07692
-252.112457	76.102531
-252.151306	412.192688
-252.386749	10.03125
-252.45314	34.08696
-253.122086	1328.503052
-253.159164	1574.909058
-253.5289	25.205
-253.672729	59.55645
-253.848495	15.36364
-254.109161	13.005
-254.131363	12
-254.165207	147
-254.660446	45.640961
-254.943253	43.728451
-255.139862	336.878998
-255.172623	430.239014
-255.40387	15.69444
-256.139648	15.77885
-257.108276	39.384621
-257.18985	62.28017
-259.149078	41.681599
-261.1474	41.360001
-262.132812	80.03846
-263.137909	23.805
-263.193054	15.625
-263.808685	37.351749
-264.924469	79.71698
-265.158875	2248.229004
-265.252075	27.01786
-265.303162	17.004999
-265.34845	11.14286
-265.42215	24.34914
-265.444824	36.142441
-265.467499	18.05357
-265.543701	57.845001
-265.706848	41.782612
-265.824341	30.148809
-265.881592	39.206631
-265.949707	25.3125
-266.000793	20
-266.057953	46.210529
-266.432343	37.297619
-267.174408	4606.346191
-267.489807	26.1
-267.5578	56.102268
-267.586761	41.153851
-267.672211	48.533329
-267.774658	16.164471
-267.854401	24.07143
-267.87146	41.431122
-267.905884	42.656818
-267.928619	78.382072
-268.025299	12.03125
-268.177032	334.944092
-268.634949	30.13587
-269.149994	132.154099
-269.263123	13.00735
-270.122986	150.284103
-270.15506	40.721149
-271.130066	224.680206
-271.168823	244.256302
-271.526123	39.490379
-277.159515	1945.578003
-277.36969	11.03125
-277.688446	34.01923
-278.159912	57.002781
-280.146912	46.041672
-283.124786	129.102295
-283.168701	378.979614
-285.183563	323.328796
-285.655914	13.14881
-287.139496	50.034481
-288.1297	36.44643
-295.102203	21.390631
-295.169556	5758.023926
-295.257416	65.470589
-295.312134	82.322357
-295.401215	10.03571
-295.443085	14.08333
-295.497009	46.011909
-295.526093	38.244999
-295.614929	17.01136
-295.64978	52.96323
-295.694366	32.142441
-295.736267	23.160721
-295.888641	51.197578
-295.993652	15.16447
-296.174835	137.5
-297.146271	49.285709
-297.181274	72.323273
-297.341461	19.16667
-297.48645	23.21121
-297.516479	21.025
-301.35257	12.125
-301.821655	15.92045
-303.192078	22.728451
-305.147247	88.047623
-309.019043	17.015631
-313.138489	27.191179
-313.18161	942.707214
-313.260315	13.47115
-313.645935	13.32237
-314.179077	59.125
-314.36145	11.5
-314.569489	12.16071
-315.58905	16.242649
-317.150024	272.524994
-318.153381	130.413498
-321.856079	20.01136
-322.756073	19.33333
-323.575623	26.41667
-325.178741	304.85611
-326.18927	221.595306
-327.196136	715.115479
-328.105591	11.125
-328.193359	31.612499
-329.12796	19.11364
-335.1716	15.02273
-339.199036	100.4198
-339.770325	40.680561
-341.210541	36.125
-343.191467	103.335297
-345.197723	45.16
-351.193268	90.630211
-355.189941	468.799988
-355.944275	52.44828
-356.594391	21.57065
-358.209686	106.564003
-361.176392	67.166054
-361.525574	26.055559
-362.182251	27.529409
-367.533844	21.57065
-369.207001	543.349121
-369.558167	31.049999
-371.408844	16.25
-373.197662	149.388199
-377.172089	2765.763916
-377.428162	84.097603
-377.542419	29.22283
-377.596039	26.125
-377.676758	17.595591
-377.696228	13.125
-378.172882	68.633621
-378.215637	36.44022
-378.2995	25.55603
-378.358917	15.025
-378.380859	37.36742
-378.500824	36.599998
-378.951935	22.625
-387.212769	52.686409
-391.186676	330.640015
-391.483978	14.25
-392.816833	11.68056
-422.530853	10
-429.227356	245.703903
-430.228912	89.840912
-431.260529	49.84808
-437.1922	86.138702
-451.20993	969.187012
-451.363922	64.027443
-451.807831	21.4879
-452.074158	10.02778
-453.847565	12.75
-475.295074	153.456802
-475.364136	10.25
-489.250977	65.522728
-490.253113	18.75
-490.58429	19.148809
-491.240387	25.816669
-509.675049	18.160721
-511.231567	1447.583984
-511.495636	53.635201
-512.097656	11.01389
-512.168396	75.068176
-513.224365	649.715271
-513.440125	22.96196
-513.603577	24.01136
-514.108215	23.907261
-514.187378	17.81818
-514.366028	59.96983
-519.281555	42.11842
-545.541565	15.40833
-550.950867	49.206902
-565.411865	15.1
-573.246521	578.913574
-573.593994	18.225
-573.659119	33.022961
-574.835022	15.045
-575.068726	10.32143
-576.705566	12.11111
-577.668518	11.075
-633.266418	621.241028
-633.622375	10.24039
-633.785095	24.92045
-634.281921	30.455641
-636.130188	22.05921
-660.481445	30.57095
-753.358521	14.11111
-END IONS
diff --git a/docs/src/spectrum_iplot.json b/docs/src/spectrum_iplot.json
index 14f7732..3fab2dc 100644
--- a/docs/src/spectrum_iplot.json
+++ b/docs/src/spectrum_iplot.json
@@ -1,1 +1,1 @@
-{"config": {"view": {"width": 400, "height": 300}, "mark": {"tooltip": null}}, "layer": [{"data": {"name": "data-b23b32ed2918bd65f8d9dad67f5b6455"}, "mark": {"type": "rule", "size": 2}, "encoding": {"color": {"type": "nominal", "field": "color", "legend": null, "scale": null}, "tooltip": [{"type": "quantitative", "field": "exp_mz", "format": ".4f", "title": "Experimental m/z"}, {"type": "quantitative", "field": "intensity", "format": ".0%", "title": "Intensity"}], "x": {"type": "quantitative", "axis": {"grid": true, "title": "m/z", "titleFontStyle": "italic"}, "field": "exp_mz", "scale": {"nice": true, "padding": 5, "zero": false}}, "y": {"type": "quantitative", "axis": {"format": "%", "grid": true, "title": "Intensity"}, "field": "intensity", "scale": {"nice": true, "padding": 5}}}}, {"data": {"name": "data-081fc9b2fa047113dfa6ae0eeae5f7e6"}, "mark": {"type": "rule", "size": 2}, "encoding": {"color": {"type": "nominal", "field": "color", "legend": null, "scale": null}, "tooltip": [{"type": "nominal", "field": "fragment", "title": "Fragment"}, {"type": "quantitative", "field": "exp_mz", "format": ".4f", "title": "Experimental m/z"}, {"type": "quantitative", "field": "calc_mz", "format": ".4f", "title": "Theoretical m/z"}, {"type": "quantitative", "field": "intensity", "format": ".0%", "title": "Intensity"}], "x": {"type": "quantitative", "axis": {"grid": true, "title": "m/z", "titleFontStyle": "italic"}, "field": "exp_mz", "scale": {"nice": true, "padding": 5, "zero": false}}, "y": {"type": "quantitative", "axis": {"format": "%", "grid": true, "title": "Intensity"}, "field": "intensity", "scale": {"nice": true, "padding": 5}}}}, {"data": {"name": "data-081fc9b2fa047113dfa6ae0eeae5f7e6"}, "mark": {"type": "text", "align": "left", "angle": 270, "baseline": "middle", "dx": 5}, "encoding": {"color": {"type": "nominal", "field": "color", "legend": null, "scale": null}, "text": {"type": "nominal", "field": "fragment"}, "tooltip": [{"type": "nominal", "field": "fragment", "title": "Fragment"}, {"type": "quantitative", "field": "exp_mz", "format": ".4f", "title": "Experimental m/z"}, {"type": "quantitative", "field": "calc_mz", "format": ".4f", "title": "Theoretical m/z"}, {"type": "quantitative", "field": "intensity", "format": ".0%", "title": "Intensity"}], "x": {"type": "quantitative", "axis": {"grid": true, "title": "m/z", "titleFontStyle": "italic"}, "field": "exp_mz", "scale": {"nice": true, "padding": 5, "zero": false}}, "y": {"type": "quantitative", "axis": {"format": "%", "grid": true, "title": "Intensity"}, "field": "intensity", "scale": {"nice": true, "padding": 5}}}}], "height": 400, "width": 640, "$schema": "https://vega.github.io/schema/vega-lite/v3.4.0.json", "datasets": {"data-b23b32ed2918bd65f8d9dad67f5b6455": [{"exp_mz": 101.07122039794922, "intensity": 0.38514694571495056, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 120.08110046386719, "intensity": 0.3500851094722748, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 129.102294921875, "intensity": 0.35083481669425964, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 130.06533813476562, "intensity": 0.4036368131637573, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 170.06008911132812, "intensity": 0.5717398524284363, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 214.09768676757812, "intensity": 0.47720515727996826, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 214.15350341796875, "intensity": 0.28815317153930664, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 233.16494750976562, "intensity": 0.2766750454902649, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 242.14993286132812, "intensity": 0.3346022367477417, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 243.10874938964844, "intensity": 0.3623234033584595, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 284.1026611328125, "intensity": 0.8009493947029114, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 285.1063232421875, "intensity": 0.27843743562698364, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 344.1928405761719, "intensity": 0.318891316652298, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 353.18170166015625, "intensity": 0.37984132766723633, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 363.2070007324219, "intensity": 0.3013898730278015, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 395.1347961425781, "intensity": 0.4417710304260254, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 412.1607360839844, "intensity": 0.5171781778335571, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 424.217529296875, "intensity": 0.28943997621536255, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 480.2240905761719, "intensity": 0.37062183022499084, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 497.2502746582031, "intensity": 0.3041319251060486, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 525.2426147460938, "intensity": 0.3099946975708008, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 549.2872924804688, "intensity": 0.3830855190753937, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 559.2943115234375, "intensity": 0.35007503628730774, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 696.351318359375, "intensity": 0.36242109537124634, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 718.3870849609375, "intensity": 0.572966456413269, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 767.3910522460938, "intensity": 0.443424791097641, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 876.4351806640625, "intensity": 0.37056124210357666, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 877.419677734375, "intensity": 0.5582457184791565, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 878.4134521484375, "intensity": 0.3392740786075592, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 895.4476318359375, "intensity": 0.4597960412502289, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 1008.5327758789062, "intensity": 0.4994979798793793, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 1118.573974609375, "intensity": 0.3925056755542755, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 1136.58984375, "intensity": 0.38583794236183167, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 1250.6297607421875, "intensity": 0.3353876769542694, "calc_mz": null, "fragment": null, "color": "#212121"}], "data-081fc9b2fa047113dfa6ae0eeae5f7e6": [{"exp_mz": 147.11273193359375, "intensity": 0.3019610047340393, "calc_mz": 147.11280115047, "fragment": "y1+", "color": "#D32F2F"}, {"exp_mz": 159.09169006347656, "intensity": 1.0, "calc_mz": 159.09167184721002, "fragment": "a1+", "color": "#388E3C"}, {"exp_mz": 187.086669921875, "intensity": 0.33918213844299316, "calc_mz": 187.08658646677, "fragment": "b1+", "color": "#1976D2"}, {"exp_mz": 204.13414001464844, "intensity": 0.46954265236854553, "calc_mz": 204.13426115047, "fragment": "y2+", "color": "#D32F2F"}, {"exp_mz": 301.1289978027344, "intensity": 0.6379719972610474, "calc_mz": 301.12951646677, "fragment": "b2+", "color": "#1976D2"}, {"exp_mz": 305.18109130859375, "intensity": 0.46205222606658936, "calc_mz": 305.18194115047, "fragment": "y3+", "color": "#D32F2F"}, {"exp_mz": 362.2037353515625, "intensity": 0.7668641209602356, "calc_mz": 362.20340115047003, "fragment": "y4+", "color": "#D32F2F"}, {"exp_mz": 429.1875915527344, "intensity": 0.5527995228767395, "calc_mz": 429.18809646677, "fragment": "b3+", "color": "#1976D2"}, {"exp_mz": 542.272216796875, "intensity": 0.2779512405395508, "calc_mz": 542.27215646677, "fragment": "b4+", "color": "#1976D2"}, {"exp_mz": 548.280517578125, "intensity": 0.7962697744369507, "calc_mz": 548.2827111504699, "fragment": "y5+", "color": "#D32F2F"}, {"exp_mz": 695.351318359375, "intensity": 0.6674109697341919, "calc_mz": 695.35112115047, "fragment": "y6+", "color": "#D32F2F"}, {"exp_mz": 766.387451171875, "intensity": 0.7651169896125793, "calc_mz": 766.38823115047, "fragment": "y7+", "color": "#D32F2F"}, {"exp_mz": 894.4446411132812, "intensity": 0.6638197898864746, "calc_mz": 894.44681115047, "fragment": "y8+", "color": "#D32F2F"}, {"exp_mz": 1007.5315551757812, "intensity": 0.6666371822357178, "calc_mz": 1007.53087115047, "fragment": "y9+", "color": "#D32F2F"}, {"exp_mz": 1135.5819091796875, "intensity": 0.49215438961982727, "calc_mz": 1135.58945115047, "fragment": "y10+", "color": "#D32F2F"}, {"exp_mz": 1249.630615234375, "intensity": 0.3710383176803589, "calc_mz": 1249.6323811504699, "fragment": "y11+", "color": "#D32F2F"}]}}
+{"config": {"view": {"continuousWidth": 400, "continuousHeight": 300}}, "layer": [{"data": {"name": "data-b23b32ed2918bd65f8d9dad67f5b6455"}, "mark": {"type": "rule", "size": 2}, "encoding": {"color": {"type": "nominal", "field": "color", "legend": null, "scale": null}, "tooltip": [{"type": "quantitative", "field": "exp_mz", "format": ".4f", "title": "Experimental m/z"}, {"type": "quantitative", "field": "intensity", "format": ".0%", "title": "Intensity"}], "x": {"type": "quantitative", "axis": {"grid": true, "title": "m/z", "titleFontStyle": "italic"}, "field": "exp_mz", "scale": {"nice": true, "padding": 5, "zero": false}}, "y": {"type": "quantitative", "axis": {"format": "%", "grid": true, "title": "Intensity"}, "field": "intensity", "scale": {"nice": true, "padding": 5}}}}, {"data": {"name": "data-081fc9b2fa047113dfa6ae0eeae5f7e6"}, "mark": {"type": "rule", "size": 2}, "encoding": {"color": {"type": "nominal", "field": "color", "legend": null, "scale": null}, "tooltip": [{"type": "nominal", "field": "fragment", "title": "Fragment"}, {"type": "quantitative", "field": "exp_mz", "format": ".4f", "title": "Experimental m/z"}, {"type": "quantitative", "field": "calc_mz", "format": ".4f", "title": "Theoretical m/z"}, {"type": "quantitative", "field": "intensity", "format": ".0%", "title": "Intensity"}], "x": {"type": "quantitative", "axis": {"grid": true, "title": "m/z", "titleFontStyle": "italic"}, "field": "exp_mz", "scale": {"nice": true, "padding": 5, "zero": false}}, "y": {"type": "quantitative", "axis": {"format": "%", "grid": true, "title": "Intensity"}, "field": "intensity", "scale": {"nice": true, "padding": 5}}}}, {"data": {"name": "data-081fc9b2fa047113dfa6ae0eeae5f7e6"}, "mark": {"type": "text", "align": "left", "angle": 270, "baseline": "middle", "dx": 5}, "encoding": {"color": {"type": "nominal", "field": "color", "legend": null, "scale": null}, "text": {"type": "nominal", "field": "fragment"}, "tooltip": [{"type": "nominal", "field": "fragment", "title": "Fragment"}, {"type": "quantitative", "field": "exp_mz", "format": ".4f", "title": "Experimental m/z"}, {"type": "quantitative", "field": "calc_mz", "format": ".4f", "title": "Theoretical m/z"}, {"type": "quantitative", "field": "intensity", "format": ".0%", "title": "Intensity"}], "x": {"type": "quantitative", "axis": {"grid": true, "title": "m/z", "titleFontStyle": "italic"}, "field": "exp_mz", "scale": {"nice": true, "padding": 5, "zero": false}}, "y": {"type": "quantitative", "axis": {"format": "%", "grid": true, "title": "Intensity"}, "field": "intensity", "scale": {"nice": true, "padding": 5}}}}], "height": 400, "width": 640, "$schema": "https://vega.github.io/schema/vega-lite/v4.8.1.json", "datasets": {"data-b23b32ed2918bd65f8d9dad67f5b6455": [{"exp_mz": 101.07122039794922, "intensity": 0.38514694571495056, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 120.08110046386719, "intensity": 0.3500851094722748, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 129.102294921875, "intensity": 0.35083481669425964, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 130.06533813476562, "intensity": 0.4036368131637573, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 170.06008911132812, "intensity": 0.5717398524284363, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 214.09768676757812, "intensity": 0.47720515727996826, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 214.15350341796875, "intensity": 0.28815317153930664, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 233.16494750976562, "intensity": 0.2766750454902649, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 242.14993286132812, "intensity": 0.3346022367477417, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 243.10874938964844, "intensity": 0.3623234033584595, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 284.1026611328125, "intensity": 0.8009493947029114, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 285.1063232421875, "intensity": 0.27843743562698364, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 344.1928405761719, "intensity": 0.318891316652298, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 353.18170166015625, "intensity": 0.37984132766723633, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 363.2070007324219, "intensity": 0.3013898730278015, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 395.1347961425781, "intensity": 0.4417710304260254, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 412.1607360839844, "intensity": 0.5171781778335571, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 424.217529296875, "intensity": 0.28943997621536255, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 480.2240905761719, "intensity": 0.37062183022499084, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 497.2502746582031, "intensity": 0.3041319251060486, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 525.2426147460938, "intensity": 0.3099946975708008, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 549.2872924804688, "intensity": 0.3830855190753937, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 559.2943115234375, "intensity": 0.35007503628730774, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 696.351318359375, "intensity": 0.36242109537124634, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 718.3870849609375, "intensity": 0.572966456413269, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 767.3910522460938, "intensity": 0.443424791097641, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 876.4351806640625, "intensity": 0.37056124210357666, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 877.419677734375, "intensity": 0.5582457184791565, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 878.4134521484375, "intensity": 0.3392740786075592, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 895.4476318359375, "intensity": 0.4597960412502289, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 1008.5327758789062, "intensity": 0.4994979798793793, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 1118.573974609375, "intensity": 0.3925056755542755, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 1136.58984375, "intensity": 0.38583794236183167, "calc_mz": null, "fragment": null, "color": "#212121"}, {"exp_mz": 1250.6297607421875, "intensity": 0.3353876769542694, "calc_mz": null, "fragment": null, "color": "#212121"}], "data-081fc9b2fa047113dfa6ae0eeae5f7e6": [{"exp_mz": 147.11273193359375, "intensity": 0.3019610047340393, "calc_mz": 147.11280115047, "fragment": "y1+", "color": "#D32F2F"}, {"exp_mz": 159.09169006347656, "intensity": 1.0, "calc_mz": 159.09167184721002, "fragment": "a1+", "color": "#388E3C"}, {"exp_mz": 187.086669921875, "intensity": 0.33918213844299316, "calc_mz": 187.08658646677, "fragment": "b1+", "color": "#1976D2"}, {"exp_mz": 204.13414001464844, "intensity": 0.46954265236854553, "calc_mz": 204.13426115047, "fragment": "y2+", "color": "#D32F2F"}, {"exp_mz": 301.1289978027344, "intensity": 0.6379719972610474, "calc_mz": 301.12951646677, "fragment": "b2+", "color": "#1976D2"}, {"exp_mz": 305.18109130859375, "intensity": 0.46205222606658936, "calc_mz": 305.18194115047, "fragment": "y3+", "color": "#D32F2F"}, {"exp_mz": 362.2037353515625, "intensity": 0.7668641209602356, "calc_mz": 362.20340115047003, "fragment": "y4+", "color": "#D32F2F"}, {"exp_mz": 429.1875915527344, "intensity": 0.5527995228767395, "calc_mz": 429.18809646677, "fragment": "b3+", "color": "#1976D2"}, {"exp_mz": 542.272216796875, "intensity": 0.2779512405395508, "calc_mz": 542.27215646677, "fragment": "b4+", "color": "#1976D2"}, {"exp_mz": 548.280517578125, "intensity": 0.7962697744369507, "calc_mz": 548.2827111504699, "fragment": "y5+", "color": "#D32F2F"}, {"exp_mz": 695.351318359375, "intensity": 0.6674109697341919, "calc_mz": 695.35112115047, "fragment": "y6+", "color": "#D32F2F"}, {"exp_mz": 766.387451171875, "intensity": 0.7651169896125793, "calc_mz": 766.38823115047, "fragment": "y7+", "color": "#D32F2F"}, {"exp_mz": 894.4446411132812, "intensity": 0.6638197898864746, "calc_mz": 894.44681115047, "fragment": "y8+", "color": "#D32F2F"}, {"exp_mz": 1007.5315551757812, "intensity": 0.6666371822357178, "calc_mz": 1007.53087115047, "fragment": "y9+", "color": "#D32F2F"}, {"exp_mz": 1135.5819091796875, "intensity": 0.49215438961982727, "calc_mz": 1135.58945115047, "fragment": "y10+", "color": "#D32F2F"}, {"exp_mz": 1249.630615234375, "intensity": 0.3710383176803589, "calc_mz": 1249.6323811504699, "fragment": "y11+", "color": "#D32F2F"}]}}
\ No newline at end of file
diff --git a/spectrum_utils/iplot.py b/spectrum_utils/iplot.py
index 33cfd45..b170a9c 100644
--- a/spectrum_utils/iplot.py
+++ b/spectrum_utils/iplot.py
@@ -51,7 +51,8 @@ def spectrum(spec: MsmsSpectrum, color_ions: bool = True,
     if spec.annotation is not None:
         annotation = (spec.annotation if annotate_ions else
                       [None] * len(spec.mz))
-        color = [colors[a.ion_type if a is not None and color_ions else None]
+        color = [colors[a.ion_type[0] if a is not None and color_ions else
+                        None]
                  for a in spec.annotation]
     else:
         annotation = [None] * len(spec.mz)
diff --git a/spectrum_utils/plot.py b/spectrum_utils/plot.py
index 4c10d7b..a0b199f 100755
--- a/spectrum_utils/plot.py
+++ b/spectrum_utils/plot.py
@@ -5,20 +5,18 @@
 import matplotlib.pyplot as plt
 import matplotlib.ticker as mticker
 
-from spectrum_utils.spectrum import MsmsSpectrum, MoleculeFragmentAnnotation,\
-    PeptideFragmentAnnotation
+from spectrum_utils.spectrum import MsmsSpectrum, FragmentAnnotation
 
 
 colors = {'a': '#388E3C', 'b': '#1976D2', 'c': '#00796B',
           'x': '#7B1FA2', 'y': '#D32F2F', 'z': '#F57C00',
-          'unknown': '#212121', 'molecule': '#212121', None: '#212121'}
-zorders = {'a': 3, 'b': 4, 'c': 3, 'x': 3, 'y': 4, 'z': 3, 'unknown': 2,
-           'molecule': 5, None: 1}
+          '?': '#212121', 'f': '#212121', None: '#212121'}
+zorders = {'a': 3, 'b': 4, 'c': 3, 'x': 3, 'y': 4, 'z': 3, '?': 2, 'f': 5,
+           None: 1}
 
 
 def _annotate_ion(mz: float, intensity: float,
-                  annotation: Optional[Union[MoleculeFragmentAnnotation,
-                                             PeptideFragmentAnnotation]],
+                  annotation: Optional[FragmentAnnotation],
                   color_ions: bool, annotate_ions: bool,
                   annotation_kws: Dict[str, object], ax: plt.Axes)\
         -> Tuple[str, int]:
@@ -54,9 +52,9 @@ def _annotate_ion(mz: float, intensity: float,
         return colors.get(None), zorders.get(None)
     # Else: Add the textual annotation.
     else:
-        color = (colors.get(annotation.ion_type) if color_ions else
+        color = (colors.get(annotation.ion_type[0]) if color_ions else
                  colors.get(None))
-        zorder = zorders.get(annotation.ion_type)
+        zorder = zorders.get(annotation.ion_type[0])
 
         if annotate_ions:
             annotation_pos = intensity
diff --git a/spectrum_utils/spectrum.py b/spectrum_utils/spectrum.py
index 1b213c3..b232c44 100755
--- a/spectrum_utils/spectrum.py
+++ b/spectrum_utils/spectrum.py
@@ -1,6 +1,4 @@
-import math
 import operator
-import warnings
 from typing import Any, Dict, Iterable, List, Optional, Tuple, Union
 
 import numba as nb
@@ -47,137 +45,97 @@ class FragmentAnnotation:
     Class representing a general fragment ion annotation.
     """
 
-    def __init__(self, charge: int, calc_mz: float, annotation: str = None)\
+    def __init__(self, ion_type: str, neutral_loss: Optional[str] = None,
+                 isotope: int = 0, charge: int = 0,
+                 adduct: Optional[str] = None, calc_mz: float = None) \
             -> None:
         """
-        Instantiate a new `FragmentAnnotation`.
+        Interpretation of a single fragment peak.
+
+        This fragment annotation format is derived from the PSI peak
+        interpretation specification:
+        https://docs.google.com/document/d/1yEUNG4Ump6vnbMDs4iV4s3XISflmOkRAyqUuutcCG2w/edit?usp=sharing
 
         Parameters
         ----------
-        charge : int
-            The fragment ion charge if known, None otherwise.
+        ion_type : str
+            Specifies the basic type of ion being described. Examples are
+            b ions, y ions, immonium ions, unfragmented precursor ions,
+            internal fragmentation ions, isobaric tag ions, etc.
+        neutral_loss : str, optional
+            A string of 0 to n loss components, described by their molecular
+            formula. The default is no neutral loss.
+        isotope : int, optional
+            The isotope number above or below the monoisotope. The default is
+            the monoisotopic peak.
+        charge : int, optional
+            The charge of the fragment. The default is charge 1.
+        adduct : str, optional
+            The adduct that ionized the fragment.
         calc_mz : float
             The theoretical m/z value of the fragment.
-        annotation : str
-            The fragment's annotation string.
         """
-        self.ion_type = 'unknown'
+        if ion_type[0] not in '?abcxyzIm_prf':
+            raise ValueError('Unsupported ion type')
+        if ion_type == '?' and (neutral_loss is not None or
+                                isotope != 0 or
+                                charge != 0 or
+                                adduct is not None):
+            raise ValueError('Information specified for an unknown ion')
+        self.ion_type = ion_type
+        self.neutral_loss = neutral_loss
+        self.isotope = isotope
+        if charge == 0 and ion_type != '?':
+            raise ValueError('Invalid charge 0 for annotated fragment')
+        elif charge < 0:
+            raise ValueError('Invalid negative charge')
         self.charge = charge
+        self.adduct = adduct
         self.calc_mz = calc_mz
-        self.annotation = annotation
-
-    def _charge_to_str(self):
-        """
-        Convert a numeric charge to a string representation.
-        """
-        if self.charge is None:
-            return 'unknown'
-        elif self.charge > 0:
-            return '+' * self.charge
-        elif self.charge < 0:
-            return '-' * -self.charge
-        else:
-            return 'undefined'
 
     def __repr__(self) -> str:
-        return f"FragmentAnnotation(annotation='{self.annotation}', " \
-               f"charge={self._charge_to_str()}, mz={self.calc_mz})"
-
-    def __str__(self) -> str:
-        return self.annotation
-
-    def __eq__(self, other: Any) -> bool:
-        if not isinstance(other, FragmentAnnotation):
-            return False
+        if self.ion_type == '?':
+            ion = '?'
         else:
-            return self.annotation == other.annotation
-
+            ion = self.ion_type
+            if self.neutral_loss is not None:
+                ion += f'{self.neutral_loss}'
+            if self.isotope != 0:
+                ion += f'{self.isotope:+}i'
+            if self.charge > 1:
+                ion += f'^{self.charge}'
+            if self.adduct is not None:
+                ion += self.adduct
+            return ion
+        return f'FragmentAnnotation({ion}, mz={self.calc_mz})'
 
-class PeptideFragmentAnnotation(FragmentAnnotation):
-    """
-    Class representing a peptide fragment ion annotation.
-    """
-
-    def __init__(self, charge: int, calc_mz: float, ion_type: str,
-                 ion_index: int) -> None:
-        """
-        Instantiate a new `PeptideFragmentAnnotation`.
-
-        Parameters
-        ----------
-        charge : int
-            The peptide fragment ion charge.
-        calc_mz : float
-            The theoretical m/z value of the peptide fragment.
-        ion_type : {'a', 'b', 'c', 'x', 'y', 'z'}
-            The peptide fragment ion type.
-        ion_index : int
-            The peptide fragment ion index.
-        """
-        super().__init__(charge, calc_mz)
-        if ion_type not in 'abcxyz':
-            raise ValueError(f'Unknown ion type: {ion_type}')
-        self.ion_type = ion_type
-        self.ion_index = ion_index
-        self.annotation = f'{self.ion_type}{self.ion_index}' \
-                          f'{self._charge_to_str()}'
-
-    def __repr__(self) -> str:
-        return f"PeptideFragmentAnnotation(ion_type='{self.ion_type}', " \
-            f"ion_index={self.ion_index}, charge={self.charge}, " \
-            f"mz={self.calc_mz})"
-
-    def __eq__(self, other: Any) -> bool:
-        if not isinstance(other, PeptideFragmentAnnotation):
-            return False
+    def __str__(self) -> str:
+        if self.ion_type == '?':
+            return str(self.calc_mz)
         else:
-            return (self.ion_type == other.ion_type and
-                    self.ion_index == other.ion_index and
-                    self.charge == other.charge and
-                    math.isclose(self.calc_mz, other.calc_mz))
-
-
-class MoleculeFragmentAnnotation(FragmentAnnotation):
-    """
-    Class representing a molecule fragment ion annotation.
-    """
-
-    def __init__(self, charge: int, calc_mz: float, smiles: str) -> None:
-        """
-        Instantiate a new `MoleculeFragmentAnnotation`.
-
-        Parameters
-        ----------
-        charge : int
-            The molecule fragment ion charge.
-        calc_mz : float
-            The theoretical m/z value of the molecule fragment.
-        smiles : str
-            The SMILES representation of the molecule.
-        """
-        super().__init__(charge, calc_mz)
-        self.ion_type = 'molecule'
-        self.smiles = smiles
-        self.annotation = self.smiles
-
-    def __repr__(self) -> str:
-        return f"MoleculeFragmentAnnotation(smiles='{self.smiles}', " \
-            f"charge={self.charge}, mz={self.calc_mz})"
+            annotation = self.ion_type
+            if self.neutral_loss is not None:
+                annotation += f'{self.neutral_loss}'
+            if self.isotope != 0:
+                annotation += f'{self.isotope:+}i'
+            annotation += '+' * self.charge
+            if self.adduct is not None:
+                annotation += self.adduct
+            return annotation
 
     def __eq__(self, other: Any) -> bool:
-        if not isinstance(other, MoleculeFragmentAnnotation):
+        if not isinstance(other, FragmentAnnotation):
             return False
         else:
-            return (self.smiles == other.smiles and
-                    self.charge == other.charge and
-                    math.isclose(self.calc_mz, other.calc_mz))
+            return str(self) == str(other)
 
 
 def _get_theoretical_peptide_fragments(
         peptide: str,
         modifications: Optional[Dict[Union[float, str], float]] = None,
-        types: str = 'by', max_charge: int = 1)\
-        -> List[PeptideFragmentAnnotation]:
+        types: str = 'by', max_charge: int = 1,
+        neutral_losses: Optional[Dict[str, float]] = None) \
+        -> List[FragmentAnnotation]:
     """
     Get theoretical peptide fragments for the given peptide.
 
@@ -197,6 +155,9 @@ def _get_theoretical_peptide_fragments(
     max_charge : int, optional
         All fragments up to and including the given charge will be generated
         (the default is 1 to only generate singly-charged fragments).
+    neutral_losses : Optional[Dict[str, float]]
+        A dictionary with neutral loss names and (negative) mass differences to
+        be considered.
 
     Returns
     -------
@@ -214,6 +175,8 @@ def _get_theoretical_peptide_fragments(
             del mods['C-term']
     else:
         mods = {}
+    if neutral_losses is None:
+        neutral_losses = {None: 0}
     ions = []
     for i in range(1, len(peptide)):
         for ion_type in types:
@@ -226,11 +189,19 @@ def _get_theoretical_peptide_fragments(
                 sequence = peptide[i:]
                 mod_mass = sum([md for pos, md in mods.items() if pos >= i])
             for charge in range(1, max_charge + 1):
-                ions.append(PeptideFragmentAnnotation(
-                    charge, mass.fast_mass(
-                        sequence=sequence, ion_type=ion_type,
-                        charge=charge, aa_mass=_aa_mass) + mod_mass / charge,
-                    ion_type, ion_index))
+                for nl_name, nl_mass in neutral_losses.items():
+                    nl_name = (None if nl_name is None else
+                               f'{"-" if nl_mass < 0 else "+"}{nl_name}')
+                    ions.append(FragmentAnnotation(
+                        ion_type=f'{ion_type}{ion_index}',
+                        neutral_loss=nl_name,
+                        isotope=0,
+                        charge=charge,
+                        calc_mz=mass.fast_mass(sequence=sequence,
+                                               ion_type=ion_type,
+                                               charge=charge,
+                                               aa_mass=_aa_mass)
+                                + (mod_mass + nl_mass) / charge))
     return sorted(ions, key=operator.attrgetter('calc_mz'))
 
 
@@ -507,7 +478,7 @@ def _scale_intensity_max(intensity: np.ndarray, max_intensity: float)\
 @nb.njit
 def _get_peptide_fragment_annotation_map(
         spectrum_mz: np.ndarray, spectrum_intensity: np.ndarray,
-        annotation_mz: List[float], fragment_tol_mass: float,
+        annotation_mz: nb.typed.List, fragment_tol_mass: float,
         fragment_tol_mode: str, peak_assignment: str = 'most_intense')\
         -> List[Tuple[int, int]]:
     """
@@ -519,7 +490,7 @@ def _get_peptide_fragment_annotation_map(
         The mass-to-charge varlues of the spectrum fragment peaks.
     spectrum_intensity : np.ndarray
         The intensities of the spectrum fragment peaks.
-    annotation_mz : List[float]
+    annotation_mz : nb.typed.List[float]
         A list of mass-to-charge values of the peptide fragment annotations.
     fragment_tol_mass : float
         Fragment mass tolerance to match spectrum peaks against theoretical
@@ -991,11 +962,11 @@ def scale_intensity(self, scaling: Optional[str] = None,
     def annotate_peaks(self, *args, **kwargs):
         raise DeprecationWarning('Renamed to annotate_peptide_fragments')
 
-    def annotate_peptide_fragments(self, fragment_tol_mass: float,
-                                   fragment_tol_mode: str,
-                                   ion_types: str = 'by',
-                                   max_ion_charge: Optional[int] = None,
-                                   peak_assignment: str = 'most_intense')\
+    def annotate_peptide_fragments(
+            self, fragment_tol_mass: float, fragment_tol_mode: str,
+            ion_types: str = 'by', max_ion_charge: Optional[int] = None,
+            peak_assignment: str = 'most_intense',
+            neutral_losses: Optional[Dict[str, float]] = None) \
             -> 'MsmsSpectrum':
         """
         Annotate peaks with their corresponding peptide fragment ion
@@ -1028,6 +999,10 @@ def annotate_peptide_fragments(self, fragment_tol_mass: float,
               (default).
             - 'nearest_mz': The peak whose m/z is closest to the theoretical
               m/z will be annotated.
+        neutral_losses : Dict[str, float], optional
+            Neutral losses to consider, specified as a dictionary with as keys
+            the description (molecular formula) and as value the neutral loss.
+            Note that the value should typically be negative.
 
         Returns
         -------
@@ -1037,23 +1012,21 @@ def annotate_peptide_fragments(self, fragment_tol_mass: float,
             raise ValueError('No peptide sequence available for the spectrum')
         if max_ion_charge is None:
             max_ion_charge = max(1, self.precursor_charge - 1)
-
+        # Make sure the standard peaks (without a neutral loss) are always
+        # considered.
+        if neutral_losses is not None and None not in neutral_losses:
+            neutral_losses[None] = 0
         theoretical_fragments = _get_theoretical_peptide_fragments(
-            self.peptide, self.modifications, ion_types, max_ion_charge)
+            self.peptide, self.modifications, ion_types, max_ion_charge,
+            neutral_losses)
         self.annotation = np.full_like(self.mz, None, object)
-        with warnings.catch_warnings():
-            # FIXME: Deprecated reflected list in Numba should be resolved from
-            #        version 0.46.0 onwards.
-            #  https://numba.pydata.org/numba-doc/latest/reference/deprecation.html#deprecation-of-reflection-for-list-and-set-types
-            warnings.simplefilter('ignore', nb.NumbaPendingDeprecationWarning)
-            for annotation_i, fragment_i in\
-                    _get_peptide_fragment_annotation_map(
-                        self.mz, self.intensity,
-                        [fragment.calc_mz for fragment
-                         in theoretical_fragments],
-                        fragment_tol_mass, fragment_tol_mode, peak_assignment):
-                self.annotation[annotation_i] =\
-                    theoretical_fragments[fragment_i]
+        for annotation_i, fragment_i in \
+                _get_peptide_fragment_annotation_map(
+                    self.mz, self.intensity,
+                    nb.typed.List([fragment.calc_mz
+                                   for fragment in theoretical_fragments]),
+                    fragment_tol_mass, fragment_tol_mode, peak_assignment):
+            self.annotation[annotation_i] = theoretical_fragments[fragment_i]
 
         return self
 
@@ -1107,19 +1080,17 @@ def annotate_molecule_fragment(self, smiles: str, fragment_mz: float,
             if self.annotation is None:
                 self.annotation = np.full_like(self.mz, None, object)
             # Set the molecule's annotation.
-            self.annotation[peak_index] =\
-                MoleculeFragmentAnnotation(fragment_charge, fragment_mz,
-                                           smiles)
+            self.annotation[peak_index] = FragmentAnnotation(
+                f'f{{{smiles}}}', charge=fragment_charge, calc_mz=fragment_mz)
 
         return self
 
-    def annotate_mz_fragment(self, fragment_mz: float, fragment_charge: int,
+    def annotate_mz_fragment(self, fragment_mz: float,
                              fragment_tol_mass: float, fragment_tol_mode: str,
-                             peak_assignment: str = 'most_intense',
-                             text: Optional[str] = None) -> 'MsmsSpectrum':
+                             peak_assignment: str = 'most_intense') \
+            -> 'MsmsSpectrum':
         """
-        Annotate a peak (if present) with its m/z value or a custom provided
-        string.
+        Annotate a peak (if present) with its m/z value.
 
         The matching position in `self.annotation` will be overwritten.
 
@@ -1127,8 +1098,6 @@ def annotate_mz_fragment(self, fragment_mz: float, fragment_charge: int,
         ----------
         fragment_mz : float
             The expected m/z to annotate.
-        fragment_charge : int
-            The peak charge.
         fragment_tol_mass : float
             Fragment mass tolerance to match spectrum peaks against the given
             m/z.
@@ -1142,9 +1111,6 @@ def annotate_mz_fragment(self, fragment_mz: float, fragment_charge: int,
               (default).
             - 'nearest_mz': The peak whose m/z is closest to the given m/z will
               be annotated.
-        text : Optional[str], optional
-            The text to annotate the peak with. If None, its m/z value will be
-            used.
 
         Returns
         -------
@@ -1161,9 +1127,7 @@ def annotate_mz_fragment(self, fragment_mz: float, fragment_charge: int,
             if self.annotation is None:
                 self.annotation = np.full_like(self.mz, None, object)
             # Set the peak annotation.
-            self.annotation[peak_index] =\
-                FragmentAnnotation(
-                    fragment_charge, fragment_mz,
-                    text if text is not None else str(fragment_mz))
+            self.annotation[peak_index] = FragmentAnnotation(
+                '?', calc_mz=fragment_mz)
 
         return self


Test patch:
diff --git a/tests/spectrum_test.py b/tests/spectrum_test.py
index 304c5b6..3ff17b9 100644
--- a/tests/spectrum_test.py
+++ b/tests/spectrum_test.py
@@ -10,6 +10,29 @@
 np.random.seed(13)
 
 
+def test_fragmentannotation_unknown():
+    spectrum.FragmentAnnotation('?')
+    with pytest.raises(ValueError):
+        spectrum.FragmentAnnotation('?', neutral_loss='H2O')
+    with pytest.raises(ValueError):
+        spectrum.FragmentAnnotation('?', isotope=1)
+    with pytest.raises(ValueError):
+        spectrum.FragmentAnnotation('?', charge=1)
+    with pytest.raises(ValueError):
+        spectrum.FragmentAnnotation('?', adduct='[M+H]')
+
+
+def test_fragment_annotation_primary():
+    spectrum.FragmentAnnotation('b5', neutral_loss='H2O', isotope=1, charge=1,
+                                adduct='[M+H]')
+    with pytest.raises(ValueError):
+        spectrum.FragmentAnnotation('b5')
+    with pytest.raises(ValueError):
+        spectrum.FragmentAnnotation('b5', charge=0)
+    with pytest.raises(ValueError):
+        spectrum.FragmentAnnotation('b5', charge=-2)
+
+
 def test_get_theoretical_fragments():
     peptide = 'HPYLEDR'
     fragments = {'b1_1': 138.066147, 'b2_1': 235.118912, 'b3_1': 398.182220,
@@ -26,8 +49,7 @@ def test_get_theoretical_fragments():
                  'y4_3': 178.095698, 'y5_3': 232.450141, 'y6_3': 264.801061}
     for fragment in spectrum._get_theoretical_peptide_fragments(
             peptide, max_charge=3):
-        fragment_mz = fragments[f'{fragment.ion_type}{fragment.ion_index}'
-                                f'_{fragment.charge}']
+        fragment_mz = fragments[f'{fragment.ion_type}_{fragment.charge}']
         assert fragment.calc_mz == pytest.approx(fragment_mz)
 
 
@@ -48,8 +70,7 @@ def test_get_theoretical_fragments_static_mod():
                  'y4_3': 178.095698, 'y5_3': 259.105585, 'y6_3': 291.456505}
     for fragment in spectrum._get_theoretical_peptide_fragments(
             peptide, None, max_charge=3):
-        fragment_mz = fragments[f'{fragment.ion_type}{fragment.ion_index}'
-                                f'_{fragment.charge}']
+        fragment_mz = fragments[f'{fragment.ion_type}_{fragment.charge}']
         assert fragment.calc_mz == pytest.approx(fragment_mz)
     assert spectrum._aa_mass['Y'] == pytest.approx(163.06333 + 79.96633)
     spectrum.reset_modifications()
@@ -73,8 +94,7 @@ def test_get_theoretical_fragments_mod():
                  'y4_3': 178.095698, 'y5_3': 259.105585, 'y6_3': 291.456505}
     for fragment in spectrum._get_theoretical_peptide_fragments(
             peptide, modifications, max_charge=3):
-        fragment_mz = fragments[f'{fragment.ion_type}{fragment.ion_index}'
-                                f'_{fragment.charge}']
+        fragment_mz = fragments[f'{fragment.ion_type}_{fragment.charge}']
         assert fragment.calc_mz == pytest.approx(fragment_mz)
 
 
@@ -87,7 +107,7 @@ def test_get_theoretical_fragments_mod_term():
                  'y4': 532.272522, 'y5': 695.335815, 'y6': 792.388550}
     for fragment in spectrum._get_theoretical_peptide_fragments(
             peptide, modifications):
-        fragment_mz = fragments[f'{fragment.ion_type}{fragment.ion_index}']
+        fragment_mz = fragments[f'{fragment.ion_type}']
         assert fragment.calc_mz == pytest.approx(fragment_mz)
 
 
@@ -100,10 +120,71 @@ def test_get_theoretical_fragments_mod_multiple():
                  'y4': 532.272522, 'y5': 775.302185, 'y6': 872.354980}
     for fragment in spectrum._get_theoretical_peptide_fragments(
             peptide, modifications):
-        fragment_mz = fragments[f'{fragment.ion_type}{fragment.ion_index}']
+        fragment_mz = fragments[f'{fragment.ion_type}']
         assert fragment.calc_mz == pytest.approx(fragment_mz)
 
 
+def test_get_theoretical_fragments_neutral_loss():
+    peptide = 'HPYLEDR'
+    fragments = {'b1^1': 138.066147, 'b2^1': 235.118912, 'b3^1': 398.182220,
+                 'b4^1': 511.266266, 'b5^1': 640.308899, 'b6^1': 755.335815,
+                 'y1^1': 175.118912, 'y2^1': 290.145844, 'y3^1': 419.188446,
+                 'y4^1': 532.272522, 'y5^1': 695.335815, 'y6^1': 792.388550,
+                 'b1^2': 69.536731,  'b2^2': 118.063111, 'b3^2': 199.594776,
+                 'b4^2': 256.136806, 'b5^2': 320.658101, 'b6^2': 378.171571,
+                 'y1^2': 88.063114,  'y2^2': 145.576584, 'y3^2': 210.097879,
+                 'y4^2': 266.639909, 'y5^2': 348.171574, 'y6^2': 396.697954,
+                 'b1^3': 46.693580,  'b2^3': 79.044500,  'b3^3': 133.398943,
+                 'b4^3': 171.093630, 'b5^3': 214.107826, 'b6^3': 252.450140,
+                 'y1^3': 59.044501,  'y2^3': 97.386815,  'y3^3': 140.401011,
+                 'y4^3': 178.095698, 'y5^3': 232.450141, 'y6^3': 264.801061}
+    neutral_loss = 'H2O', 18.010565    # water
+    neutral_loss_fragments = {}
+    for fragment, mz in fragments.items():
+        charge = int(fragment.split('^')[1])
+        fragment = f'{fragment}-{neutral_loss[0]}'
+        neutral_loss_fragments[fragment] = mz - (neutral_loss[1] / charge)
+    fragments = {**fragments, **neutral_loss_fragments}
+    for fragment in spectrum._get_theoretical_peptide_fragments(
+            peptide, max_charge=3,
+            neutral_losses={None: 0, neutral_loss[0]: -neutral_loss[1]}):
+        fragment_mz = fragments[
+            f"""{fragment.ion_type}^{fragment.charge}{fragment.neutral_loss
+            if fragment.neutral_loss is not None else ''}"""]
+        assert fragment_mz == pytest.approx(fragment.calc_mz), repr(fragment)
+
+
+def test_get_theoretical_fragments_mod_neutral_loss():
+    peptide = 'HPYLEDR'
+    modifications = {2: 79.96633}
+    fragments = {'b1^1': 138.066147, 'b2^1': 235.118912, 'b3^1': 478.148590,
+                 'b4^1': 591.232666, 'b5^1': 720.275269, 'b6^1': 835.302185,
+                 'y1^1': 175.118912, 'y2^1': 290.145844, 'y3^1': 419.188446,
+                 'y4^1': 532.272522, 'y5^1': 775.302185, 'y6^1': 872.354980,
+                 'b1^2': 69.536731,  'b2^2': 118.063111, 'b3^2': 239.577941,
+                 'b4^2': 296.119971, 'b5^2': 360.641266, 'b6^2': 418.154736,
+                 'y1^2': 88.063114,  'y2^2': 145.576584, 'y3^2': 210.097879,
+                 'y4^2': 266.639909, 'y5^2': 388.154739, 'y6^2': 436.681119,
+                 'b1^3': 46.693580,  'b2^3': 79.044500,  'b3^3': 160.054386,
+                 'b4^3': 197.749073, 'b5^3': 240.763270, 'b6^3': 279.105583,
+                 'y1^3': 59.044501,  'y2^3': 97.386815,  'y3^3': 140.401011,
+                 'y4^3': 178.095698, 'y5^3': 259.105585, 'y6^3': 291.456505}
+    neutral_loss = 'H2O', 18.010565    # water
+    neutral_loss_fragments = {}
+    for fragment, mz in fragments.items():
+        charge = int(fragment.split('^')[1])
+        fragment = f'{fragment}-{neutral_loss[0]}'
+        neutral_loss_fragments[fragment] = mz - (neutral_loss[1] / charge)
+    fragments = {**fragments, **neutral_loss_fragments}
+    for fragment in spectrum._get_theoretical_peptide_fragments(
+            peptide, modifications, max_charge=3,
+            neutral_losses={None: 0, neutral_loss[0]: -neutral_loss[1]}):
+        fragment_mz = fragments[
+            f"""{fragment.ion_type}^{fragment.charge}{fragment.neutral_loss
+            if fragment.neutral_loss is not None else ''}"""]
+        assert fragment_mz == pytest.approx(fragment.calc_mz), repr(fragment)
+
+
 def test_mz_intensity_len():
     mz = np.random.uniform(100, 1400, 150)
     intensity = np.random.exponential(1, 100)
@@ -115,7 +196,7 @@ def test_mz_annotation_len():
     num_peaks = 150
     mz = np.random.uniform(100, 1400, num_peaks)
     intensity = np.random.lognormal(0, 1, num_peaks)
-    annotation = [spectrum.FragmentAnnotation(None, this_mz, str(this_mz))
+    annotation = [spectrum.FragmentAnnotation('?', calc_mz=this_mz)
                   for this_mz in mz[:100]]
     with pytest.raises(ValueError):
         spectrum.MsmsSpectrum('test_spectrum', 500, 2, mz, intensity,
@@ -147,8 +228,9 @@ def test_init_annotation_order():
     num_peaks = 150
     mz = np.random.uniform(100, 1400, num_peaks)
     intensity = np.random.lognormal(0, 1, num_peaks)
-    annotation = [spectrum.PeptideFragmentAnnotation(1, this_mz, 'y', i)
-                  for i, this_mz in enumerate(mz)]
+    annotation = [
+        spectrum.FragmentAnnotation(f'y{i}', charge=1, calc_mz=this_mz)
+        for i, this_mz in enumerate(mz)]
     spec = spectrum.MsmsSpectrum('test_spectrum', 500, 2, mz, intensity,
                                  annotation)
     for this_mz, this_annotation in zip(spec.mz, spec.annotation):
@@ -159,8 +241,9 @@ def test_mz_array():
     num_peaks = 150
     mz = np.random.uniform(100, 1400, num_peaks).tolist()
     intensity = np.random.lognormal(0, 1, num_peaks)
-    annotation = [spectrum.PeptideFragmentAnnotation(1, this_mz, 'y', i)
-                  for i, this_mz in enumerate(mz)]
+    annotation = [
+        spectrum.FragmentAnnotation(f'y{i}', charge=1, calc_mz=this_mz)
+        for i, this_mz in enumerate(mz)]
     spec = spectrum.MsmsSpectrum('test_spectrum', 500, 2, mz, intensity,
                                  annotation)
     assert type(spec.mz) == np.ndarray
@@ -174,8 +257,9 @@ def test_intensity_array():
     num_peaks = 150
     mz = np.random.uniform(100, 1400, num_peaks)
     intensity = np.random.lognormal(0, 1, num_peaks).tolist()
-    annotation = [spectrum.PeptideFragmentAnnotation(1, this_mz, 'y', i)
-                  for i, this_mz in enumerate(mz)]
+    annotation = [
+        spectrum.FragmentAnnotation(f'y{i}', charge=1, calc_mz=this_mz)
+        for i, this_mz in enumerate(mz)]
     spec = spectrum.MsmsSpectrum('test_spectrum', 500, 2, mz, intensity,
                                  annotation)
     assert type(spec.intensity) == np.ndarray
@@ -189,8 +273,9 @@ def test_annotation_array():
     num_peaks = 150
     mz = np.random.uniform(100, 1400, num_peaks)
     intensity = np.random.lognormal(0, 1, num_peaks)
-    annotation = [spectrum.PeptideFragmentAnnotation(1, this_mz, 'y', i)
-                  for i, this_mz in enumerate(mz)]
+    annotation = [
+        spectrum.FragmentAnnotation(f'y{i}', charge=1, calc_mz=this_mz)
+        for i, this_mz in enumerate(mz)]
     spec = spectrum.MsmsSpectrum('test_spectrum', 500, 2, mz, intensity,
                                  annotation)
     assert type(spec.annotation) == np.ndarray
@@ -206,8 +291,9 @@ def test_annotation_none():
     intensity = np.random.lognormal(0, 1, num_peaks)
     spec = spectrum.MsmsSpectrum('test_spectrum', 500, 2, mz, intensity)
     assert spec.annotation is None
-    annotation = [spectrum.PeptideFragmentAnnotation(1, this_mz, 'y', i)
-                  for i, this_mz in enumerate(mz)]
+    annotation = [
+        spectrum.FragmentAnnotation(f'y{i}', charge=1, calc_mz=this_mz)
+        for i, this_mz in enumerate(mz)]
     spec.annotation = annotation
     assert type(spec.annotation) == np.ndarray
     spec.annotation = None
@@ -267,8 +353,9 @@ def test_round_no_merge():
     num_peaks = 150
     mz = np.arange(1, num_peaks + 1) + np.random.uniform(-0.49, 0.5, num_peaks)
     intensity = np.random.exponential(1, num_peaks)
-    annotation = [spectrum.PeptideFragmentAnnotation(1, this_mz, 'y', i)
-                  for i, this_mz in enumerate(mz)]
+    annotation = [
+        spectrum.FragmentAnnotation(f'y{i}', charge=1, calc_mz=this_mz)
+        for i, this_mz in enumerate(mz)]
     spec = spectrum.MsmsSpectrum('test_spectrum', 500, 2, mz.copy(),
                                  intensity.copy(), annotation.copy())
     decimals = 0
@@ -287,8 +374,9 @@ def test_round_merge_len():
     mz[5] = mz[3] + 0.0005
     mz[7] = mz[8] - 0.00037
     intensity = np.random.exponential(1, num_peaks)
-    annotation = [spectrum.PeptideFragmentAnnotation(1, this_mz, 'y', i)
-                  for i, this_mz in enumerate(mz)]
+    annotation = [
+        spectrum.FragmentAnnotation(f'y{i}', charge=1, calc_mz=this_mz)
+        for i, this_mz in enumerate(mz)]
     spec = spectrum.MsmsSpectrum('test_spectrum', 500, 2, mz, intensity,
                                  annotation)
     spec.round(1)
@@ -328,26 +416,29 @@ def test_round_merge_annotation():
     mz[5] = mz[3] + 0.0005
     mz[7] = mz[8] - 0.00037
     intensity = np.arange(1, 11)
-    annotation = [None, None, None,
-                  spectrum.PeptideFragmentAnnotation(1, mz[3], 'b', 4), None,
-                  spectrum.PeptideFragmentAnnotation(1, mz[5], 'b', 6),
-                  spectrum.PeptideFragmentAnnotation(1, mz[6], 'b', 7), None,
-                  None, spectrum.PeptideFragmentAnnotation(1, mz[9], 'b', 10)]
+    annotation = [
+        None, None, None,
+        spectrum.FragmentAnnotation('b4', charge=1, calc_mz=mz[3]), None,
+        spectrum.FragmentAnnotation('b6', charge=1, calc_mz=mz[5]),
+        spectrum.FragmentAnnotation('b7', charge=1, calc_mz=mz[6]), None,
+        None, spectrum.FragmentAnnotation('b10', charge=1, calc_mz=mz[9])]
     spec = spectrum.MsmsSpectrum('test_spectrum', 500, 2, mz.copy(), intensity,
                                  annotation.copy())
     spec.round(1, 'max')
     np.testing.assert_array_equal(spec.annotation, [
-        None, None, None, spectrum.PeptideFragmentAnnotation(1, mz[5], 'b', 6),
-        spectrum.PeptideFragmentAnnotation(1, mz[6], 'b', 7), None,
-        spectrum.PeptideFragmentAnnotation(1, mz[9], 'b', 10)])
+        None, None, None,
+        spectrum.FragmentAnnotation('b6', charge=1, calc_mz=mz[5]),
+        spectrum.FragmentAnnotation('b7', charge=1, calc_mz=mz[6]), None,
+        spectrum.FragmentAnnotation('b10', charge=1, calc_mz=mz[9])])
 
 
 def test_set_mz_range_keep_all():
     num_peaks = 150
     mz = np.random.uniform(100, 1400, num_peaks)
     intensity = np.random.lognormal(0, 1, num_peaks)
-    annotation = [spectrum.PeptideFragmentAnnotation(1, this_mz, 'y', i)
-                  for i, this_mz in enumerate(mz)]
+    annotation = [
+        spectrum.FragmentAnnotation(f'y{i}', charge=1, calc_mz=this_mz)
+        for i, this_mz in enumerate(mz)]
     spec = spectrum.MsmsSpectrum('test_spectrum', 500, 2, mz, intensity,
                                  annotation)
     min_mz, max_mz = 0, 1500
@@ -361,8 +452,9 @@ def test_set_mz_range_truncate():
     num_peaks = 150
     mz = np.random.uniform(100, 1400, num_peaks)
     intensity = np.random.lognormal(0, 1, num_peaks)
-    annotation = [spectrum.PeptideFragmentAnnotation(1, this_mz, 'y', i)
-                  for i, this_mz in enumerate(mz)]
+    annotation = [
+        spectrum.FragmentAnnotation(f'y{i}', charge=1, calc_mz=this_mz)
+        for i, this_mz in enumerate(mz)]
     spec = spectrum.MsmsSpectrum('test_spectrum', 500, 2, mz, intensity,
                                  annotation)
     min_mz, max_mz = 400, 1200
@@ -380,8 +472,9 @@ def test_set_mz_range_truncate_left():
     num_peaks = 150
     mz = np.random.uniform(100, 1400, num_peaks)
     intensity = np.random.lognormal(0, 1, num_peaks)
-    annotation = [spectrum.PeptideFragmentAnnotation(1, this_mz, 'y', i)
-                  for i, this_mz in enumerate(mz)]
+    annotation = [
+        spectrum.FragmentAnnotation(f'y{i}', charge=1, calc_mz=this_mz)
+        for i, this_mz in enumerate(mz)]
     spec = spectrum.MsmsSpectrum('test_spectrum', 500, 2, mz, intensity,
                                  annotation)
     min_mz, max_mz = 400, 1500
@@ -397,8 +490,9 @@ def test_set_mz_range_truncate_right():
     num_peaks = 150
     mz = np.random.uniform(100, 1400, num_peaks)
     intensity = np.random.lognormal(0, 1, num_peaks)
-    annotation = [spectrum.PeptideFragmentAnnotation(1, this_mz, 'y', i)
-                  for i, this_mz in enumerate(mz)]
+    annotation = [
+        spectrum.FragmentAnnotation(f'y{i}', charge=1, calc_mz=this_mz)
+        for i, this_mz in enumerate(mz)]
     spec = spectrum.MsmsSpectrum('test_spectrum', 500, 2, mz, intensity,
                                  annotation)
     min_mz, max_mz = 0, 1200
@@ -414,8 +508,9 @@ def test_set_mz_range_none():
     num_peaks = 150
     mz = np.random.uniform(100, 1400, num_peaks)
     intensity = np.random.lognormal(0, 1, num_peaks)
-    annotation = [spectrum.PeptideFragmentAnnotation(1, this_mz, 'y', i)
-                  for i, this_mz in enumerate(mz)]
+    annotation = [
+        spectrum.FragmentAnnotation(f'y{i}', charge=1, calc_mz=this_mz)
+        for i, this_mz in enumerate(mz)]
     spec = spectrum.MsmsSpectrum('test_spectrum', 500, 2, mz, intensity,
                                  annotation)
     spec.set_mz_range(None, None)
@@ -431,8 +526,9 @@ def test_remove_precursor_peak():
     fragment_tol_mode = 'Da'
     precursor_mz = mz[np.random.randint(0, num_peaks)] + fragment_tol_mass / 2
     intensity = np.random.lognormal(0, 1, num_peaks)
-    annotation = [spectrum.PeptideFragmentAnnotation(1, this_mz, 'y', i)
-                  for i, this_mz in enumerate(mz)]
+    annotation = [
+        spectrum.FragmentAnnotation(f'y{i}', charge=1, calc_mz=this_mz)
+        for i, this_mz in enumerate(mz)]
     spec = spectrum.MsmsSpectrum('test_spectrum', precursor_mz, 2, mz,
                                  intensity, annotation)
     spec.remove_precursor_peak(fragment_tol_mass, fragment_tol_mode)
@@ -449,8 +545,9 @@ def test_remove_precursor_peak_none():
     fragment_tol_mode = 'Da'
     precursor_mz = mz[np.random.randint(0, num_peaks)] + fragment_tol_mass * 2
     intensity = np.random.lognormal(0, 1, num_peaks)
-    annotation = [spectrum.PeptideFragmentAnnotation(1, this_mz, 'y', i)
-                  for i, this_mz in enumerate(mz)]
+    annotation = [
+        spectrum.FragmentAnnotation(f'y{i}', charge=1, calc_mz=this_mz)
+        for i, this_mz in enumerate(mz)]
     spec = spectrum.MsmsSpectrum('test_spectrum', precursor_mz, 2, mz,
                                  intensity, annotation)
     spec.remove_precursor_peak(fragment_tol_mass, fragment_tol_mode)
@@ -470,8 +567,9 @@ def test_remove_precursor_peak_charge():
     mz[-1] = ((precursor_mz - 1.0072766) * precursor_charge) / 2 + 1.0072766
     mz[-2] = ((precursor_mz - 1.0072766) * precursor_charge) + 1.0072766
     intensity = np.random.lognormal(0, 1, num_peaks)
-    annotation = [spectrum.PeptideFragmentAnnotation(1, this_mz, 'y', i)
-                  for i, this_mz in enumerate(mz)]
+    annotation = [
+        spectrum.FragmentAnnotation(f'y{i}', charge=1, calc_mz=this_mz)
+        for i, this_mz in enumerate(mz)]
     spec = spectrum.MsmsSpectrum('test_spectrum', precursor_mz,
                                  precursor_charge, mz, intensity, annotation)
     spec.remove_precursor_peak(fragment_tol_mass, fragment_tol_mode)
@@ -491,8 +589,9 @@ def test_remove_precursor_peak_isotope():
     mz[-1] = precursor_mz + 1 / precursor_charge
     mz[-2] = precursor_mz + 2 / precursor_charge
     intensity = np.random.lognormal(0, 1, num_peaks)
-    annotation = [spectrum.PeptideFragmentAnnotation(1, this_mz, 'y', i)
-                  for i, this_mz in enumerate(mz)]
+    annotation = [
+        spectrum.FragmentAnnotation(f'y{i}', charge=1, calc_mz=this_mz)
+        for i, this_mz in enumerate(mz)]
     spec = spectrum.MsmsSpectrum('test_spectrum', precursor_mz,
                                  precursor_charge, mz, intensity, annotation)
     spec.remove_precursor_peak(fragment_tol_mass, fragment_tol_mode, 2)
@@ -506,8 +605,9 @@ def test_filter_intensity_keep_all():
     num_peaks = 150
     mz = np.random.uniform(100, 1400, num_peaks)
     intensity = np.random.lognormal(0, 1, num_peaks)
-    annotation = [spectrum.PeptideFragmentAnnotation(1, this_mz, 'y', i)
-                  for i, this_mz in enumerate(mz)]
+    annotation = [
+        spectrum.FragmentAnnotation(f'y{i}', charge=1, calc_mz=this_mz)
+        for i, this_mz in enumerate(mz)]
     spec = spectrum.MsmsSpectrum('test_spectrum', 500, 2, mz, intensity,
                                  annotation)
     spec.filter_intensity()
@@ -521,8 +621,9 @@ def test_filter_intensity_remove_low_intensity():
     mz = np.random.uniform(100, 1400, num_peaks)
     intensity = np.random.lognormal(0, 1, num_peaks)
     max_intensity = intensity.max()
-    annotation = [spectrum.PeptideFragmentAnnotation(1, this_mz, 'y', i)
-                  for i, this_mz in enumerate(mz)]
+    annotation = [
+        spectrum.FragmentAnnotation(f'y{i}', charge=1, calc_mz=this_mz)
+        for i, this_mz in enumerate(mz)]
     spec = spectrum.MsmsSpectrum('test_spectrum', 500, 2, mz, intensity,
                                  annotation)
     min_intensity = 0.05
@@ -540,8 +641,9 @@ def test_filter_intensity_max_num_peaks():
     mz = np.random.uniform(100, 1400, num_peaks)
     intensity = np.random.lognormal(0, 1, num_peaks)
     max_intensity = intensity.max()
-    annotation = [spectrum.PeptideFragmentAnnotation(1, this_mz, 'y', i)
-                  for i, this_mz in enumerate(mz)]
+    annotation = [
+        spectrum.FragmentAnnotation(f'y{i}', charge=1, calc_mz=this_mz)
+        for i, this_mz in enumerate(mz)]
     spec = spectrum.MsmsSpectrum('test_spectrum', 500, 2, mz, intensity,
                                  annotation)
     max_num_peaks = 50
@@ -557,8 +659,9 @@ def test_filter_intensity_remove_low_intensity_max_num_peaks():
     mz = np.random.uniform(100, 1400, num_peaks)
     intensity = np.random.lognormal(0, 1, num_peaks)
     max_intensity = intensity.max()
-    annotation = [spectrum.PeptideFragmentAnnotation(1, this_mz, 'y', i)
-                  for i, this_mz in enumerate(mz)]
+    annotation = [
+        spectrum.FragmentAnnotation(f'y{i}', charge=1, calc_mz=this_mz)
+        for i, this_mz in enumerate(mz)]
     spec = spectrum.MsmsSpectrum('test_spectrum', 500, 2, mz, intensity,
                                  annotation)
     min_intensity = 0.05
@@ -662,7 +765,7 @@ def test_annotate_peptide_fragments():
                                                  charge=charge),
             charge, mz, intensity, peptide=peptide)
         spec.annotate_peptide_fragments(fragment_tol_mass, fragment_tol_mode)
-        assert np.count_nonzero(spec.annotation) == len(fragment_mz)
+        assert np.count_nonzero(spec.annotation) >= len(fragment_mz)
 
 
 def test_annotate_peptide_fragments_nearest_mz():
@@ -681,8 +784,8 @@ def test_annotate_peptide_fragments_nearest_mz():
         charge, mz, intensity, peptide=peptide)
     spec.annotate_peptide_fragments(fragment_tol_mass, fragment_tol_mode,
                                     peak_assignment='nearest_mz')
-    assert spec.annotation[0] == spectrum.PeptideFragmentAnnotation(
-        1, fragment_mz[0], 'b', 1)
+    assert spec.annotation[0] == spectrum.FragmentAnnotation(
+        'b1', charge=1, calc_mz=fragment_mz[0])
     assert spec.annotation[1] is None
 
 
@@ -703,8 +806,41 @@ def test_annotate_peptide_fragments_most_intense():
     spec.annotate_peptide_fragments(fragment_tol_mass, fragment_tol_mode,
                                     peak_assignment='most_intense')
     assert spec.annotation[0] is None
-    assert spec.annotation[1] == spectrum.PeptideFragmentAnnotation(
-        1, fragment_mz[0], 'b', 1)
+    assert spec.annotation[1] == spectrum.FragmentAnnotation(
+        'b1', charge=1, calc_mz=fragment_mz[0])
+
+
+def test_annotate_peptide_fragments_neutral_loss():
+    fragment_tol_mass, fragment_tol_mode = 0.02, 'Da'
+    neutral_loss = 'H2O', 18.010565    # water
+    n_peaks = 150
+    peptides = ['SYELPDGQVITIGNER', 'MFLSFPTTK', 'DLYANTVLSGGTTMYPGIADR',
+                'YLYEIAR', 'VAPEEHPVLLTEAPLNPK']
+    for charge, peptide in enumerate(peptides, 2):
+        fragment_mz = np.asarray([
+            fragment.calc_mz for fragment in
+            spectrum._get_theoretical_peptide_fragments(
+                peptide,
+                neutral_losses={None: 0, neutral_loss[0]: -neutral_loss[1]})])
+        fragment_mz += np.random.uniform(
+            -0.9 * fragment_tol_mass, 0.9 * fragment_tol_mass,
+            len(fragment_mz))
+        mz = np.random.uniform(100, 1400, n_peaks)
+        mz[: len(fragment_mz)] = fragment_mz
+        intensity = np.random.lognormal(0, 1, n_peaks)
+        spec = spectrum.MsmsSpectrum(
+            'test_spectrum', mass.calculate_mass(sequence=peptide,
+                                                 charge=charge),
+            charge, mz, intensity, peptide=peptide)
+        spec.annotate_peptide_fragments(
+            fragment_tol_mass, fragment_tol_mode,
+            neutral_losses={neutral_loss[0]: -neutral_loss[1]})
+        n_fragments = len(fragment_mz) - (
+                len(fragment_mz) - (np.partition(
+                    np.abs(fragment_mz.reshape(-1, 1) -
+                           fragment_mz.reshape(1, -1)), 1, axis=1)[:, 1]
+                                >= fragment_tol_mass).sum()) // 2
+        assert np.count_nonzero(spec.annotation) >= n_fragments
 
 
 def test_annotate_molecule_fragments():
@@ -746,8 +882,8 @@ def test_annotate_molecule_fragments_nearest_mz():
     spec.annotate_molecule_fragment('CCCCCCCC', fragment_mz, charge,
                                     fragment_tol_mass, fragment_tol_mode,
                                     peak_assignment='nearest_mz')
-    assert spec.annotation[0] == spectrum.MoleculeFragmentAnnotation(
-        charge, fragment_mz, 'CCCCCCCC')
+    assert spec.annotation[0] == spectrum.FragmentAnnotation(
+        'f{CCCCCCCC}', charge=charge, calc_mz=fragment_mz)
     assert spec.annotation[1] is None
     assert spec.annotation[2] is None
 
@@ -763,8 +899,8 @@ def test_annotate_molecule_fragments_most_intense():
                                     fragment_tol_mass, fragment_tol_mode,
                                     peak_assignment='most_intense')
     assert spec.annotation[0] is None
-    assert spec.annotation[1] == spectrum.MoleculeFragmentAnnotation(
-        charge, fragment_mz, 'CCCCCCCC')
+    assert spec.annotation[1] == spectrum.FragmentAnnotation(
+        'f{CCCCCCCC}', charge=charge, calc_mz=fragment_mz)
     assert spec.annotation[2] is None
 
 
@@ -777,26 +913,11 @@ def test_annotate_mz_fragments():
     fragment_tol_mode = 'Da'
     num_annotation = 4
     for fragment_mz in np.random.choice(spec.mz, num_annotation, False):
-        spec.annotate_mz_fragment(fragment_mz, 1, fragment_tol_mass,
+        spec.annotate_mz_fragment(fragment_mz, fragment_tol_mass,
                                   fragment_tol_mode)
     assert np.count_nonzero(spec.annotation) == num_annotation
 
 
-def test_annotate_mz_fragments_text():
-    num_peaks = 150
-    mz = np.random.uniform(100, 1400, num_peaks)
-    intensity = np.random.lognormal(0, 1, num_peaks)
-    spec = spectrum.MsmsSpectrum('test_spectrum', 500, 1, mz, intensity)
-    fragment_tol_mass = 0.02
-    fragment_tol_mode = 'Da'
-    annotation = ['one', 'two', 'three', 'four']
-    for a, fragment_mz in zip(annotation, np.random.choice(
-            spec.mz, len(annotation), False)):
-        spec.annotate_mz_fragment(fragment_mz, 1, fragment_tol_mass,
-                                  fragment_tol_mode, a)
-    assert np.count_nonzero(spec.annotation) == len(annotation)
-
-
 def test_annotate_mz_fragments_invalid_mz():
     num_peaks = 150
     mz = np.random.uniform(100, 1400, num_peaks)
@@ -805,8 +926,7 @@ def test_annotate_mz_fragments_invalid_mz():
     fragment_tol_mass = 0.02
     fragment_tol_mode = 'Da'
     with pytest.raises(ValueError):
-        spec.annotate_mz_fragment(1600, 1, fragment_tol_mass,
-                                  fragment_tol_mode)
+        spec.annotate_mz_fragment(1600, fragment_tol_mass, fragment_tol_mode)
 
 
 def test_annotate_mz_fragments_nearest_mz():
@@ -815,11 +935,10 @@ def test_annotate_mz_fragments_nearest_mz():
     mz, intensity = np.asarray([200, 200.5, 201]), np.asarray([10, 20, 30])
     spec = spectrum.MsmsSpectrum('test_spectrum', 100, 1, mz, intensity)
     fragment_mz = 200.15
-    charge = 1
-    spec.annotate_mz_fragment(fragment_mz, charge, fragment_tol_mass,
-                              fragment_tol_mode, 'nearest_mz', 'hello')
+    spec.annotate_mz_fragment(fragment_mz, fragment_tol_mass,
+                              fragment_tol_mode, 'nearest_mz')
     assert spec.annotation[0] == spectrum.FragmentAnnotation(
-        charge, fragment_mz, 'hello')
+        '?', calc_mz=fragment_mz)
     assert spec.annotation[1] is None
     assert spec.annotation[2] is None
 
@@ -830,10 +949,9 @@ def test_annotate_mz_fragments_most_intense():
     mz, intensity = np.asarray([200, 200.5, 201.5]), np.asarray([10, 20, 30])
     spec = spectrum.MsmsSpectrum('test_spectrum', 100, 1, mz, intensity)
     fragment_mz = 200.15
-    charge = 1
-    spec.annotate_mz_fragment(fragment_mz, charge, fragment_tol_mass,
-                              fragment_tol_mode, 'most_intense', 'hello')
+    spec.annotate_mz_fragment(fragment_mz, fragment_tol_mass,
+                              fragment_tol_mode, 'most_intense')
     assert spec.annotation[0] is None
     assert spec.annotation[1] == spectrum.FragmentAnnotation(
-        charge, fragment_mz, 'hello')
+        '?', calc_mz=fragment_mz)
     assert spec.annotation[2] is None