OpenMS
Loading...
Searching...
No Matches
FragmentIndex.h
Go to the documentation of this file.
1// Copyright (c) 2002-present, OpenMS Inc. -- EKU Tuebingen, ETH Zurich, and FU Berlin
2// SPDX-License-Identifier: BSD-3-Clause
3//
4// --------------------------------------------------------------------------
5// $Maintainer: $
6// $Authors: $
7// --------------------------------------------------------------------------
8
9#pragma once
10
18
19
20#include <array>
21#include <mutex>
22#include <vector>
23#include <functional>
24#include <algorithm> // std::max (used by inline static isOpenSearchMode)
25
26namespace OpenMS
27{
34 class OPENMS_DLLAPI FragmentIndex : public DefaultParamHandler
35 {
36 public:
37
38
52 struct Peptide {
53
54 // We need a constructor in order to emplace back
55 Peptide(UInt32 protein_idx, uint32_t mod_bitmask, std::pair<uint16_t , uint16_t> sequence, float precursor_mz):
56 protein_idx(protein_idx),
57 mod_bitmask_(mod_bitmask),
58 sequence_(sequence),
59 precursor_mz_(precursor_mz)
60 {}
61
63 uint32_t mod_bitmask_;
64 std::pair<uint16_t , uint16_t> sequence_;
66 };
67
72 {
73 uint32_t num_matched_{};
74 uint32_t subset_bitmask_{};
75 float sigma_delta_{};
76 uint16_t precursor_charge_{};
77 int16_t isotope_error_{};
78 size_t peptide_idx_{};
79 };
80
81
86 {
87 std::vector<SpectrumMatch> hits_;
88
89
91
99 {
100
101 this->hits_.insert(this->hits_.end(), other.hits_.begin(), other.hits_.end());
102 return *this;
103 }
104
105 void clear()
106 {
107 hits_.clear();
108
109 }
110 };
121
128 ~FragmentIndex() override = default;
129
139 bool isBuild() const;
140
153 const std::vector<Peptide>& getPeptides() const;
154
157 Size getNumFragments() const noexcept { return fi_fragments_.size() + electron_fragments_.size(); }
158
159#ifdef DEBUG_FRAGMENT_INDEX
183 void addSpecialPeptide(AASequence& peptide, Size source_idx);
184#endif
185
192 void build(const std::vector<FASTAFile::FASTAEntry> & fasta_entries);
193
195 void clear();
196
197
209 std::pair<size_t, size_t> getPeptidesInMassWindow(float precursor_mass,
210 const std::pair<float, float>& window) const;
211
216 static bool isOpenSearchMode(double lower_magnitude,
217 double upper_magnitude,
218 bool unit_ppm) noexcept
219 {
220 const double threshold = unit_ppm ? 1000.0 : 1.0;
221 return std::max(lower_magnitude, upper_magnitude) > threshold;
222 }
223
243 static constexpr uint32_t SNES_KIND_BIT_MASK = 1u << 31;
244 static constexpr uint32_t SNES_SLOT_MASK = ~SNES_KIND_BIT_MASK;
245
249 enum class SnesAnchor
250 {
251 NONE,
252 PROT_NTERM,
253 PROT_CTERM
254 };
255
258 static bool isSingleCMother(uint32_t mod_bitmask) noexcept
259 {
260 return (mod_bitmask & SNES_KIND_BIT_MASK) != 0;
261 }
263 static bool isSingleNMother(uint32_t mod_bitmask) noexcept
264 {
265 return (mod_bitmask & SNES_KIND_BIT_MASK) == 0;
266 }
267
273 bool isSnesMode() const noexcept { return is_snes_mode_; }
274
275
279 struct Hit
280 {
281 Hit(UInt32 peptide_idx, float fragment_mz) :
282 peptide_idx(peptide_idx),
283 fragment_mz(fragment_mz)
284 {}
285 UInt32 peptide_idx; // index in database
287 };
288
296 std::vector<Hit> query(const Peak1D& peak,
297 const std::pair<size_t,size_t>& peptide_idx_range,
298 uint16_t peak_charge);
299
307 void querySpectrum(const MSSpectrum& spectrum,
309
321 void querySpectrum(const MSSpectrum& spectrum,
322 const std::vector<FASTAFile::FASTAEntry>& fasta_entries,
324
340 void querySpectrum(const MSSpectrum& spectrum,
341 const std::vector<FASTAFile::FASTAEntry>& fasta_entries,
343 bool with_electron_ions);
344
356 const std::vector<FASTAFile::FASTAEntry>& fasta_entries) const;
357
379 int realizeSNESLength(const Peptide& mother,
380 const std::vector<FASTAFile::FASTAEntry>& fasta_entries,
381 double target_mh_plus,
382 double tolerance_lower_magnitude,
383 double tolerance_upper_magnitude,
384 bool tolerance_ppm) const;
385
394 const std::vector<FASTAFile::FASTAEntry>& fasta_entries,
395 size_t realized_length,
396 uint32_t subset_bitmask = 0) const;
397
398protected:
399
400
403 struct Fragment
404 {
405 Fragment() = default;
406 Fragment(UInt32 peptide_idx, float fragment_mz):
407 peptide_idx_(peptide_idx),
408 fragment_mz_(fragment_mz)
409 {}
410 UInt32 peptide_idx_{}; // 32 bit in sage
411 float fragment_mz_{};
412 };
413
414 bool is_build_{false};
415
416 void updateMembers_() override;
417
424 void generatePeptides(const std::vector<FASTAFile::FASTAEntry>& fasta_entries);
425
447 void generateSNESMothers_(const std::vector<FASTAFile::FASTAEntry>& fasta_entries);
448
456
462 struct ModSlot
463 {
464 uint16_t position;
465 double delta_mass;
467
468 static constexpr uint16_t NTERM_SLOT = UINT16_MAX - 1;
469 static constexpr uint16_t CTERM_SLOT = UINT16_MAX;
470 };
471
472 static constexpr size_t MAX_MOD_SLOTS = 32;
473
477
487 size_t buildModSlots_(const char* sequence, size_t seq_len, ModSlot* out_slots,
488 bool is_protein_nterm = false, bool is_protein_cterm = false) const;
489
498 std::vector<double> computeSnesSigmaDeltaSet_(bool include_prot_nterm_mods,
499 bool include_prot_cterm_mods) const;
500
502 std::array<double, 128> fixed_mod_deltas_{};
504 std::array<const ResidueModification*, 128> fixed_mod_ptrs_{};
505 double fixed_nterm_delta_{0.0};
506 double fixed_cterm_delta_{0.0};
507 const ResidueModification* fixed_nterm_mod_ptr_{nullptr};
508 const ResidueModification* fixed_cterm_mod_ptr_{nullptr};
509
511 std::array<std::vector<VarModEntry>, 128> variable_mod_table_{};
513 std::vector<VarModEntry> variable_nterm_mods_;
515 std::vector<VarModEntry> variable_cterm_mods_;
516
517 bool mod_tables_initialized_{false};
518
524 bool is_snes_mode_{false};
525
531 bool snes_enabled_{false};
532
535 std::vector<double> snes_sigma_delta_set_;
542
545 static std::array<double, 128> residue_mass_table_;
546 static std::once_flag mass_table_once_flag_;
548
551 {
552 double b_offset{0.0};
553 double y_offset{0.0};
554 double a_offset{0.0};
555 double c_offset{0.0};
556 double x_offset{0.0};
557 double z_offset{0.0};
558 double zp1_offset{0.0};
559 };
561
577 std::vector<Fragment>& fragments,
578 std::vector<Fragment>& electron_fragments,
579 const char* sequence,
580 size_t seq_len,
581 UInt32 peptide_idx,
582 double n_term_mod_mass,
583 double c_term_mod_mass,
584 const double* residue_mod_masses) const;
585
608 std::vector<Fragment>& fragments,
609 const char* sequence,
610 size_t seq_len,
611 UInt32 peptide_idx,
612 double n_term_mod_mass,
613 double c_term_mod_mass,
614 const double* residue_mod_masses,
615 bool add_b,
616 bool add_a,
617 bool add_c,
618 bool add_y,
619 bool add_x,
620 bool add_z,
621 bool add_zp1) const;
622
623 std::vector<Peptide> fi_peptides_;
624 std::vector<Fragment> fi_fragments_;
627 std::vector<Fragment> electron_fragments_;
628 std::vector<float> electron_bucket_min_mz_;
629
632 std::vector<uint32_t> protein_lengths_;
633
636 size_t min_ion_index_{0};
637 size_t bucketsize_;
638 std::vector<float> bucket_min_mz_;
639 double precursor_mass_tolerance_lower_{20.0};
640 double precursor_mass_tolerance_upper_{20.0};
641 bool precursor_mass_tolerance_unit_ppm_{true};
643 bool fragment_mz_tolerance_unit_ppm_{true};
644private:
645
646
688 void querySpectrumSNES_(const MSSpectrum& spectrum,
689 const std::vector<FASTAFile::FASTAEntry>& fasta_entries,
691
713 const MSSpectrum& spectrum,
714 const std::pair<size_t, size_t>& candidates_range,
715 const int16_t isotope_error,
716 const uint16_t precursor_charge,
717 const bool with_electron_ions);
728 float precursor_mass,
730 uint16_t charge,
731 bool with_electron_ions);
732
735 void sortAndBucketFragments_(std::vector<Fragment>& fragments,
736 std::vector<float>& bucket_min_mz,
737 int num_threads);
738
742 void trimHits(SpectrumMatchesTopN& init_hits) const;
743
744 //since we work with TheoreticalSpectrumGenerator, we must transfer some of those member variables
752 bool electron_ions_{false};
753
754 // SpectrumGenerator independend member variables
755 std::string digestion_enzyme_;
756 EnzymaticDigestion::Specificity enzyme_specificity_{EnzymaticDigestion::SPEC_FULL};
757
763
767
768 // Search Related member variables
769
777
779 bool isOpenSearchMode_() const noexcept
780 {
781 return isOpenSearchMode(precursor_mass_tolerance_lower_,
782 precursor_mass_tolerance_upper_,
783 precursor_mass_tolerance_unit_ppm_);
784 }
785
790 std::pair<float, float> computeMassWindow_(float precursor_mass) const;
791
792
793 };
794
795}
Definition AASequence.h:96
A base class for all classes handling default parameters.
Definition DefaultParamHandler.h:66
Specificity
when querying for valid digestion products, this determines if the specificity of the two peptide end...
Definition EnzymaticDigestion.h:42
Generates from a set of Fasta files a 2D-datastructure which stores all theoretical masses of all b a...
Definition FragmentIndex.h:35
size_t bucketsize_
number of fragments per outer node
Definition FragmentIndex.h:637
uint16_t min_matched_peaks_
PSM with less hits are discarded.
Definition FragmentIndex.h:770
bool add_x_ions_
Definition FragmentIndex.h:749
void generateSNESMothers_(const std::vector< FASTAFile::FASTAEntry > &fasta_entries)
SNES-mode peptide enumeration: emit Single-N + Single-C mother peptides.
void searchDifferentPrecursorRanges(const MSSpectrum &spectrum, float precursor_mass, SpectrumMatchesTopN &sms, uint16_t charge, bool with_electron_ions)
If closed search loops over all isotope errors. For each iteration loop over all peaks with queryPeak...
AASequence reconstructRealizedSubSequence(const Peptide &mother, const std::vector< FASTAFile::FASTAEntry > &fasta_entries, size_t realized_length, uint32_t subset_bitmask=0) const
const ResidueModification * mod_ptr
pointer to the modification (for AASequence reconstruction)
Definition FragmentIndex.h:453
bool add_a_ions_
Definition FragmentIndex.h:747
void querySpectrum(const MSSpectrum &spectrum, SpectrumMatchesTopN &sms)
: queries one complete experimental spectra against the Database. Loops over all precursor charges St...
std::vector< float > electron_bucket_min_mz_
smallest fragment m/z of each bucket of electron_fragments_
Definition FragmentIndex.h:628
bool add_b_ions_
Definition FragmentIndex.h:745
static bool isOpenSearchMode(double lower_magnitude, double upper_magnitude, bool unit_ppm) noexcept
Definition FragmentIndex.h:216
static IonOffsets ion_offsets_
Definition FragmentIndex.h:560
size_t buildModSlots_(const char *sequence, size_t seq_len, ModSlot *out_slots, bool is_protein_nterm=false, bool is_protein_cterm=false) const
ResidueModification::TermSpecificity term_spec
where this mod can be applied
Definition FragmentIndex.h:454
static std::once_flag mass_table_once_flag_
Definition FragmentIndex.h:546
void sortAndBucketFragments_(std::vector< Fragment > &fragments, std::vector< float > &bucket_min_mz, int num_threads)
std::pair< float, float > computeMassWindow_(float precursor_mass) const
StringList modifications_fixed_
Modification that are one all peptides.
Definition FragmentIndex.h:764
static bool isSingleCMother(uint32_t mod_bitmask) noexcept
Definition FragmentIndex.h:258
float fragment_mz_tolerance_
Definition FragmentIndex.h:642
bool add_y_ions_
Definition FragmentIndex.h:746
std::vector< Peptide > fi_peptides_
vector of all (digested) peptides
Definition FragmentIndex.h:623
std::vector< VarModEntry > variable_cterm_mods_
Pure C-terminal variable mods (not residue-specific)
Definition FragmentIndex.h:515
void generateFragmentsLightweight_(std::vector< Fragment > &fragments, std::vector< Fragment > &electron_fragments, const char *sequence, size_t seq_len, UInt32 peptide_idx, double n_term_mod_mass, double c_term_mod_mass, const double *residue_mod_masses) const
size_t missed_cleavages_
number of missed cleavages
Definition FragmentIndex.h:758
float fragment_min_mz_
smallest fragment mz
Definition FragmentIndex.h:634
uint16_t min_precursor_charge_
minimal possible precursor charge (usually always 1)
Definition FragmentIndex.h:773
uint32_t max_processed_hits_
The amount of PSM that will be used. the rest is filtered out.
Definition FragmentIndex.h:776
static bool isSingleNMother(uint32_t mod_bitmask) noexcept
Definition FragmentIndex.h:263
float peptide_max_mass_
Definition FragmentIndex.h:760
void querySpectrumSNES_(const MSSpectrum &spectrum, const std::vector< FASTAFile::FASTAEntry > &fasta_entries, SpectrumMatchesTopN &sms)
SNES-mode spectrum query (MetaMorpheus-style: byte-count + b-ion filter).
bool add_zp1_ions_
Definition FragmentIndex.h:751
std::vector< Fragment > electron_fragments_
Definition FragmentIndex.h:627
uint16_t max_fragment_charge_
The maximal possible charge of the fragments.
Definition FragmentIndex.h:775
std::pair< size_t, size_t > getPeptidesInMassWindow(float precursor_mass, const std::pair< float, float > &window) const
std::vector< double > snes_sigma_delta_set_with_prot_cterm_
Definition FragmentIndex.h:541
std::vector< Hit > query(const Peak1D &peak, const std::pair< size_t, size_t > &peptide_idx_range, uint16_t peak_charge)
Queries one peak (against the ion series of the ions:add_*_ions parameters, not the c and z+1 ions of...
bool isOpenSearchMode_() const noexcept
Instance delegate — same rule, reads the member bounds.
Definition FragmentIndex.h:779
std::vector< Fragment > fi_fragments_
Definition FragmentIndex.h:624
void querySpectrum(const MSSpectrum &spectrum, const std::vector< FASTAFile::FASTAEntry > &fasta_entries, SpectrumMatchesTopN &sms)
Query a spectrum against the fragment index with FASTA context.
std::vector< double > snes_sigma_delta_set_
Definition FragmentIndex.h:535
int16_t max_isotope_error_
Maximal possible isotope error (both only used for closed search)
Definition FragmentIndex.h:772
float fragment_max_mz_
largest fragment mz
Definition FragmentIndex.h:635
std::string digestion_enzyme_
Definition FragmentIndex.h:755
void generateFragmentsForSeries_(std::vector< Fragment > &fragments, const char *sequence, size_t seq_len, UInt32 peptide_idx, double n_term_mod_mass, double c_term_mod_mass, const double *residue_mod_masses, bool add_b, bool add_a, bool add_c, bool add_y, bool add_x, bool add_z, bool add_zp1) const
bool isBuild() const
Indicates whether the fragment index has been built.
size_t peptide_max_length_
Definition FragmentIndex.h:762
~FragmentIndex() override=default
Default destructor.
void querySpectrum(const MSSpectrum &spectrum, const std::vector< FASTAFile::FASTAEntry > &fasta_entries, SpectrumMatchesTopN &sms, bool with_electron_ions)
Query a spectrum, optionally also against the c and z+1 ions of ions:electron_ions.
std::vector< double > snes_sigma_delta_set_with_prot_nterm_
Definition FragmentIndex.h:538
void generatePeptides(const std::vector< FASTAFile::FASTAEntry > &fasta_entries)
Generates all peptides from given fasta entries. If Bottom-up is set to false skips digestion....
std::vector< float > bucket_min_mz_
vector of the smalles fragment mz of each bucket
Definition FragmentIndex.h:638
double delta_mass
mass delta from this modification
Definition FragmentIndex.h:452
float peptide_min_mass_
Definition FragmentIndex.h:759
int16_t min_isotope_error_
Minimal possible isotope error.
Definition FragmentIndex.h:771
uint16_t max_precursor_charge_
maximal possible precursor charge
Definition FragmentIndex.h:774
std::vector< uint32_t > protein_lengths_
Definition FragmentIndex.h:632
void updateMembers_() override
This method is used to update extra member variables at the end of the setParameters() method.
void queryPeaks(SpectrumMatchesTopN &candidates, const MSSpectrum &spectrum, const std::pair< size_t, size_t > &candidates_range, const int16_t isotope_error, const uint16_t precursor_charge, const bool with_electron_ions)
Counts fragment matches for ONE (precursor charge, isotope error) block and appends the surviving can...
void clear()
Delete fragment index. Sets is_build=false.
StringList modifications_variable_
Variable Modification -> all possible comibnations are created.
Definition FragmentIndex.h:765
size_t max_variable_mods_per_peptide_
Definition FragmentIndex.h:766
void build(const std::vector< FASTAFile::FASTAEntry > &fasta_entries)
Given a set of Fasta files, builds the Fragment Index datastructure (FID). First all fragments are so...
int realizeSNESLength(const Peptide &mother, const std::vector< FASTAFile::FASTAEntry > &fasta_entries, double target_mh_plus, double tolerance_lower_magnitude, double tolerance_upper_magnitude, bool tolerance_ppm) const
Find the realized sub-peptide length of a SNES mother that best matches the observed precursor mass.
bool isSnesMode() const noexcept
Definition FragmentIndex.h:273
void trimHits(SpectrumMatchesTopN &init_hits) const
places the k-largest elements in the front of the input array. Inside of the k-largest elements and o...
Size getNumFragments() const noexcept
Definition FragmentIndex.h:157
const std::vector< Peptide > & getPeptides() const
Returns a reference to the internal peptide container.
AASequence reconstructModifiedSequence(const Peptide &peptide, const std::vector< FASTAFile::FASTAEntry > &fasta_entries) const
Reconstruct a fully modified AASequence from a Peptide's bitmask.
std::vector< VarModEntry > variable_nterm_mods_
Pure N-terminal variable mods (not residue-specific)
Definition FragmentIndex.h:513
size_t peptide_min_length_
Definition FragmentIndex.h:761
static void initResidueMassTable_()
bool add_c_ions_
Definition FragmentIndex.h:748
FragmentIndex()
Default constructor.
SnesAnchor
Definition FragmentIndex.h:250
bool add_z_ions_
Definition FragmentIndex.h:750
static std::array< double, 128 > residue_mass_table_
Definition FragmentIndex.h:545
std::vector< double > computeSnesSigmaDeltaSet_(bool include_prot_nterm_mods, bool include_prot_cterm_mods) const
Precomputed ion-type mass offsets (from Residue::getInternalTo*Ion formulas)
Definition FragmentIndex.h:551
Match between a query peak and an entry in the DB.
Definition FragmentIndex.h:72
Entry in the per-AA variable modification lookup table.
Definition FragmentIndex.h:451
The representation of a 1D spectrum.
Definition MSSpectrum.h:44
A 1-dimensional raw data point or peak.
Definition Peak1D.h:30
Representation of a modification on an amino acid residue.
Definition ResidueModification.h:55
TermSpecificity
Position where the modification is allowed to occur.
Definition ResidueModification.h:74
uint32_t UInt32
Unsigned integer type (32bit)
Definition Types.h:33
size_t Size
Size type e.g. used as variable which can hold result of size()
Definition Types.h:97
std::vector< std::string > StringList
Vector of String.
Definition TypeAliases.h:39
Main OpenMS namespace.
Definition openswathalgo/include/OpenMS/OPENSWATHALGO/DATAACCESS/ISpectrumAccess.h:19
One entry in the fragment index.
Definition FragmentIndex.h:404
Fragment(UInt32 peptide_idx, float fragment_mz)
Definition FragmentIndex.h:406
Definition FragmentIndex.h:280
UInt32 peptide_idx
Definition FragmentIndex.h:285
Hit(UInt32 peptide_idx, float fragment_mz)
Definition FragmentIndex.h:281
float fragment_mz
Definition FragmentIndex.h:286
A candidate modification slot for a specific peptide.
Definition FragmentIndex.h:463
const ResidueModification * mod_ptr
for AASequence reconstruction
Definition FragmentIndex.h:466
uint16_t position
residue index, or NTERM_SLOT/CTERM_SLOT
Definition FragmentIndex.h:464
double delta_mass
mass delta
Definition FragmentIndex.h:465
Compact descriptor of a peptide instance held by the FragmentIndex.
Definition FragmentIndex.h:52
std::pair< uint16_t, uint16_t > sequence_
{start, length} within the source protein sequence (start is 0-based; length in residues)
Definition FragmentIndex.h:64
uint32_t mod_bitmask_
Bitmask of active variable mod slots (0 = unmodified/fixed-only; up to 32 slots)
Definition FragmentIndex.h:63
UInt32 protein_idx
0-based index into FASTA entries provided to build(); identifies the source protein
Definition FragmentIndex.h:62
float precursor_mz_
Mono-isotopic m/z at charge 1 (M+H)+ of this peptide; used for sorting/filtering.
Definition FragmentIndex.h:65
Peptide(UInt32 protein_idx, uint32_t mod_bitmask, std::pair< uint16_t, uint16_t > sequence, float precursor_mz)
Definition FragmentIndex.h:55
container for SpectrumMatch. Also keeps count of total number of candidates and total number of match...
Definition FragmentIndex.h:86
SpectrumMatchesTopN & operator+=(const SpectrumMatchesTopN &other)
Appends the a SpectrumMatchesTopN to another one. Add the number of all matched peaks up....
Definition FragmentIndex.h:98
void clear()
Definition FragmentIndex.h:105
std::vector< SpectrumMatch > hits_
The preliminary candidates.
Definition FragmentIndex.h:87