public void ReadMzMLChromatogramsTestDelayedRandom(string inputFileRelativePath, int expectedChromatograms, bool immediateRandomAccess) { if (!TestPath.FindInputFile(inputFileRelativePath, out var sourceFile)) { Console.WriteLine("File not found: " + inputFileRelativePath); return; } using (var reader = new SimpleMzMLReader(sourceFile.FullName, immediateRandomAccess, true)) { if (!immediateRandomAccess) { // For non-random access readers, the number of chromatograms (as reported by NumChromatograms) // will not get populated until after all the spectra (if any) have been read // Therefore, NumChromatograms should currently be zero since immediateRandomAccess was false Assert.AreEqual(0, reader.NumChromatograms); // You cannot use reader.TryMakeRandomAccessCapable() to make the chromatograms available // Thus, exit this method return; } Assert.AreEqual(expectedChromatograms, reader.NumChromatograms); var stepSize = Math.Max(1, expectedChromatograms / 100); var chromatogramNumber = 1; while (chromatogramNumber <= expectedChromatograms) { var chrom = reader.ReadChromatogram(chromatogramNumber); Console.WriteLine("Chromatogram {0,2}, NativeID {1,-35} has {2:N0} data points", chrom.Index, chrom.Id, chrom.Intensities.Length); chromatogramNumber += stepSize; } } }
//[TestCase(@"MzML\QC_Shew_16_01-15f_MPA_02redo_8Nov16_Tiger_16-02-14.mzML.gz", 9293)] // implemented, but decompresses first public void ReadMzMLChromatogramsTestRandom(string inputFileRelativePath, int expectedChromatograms) { if (!TestPath.FindInputFile(inputFileRelativePath, out var sourceFile)) { Console.WriteLine("File not found: " + inputFileRelativePath); return; } using (var reader = new SimpleMzMLReader(sourceFile.FullName, true, true)) { Assert.AreEqual(expectedChromatograms, reader.NumChromatograms); var chromCount = 0; foreach (var chrom in reader.ReadAllChromatograms(true)) { if (chrom == null) { Console.WriteLine("ReadAllChromatograms returned null for chromatogram index {0}", chromCount); } else { Console.WriteLine("Chromatogram {0}, NativeID {1,-45} has {2:N0} data points", chrom.Index, chrom.Id, chrom.Intensities.Length); } chromCount++; } Assert.AreEqual(expectedChromatograms, chromCount); } }
public void ReadMzMLTest(string inputFileRelativePath, int expectedSpectra, bool includePeaks) { if (!TestPath.FindInputFile(inputFileRelativePath, out var sourceFile)) { Console.WriteLine("File not found: " + inputFileRelativePath); return; } using (var reader = new SimpleMzMLReader(sourceFile.FullName, false, true)) { Assert.AreEqual(expectedSpectra, reader.NumSpectra); var specCount = 0; foreach (var spec in reader.ReadAllSpectra(includePeaks)) { if (specCount < 100 || specCount >= expectedSpectra - 100) { Console.WriteLine("Spectrum {0,4}, NativeID {1,-45} has {2:N0} data points", spec.ScanNumber, spec.NativeId, spec.Peaks.Length); } else if (specCount == 100) { Console.WriteLine("..."); } specCount++; } Assert.AreEqual(expectedSpectra, specCount); } }
public MzMLFusionContainer(string filename) { this.filename = filename; if (filename != null) { SimpleMzMLReader reader = new SimpleMzMLReader(filename); _spectra = reader.ReadAllSpectra(); } }
public void ReadMzMLChromatogramsTestNonRandom(string inputFileRelativePath, int expectedSpectra, int expectedChromatograms) { if (!TestPath.FindInputFile(inputFileRelativePath, out var sourceFile)) { Console.WriteLine("File not found: " + inputFileRelativePath); return; } using (var reader = new SimpleMzMLReader(sourceFile.FullName, false, true)) { Assert.AreEqual(expectedSpectra, reader.NumSpectra); if (expectedSpectra != 0) { Assert.AreEqual(0, reader.NumChromatograms); } var specCount = 0; foreach (var spec in reader.ReadAllSpectra(true)) { if (specCount < 100 || specCount >= expectedSpectra - 100) { Console.WriteLine("Spectrum {0,4}, NativeID {1,-45} has {2:N0} data points", spec.ScanNumber, spec.NativeId, spec.Peaks.Length); } else if (specCount == 100) { Console.WriteLine("..."); } specCount++; } Assert.AreEqual(expectedSpectra, specCount); Assert.AreEqual(expectedChromatograms, reader.NumChromatograms); var chromCount = 0; foreach (var chrom in reader.ReadAllChromatograms(false)) { if (chrom == null) { Console.WriteLine("ReadAllChromatograms returned null for chromatogram index {0}", chromCount); } else { Console.WriteLine("Chromatogram {0}, NativeID {1,-45} has {2:N0} data points", chrom.Index, chrom.Id, chrom.Intensities.Length); } chromCount++; } Assert.AreEqual(expectedChromatograms, reader.NumChromatograms); Assert.AreEqual(expectedChromatograms, chromCount); } }
public void ReadMzMLCompareScanNumbers(string inputFileRelativePath, string artificialScanNumberList, string expectedActualScanNumberList) { if (!TestPath.FindInputFile(inputFileRelativePath, out var sourceFile)) { Console.WriteLine("File not found: " + inputFileRelativePath); return; } var artificialScanNumbers = ParseOrderedIntegerList(artificialScanNumberList); var expectedActualScanNumbers = ParseOrderedIntegerList(expectedActualScanNumberList); // Run the test twice, first with randomAccess disabled, then with randomAccess enabled for (var i = 0; i < 2; i++) { var randomAccess = i > 0; using (var reader = new SimpleMzMLReader(sourceFile.FullName, randomAccess, true)) { for (var j = 0; j < artificialScanNumbers.Count; j++) { var artificialScanNumber = artificialScanNumbers[j]; var expectedScanNumber = expectedActualScanNumbers[j]; var spectrum = reader.ReadMassSpectrum(artificialScanNumber, false); if (expectedScanNumber <= 0) { Console.WriteLine("Spectrum {0,4} does not exist; this was expected", artificialScanNumber); Assert.IsNull(spectrum); continue; } Assert.IsNotNull(spectrum); Console.WriteLine("Spectrum {0,4}, NativeID {1,-45}, scan {2,4}", spectrum.ScanNumber, spectrum.NativeId, spectrum.NativeIdScanNumber); Assert.AreEqual(expectedScanNumber, spectrum.NativeIdScanNumber); var comparisonSpectrum = reader.GetSpectrumForScan(spectrum.NativeIdScanNumber, false); Assert.AreEqual(comparisonSpectrum.NativeId, spectrum.NativeId); } } Console.WriteLine(); } }
public void ReadMzMLTestRetrieveByScanNumber(string inputFileRelativePath, int expectedSpectra, bool includePeaks, string scanNumberList, string expectedMissingScanNumbers) { if (!TestPath.FindInputFile(inputFileRelativePath, out var sourceFile)) { Console.WriteLine("File not found: " + inputFileRelativePath); return; } var scanNumbers = ParseDelimitedIntegerList(scanNumberList); var expectedMissingScans = ParseDelimitedIntegerList(expectedMissingScanNumbers); using (var reader = new SimpleMzMLReader(sourceFile.FullName, true, true)) { Assert.AreEqual(expectedSpectra, reader.NumSpectra); foreach (var scanNumber in scanNumbers) { var spec = reader.GetSpectrumForScan(scanNumber, includePeaks); if (spec == null) { if (expectedMissingScans.Contains(scanNumber)) { Console.WriteLine("Scan {0} not found; this is expected", scanNumber); continue; } Assert.Fail("GetSpectrumForScan returned null for scan {0}", scanNumber); } if (includePeaks) { Console.WriteLine("Spectrum {0,4}, NativeID {1,-45}, scan {2,4} has {3:N0} data points", spec.ScanNumber, spec.NativeId, spec.NativeIdScanNumber, spec.Peaks.Length); } else { Console.WriteLine("Spectrum {0,4}, NativeID {1,-45}, scan {2,4} (peaks not loaded)", spec.ScanNumber, spec.NativeId, spec.NativeIdScanNumber); } Assert.AreEqual(scanNumber, spec.NativeIdScanNumber); } } }
public void ReadMzMLTestRandom(string inputFileRelativePath, int expectedSpectra, bool includePeaks, bool immediateRandomAccess) { if (!TestPath.FindInputFile(inputFileRelativePath, out var sourceFile)) { Console.WriteLine("File not found: " + inputFileRelativePath); return; } using (var reader = new SimpleMzMLReader(sourceFile.FullName, immediateRandomAccess, true)) { if (!immediateRandomAccess) { reader.TryMakeRandomAccessCapable(); } Assert.AreEqual(expectedSpectra, reader.NumSpectra); var stepSize = Math.Max(1, expectedSpectra / 100); // Note: calling .ReadMassSpectrum with scanNumber = 1 returns the first spectrum in the file, regardless of its actual scan number var scanNumber = 1; while (scanNumber <= expectedSpectra) { var spec = reader.ReadMassSpectrum(scanNumber, includePeaks); if (includePeaks) { Console.WriteLine("Spectrum {0,4}, NativeID {1,-45}, scan {2,4} has {3:N0} data points", spec.ScanNumber, spec.NativeId, spec.NativeIdScanNumber, spec.Peaks.Length); } else { Console.WriteLine("Spectrum {0,4}, NativeID {1,-45}, scan {2,4} (peaks not loaded)", spec.ScanNumber, spec.NativeId, spec.NativeIdScanNumber); } scanNumber += stepSize; } } }
public List <CompoundData> ReadSpectraData(List <CompoundData> combinedTransitions) { using (var reader = new SimpleMzMLReader(DatasetPath)) { foreach (var spectrum in reader.ReadAllSpectra(true)) { if (spectrum.Precursors.Count == 0) { continue; } var time = spectrum.ScanStartTime; var precursorMz = spectrum.Precursors[0].SelectedIons[0].SelectedIonMz; var matches = combinedTransitions.Where(x => x.StartTimeMinutes <= time && time <= x.StopTimeMinutes && Math.Abs(x.PrecursorMz - precursorMz) < 0.01); foreach (var match in matches) { foreach (var trans in match.Transitions) { foreach (var scanWindow in spectrum.ScanWindows.Where(x => x.LowerLimit <= trans.ProductMz && trans.ProductMz <= x.UpperLimit)) { //foreach (var peakMatch in srmSpec.Peaks.Where(x => Math.Abs(trans.ProductMz - x.Mz) < 0.01)) foreach (var peakMatch in spectrum.Peaks.Where(x => scanWindow.LowerLimit <= x.Mz && x.Mz <= scanWindow.UpperLimit)) { var intensity = peakMatch.Intensity; trans.IntensitySum += intensity; trans.Intensities.Add(new TransitionData.DataPoint(spectrum.ScanNumber, time, intensity)); if (intensity > trans.MaxIntensity) { trans.MaxIntensity = intensity; trans.MaxIntensityTime = time; } } } } } } var medianScanTimeDiff = 0.001; foreach (var chromatogram in reader.ReadAllChromatograms(true)) { if (chromatogram.CVParams.Any(x => x.TermInfo.Cvid == CV.CVID.MS_total_ion_current_chromatogram)) { // First chromatogram, use it to determine approximate scan times var diffs = new List <double>(chromatogram.Times.Length); var lastTime = 0.0; foreach (var time in chromatogram.Times) { diffs.Add(time - lastTime); lastTime = time; } diffs.Sort(); medianScanTimeDiff = diffs[diffs.Count / 2]; } if (!chromatogram.CVParams.Any(x => x.TermInfo.Cvid == CV.CVID.MS_selected_reaction_monitoring_chromatogram)) { continue; } var precursorMz = chromatogram.Precursor.IsolationWindow.TargetMz; var productMz = chromatogram.Product.TargetMz; var matches = combinedTransitions.Where(x => Math.Abs(x.PrecursorMz - precursorMz) < 0.01); foreach (var match in matches) { foreach (var trans in match.Transitions.Where(x => Math.Abs(x.ProductMz - productMz) < 0.01)) { for (var i = 0; i < chromatogram.Times.Length; i++) { var time = chromatogram.Times[i]; var intensity = chromatogram.Intensities[i]; trans.IntensitySum += intensity; var estimatedScanNum = (int)Math.Round(time / medianScanTimeDiff, MidpointRounding.AwayFromZero); trans.Intensities.Add(new TransitionData.DataPoint(estimatedScanNum, time, intensity)); if (intensity > trans.MaxIntensity) { trans.MaxIntensity = intensity; trans.MaxIntensityTime = time; } } } } } } return(combinedTransitions.ToList()); }
public void TestGetParentScan(string inputFileRelativePath, int startScan, int endScan, params int[] expectedPrecursorScans) { if (!TestPath.FindInputFile(inputFileRelativePath, out var sourceFile)) { Console.WriteLine("File not found: " + inputFileRelativePath); return; } using (var reader = new SimpleMzMLReader(sourceFile.FullName, true, true)) { for (var scanNumber = startScan; scanNumber <= endScan; scanNumber++) { var spectrum = reader.ReadMassSpectrum(scanNumber, false); if (spectrum == null) { continue; } var targetIndex = scanNumber - startScan; int expectedPrecursorScan; if (targetIndex >= 0 && targetIndex < expectedPrecursorScans.Length) { expectedPrecursorScan = expectedPrecursorScans[targetIndex]; } else { expectedPrecursorScan = 0; } if (spectrum.Precursors.Count == 0) { Console.WriteLine("Scan {0} is not a fragmentation scan", spectrum.ScanNumber); if (expectedPrecursorScan > 0) { Assert.Fail("Scan {0} was supposed to have precursor scan {1}, but it has no precursors", spectrum.ScanNumber, expectedPrecursorScan); } continue; } var precursorSpectrumReference = spectrum.Precursors[0].PrecursorSpectrumRef; // Parse out scan number from the precursor spectrum reference // "controllerType=0 controllerNumber=1 scan=1" if (!NativeIdConversion.TryGetScanNumberLong(precursorSpectrumReference, out var precursorScan)) { Assert.Fail("Invalid spectrum reference: " + precursorSpectrumReference); } Console.WriteLine("Scan {0} has precursor {1:F2} m/z, precursor scan {2}", spectrum.ScanNumber, spectrum.Precursors[0].IsolationWindow.TargetMz, precursorScan); if (expectedPrecursorScan != 0) { Assert.AreEqual(expectedPrecursorScan, precursorScan, "Precursor scan number does not match the expected value for scan {0}", spectrum.ScanNumber); } } } }
public void ReadSpectraData(List <IdentData> psmResults) { var dataByNativeId = new Dictionary <string, List <IdentData> >(); var dataByScan = new Dictionary <int, List <IdentData> >(); foreach (var psm in psmResults) { if (!string.IsNullOrWhiteSpace(psm.NativeId)) { if (!dataByNativeId.TryGetValue(psm.NativeId, out var results)) { results = new List <IdentData>(); dataByNativeId.Add(psm.NativeId, results); } results.Add(psm); } if (psm.ScanIdInt >= 0) { if (!dataByScan.TryGetValue(psm.ScanIdInt, out var results)) { results = new List <IdentData>(); dataByScan.Add(psm.ScanIdInt, results); } results.Add(psm); } } if (psmResults.Count == 0) { OnWarningEvent("Empty psmResults were sent to ReadSpectraData; nothing to do"); return; } using var reader = new SimpleMzMLReader(MzMLFilePath); var spectraRead = 0; var lastStatus = DateTime.UtcNow; var maxScanId = psmResults.Max(x => x.ScanIdInt); foreach (var spectrum in reader.ReadAllSpectra(false)) { spectraRead++; var nativeIdScanNumber = spectrum.NativeIdScanNumber; if (nativeIdScanNumber > 0 && nativeIdScanNumber > maxScanId) { // All of the PSMs have been processed break; } var spectrumScanNumber = nativeIdScanNumber == 0 ? spectrum.ScanNumber : nativeIdScanNumber; if (spectrum.MsLevel <= 1) { continue; } // Find PSMs associated with the current spectrum // First lookup using NativeId // If no match, lookup using the scan number List <IdentData> psmsForSpectrum; if (dataByNativeId.TryGetValue(spectrum.NativeId, out var psmsFromNativeId)) { psmsForSpectrum = psmsFromNativeId; } else if (dataByScan.TryGetValue(spectrumScanNumber, out var psmsFromScanNumber)) { psmsForSpectrum = psmsFromScanNumber; } else { continue; } foreach (var psm in psmsForSpectrum) { var experimentalMzRefined = spectrum.GetThermoMonoisotopicMz(); if (Math.Abs(experimentalMzRefined) > 0) { psm.ExperMzRefined = experimentalMzRefined; } else if (spectrum.Precursors.Count > 0 && spectrum.Precursors[0].SelectedIons.Count > 0) { psm.ExperMzRefined = spectrum.Precursors[0].SelectedIons[0].SelectedIonMz; } else { OnWarningEvent("Could not determine the experimental precursor m/z for scan {0}", spectrumScanNumber); } if (psm.ScanTimeSeconds <= 0) { // StartTime is stored in minutes, we've been using seconds. psm.ScanTimeSeconds = spectrum.ScanStartTime * 60; } } if (DateTime.UtcNow.Subtract(lastStatus).TotalSeconds < 5) { continue; } Console.WriteLine(" {0:F0}% complete", spectraRead / (double)reader.NumSpectra * 100); lastStatus = DateTime.UtcNow; } }