private List <Tuple <double, PointPairList> > GetMS3Spectra(int scan) { var result = new List <Tuple <double, PointPairList> >(); for (int i = scan + 1; i <= lastScan; i++) { var mslevel = reader.GetMsLevel(i); if (mslevel != 3) { break; } var pplms3 = new PointPairList(); var ms3spectra = GetPeakList(i); var ms3precursor = reader.GetPrecursorPeak(i); foreach (var m in ms3spectra) { pplms3.Add(new PointPair(m.Mz, m.Intensity)); } result.Add(new Tuple <double, PointPairList>(ms3precursor.Mz, pplms3)); } result.Sort((m1, m2) => m1.Item1.CompareTo(m2.Item1)); return(result); }
private List <SrmScan> GetMRMScans(string directory) { var fileName = GetPeakFileName(directory); if (File.Exists(fileName)) { SetProgressMessage("Reading scan from " + fileName + " ..."); return(new SrmScanFileFormat().ReadFromFile(fileName)); } else { List <PeakList <Peak> > pkls = new List <PeakList <Peak> >(); SetProgressMessage("Reading scan from " + directory + " ..."); IRawFile reader = RawFileFactory.GetRawFileReader(directory); try { var firstCount = reader.GetFirstSpectrumNumber(); var lastCount = reader.GetLastSpectrumNumber(); Progress.SetRange(firstCount, lastCount); Progress.SetPosition(firstCount); for (int i = firstCount; i <= lastCount; i++) { if (reader.GetMsLevel(i) != 2) { continue; } if (Progress.IsCancellationPending()) { throw new UserTerminatedException(); } Progress.Increment(1); var pkl = reader.GetPeakList(i); var precursor = reader.GetPrecursorPeak(i); if (precursor != null) { pkl.PrecursorMZ = precursor.Mz; pkl.PrecursorCharge = precursor.Charge; } pkl.ScanTimes.Add(new ScanTime(i, reader.ScanToRetentionTime(i))); pkls.Add(pkl); } List <SrmScan> result = new List <SrmScan>(); pkls.ForEach(m => m.ForEach(n => result.Add(new SrmScan(m.PrecursorMZ, n.Mz, m.ScanTimes[0].RetentionTime, n.Intensity, true)))); new SrmScanFileFormat().WriteToFile(fileName, result); SetProgressMessage("finished."); return(result); } finally { reader.Close(); } } }
public List <PrecursorItem> QueryPrecursorFromProductIon(QueryItem productIon, double ppmProductTolerance, double ppmPrecursorTolerance) { List <PrecursorItem> result = new List <PrecursorItem>(); int firstScan = reader.GetFirstSpectrumNumber(); int lastScan = reader.GetLastSpectrumNumber(); double mzTolerance = PrecursorUtils.ppm2mz(productIon.ProductIonMz, ppmProductTolerance); PeakList <Peak> lastFullScan = new PeakList <Peak>(); Progress.SetRange(firstScan, lastScan); for (int scan = firstScan; scan <= lastScan; scan++) { Progress.SetPosition(scan); if (Progress.IsCancellationPending()) { throw new UserTerminatedException(); } //ignore ms 1 if (reader.GetMsLevel(scan) == 1) { lastFullScan = ReadScan(scan); continue; } //read all peaks PeakList <Peak> pkl = ReadScan(scan); //find product ions PeakList <Peak> productIons = pkl.FindPeak(productIon.ProductIonMz, mzTolerance); if (productIons.Count == 0) { continue; } //get minimum product ion intensity double maxIntensity = pkl.FindMaxIntensityPeak().Intensity; double relativeIntensity = productIons.FindMaxIntensityPeak().Intensity / maxIntensity; if (relativeIntensity < productIon.MinRelativeIntensity) { continue; } Peak peak = reader.GetPrecursorPeak(scan); double precursorMzTolerance = PrecursorUtils.ppm2mz(peak.Mz, ppmPrecursorTolerance); var precursorPkl = lastFullScan.FindPeak(peak.Mz, precursorMzTolerance); bool isotopic = false; if (precursorPkl.Count == 0) { isotopic = true; precursorPkl = lastFullScan.FindPeak(peak.Mz - 1.0, precursorMzTolerance); } if (precursorPkl.Count == 0) { precursorPkl = lastFullScan.FindPeak(peak.Mz + 1.0, precursorMzTolerance); } var precursorInFullMs = precursorPkl.FindMaxIntensityPeak(); var precursor = new PrecursorItem() { Scan = scan, ProductIonRelativeIntensity = relativeIntensity }; if (isotopic && precursorInFullMs != null) { precursor.PrecursorMZ = precursorInFullMs.Mz; precursor.IsIsotopic = true; } else { precursor.PrecursorMZ = peak.Mz; precursor.IsIsotopic = false; } if (precursorInFullMs != null) { precursor.PrecursorIntensity = precursorInFullMs.Intensity; } result.Add(precursor); } var precursorMzs = from item in result group item by item.PrecursorMZ into mzGroup let mzcount = mzGroup.Where(m => m.PrecursorIntensity > 0).Count() orderby mzcount descending select mzGroup.Key; foreach (var mz in precursorMzs) { double mzPrecursorTolerance = PrecursorUtils.ppm2mz(mz, ppmPrecursorTolerance); foreach (var item in result) { if (!item.IsIsotopic) { continue; } if (Math.Abs(item.PrecursorMZ - mz) <= mzPrecursorTolerance) { item.PrecursorMZ = mz; } } } return(result); }