1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
use std::sync::LazyLock;
use crate::{
fragment::FragmentKind,
glycan::{BaseSugar, GlycanSubstituent, MonoSaccharide},
model::{
ChargePoint, ChargeRange, FragmentationModel, GlycanModel, Location, PrimaryIonSeries,
SatelliteIonSeries, SatelliteLocation,
},
AminoAcid, NeutralLoss,
};
use super::GlycanPeptideFragment;
static MODEL_ALL: LazyLock<FragmentationModel> = LazyLock::new(|| FragmentationModel {
a: PrimaryIonSeries::default()
.neutral_losses(vec![NeutralLoss::Loss(molecular_formula!(H 2 O 1))]),
b: PrimaryIonSeries::default()
.neutral_losses(vec![NeutralLoss::Loss(molecular_formula!(H 2 O 1))]),
c: PrimaryIonSeries::default()
.neutral_losses(vec![NeutralLoss::Loss(molecular_formula!(H 2 O 1))]),
d: SatelliteIonSeries::base()
.neutral_losses(vec![NeutralLoss::Loss(molecular_formula!(H 2 O 1))]),
v: SatelliteIonSeries::base()
.neutral_losses(vec![NeutralLoss::Loss(molecular_formula!(H 2 O 1))]),
w: SatelliteIonSeries::base()
.neutral_losses(vec![NeutralLoss::Loss(molecular_formula!(H 2 O 1))]),
x: PrimaryIonSeries::default()
.neutral_losses(vec![NeutralLoss::Loss(molecular_formula!(H 2 O 1))]),
y: PrimaryIonSeries::default()
.neutral_losses(vec![NeutralLoss::Loss(molecular_formula!(H 2 O 1))]),
z: PrimaryIonSeries::default()
.neutral_losses(vec![NeutralLoss::Loss(molecular_formula!(H 2 O 1))]),
precursor: (
vec![NeutralLoss::Loss(molecular_formula!(H 2 O 1))],
Vec::new(),
(1, None),
ChargeRange::PRECURSOR,
),
immonium: Some((ChargeRange::ONE, immonium_losses().clone())),
modification_specific_neutral_losses: true,
modification_specific_diagnostic_ions: Some(ChargeRange::ONE),
glycan: GlycanModel::default_allow()
.neutral_losses(vec![NeutralLoss::Loss(molecular_formula!(H 2 O 1))]),
allow_cross_link_cleavage: true,
});
static MODEL_NONE: LazyLock<FragmentationModel> = LazyLock::new(|| FragmentationModel {
a: PrimaryIonSeries::none(),
b: PrimaryIonSeries::none(),
c: PrimaryIonSeries::none(),
d: SatelliteIonSeries::default(),
v: SatelliteIonSeries::default(),
w: SatelliteIonSeries::default(),
x: PrimaryIonSeries::none(),
y: PrimaryIonSeries::none(),
z: PrimaryIonSeries::none(),
precursor: (Vec::new(), Vec::new(), (0, None), ChargeRange::PRECURSOR),
immonium: None,
modification_specific_neutral_losses: false,
modification_specific_diagnostic_ions: None,
glycan: GlycanModel::DISALLOW,
allow_cross_link_cleavage: false,
});
static MODEL_UVPD: LazyLock<FragmentationModel> = LazyLock::new(|| FragmentationModel {
a: PrimaryIonSeries::default().variants(vec![0, 1, 2]),
b: PrimaryIonSeries::default().variants(vec![0, 2]),
c: PrimaryIonSeries::default(),
d: SatelliteIonSeries::base(),
v: SatelliteIonSeries::base(),
w: SatelliteIonSeries::base(),
x: PrimaryIonSeries::default().variants(vec![-1, 0, 1, 2]),
y: PrimaryIonSeries::default().variants(vec![-2, -1, 0]),
z: PrimaryIonSeries::default(),
precursor: (
vec![NeutralLoss::Loss(molecular_formula!(H 2 O 1))],
Vec::new(),
(0, None),
ChargeRange::PRECURSOR,
),
immonium: Some((ChargeRange::ONE, immonium_losses().clone())),
modification_specific_neutral_losses: true,
modification_specific_diagnostic_ions: Some(ChargeRange::ONE),
glycan: GlycanModel::DISALLOW,
allow_cross_link_cleavage: false,
});
static MODEL_ETHCD: LazyLock<FragmentationModel> = LazyLock::new(|| FragmentationModel {
a: PrimaryIonSeries::default().location(Location::TakeN { skip: 0, take: 1 }),
b: PrimaryIonSeries::default()
.neutral_losses(vec![NeutralLoss::Loss(molecular_formula!(H 2 O 1))]),
c: PrimaryIonSeries::default()
.neutral_losses(vec![NeutralLoss::Loss(molecular_formula!(H 2 O 1))])
.variants(vec![0, 1]),
d: SatelliteIonSeries::base(),
v: SatelliteIonSeries::default(),
w: SatelliteIonSeries::base()
.neutral_losses(vec![NeutralLoss::Loss(molecular_formula!(H 2 O 1))]),
x: PrimaryIonSeries::none(),
y: PrimaryIonSeries::default()
.neutral_losses(vec![NeutralLoss::Loss(molecular_formula!(H 2 O 1))]),
z: PrimaryIonSeries::default()
.neutral_losses(vec![NeutralLoss::Loss(molecular_formula!(H 2 O 1))])
.variants(vec![0, 1]),
precursor: (
vec![NeutralLoss::Loss(molecular_formula!(H 2 O 1))],
Vec::new(),
(0, None),
ChargeRange::ONE_TO_PRECURSOR,
),
immonium: None,
modification_specific_neutral_losses: true,
modification_specific_diagnostic_ions: Some(ChargeRange::ONE),
glycan: GlycanModel::default_allow()
.neutral_losses(vec![NeutralLoss::Loss(molecular_formula!(H 2 O 1))])
.default_peptide_fragment(GlycanPeptideFragment::FULL)
.peptide_fragment_rules(vec![
(
vec![AminoAcid::Asparagine, AminoAcid::Tryptophan],
vec![FragmentKind::c, FragmentKind::z, FragmentKind::w],
GlycanPeptideFragment::FULL,
),
(
vec![AminoAcid::Asparagine, AminoAcid::Tryptophan],
vec![FragmentKind::b, FragmentKind::y, FragmentKind::v],
GlycanPeptideFragment::CORE,
),
(
vec![AminoAcid::Serine, AminoAcid::Threonine],
vec![FragmentKind::c, FragmentKind::z, FragmentKind::w],
GlycanPeptideFragment::FULL,
),
(
vec![AminoAcid::Serine, AminoAcid::Threonine],
vec![FragmentKind::b, FragmentKind::y, FragmentKind::v],
GlycanPeptideFragment::FREE,
),
]),
allow_cross_link_cleavage: true,
});
static MODEL_EAD: LazyLock<FragmentationModel> = LazyLock::new(|| FragmentationModel {
a: PrimaryIonSeries::default()
.neutral_losses(vec![NeutralLoss::Loss(molecular_formula!(H 2 O 1))]),
b: PrimaryIonSeries::default()
.neutral_losses(vec![NeutralLoss::Loss(molecular_formula!(H 2 O 1))]),
c: PrimaryIonSeries::default()
.neutral_losses(vec![NeutralLoss::Loss(molecular_formula!(H 2 O 1))]),
d: SatelliteIonSeries::base()
.neutral_losses(vec![NeutralLoss::Loss(molecular_formula!(H 2 O 1))]),
v: SatelliteIonSeries::base()
.neutral_losses(vec![NeutralLoss::Loss(molecular_formula!(H 2 O 1))]),
w: SatelliteIonSeries::base()
.neutral_losses(vec![NeutralLoss::Loss(molecular_formula!(H 2 O 1))]),
x: PrimaryIonSeries::default()
.neutral_losses(vec![NeutralLoss::Loss(molecular_formula!(H 2 O 1))]),
y: PrimaryIonSeries::default()
.neutral_losses(vec![NeutralLoss::Loss(molecular_formula!(H 2 O 1))]),
z: PrimaryIonSeries::default()
.neutral_losses(vec![NeutralLoss::Loss(molecular_formula!(H 2 O 1))]),
precursor: (
vec![NeutralLoss::Loss(molecular_formula!(H 2 O 1))],
Vec::new(),
(0, None),
ChargeRange::ONE_TO_PRECURSOR,
),
immonium: Some((ChargeRange::ONE, immonium_losses().clone())),
modification_specific_neutral_losses: true,
modification_specific_diagnostic_ions: Some(ChargeRange::ONE),
glycan: GlycanModel::default_allow()
.neutral_losses(vec![NeutralLoss::Loss(molecular_formula!(H 2 O 1))]),
allow_cross_link_cleavage: true,
});
static MODEL_EACID: LazyLock<FragmentationModel> = LazyLock::new(|| FragmentationModel {
a: PrimaryIonSeries::default()
.neutral_losses(vec![NeutralLoss::Loss(molecular_formula!(H 2 O 1))]),
b: PrimaryIonSeries::default()
.neutral_losses(vec![NeutralLoss::Loss(molecular_formula!(H 2 O 1))]),
c: PrimaryIonSeries::default()
.neutral_losses(vec![NeutralLoss::Loss(molecular_formula!(H 2 O 1))]),
d: SatelliteIonSeries::base()
.neutral_losses(vec![NeutralLoss::Loss(molecular_formula!(H 2 O 1))]),
v: SatelliteIonSeries::base()
.neutral_losses(vec![NeutralLoss::Loss(molecular_formula!(H 2 O 1))]),
w: SatelliteIonSeries::base()
.neutral_losses(vec![NeutralLoss::Loss(molecular_formula!(H 2 O 1))]),
x: PrimaryIonSeries::default()
.neutral_losses(vec![NeutralLoss::Loss(molecular_formula!(H 2 O 1))]),
y: PrimaryIonSeries::default()
.neutral_losses(vec![NeutralLoss::Loss(molecular_formula!(H 2 O 1))]),
z: PrimaryIonSeries::default()
.neutral_losses(vec![NeutralLoss::Loss(molecular_formula!(H 2 O 1))]),
precursor: (
vec![NeutralLoss::Loss(molecular_formula!(H 2 O 1))],
Vec::new(),
(0, None),
ChargeRange::ONE_TO_PRECURSOR,
),
immonium: None,
modification_specific_neutral_losses: true,
modification_specific_diagnostic_ions: Some(ChargeRange::ONE),
glycan: GlycanModel::default_allow()
.neutral_losses(vec![NeutralLoss::Loss(molecular_formula!(H 2 O 1))]),
allow_cross_link_cleavage: true,
});
static MODEL_CID_HCD: LazyLock<FragmentationModel> = LazyLock::new(|| FragmentationModel {
a: PrimaryIonSeries::default()
.location(Location::TakeN { skip: 0, take: 1 })
.neutral_losses(vec![NeutralLoss::Loss(molecular_formula!(H 2 O 1))]),
b: PrimaryIonSeries::default()
.neutral_losses(vec![NeutralLoss::Loss(molecular_formula!(H 2 O 1))]),
c: PrimaryIonSeries::none(),
d: SatelliteIonSeries::base()
.neutral_losses(vec![NeutralLoss::Loss(molecular_formula!(H 2 O 1))]),
v: SatelliteIonSeries::default(),
w: SatelliteIonSeries::default(),
x: PrimaryIonSeries::none(),
y: PrimaryIonSeries::default()
.neutral_losses(vec![NeutralLoss::Loss(molecular_formula!(H 2 O 1))]),
z: PrimaryIonSeries::none(),
precursor: (
vec![NeutralLoss::Loss(molecular_formula!(H 2 O 1))],
Vec::new(),
(0, None),
ChargeRange::PRECURSOR,
),
immonium: None,
modification_specific_neutral_losses: true,
modification_specific_diagnostic_ions: Some(ChargeRange::ONE),
glycan: GlycanModel::default_allow()
.default_peptide_fragment(GlycanPeptideFragment::CORE)
.peptide_fragment_rules(vec![
(
vec![AminoAcid::Asparagine, AminoAcid::Tryptophan],
Vec::new(),
GlycanPeptideFragment::CORE,
),
(
vec![AminoAcid::Serine, AminoAcid::Threonine],
Vec::new(),
GlycanPeptideFragment::FREE,
),
]),
allow_cross_link_cleavage: true,
});
static MODEL_ETD: LazyLock<FragmentationModel> = LazyLock::new(|| FragmentationModel {
a: PrimaryIonSeries::none(),
b: PrimaryIonSeries::none(),
c: PrimaryIonSeries::default()
.neutral_losses(vec![NeutralLoss::Loss(molecular_formula!(H 2 O 1))])
.variants(vec![-1, 0, 2]),
d: SatelliteIonSeries::default(),
v: SatelliteIonSeries::base(),
w: SatelliteIonSeries::default()
.location(SatelliteLocation {
rules: vec![
(vec![AminoAcid::Methionine], 5),
(vec![AminoAcid::Leucine, AminoAcid::GlutamicAcid], 2),
(vec![AminoAcid::Isoleucine, AminoAcid::AsparticAcid], 1),
(
vec![
AminoAcid::Valine,
AminoAcid::Asparagine,
AminoAcid::Threonine,
AminoAcid::Serine,
AminoAcid::Tryptophan,
AminoAcid::Histidine,
AminoAcid::Phenylalanine,
AminoAcid::Tyrosine,
],
0,
),
],
base: None,
})
.variants(vec![-1, 0, 1]),
x: PrimaryIonSeries::none(),
y: PrimaryIonSeries::default()
.neutral_losses(vec![NeutralLoss::Loss(molecular_formula!(H 2 O 1))]),
z: PrimaryIonSeries::default()
.neutral_losses(vec![NeutralLoss::Loss(molecular_formula!(H 2 O 1))])
.variants(vec![-1, 0, 1, 2]),
precursor: (
vec![
NeutralLoss::Loss(molecular_formula!(H 2 O 1)),
NeutralLoss::Loss(molecular_formula!(H 1 O 1)),
NeutralLoss::Loss(molecular_formula!(H 3 N 1)),
],
vec![
(
vec![AminoAcid::AsparticAcid],
vec![NeutralLoss::Loss(molecular_formula!(C 1 H 1 O 2))],
),
(
vec![AminoAcid::GlutamicAcid],
vec![NeutralLoss::Loss(molecular_formula!(C 2 H 3 O 2))],
),
],
(2, None),
ChargeRange {
start: ChargePoint::Relative(-2),
end: ChargePoint::Relative(0),
},
),
immonium: None,
modification_specific_neutral_losses: true,
modification_specific_diagnostic_ions: Some(ChargeRange::ONE),
glycan: GlycanModel::default_allow().default_peptide_fragment(GlycanPeptideFragment::FREE),
allow_cross_link_cleavage: true,
});
static MODEL_TD_ETD: LazyLock<FragmentationModel> = LazyLock::new(|| FragmentationModel {
a: PrimaryIonSeries::none(),
b: PrimaryIonSeries::none(),
c: PrimaryIonSeries::default()
.neutral_losses(vec![
NeutralLoss::Loss(molecular_formula!(H 2 O 1)),
NeutralLoss::Loss(molecular_formula!(H 3 N 1)),
])
.variants(vec![0, 1, 2]),
d: SatelliteIonSeries::default(),
v: SatelliteIonSeries::default(),
w: SatelliteIonSeries::default(),
x: PrimaryIonSeries::none(),
y: PrimaryIonSeries::none(),
z: PrimaryIonSeries::default()
.neutral_losses(vec![
NeutralLoss::Loss(molecular_formula!(H 2 O 1)),
NeutralLoss::Loss(molecular_formula!(H 3 N 1)),
])
.variants(vec![-1, 0, 1, 2]),
precursor: (
vec![
NeutralLoss::Loss(molecular_formula!(H 2 O 1)),
NeutralLoss::Loss(molecular_formula!(H 1 O 1)),
NeutralLoss::Loss(molecular_formula!(H 3 N 1)),
NeutralLoss::Gain(molecular_formula!(H 1)),
NeutralLoss::Gain(molecular_formula!(H 2)),
NeutralLoss::Gain(molecular_formula!(H 3)),
],
vec![
(
vec![AminoAcid::AsparticAcid],
vec![NeutralLoss::Loss(molecular_formula!(C 1 H 1 O 2))],
),
(
vec![AminoAcid::GlutamicAcid],
vec![NeutralLoss::Loss(molecular_formula!(C 2 H 3 O 2))],
),
],
(0, None),
ChargeRange::PRECURSOR,
),
immonium: None,
modification_specific_neutral_losses: true,
modification_specific_diagnostic_ions: Some(ChargeRange::ONE),
glycan: GlycanModel::DISALLOW,
allow_cross_link_cleavage: true,
});
impl FragmentationModel {
/// Generate all possible fragments
pub fn all() -> &'static Self {
LazyLock::force(&MODEL_ALL)
}
/// Generate no fragments (except for precursor)
pub fn none() -> &'static Self {
LazyLock::force(&MODEL_NONE)
}
/// UVPD
/// 10.1021/acs.chemrev.9b00440 and 10.1021/jacs.6b05147
pub fn uvpd() -> &'static Self {
LazyLock::force(&MODEL_UVPD)
}
/// electron-transfer/higher-energy collisional dissociation
pub fn ethcd() -> &'static Self {
LazyLock::force(&MODEL_ETHCD)
}
/// EAD
pub fn ead() -> &'static Self {
LazyLock::force(&MODEL_EAD)
}
/// EAciD
pub fn eacid() -> &'static Self {
LazyLock::force(&MODEL_EACID)
}
/// CID Hcd
pub fn cid_hcd() -> &'static Self {
LazyLock::force(&MODEL_CID_HCD)
}
/// ETD 10.1002/jms.3919
pub fn etd() -> &'static Self {
LazyLock::force(&MODEL_ETD)
}
/// Top Down ETD
pub fn td_etd() -> &'static Self {
LazyLock::force(&MODEL_TD_ETD)
}
}
/// All losses from the base immonium ions. Compiled from the sources below.
///
/// | AA | [Wikipedia](https://upload.wikimedia.org/wikipedia/commons/thumb/0/01/Amino_acid_fragment_ions.png/400px-Amino_acid_fragment_ions.png) | 0.1016/1044-0305(93)87006-X | [ionsource](https://www.ionsource.com/Card/immon/immon.htm) | [10.1002/chin.199624319](http://dx.doi.org/10.1002/chin.199624319) | [Prospector (MS-Comp)](https://prospector.ucsf.edu/prospector/cgi-bin/msform.cgi?form=mscomp) | [10.1186/1477-5956-9-2](http://dx.doi.org/10.1186/1477-5956-9-2) | 10.1016/j.ymeth.2004.08.013 | 10.1385/1597452750 (table 5) | 10.1021/ac902712f | [Prospector (MS-Product)](https://prospector.ucsf.edu/prospector/cgi-bin/msform.cgi?form=msproduct) | [ThermoFisher](https://tools.thermofisher.com/content/sfs/brochures/cms_040030.pdf) | 10.1074/mcp.O113.035915 | 10.1074/mcp.O113.035915 | 10.1021/ac902712f | [Prospector (MS-Product)](https://prospector.ucsf.edu/prospector/cgi-bin/msform.cgi?form=msproduct) | | 10.1385/1597452750 (table 5) | Sources | Best mass | Best formula | Loss | Loss formula | Interpreted loss | Interpreted formula | Final |
/// |-------|---------------------------------------------------------------------------------------------------------------------------|-----------------------------|------------------------------------------------|------------------------------------------|-----------------------------------------------------------------------|-----------------------------------------|-----------------------------|------------------------------|-------------------|--------------------------------------------------------------------------|---------------------------------------------------------------------|-------------------------|-------------------------|-------------------|--------------------------------------------------------------------------|------------------------------|---------|----------:|--------------|----------|--------------|------------------|-------------------------|------------|
/// | A | 44 | 44 | | 44 | | 44 | | 44.05 | | | 44.0500 | | | | | | 6 | 44.0500 | | | | | | |
/// | R | 129 | 129 | | 129 | | 129 | | 129.11 | | | 129.1140 | 129.1135 | C5H13N4+ | | | | 8 | 129.1138 | C5H13N4+ | | | | | |
/// | | | | 185 | | 185 | | | | | | | | | | | | 2 | 185 | | -55.8862 | | C-2O-2 | | C-2O-2 |
/// | | | | | | | | | 115.09 | | | | | | | | | 1 | 115.09 | | 14.0238 | | C1H2 | | C1H2 |
/// | | 112 | 112 | 112 | 112 | 112 | 112 | 112.09 | 112.09 | | 112.0869 | 112.0875 | | | | C5H10N3+ | C5H10N3+ | 12 | 112.0872 | C5H10N3+ | 17.0266 | H3N1 | | | H3N1 |
/// | | 100 | 100 | 100 | 100 | 100 | 100 | 100.09 | | | 100.0869 | 100.0875 | | | | C4H10N3+ | | 10 | 100.0872 | C4H10N3+ | 29.0266 | C1H3N1 | | | C1H3N1 |
/// | | 87 | 87 | 87 | 87 | 87 | 87 | 87.09 | 87.09 | 87.0922 | 87.0917 | | | | C4H11N2+ | C4H11N2+ | | 12 | 87.0920 | C4H11N2+ | 42.0218 | C2H2N2 | | | C2H2N2 |
/// | | 73 | 73 | 73 | | 73 | 72 | 73.00 | | 73.0640 | | | | | C2H7N3+ | | | 8 | 73.0640 | C2H7N3+ | 56.0498 | C3H6N1 | | | C3H6N1 |
/// | | 70 | 70 | 70 | 70 | 70 | 70 | 70.07 | 70.07 | 70.0657 | 70.0651 | 70.0657 | | | C4H8N1+ | C4H8N1+ | | 13 | 70.0655 | C4H8N1+ | 59.0483 | C1H5N3 | | | C1H5N3 |
/// | | | | | | | | | 60.06 | | | | | | | | | 1 | 60.06 | | 69.0538 | | C3H4N2O-1 | C2H6N1O1+ | C3H4N2O-1 |
/// | | | 59 | | | | 59 | | | 59.0483 | | | | | CH5N3+ | | | 4 | 59.0483 | CH5N3+ | 70.0655 | C4H8N1 | | | C4H8N1 |
/// | | | | | | | | | | 43.0296 | | | | | C1H3N2+ | | | 2 | 43.0296 | C1H3N2+ | 86.0842 | C4H10N2 | | | C4H10N2 |
/// | | 29 | | | | | | | | | | | | | | | | 1 | 29 | | 100.1138 | | | H1N2/C1H1O1/C1H3N1/C2H5 | |
/// | N | 87 | 87 | 87 | 87 | 87 | 87 | 87.09 | 87.06 | | 87.0553 | 87.0558 | | | | C3H7N2O1+ | | 11 | 87.0556 | C3H7N2O1+ | | | | | |
/// | | 70 | 70 | 70 | 70 | | 70 | | 70.03 | | | 70.0293 | | | | | C3H4N1O1+ | 8 | 70.0293 | C3H4N1O1+ | 17.0263 | H3N1 | | | H3N1 |
/// | D | 88 | 88 | 88 | 88 | 88 | 88 | 88.04 | 88.04 | 88.0399 | 88.0393 | 88.0399 | | | C3H6N1O2+ | C3H6N1O2+ | | 13 | 88.0397 | C3H6N1O2+ | | | | | |
/// | | 70 | | 70 | 70 | | 70 | | 70.03 | | | 70.0293 | | | | | C3H4N1O1+ | 7 | 70.0293 | C3H4N1O1+ | 18.0104 | H2O1 | | | H2O1 |
/// | C | 76 | | | 76 | | 76 | | | | | 76.0221 | | | | | | 4 | 76.0221 | | | | | | |
/// | E | 102 | 102 | | 102 | 102 | 102 | 102.06 | 102.05 | 102.0555 | 102.0550 | 102.0555 | 102.0550 | C4H8N1O2+ | C4H8N1O2+ | C4H8N1O2+ | | 14 | 102.0553 | C4H8N1O2+ | | | | | |
/// | | | | | 91 | | | | | | | | | | | | | 1 | 91 | | 11.0553 | | | | |
/// | | | | | 84 | | | | 84.04 | | | 84.0449 | | | | | C4H6N1O1+ | 4 | 84.0449 | C4H6N1O1+ | 18.0104 | H2O1 | | | H2O1 |
/// | Q | 101 | 101 | 101 | 101 | 101 | 101 | 101.11 | 101.11 | | 101.0709 | 101.0715 | 101.0709 | C4H9N2O1+ | | C4H9N2O1+ | | 13 | 101.0711 | C4H9N2O1+ | | | | | |
/// | | 129 | 129 | 129 | 129 | 129 | 129 | 129.1 | 129.11 | | 129.0659 | 129.1028 | | | | C5H9N2O2+ | | 11 | 129.0844 | C5H9N2O2+ | -28.0133 | C-1O-1 | | | C-1O-1 |
/// | | 84 | 84 | 84 | 84 | 84 | 84 | 84.08 | 84.04 | 84.0813 | 84.0444 | 84.0449 | | | C5H10N1+ | C4H6N1O1+ | C4H6N1O1+ | 14 | 84.0569 | C5H10N1+ | 17.0142 | H3N1 | | | H3N1 |
/// | | 56 | | | 56 | | 56 | | 56.05 | | | 56.0500 | | | | | | 5 | 56.0500 | | 45.0211 | | C1H3N1O1 | | C1H3N1O1 |
/// | G | 30 | 30 | | 30 | | 30 | | 30.03 | 30.0344 | | 30.0344 | | | C1H4N1+ | | | 8 | 30.0344 | C1H4N1+ | | | | | |
/// | H | 110 | 110 | 110 | 110 | 110 | 110 | 110.07 | 110.07 | 110.0718 | 110.0713 | 110.0718 | 110.0713 | C5H8N3+ | C5H8N3+ | C5H8N3+ | | 15 | 110.0716 | C5H8N3+ | | | | | |
/// | | 166 | 166 | | | | 166 | | | | | | | | | | | 3 | 166 | | -55.9284 | | C-2O-2 | | C-2O-2 |
/// | | 138 | 138 | | | | 138 | 138.07 | | | 138.0662 | | | | | C6H8N3O1+ | | 6 | 138.0662 | C6H8N3O1+ | -27.9946 | C-1O-1 | | | C-1O-1 |
/// | | 123 | 123 | | | | 123 | | | | | | | | | | | 3 | 123 | | -12.9284 | | H3O-1 | | H3O-1 |
/// | | 121 | 121 | | | | 121 | | | | | | | | | | | 3 | 121 | | -10.9284 | | H5O-1 | | H5O-1 |
/// | | 82 | 82 | | | | 82 | | | 82.0531 | | | | | C4H6N2+ | | | 5 | 82.0531 | C4H6N2+ | 28.0185 | C1H2N1 | | | C1H2N1 |
/// | I/L/J | 86 | 86 | 86 | 86 | 86 | 86 | 86.1 | 86.10 | 86.0970 | 86.0964 | 86.0970 | | | C5H12N+ | C5H12N1+ | | 13 | 86.0968 | C5H12N+ | | | | | |
/// | | 72 | 72 | | 72 | | 72 | | | | | 72.0449 | | | | | | 5 | 72.0449 | | 14.0519 | | C1H2 | | C1H2 |
/// | | 44 | | | 44 | | 44 | | | | | 44.0500 | | | | | | 4 | 44.0500 | | 42.0468 | | C3H6 | | C3H6 |
/// | K | 101 | 101 | 101 | 101 | 101 | 101 | 101.11 | 101.11 | | 101.1073 | 101.1079 | | | | C5H13N2+ | | 11 | 101.1076 | C5H13N2+ | | | | | |
/// | | 129 | 129 | 129 | 129 | 129 | 129 | 129.1 | 129.11 | | 129.1022 | | 129.1022 | C6H13N2O1+ | | C6H13N2O1+ | | 12 | 129.1022 | C6H13N2O1+ | -27.9946 | C-1O-1 | | | C-1O-1 |
/// | | | | | | | | | | | 126.0913 | | | | | C7H12N1O1+ | | 2 | 126.0913 | C7H12N1O1+ | -24.9837 | C-2H1N1O-1 | | | C-2H1N1O-1 |
/// | | 112 | 112 | | 112 | | 112 | | | | | | | | | | | 4 | 112 | | -10.8924 | | H5O-1 | | H5O-1 |
/// | | 84 | 84 | 84 | 84 | 84 | 84 | 84.08 | 84.08 | 84.0813 | 84.0808 | 84.0813 | | | C5H10N1+ | C5H10N1+ | C5H10N1+ | 14 | 84.0811 | C5H10N1+ | 17.0265 | H3N1 | | | H3N1 |
/// | | 70 | 70 | | | | 70 | | | | | | | | | | | 3 | 70 | | 31.1076 | | C1H5N1 | | C1H5N1 |
/// | | | | | | | | | 56.05 | | | 56.0500 | | | | | | 2 | 56.0500 | | 45.0576 | | C2H7N1 | | C2H7N1 |
/// | M | 104 | 104 | 104 | 104 | 104 | 104 | 104.05 | 104.06 | | 104.0528 | 104.0534 | | | | C4H10N1S1+ | | 11 | 104.0531 | C4H10N1S1+ | | | | | |
/// | | | | | | | 70 | | | | | | | | | | | | 70 | | 34.0531 | | H2S1 | | H2S1 |
/// | | 61 | 61 | | | | 61 | | | 61.0112 | | | | | C2H5S1+ | | | 5 | 61.0112 | C2H5S1+ | 43.0419 | C2H3N1 | | | C2H3N1 |
/// | | | | | | | | | | | | | | | | | C3H6N1+ | 1 | ?? | C3H6N1+ | ?? | C1H4S1 | | | C1H4S1 |
/// | F | 120 | 120 | 120 | 120 | 120 | 120 | 120.08 | 120.08 | 120.0813 | 120.0808 | 120.0813 | 120.0808 | C8H10N+ | C8H10N1+ | C8H10N1+ | | 15 | 120.0811 | C8H10N+ | | | | | |
/// | | 91 | 91 | | 91 | | 91 | | | | | 91.0548 | | | | | | 5 | 91.0548 | | 29.0263 | | C1H3N1 | C7H7+ | C1H3N1 |
/// | P | 70 | 70 | 70 | 70 | 70 | 70 | 70.07 | 70.07 | 70.0657 | 70.0651 | 70.0657 | | | C4H8N1+ | C4H8N1+ | | 13 | 70.0655 | C4H8N1+ | | | | | |
/// | | | | 126 | | 126 | | 126.06 | | | 126.055 | | | | | C6H8N1O2+ | | 5 | 126.0550 | C6H8N1O2+ | -55.9895 | C-2O-2 | | | C-2O-2 |
/// | S | 60 | 60 | 60 | 60 | 60 | 60 | 60.04 | 60.04 | | 60.0444 | 60.0449 | | | | C2H6N1O1+ | | 11 | 60.0447 | C2H6N1O1+ | | | | | |
/// | | | | | | | | | | | | | | | | | C2H4N1+ | 1 | ?? | C2H4N1+ | ?? | H2O1 | | | H2O1 |
/// | T | 74 | 74 | 74 | 74 | 74 | 74 | | 74.06 | 74.0606 | 74.0600 | 74.0606 | | | C3H8N1O1+ | C3H8N1O1+ | | 12 | 74.0604 | C3H8N1O1+ | | | | | |
/// | | | | | | | | | | | | | | | | | C3H6N1O1+ | 1 | ?? | C3H6N1O1+ | ?? | H2N1 | | | H2N1 |
/// | W | 159 | 159 | 159 | 159 | 159 | 159 | 159.09 | 159.09 | | 159.0917 | 159.0922 | 159.0917 | C10H11N2+ | | C10H11N2+ | | 13 | 159.0919 | C10H11N2+ | | | | | |
/// | | | 171 | | | | 171 | | | | | | | | | | | 2 | 171 | | -11.9081 | | H4O-1 | | H4O-1 |
/// | | 170 | 170 | 170 | | 170 | 170 | | | | | | | | | | | 5 | 170 | | -10.9081 | | H5O-1 | | H5O-1 |
/// | | 132 | | | 132 | | 132 | | 132.08 | | | 132.0813 | | | | | | 5 | 132.0813 | | 27.0106 | | C1H1N1 | | C1H1N1 |
/// | | 130 | 130 | 130 | 130 | 130 | 130 | | 130.07 | | | 130.0657 | | | | | | 8 | 130.0657 | | 29.0262 | | C1H3N1 | | C1H3N1 |
/// | | 117 | 117 | 117 | 117 | 117 | 117 | | | | | 117.0578 | | | | | | 7 | 117.0578 | | 42.0341 | | C2H4N1 | | C2H4N1 |
/// | | 100 | | | | | | | | | | | | | | | | 1 | 100 | | 59.0919 | | C3H9N1/C2H7N2 | | |
/// | | | | | 77 | | 77 | | | | | 77.0391 | | | | | | 3 | 77.0391 | | 82.0528 | | C4H6N2 | C6H5 | C4H6N2 |
/// | | 11 | | | | | | | | | | | | | | | | 1 | 11 | | 148.0919 | | | | |
/// | Y | 136 | 136 | 136 | 136 | 136 | 136 | 136.08 | 136.08 | 136.0762 | 136.0757 | 136.0762 | 136.0757 | C8H10N1O1+ | C8H10N1O1+ | C8H10N1O1+ | | 15 | 136.0760 | C8H10N1O1+ | | | | | |
/// | | 107 | 107 | | 107 | | 107 | | | | | 107.0497 | | | | | | 5 | 107.0497 | | 29.0263 | | C1H3N1 | | C1H3N1 |
/// | | 91 | 91 | | 91 | | 91 | | | | | 91.0548 | | | | | | 5 | 91.0548 | | 45.0212 | | C1H3N1O1 | | C1H3N1O1 |
/// | | | | | | | | | | 55.0184 | | | | | C3H3O1+ | | | 2 | 55.0184 | C3H3O1+ | 81.0576 | C5H7N1 | | | C5H7N1 |
/// | V | 72 | 72 | 72 | 72 | 72 | 72 | 72.08 | 72.08 | 72.0813 | 72.0808 | 72.0813 | | | C4H10N1+ | C4H10N1+ | | 13 | 72.0811 | C4H10N1+ | | | | | |
/// | | 69 | | | 69 | | 69 | | | | | 69.0704 | | | | | | 4 | 69.0704 | | 3.0107 | | C1H1O-1 | | C1H1O-1 |
/// | | 55 | | | 55 | | 55 | | | | | 55.0548 | | | | | | 4 | 55.0548 | | 17.0263 | | H3N1 | | H3N1 |
/// | | 44 | | | | | | | | | | | | | | | | 1 | 44 | | 28.0811 | | C1H2N1 | | C1H2N1 |
/// | | | | | 41 | | 41 | | | | | 41.0391 | | | | | | 3 | 41.0391 | | 31.0420 | | C1H5N1 | | C1H5N1 |
static IMMONIUM_LOSSES: LazyLock<Vec<(Vec<AminoAcid>, Vec<NeutralLoss>)>> = LazyLock::new(||
// TODO: For B/Z there are common immonium ions, but the mass is the same (meaning the loss is different), find a way of representing that
vec![(
vec![AminoAcid::Arginine], vec![
NeutralLoss::Gain(molecular_formula!(C 2 O 2)),
NeutralLoss::Loss(molecular_formula!(C 1 H 2)),
NeutralLoss::Loss(molecular_formula!(H 3 N 1)),
NeutralLoss::Loss(molecular_formula!(C 1 H 3 N 1)),
NeutralLoss::Loss(molecular_formula!(C 2 H 2 N 2)),
NeutralLoss::Loss(molecular_formula!(C 3 H 6 N 2)),
NeutralLoss::Loss(molecular_formula!(C 1 H 5 N 3)),
NeutralLoss::Loss(molecular_formula!(C 3 H 4 N 2 O -1)),
NeutralLoss::Loss(molecular_formula!(C 4 H 8 N 1)),
NeutralLoss::Loss(molecular_formula!(C 4 H 10 N 2)),
]),
(vec![AminoAcid::Asparagine], vec![NeutralLoss::Loss(molecular_formula!(H 3 N 1))]),
(vec![AminoAcid::AsparticAcid, AminoAcid::GlutamicAcid, AminoAcid::Serine], vec![NeutralLoss::Loss(molecular_formula!(H 2 O 1))]),
(vec![AminoAcid::Glutamine], vec![
NeutralLoss::Gain(molecular_formula!(C 1 O 1)),
NeutralLoss::Loss(molecular_formula!(H 3 N 1)),
NeutralLoss::Loss(molecular_formula!(C 1 H 3 N 1 O 1)),
]),
(vec![AminoAcid::Histidine], vec![
NeutralLoss::Gain(molecular_formula!(C 2 O 2)),
NeutralLoss::Gain(molecular_formula!(C 1 O 1)),
NeutralLoss::Loss(molecular_formula!(H 3 O -1)),
NeutralLoss::Loss(molecular_formula!(H 5 O -1)),
NeutralLoss::Loss(molecular_formula!(C 1 H 2 N 1)),
]),
(vec![AminoAcid::Leucine, AminoAcid::Isoleucine, AminoAcid::AmbiguousLeucine], vec![
NeutralLoss::Loss(molecular_formula!(C 1 H 2)),
NeutralLoss::Loss(molecular_formula!(C 3 H 6)),
]),
(vec![AminoAcid::Lysine], vec![
NeutralLoss::Gain(molecular_formula!(C 1 O 1)),
NeutralLoss::Loss(molecular_formula!(C -2 H 1 N 1 O -1)),
NeutralLoss::Loss(molecular_formula!(H 5 O -1)),
NeutralLoss::Loss(molecular_formula!(H 3 N 1)),
NeutralLoss::Loss(molecular_formula!(C 1 H 5 N 1)),
NeutralLoss::Loss(molecular_formula!(C 2 H 7 N 1)),
]),
(vec![AminoAcid::Methionine], vec![
NeutralLoss::Loss(molecular_formula!(H 2 S 1)),
NeutralLoss::Loss(molecular_formula!(C 2 H 3 N 1)),
NeutralLoss::Loss(molecular_formula!(C 1 H 4 S 1)),
]),
(vec![AminoAcid::Phenylalanine], vec![NeutralLoss::Gain(molecular_formula!(C 2 O 2))]),
(vec![AminoAcid::Threonine], vec![NeutralLoss::Loss(molecular_formula!(H 2 N 1))]),
(vec![AminoAcid::Tryptophan], vec![
NeutralLoss::Loss(molecular_formula!(H 4 O -1)),
NeutralLoss::Loss(molecular_formula!(H 5 O -1)),
NeutralLoss::Loss(molecular_formula!(C 1 H 1 N 1)),
NeutralLoss::Loss(molecular_formula!(C 1 H 3 N 1)),
NeutralLoss::Loss(molecular_formula!(C 2 H 4 N 1)),
NeutralLoss::Loss(molecular_formula!(C 4 H 6 N 2)),
]),
(vec![AminoAcid::Tyrosine], vec![
NeutralLoss::Loss(molecular_formula!(C 1 H 3 N 1)),
NeutralLoss::Loss(molecular_formula!(C 1 H 3 N 1 O 1)),
NeutralLoss::Loss(molecular_formula!(C 5 H 7 N 1)),
]),
(vec![AminoAcid::Valine], vec![
NeutralLoss::Loss(molecular_formula!(C 1 H 1 O -1)),
NeutralLoss::Loss(molecular_formula!(H 3 N 1)),
NeutralLoss::Loss(molecular_formula!(C 1 H 2 N 1)),
NeutralLoss::Loss(molecular_formula!(C 1 H 5 N 1)),
]),
]);
pub fn immonium_losses() -> &'static Vec<(Vec<AminoAcid>, Vec<NeutralLoss>)> {
LazyLock::force(&IMMONIUM_LOSSES)
}
/// Generate all uncharged diagnostic ions for this monosaccharide.
/// According to: <https://doi.org/10.1016/j.trac.2018.09.007>.
static GLYCAN_LOSSES: LazyLock<Vec<(MonoSaccharide, bool, Vec<NeutralLoss>)>> =
LazyLock::new(|| {
vec![
(
MonoSaccharide::new(BaseSugar::Hexose(None), &[]),
false,
vec![
NeutralLoss::Loss(molecular_formula!(H 2 O 1)),
NeutralLoss::Loss(molecular_formula!(H 4 O 2)),
NeutralLoss::Loss(molecular_formula!(C 1 H 6 O 3)),
NeutralLoss::Loss(molecular_formula!(C 2 H 6 O 3)),
],
),
(
MonoSaccharide::new(BaseSugar::Hexose(None), &[GlycanSubstituent::NAcetyl]),
false,
vec![
NeutralLoss::Loss(molecular_formula!(H 2 O 1)),
NeutralLoss::Loss(molecular_formula!(H 4 O 2)),
NeutralLoss::Loss(molecular_formula!(C 2 H 4 O 2)),
NeutralLoss::Loss(molecular_formula!(C 1 H 6 O 3)),
NeutralLoss::Loss(molecular_formula!(C 2 H 6 O 3)),
NeutralLoss::Loss(molecular_formula!(C 4 H 8 O 4)),
],
),
(
MonoSaccharide::new(
BaseSugar::Nonose(None),
&[
GlycanSubstituent::Amino,
GlycanSubstituent::Acetyl,
GlycanSubstituent::Acid,
],
)
.with_name("NeuAc"),
false,
vec![NeutralLoss::Loss(molecular_formula!(H 2 O 1))],
),
(
MonoSaccharide::new(
BaseSugar::Nonose(None),
&[
GlycanSubstituent::Amino,
GlycanSubstituent::Glycolyl,
GlycanSubstituent::Acid,
],
)
.with_name("NeuGc"),
false,
vec![NeutralLoss::Loss(molecular_formula!(H 2 O 1))],
),
]
});
pub fn glycan_losses() -> &'static Vec<(MonoSaccharide, bool, Vec<NeutralLoss>)> {
LazyLock::force(&GLYCAN_LOSSES)
}
#[test]
#[expect(clippy::missing_panics_doc)]
fn test_reading_custom_models_json() {
use serde_json;
let data = r#"[ [ "None", { "a": { "location": "None", "neutral_losses": [], "amino_acid_neutral_losses": [], "amino_acid_side_chain_losses": [ 0, null ], "charge_range": { "start": { "Absolute": 1 }, "end": { "Relative": 0 } }, "allowed_variants": [ 0 ] }, "b": { "location": "None", "neutral_losses": [], "amino_acid_neutral_losses": [], "amino_acid_side_chain_losses": [ 0, null ], "charge_range": { "start": { "Absolute": 1 }, "end": { "Relative": 0 } }, "allowed_variants": [ 0 ] }, "c": { "location": "None", "neutral_losses": [], "amino_acid_neutral_losses": [], "amino_acid_side_chain_losses": [ 0, null ], "charge_range": { "start": { "Absolute": 1 }, "end": { "Relative": 0 } }, "allowed_variants": [ 0 ] }, "d": { "location": { "rules": [], "base": null }, "neutral_losses": [], "amino_acid_neutral_losses": [], "amino_acid_side_chain_losses": [ 0, null ], "charge_range": { "start": { "Absolute": 1 }, "end": { "Relative": 0 } }, "allowed_variants": [ 0 ] }, "v": { "location": { "rules": [], "base": null }, "neutral_losses": [], "amino_acid_neutral_losses": [], "amino_acid_side_chain_losses": [ 0, null ], "charge_range": { "start": { "Absolute": 1 }, "end": { "Relative": 0 } }, "allowed_variants": [ 0 ] }, "w": { "location": { "rules": [], "base": null }, "neutral_losses": [], "amino_acid_neutral_losses": [], "amino_acid_side_chain_losses": [ 0, null ], "charge_range": { "start": { "Absolute": 1 }, "end": { "Relative": 0 } }, "allowed_variants": [ 0 ] }, "x": { "location": "None", "neutral_losses": [], "amino_acid_neutral_losses": [], "amino_acid_side_chain_losses": [ 0, null ], "charge_range": { "start": { "Absolute": 1 }, "end": { "Relative": 0 } }, "allowed_variants": [ 0 ] }, "y": { "location": "None", "neutral_losses": [], "amino_acid_neutral_losses": [], "amino_acid_side_chain_losses": [ 0, null ], "charge_range": { "start": { "Absolute": 1 }, "end": { "Relative": 0 } }, "allowed_variants": [ 0 ] }, "z": { "location": "None", "neutral_losses": [], "amino_acid_neutral_losses": [], "amino_acid_side_chain_losses": [ 0, null ], "charge_range": { "start": { "Absolute": 1 }, "end": { "Relative": 0 } }, "allowed_variants": [ 0 ] }, "precursor": [ [], [], [ 0, null ], { "start": { "Relative": 0 }, "end": { "Relative": 0 } } ], "immonium": null, "modification_specific_neutral_losses": false, "modification_specific_diagnostic_ions": null, "glycan": { "allow_structural": false, "compositional_range": { "start": 0, "end": 0 }, "neutral_losses": [], "specific_neutral_losses": [], "default_peptide_fragment": { "full": true, "core": null }, "peptide_fragment_rules": [], "oxonium_charge_range": { "start": { "Absolute": 1 }, "end": { "Absolute": 1 } }, "other_charge_range": { "start": { "Absolute": 1 }, "end": { "Relative": 0 } } }, "allow_cross_link_cleavage": false } ], [ "Something ETciD", { "a": { "location": { "TakeN": { "skip": 0, "take": 1 } }, "neutral_losses": [], "amino_acid_neutral_losses": [], "amino_acid_side_chain_losses": [ 0, null ], "charge_range": { "start": { "Absolute": 1 }, "end": { "Relative": 0 } }, "allowed_variants": [ 0 ] }, "b": { "location": "All", "neutral_losses": [ { "Loss": { "elements": [ [ "H", null, 2 ], [ "O", null, 1 ] ], "additional_mass": 0.0, "labels": [] } } ], "amino_acid_neutral_losses": [], "amino_acid_side_chain_losses": [ 0, null ], "charge_range": { "start": { "Absolute": 1 }, "end": { "Relative": 0 } }, "allowed_variants": [ 0 ] }, "c": { "location": "All", "neutral_losses": [ { "Loss": { "elements": [ [ "H", null, 2 ], [ "O", null, 1 ] ], "additional_mass": 0.0, "labels": [] } } ], "amino_acid_neutral_losses": [], "amino_acid_side_chain_losses": [ 0, null ], "charge_range": { "start": { "Absolute": 1 }, "end": { "Relative": 0 } }, "allowed_variants": [ 0, 1 ] }, "d": { "location": { "rules": [], "base": 6 }, "neutral_losses": [], "amino_acid_neutral_losses": [], "amino_acid_side_chain_losses": [ 0, null ], "charge_range": { "start": { "Absolute": 1 }, "end": { "Relative": 0 } }, "allowed_variants": [ 0 ] }, "v": { "location": { "rules": [], "base": null }, "neutral_losses": [], "amino_acid_neutral_losses": [], "amino_acid_side_chain_losses": [ 0, null ], "charge_range": { "start": { "Absolute": 1 }, "end": { "Relative": 0 } }, "allowed_variants": [ 0 ] }, "w": { "location": { "rules": [], "base": 0 }, "neutral_losses": [ { "Loss": { "elements": [ [ "H", null, 2 ], [ "O", null, 1 ] ], "additional_mass": 0.0, "labels": [] } } ], "amino_acid_neutral_losses": [], "amino_acid_side_chain_losses": [ 0, null ], "charge_range": { "start": { "Absolute": 1 }, "end": { "Relative": 0 } }, "allowed_variants": [ 0 ] }, "x": { "location": "None", "neutral_losses": [], "amino_acid_neutral_losses": [], "amino_acid_side_chain_losses": [ 0, null ], "charge_range": { "start": { "Absolute": 1 }, "end": { "Relative": 0 } }, "allowed_variants": [ 0 ] }, "y": { "location": "All", "neutral_losses": [ { "Loss": { "elements": [ [ "H", null, 2 ], [ "O", null, 1 ] ], "additional_mass": 0.0, "labels": [] } } ], "amino_acid_neutral_losses": [], "amino_acid_side_chain_losses": [ 0, null ], "charge_range": { "start": { "Absolute": 1 }, "end": { "Relative": 0 } }, "allowed_variants": [ 0 ] }, "z": { "location": "All", "neutral_losses": [ { "Loss": { "elements": [ [ "H", null, 2 ], [ "O", null, 1 ] ], "additional_mass": 0.0, "labels": [] } } ], "amino_acid_neutral_losses": [], "amino_acid_side_chain_losses": [ 0, null ], "charge_range": { "start": { "Absolute": 1 }, "end": { "Relative": 0 } }, "allowed_variants": [ 0, 1 ] }, "precursor": [ [ { "Loss": { "elements": [ [ "H", null, 2 ], [ "O", null, 1 ] ], "additional_mass": 0.0, "labels": [] } } ], [], [ 0, null ], { "start": { "Absolute": 1 }, "end": { "Relative": 0 } } ], "immonium": null, "modification_specific_neutral_losses": true, "modification_specific_diagnostic_ions": { "start": { "Absolute": 1 }, "end": { "Absolute": 1 } }, "glycan": { "allow_structural": true, "compositional_range": { "start": 1, "end": 10 }, "neutral_losses": [ { "Loss": { "elements": [ [ "H", null, 2 ], [ "O", null, 1 ] ], "additional_mass": 0.0, "labels": [] } } ], "specific_neutral_losses": [ [ { "base_sugar": { "Hexose": null }, "substituents": [], "furanose": false, "configuration": null, "proforma_name": "Hex" }, false, [ { "Loss": { "elements": [ [ "H", null, 2 ], [ "O", null, 1 ] ], "additional_mass": 0.0, "labels": [] } }, { "Loss": { "elements": [ [ "H", null, 4 ], [ "O", null, 2 ] ], "additional_mass": 0.0, "labels": [] } }, { "Loss": { "elements": [ [ "H", null, 6 ], [ "C", null, 1 ], [ "O", null, 3 ] ], "additional_mass": 0.0, "labels": [] } }, { "Loss": { "elements": [ [ "H", null, 6 ], [ "C", null, 2 ], [ "O", null, 3 ] ], "additional_mass": 0.0, "labels": [] } } ] ], [ { "base_sugar": { "Hexose": null }, "substituents": [ "NAcetyl" ], "furanose": false, "configuration": null, "proforma_name": "HexNAc" }, false, [ { "Loss": { "elements": [ [ "H", null, 2 ], [ "O", null, 1 ] ], "additional_mass": 0.0, "labels": [] } }, { "Loss": { "elements": [ [ "H", null, 4 ], [ "O", null, 2 ] ], "additional_mass": 0.0, "labels": [] } }, { "Loss": { "elements": [ [ "H", null, 4 ], [ "C", null, 2 ], [ "O", null, 2 ] ], "additional_mass": 0.0, "labels": [] } }, { "Loss": { "elements": [ [ "H", null, 6 ], [ "C", null, 1 ], [ "O", null, 3 ] ], "additional_mass": 0.0, "labels": [] } }, { "Loss": { "elements": [ [ "H", null, 6 ], [ "C", null, 2 ], [ "O", null, 3 ] ], "additional_mass": 0.0, "labels": [] } }, { "Loss": { "elements": [ [ "H", null, 8 ], [ "C", null, 4 ], [ "O", null, 4 ] ], "additional_mass": 0.0, "labels": [] } } ] ], [ { "base_sugar": { "Nonose": null }, "substituents": [ "Amino", "Acid", "Acetyl" ], "furanose": false, "configuration": null, "proforma_name": "NeuAc" }, false, [ { "Loss": { "elements": [ [ "H", null, 2 ], [ "O", null, 1 ] ], "additional_mass": 0.0, "labels": [] } } ] ], [ { "base_sugar": { "Nonose": null }, "substituents": [ "Amino", "Acid", "Glycolyl" ], "furanose": false, "configuration": null, "proforma_name": "NeuGc" }, false, [ { "Loss": { "elements": [ [ "H", null, 2 ], [ "O", null, 1 ] ], "additional_mass": 0.0, "labels": [] } } ] ] ], "default_peptide_fragment": { "full": true, "core": null }, "peptide_fragment_rules": [], "oxonium_charge_range": { "start": { "Absolute": 1 }, "end": { "Absolute": 1 } }, "other_charge_range": { "start": { "Absolute": 1 }, "end": { "Relative": 0 } } }, "allow_cross_link_cleavage": false } ], [ "UVPD", { "a": { "location": "All", "neutral_losses": [], "amino_acid_neutral_losses": [], "amino_acid_side_chain_losses": [ 0, null ], "charge_range": { "start": { "Absolute": 1 }, "end": { "Relative": 0 } }, "allowed_variants": [ 0, 1, 2 ] }, "b": { "location": "All", "neutral_losses": [ { "Loss": { "elements": [ [ "H", null, 2 ], [ "O", null, 1 ] ], "additional_mass": 0.0, "labels": [] } } ], "amino_acid_neutral_losses": [], "amino_acid_side_chain_losses": [ 0, null ], "charge_range": { "start": { "Absolute": 1 }, "end": { "Relative": 0 } }, "allowed_variants": [ 0, 1 ] }, "c": { "location": "All", "neutral_losses": [ { "Loss": { "elements": [ [ "H", null, 2 ], [ "O", null, 1 ] ], "additional_mass": 0.0, "labels": [] } } ], "amino_acid_neutral_losses": [], "amino_acid_side_chain_losses": [ 0, null ], "charge_range": { "start": { "Absolute": 1 }, "end": { "Relative": 0 } }, "allowed_variants": [ 0 ] }, "d": { "location": { "rules": [], "base": 0 }, "neutral_losses": [], "amino_acid_neutral_losses": [], "amino_acid_side_chain_losses": [ 0, null ], "charge_range": { "start": { "Absolute": 1 }, "end": { "Relative": 0 } }, "allowed_variants": [ 0 ] }, "v": { "location": { "rules": [], "base": 0 }, "neutral_losses": [], "amino_acid_neutral_losses": [], "amino_acid_side_chain_losses": [ 0, null ], "charge_range": { "start": { "Absolute": 1 }, "end": { "Relative": 0 } }, "allowed_variants": [ 0 ] }, "w": { "location": { "rules": [], "base": 0 }, "neutral_losses": [ { "Loss": { "elements": [ [ "H", null, 2 ], [ "O", null, 1 ] ], "additional_mass": 0.0, "labels": [] } } ], "amino_acid_neutral_losses": [], "amino_acid_side_chain_losses": [ 0, null ], "charge_range": { "start": { "Absolute": 1 }, "end": { "Relative": 0 } }, "allowed_variants": [ 0 ] }, "x": { "location": "All", "neutral_losses": [], "amino_acid_neutral_losses": [], "amino_acid_side_chain_losses": [ 0, null ], "charge_range": { "start": { "Absolute": 1 }, "end": { "Relative": 0 } }, "allowed_variants": [ 0, 1, 2 ] }, "y": { "location": "All", "neutral_losses": [ { "Loss": { "elements": [ [ "H", null, 2 ], [ "O", null, 1 ] ], "additional_mass": 0.0, "labels": [] } } ], "amino_acid_neutral_losses": [], "amino_acid_side_chain_losses": [ 0, null ], "charge_range": { "start": { "Absolute": 1 }, "end": { "Relative": 0 } }, "allowed_variants": [ 0, 1, 2 ] }, "z": { "location": "All", "neutral_losses": [ { "Loss": { "elements": [ [ "H", null, 2 ], [ "O", null, 1 ] ], "additional_mass": 0.0, "labels": [] } } ], "amino_acid_neutral_losses": [], "amino_acid_side_chain_losses": [ 0, null ], "charge_range": { "start": { "Absolute": 1 }, "end": { "Relative": 0 } }, "allowed_variants": [ 0 ] }, "precursor": [ [ { "Loss": { "elements": [ [ "H", null, 2 ], [ "O", null, 1 ] ], "additional_mass": 0.0, "labels": [] } } ], [], [ 0, null ], { "start": { "Relative": 0 }, "end": { "Relative": 0 } } ], "immonium": [ { "start": { "Absolute": 1 }, "end": { "Absolute": 1 } }, [] ], "modification_specific_neutral_losses": true, "modification_specific_diagnostic_ions": { "start": { "Absolute": 1 }, "end": { "Absolute": 1 } }, "glycan": { "allow_structural": false, "compositional_range": { "start": 0, "end": 0 }, "neutral_losses": [ { "Loss": { "elements": [ [ "H", null, 2 ], [ "O", null, 1 ] ], "additional_mass": 0.0, "labels": [] } } ], "specific_neutral_losses": [], "default_peptide_fragment": { "full": true, "core": null }, "peptide_fragment_rules": [], "oxonium_charge_range": { "start": { "Absolute": 1 }, "end": { "Absolute": 1 } }, "other_charge_range": { "start": { "Absolute": 1 }, "end": { "Relative": 0 } } }, "allow_cross_link_cleavage": false } ]]"#;
let mods: Vec<(String, FragmentationModel)> = serde_json::from_str(data).unwrap();
assert!(mods.len() > 1);
}