private IEnumerable <SpectrumFilterPair> FindFilterPairs(IsolationWindowFilter isoWin, FullScanAcquisitionMethod acquisitionMethod, bool ignoreIsolationScheme = false) { if (!isoWin.IsolationMz.HasValue) { return(new SpectrumFilterPair[0]); // empty } // Return cached value from dictionary if we've seen this target previously. var isoWinKey = isoWin; IList <SpectrumFilterPair> filterPairsCached; if (_filterPairDictionary.TryGetValue(isoWinKey, out filterPairsCached)) { return(filterPairsCached); } var filterPairs = new List <SpectrumFilterPair>(); if (acquisitionMethod == FullScanAcquisitionMethod.DIA) { var isoTargMz = isoWin.IsolationMz; double?isoTargWidth = isoWin.IsolationWidth; if (!ignoreIsolationScheme) { CalcDiaIsolationValues(ref isoTargMz, ref isoTargWidth); } if (isoTargWidth.HasValue) { // For multiple case, find the first possible value, and iterate until // no longer matching or the end of the array is encountered int iFilter = IndexOfFilter(isoTargMz, isoTargWidth.Value); if (iFilter != -1) { while (iFilter < _filterMzValues.Length && CompareMz(isoTargMz, _filterMzValues[iFilter].Q1, isoTargWidth.Value) == 0) { filterPairs.Add(_filterMzValues[iFilter++]); } } } } else { // For single (Targeted) case, review all possible matches for the one closest to the // desired precursor m/z value. // per "Issue 263: Too strict about choosing only one precursor for every MS/MS scan in Targeted MS/MS", // if more than one match at this m/z value return a list double minMzDelta = double.MaxValue; double mzDeltaEpsilon = Math.Min(_instrument.MzMatchTolerance, .0001); // Isolation width for single is based on the instrument m/z match tolerance var isoTargMz = isoWin.IsolationMz; var isoWinSingle = new IsolationWindowFilter(isoTargMz, _instrument.MzMatchTolerance * 2); foreach (var filterPair in FindFilterPairs(isoWinSingle, FullScanAcquisitionMethod.DIA, true)) { double mzDelta = Math.Abs(isoTargMz - filterPair.Q1); if (mzDelta < minMzDelta) // new best match { minMzDelta = mzDelta; // are any existing matches no longer within epsilion of new best match? for (int n = filterPairs.Count; n-- > 0;) { if ((Math.Abs(isoTargMz - filterPairs[n].Q1) - minMzDelta) > mzDeltaEpsilon) { filterPairs.RemoveAt(n); // no longer a match by our new standard } } filterPairs.Add(filterPair); } else if ((mzDelta - minMzDelta) <= mzDeltaEpsilon) { filterPairs.Add(filterPair); // not the best, but close to it } } } _filterPairDictionary[isoWinKey] = filterPairs; return(filterPairs); }
private bool Equals(IsolationWindowFilter other) { return(other.IsolationMz.Equals(IsolationMz) && other.IsolationWidth.Equals(IsolationWidth)); }
private static bool IsSimIsolation(IsolationWindowFilter isoWin) { return(isoWin.IsolationMz.HasValue && isoWin.IsolationWidth.HasValue && // TODO: Introduce a variable cut-off in the document settings isoWin.IsolationWidth.Value < 200); }
private IEnumerable<SpectrumFilterPair> FindFilterPairs(IsolationWindowFilter isoWin, FullScanAcquisitionMethod acquisitionMethod, bool ignoreIsolationScheme = false) { if (!isoWin.IsolationMz.HasValue) return new SpectrumFilterPair[0]; // empty // Return cached value from dictionary if we've seen this target previously. var isoWinKey = isoWin; IList<SpectrumFilterPair> filterPairsCached; if (_filterPairDictionary.TryGetValue(isoWinKey, out filterPairsCached)) { return filterPairsCached; } var filterPairs = new List<SpectrumFilterPair>(); if (acquisitionMethod == FullScanAcquisitionMethod.DIA) { double isoTargMz = isoWin.IsolationMz.Value; double? isoTargWidth = isoWin.IsolationWidth; if (!ignoreIsolationScheme) { CalcDiaIsolationValues(ref isoTargMz, ref isoTargWidth); } if (isoTargWidth.HasValue) { // For multiple case, find the first possible value, and iterate until // no longer matching or the end of the array is encountered int iFilter = IndexOfFilter(isoTargMz, isoTargWidth.Value); if (iFilter != -1) { while (iFilter < _filterMzValues.Length && CompareMz(isoTargMz, _filterMzValues[iFilter].Q1, isoTargWidth.Value) == 0) filterPairs.Add(_filterMzValues[iFilter++]); } } } else { // For single (Targeted) case, review all possible matches for the one closest to the // desired precursor m/z value. // per "Issue 263: Too strict about choosing only one precursor for every MS/MS scan in Targeted MS/MS", // if more than one match at this m/z value return a list double minMzDelta = double.MaxValue; double mzDeltaEpsilon = Math.Min(_instrument.MzMatchTolerance, .0001); // Isolation width for single is based on the instrument m/z match tolerance double isoTargMz = isoWin.IsolationMz.Value; var isoWinSingle = new IsolationWindowFilter(isoTargMz, _instrument.MzMatchTolerance * 2); foreach (var filterPair in FindFilterPairs(isoWinSingle, FullScanAcquisitionMethod.DIA, true)) { double mzDelta = Math.Abs(isoTargMz - filterPair.Q1); if (mzDelta < minMzDelta) // new best match { minMzDelta = mzDelta; // are any existing matches no longer within epsilion of new best match? for (int n = filterPairs.Count; n-- > 0; ) { if ((Math.Abs(isoTargMz - filterPairs[n].Q1) - minMzDelta) > mzDeltaEpsilon) { filterPairs.RemoveAt(n); // no longer a match by our new standard } } filterPairs.Add(filterPair); } else if ((mzDelta - minMzDelta) <= mzDeltaEpsilon) { filterPairs.Add(filterPair); // not the best, but close to it } } } _filterPairDictionary[isoWinKey] = filterPairs; return filterPairs; }
private static bool IsSimIsolation(IsolationWindowFilter isoWin) { return isoWin.IsolationMz.HasValue && isoWin.IsolationWidth.HasValue && // TODO: Introduce a variable cut-off in the document settings isoWin.IsolationWidth.Value < 200; }
private bool Equals(IsolationWindowFilter other) { return other.IsolationMz.Equals(IsolationMz) && other.IsolationWidth.Equals(IsolationWidth); }