private void EvaluateBestDriftTime(int msLevel, LibKey libKey, float tolerance, List<TransitionFullScanInfo> transitions) { double? driftTime = null; double maxIntensity = 0; // Avoid picking MS2 drift times wildly different from MS1 times double? ms1DriftTimeBest; if ((msLevel == 2) && _ms1DriftTimes.ContainsKey(libKey)) { ms1DriftTimeBest = _ms1DriftTimes[libKey].OrderByDescending(p => p.Intensity) .FirstOrDefault() .DriftTime; } else { ms1DriftTimeBest = null; } const int maxHighEnergyDriftOffsetMsec = 2; // CONSIDER(bspratt): user definable? or dynamically set by looking at scan to scan drift delta? Or resolving power? foreach (var scan in _msDataFileScanHelper.MsDataSpectra.Where(scan => scan != null)) { if (!scan.DriftTimeMsec.HasValue || !scan.Mzs.Any()) continue; if (ms1DriftTimeBest.HasValue && (scan.DriftTimeMsec.Value < ms1DriftTimeBest.Value - maxHighEnergyDriftOffsetMsec || scan.DriftTimeMsec.Value > ms1DriftTimeBest.Value + maxHighEnergyDriftOffsetMsec)) continue; // Get the total intensity for all transitions of current msLevel double totalIntensity = 0; foreach (var t in transitions) { var mzPeak = t.ProductMz; var halfwin = (t.ExtractionWidth ?? tolerance)/2; var mzLow = mzPeak - halfwin; var mzHigh = mzPeak + halfwin; var first = Array.BinarySearch(scan.Mzs, mzLow); if (first < 0) first = ~first; for (var i = first; i < scan.Mzs.Length; i++) { if (scan.Mzs[i] > mzHigh) break; totalIntensity += scan.Intensities[i]; } } if (maxIntensity < totalIntensity) { driftTime = scan.DriftTimeMsec; maxIntensity = totalIntensity; } } if (driftTime.HasValue) { var dict = (msLevel == 1) ? _ms1DriftTimes : _ms2DriftTimes; var result = new DriftTimeIntensityPair { DriftTime = driftTime.Value, Intensity = maxIntensity }; List<DriftTimeIntensityPair> listPairs; if (!dict.TryGetValue(libKey, out listPairs)) { listPairs = new List<DriftTimeIntensityPair>(); dict.Add(libKey, listPairs); } listPairs.Add(result); } }
private void EvaluateBestDriftTime(int msLevel, LibKey libKey, float tolerance, List <TransitionFullScanInfo> transitions) { double?driftTime = null; double maxIntensity = 0; // Avoid picking MS2 drift times wildly different from MS1 times double?ms1DriftTimeBest; if ((msLevel == 2) && _ms1DriftTimes.ContainsKey(libKey)) { ms1DriftTimeBest = _ms1DriftTimes[libKey].OrderByDescending(p => p.Intensity) .FirstOrDefault() .DriftTime; } else { ms1DriftTimeBest = null; } const int maxHighEnergyDriftOffsetMsec = 2; // CONSIDER(bspratt): user definable? or dynamically set by looking at scan to scan drift delta? Or resolving power? foreach (var scan in _msDataFileScanHelper.MsDataSpectra.Where(scan => scan != null)) { if (!scan.DriftTimeMsec.HasValue || !scan.Mzs.Any()) { continue; } if (ms1DriftTimeBest.HasValue && (scan.DriftTimeMsec.Value < ms1DriftTimeBest.Value - maxHighEnergyDriftOffsetMsec || scan.DriftTimeMsec.Value > ms1DriftTimeBest.Value + maxHighEnergyDriftOffsetMsec)) { continue; } // Get the total intensity for all transitions of current msLevel double totalIntensity = 0; foreach (var t in transitions) { var mzPeak = t.ProductMz; var halfwin = (t.ExtractionWidth ?? tolerance) / 2; var mzLow = mzPeak - halfwin; var mzHigh = mzPeak + halfwin; var first = Array.BinarySearch(scan.Mzs, mzLow); if (first < 0) { first = ~first; } for (var i = first; i < scan.Mzs.Length; i++) { if (scan.Mzs[i] > mzHigh) { break; } totalIntensity += scan.Intensities[i]; } } if (maxIntensity < totalIntensity) { driftTime = scan.DriftTimeMsec; maxIntensity = totalIntensity; } } if (driftTime.HasValue) { var dict = (msLevel == 1) ? _ms1DriftTimes : _ms2DriftTimes; var result = new DriftTimeIntensityPair { DriftTime = driftTime.Value, Intensity = maxIntensity }; List <DriftTimeIntensityPair> listPairs; if (!dict.TryGetValue(libKey, out listPairs)) { listPairs = new List <DriftTimeIntensityPair>(); dict.Add(libKey, listPairs); } listPairs.Add(result); } }