/// <summary> /// Use binary search to find all Isotopic Peaks we want to consider when looking for the cross-links shifts. /// </summary> /// <param name="completePeakList">The complete list of Isotopic Peaks that we will use for searching.</param> /// <param name="minimumMz">The minimum m/z value to consider.</param> /// <param name="scanLc">The LC Scan to consider.</param> /// <param name="scanIms">The IMS Scan to consider.</param> /// <returns>All peaks that are in the given LC Scan and IMS Scan and m/z >= thegiven m/z of the Feature.</returns> public static List<IPeak> FindCandidatePeaks(List<IsotopicPeak> completePeakList, double minimumMz, int scanLc, int scanIms) { // Set up Peak Comparer to use for binary search later on AnonymousComparer<IsotopicPeak> peakComparer = new AnonymousComparer<IsotopicPeak>((x, y) => x.ScanLc != y.ScanLc ? x.ScanLc.CompareTo(y.ScanLc) : x.ScanIms != y.ScanIms ? x.ScanIms.CompareTo(y.ScanIms) : x.Mz.CompareTo(y.Mz)); IsotopicPeak lowPeak = new IsotopicPeak {ScanLc = scanLc, ScanIms = scanIms, Mz = minimumMz, Intensity = 1}; IsotopicPeak highPeak = new IsotopicPeak { ScanLc = scanLc, ScanIms = scanIms + 1, Mz = 0, Intensity = 1 }; int lowPeakPosition = completePeakList.BinarySearch(lowPeak, peakComparer); int highPeakPosition = completePeakList.BinarySearch(highPeak, peakComparer); lowPeakPosition = lowPeakPosition < 0 ? ~lowPeakPosition : lowPeakPosition; highPeakPosition = highPeakPosition < 0 ? ~highPeakPosition : highPeakPosition; List<IPeak> candidatePeaks = new List<IPeak>(); for (int j = lowPeakPosition; j < highPeakPosition; j++) { IsotopicPeak peak = completePeakList[j]; MSPeak msPeak = new MSPeak(peak.Mz, peak.Intensity, 0.05f, 1); candidatePeaks.Add(msPeak); } return candidatePeaks; }
/// <summary> /// Parses a single line of the input file and returns a single Isotopic Peak. /// </summary> /// <param name="line">The line to read, as a string.</param> /// <param name="columnMapping">The column mapping for the input file.</param> /// <returns>A single IsotopicPeak object created by using the information from the parsed line.</returns> private static IsotopicPeak ParseLine(string line, IDictionary<string, int> columnMapping) { var columnName = "unknown"; try { var columns = line.Split('\t', ',', '\n'); var peak = new IsotopicPeak(); columnName = "FrameNum"; if (columnMapping.ContainsKey(FRAME_NUM)) peak.ScanLc = int.Parse(columns[columnMapping[FRAME_NUM]]); columnName = "ScanNum"; if (columnMapping.ContainsKey(SCAN_NUM)) peak.ScanIms = int.Parse(columns[columnMapping[SCAN_NUM]]); columnName = "MZ"; if (columnMapping.ContainsKey(MZ)) peak.Mz = double.Parse(columns[columnMapping[MZ]]); columnName = "Intensity"; if (columnMapping.ContainsKey(INTENSITY)) peak.Intensity = (int)Math.Round(double.Parse(columns[columnMapping[INTENSITY]])); return peak; } catch (Exception) { Console.WriteLine("Error parsing column " + columnName + " in line: " + line); throw; } }