public void TestGetScanCountsByScanType( string dotDFolderName, int scanStart, int scanEnd, int expectedMS1, int expectedMS2, int expectedTotalScanCount) { var dataFolder = GetBrukerDataFolder(dotDFolderName); using (var reader = new MSDataFileReader(dataFolder.FullName)) { Console.WriteLine("Parsing scan headers for {0}", dataFolder.Name); var scanCount = reader.SpectrumCount; Console.WriteLine("Total scans: {0}", scanCount); Assert.AreEqual(expectedTotalScanCount, scanCount, "Total scan count mismatch"); Console.WriteLine(); var scanNumberToIndexMap = reader.GetScanToIndexMapping(); var scanCountMS1 = 0; var scanCountMS2 = 0; foreach (var scan in scanNumberToIndexMap.Where(x => x.Key >= scanStart && x.Key <= scanEnd)) { // var scanNumber = scan.Key; var spectrumIndex = scan.Value; var spectrum = reader.GetSpectrum(spectrumIndex, false); if (spectrum.Level > 1) { scanCountMS2++; } else { scanCountMS1++; } } Console.WriteLine("scanCountMS1={0}", scanCountMS1); Console.WriteLine("scanCountMS2={0}", scanCountMS2); Assert.AreEqual(expectedMS1, scanCountMS1, "MS1 scan count mismatch"); Assert.AreEqual(expectedMS2, scanCountMS2, "MS2 scan count mismatch"); } }
public void TestGetScanData(string dotDFolderName, int scanStart, int scanEnd) { var expectedData = new Dictionary <string, Dictionary <int, string> >(); // Keys in this dictionary are the scan number of data being retrieved var file1Data = new Dictionary <int, string> { { 5, "5 39775 39775 982.741 0.0E+0 1410.843 8.7E+4" }, { 6, "6 39775 39775 982.741 0.0E+0 1410.843 9.1E+4" }, { 7, "7 39775 39775 982.741 0.0E+0 1410.843 8.7E+4" }, { 8, "8 39775 39775 982.741 0.0E+0 1410.843 4.5E+4" }, { 9, "9 39775 39775 982.741 0.0E+0 1410.843 1.4E+5" } }; expectedData.Add("Humira_100fmol_20121026_hi_res_9_01_716", file1Data); var file2Data = new Dictionary <int, string> { { 1, "1 7615807 7615807 110.561 3.8E+4 202.468 4.2E+5" } }; expectedData.Add("Blank-2_05May16_Leopard_Infuse_1_01_7976", file2Data); var dataFolder = GetBrukerDataFolder(dotDFolderName); using (var reader = new MSDataFileReader(dataFolder.FullName)) { Console.WriteLine("Scan data for {0}", dataFolder.Name); Console.WriteLine("{0} {1,-8} {2,-8} {3,-8} {4,-8} {5,-8} {6}", "Scan", "MzCount", "IntCount", "FirstMz", "FirstInt", "MidMz", "MidInt"); var scanNumberToIndexMap = reader.GetScanToIndexMapping(); foreach (var scan in scanNumberToIndexMap.Where(x => x.Key >= scanStart && x.Key <= scanEnd)) { var scanNumber = scan.Key; var spectrumIndex = scan.Value; var spectrum = reader.GetSpectrum(spectrumIndex, true); var dataPointsRead = spectrum.Mzs.Length; Assert.IsTrue(dataPointsRead > 0, "GetScanData returned 0 for scan {0}", scanNumber); var midPoint = (int)(spectrum.Intensities.Length / 2f); var scanSummary = string.Format( "{0} {1,-8} {2,-8} {3,-8:0.000} {4,-8:0.0E+0} {5,-8:0.000} {6:0.0E+0}", scanNumber, spectrum.Mzs.Length, spectrum.Intensities.Length, spectrum.Mzs[0], spectrum.Intensities[0], spectrum.Mzs[midPoint], spectrum.Intensities[midPoint]); Console.WriteLine(scanSummary); if (!expectedData.TryGetValue(Path.GetFileNameWithoutExtension(dataFolder.Name), out var expectedDataThisFile)) { Assert.Fail("Dataset {0} not found in dictionary expectedData", dataFolder.Name); } if (expectedDataThisFile.TryGetValue(scanNumber, out var expectedDataDetails)) { Assert.AreEqual(expectedDataDetails, scanSummary, "Scan details mismatch, scan " + scanNumber); } } } }
public void TestCorruptDataHandling( string dotDFolderName, int scanStart, int scanEnd, int expectedMS1, int expectedMS2) { var dataFolder = GetBrukerDataFolder(dotDFolderName); try { using (var reader = new MSDataFileReader(dataFolder.FullName)) { var scanCount = reader.SpectrumCount; Console.WriteLine("Scan count for {0}: {1}", dataFolder.Name, scanCount); if (expectedMS1 + expectedMS2 == 0) { Assert.IsTrue(scanCount == 0, "ScanCount is non-zero, while we expected it to be 0"); } else { Assert.IsTrue(scanCount > 0, "ScanCount is zero, while we expected it to be > 0"); } var scanNumberToIndexMap = reader.GetScanToIndexMapping(); var scanCountMS1 = 0; var scanCountMS2 = 0; foreach (var scan in scanNumberToIndexMap.Where(x => x.Key >= scanStart && x.Key <= scanEnd)) { var scanNumber = scan.Key; var spectrumIndex = scan.Value; try { var spectrum = reader.GetSpectrum(spectrumIndex, true); var cvScanInfo = reader.GetSpectrumScanInfo(spectrumIndex); Assert.IsTrue(cvScanInfo != null, "GetSpectrumScanInfo returned a null object for scan {0}", scanNumber); if (spectrum.Level > 1) { scanCountMS2++; } else { scanCountMS1++; } var dataPointCount = spectrum.Mzs.Length; Assert.IsTrue(dataPointCount > 0, "Data point count is 0 for scan {0}", scanNumber); Assert.IsTrue(spectrum.Mzs.Length > 0, "m/z data is empty for scan {0}", scanNumber); Assert.IsTrue(spectrum.Intensities.Length > 0, "Intensity data is empty for scan {0}", scanNumber); Assert.IsTrue(spectrum.Mzs.Length == spectrum.Intensities.Length, "Array length mismatch for m/z and intensity data for scan {0}", scanNumber); } catch (Exception ex) { Console.WriteLine("Exception reading scan {0}: {1}", scanNumber, ex.Message); Assert.Fail("Exception reading scan {0}", scanNumber); } } Console.WriteLine("scanCountMS1={0}", scanCountMS1); Console.WriteLine("scanCountMS2={0}", scanCountMS2); Assert.AreEqual(expectedMS1, scanCountMS1, "MS1 scan count mismatch"); Assert.AreEqual(expectedMS2, scanCountMS2, "MS2 scan count mismatch"); } } catch (Exception ex) { if (expectedMS1 + expectedMS2 == 0) { Console.WriteLine("Error opening .D folder (this was expected):\n{0}", ex.Message); } else { var msg = string.Format("Exception opening .D folder {0}:\n{1}", dotDFolderName, ex.Message); Console.WriteLine(msg); Assert.Fail(msg); } } }
public void TestGetScanInfo(string dotDFolderName, int scanStart, int scanEnd, int expectedMS1, int expectedMS2) { var expectedData = new Dictionary <string, Dictionary <int, string> >(); // Keys in this dictionary are the scan number whose metadata is being retrieved var file1Data = new Dictionary <int, string> { // Scan MSLevel NumPeaks RetentionTime ScanStartTime DriftTimeMsec LowMass HighMass TotalIonCurrent BasePeakMZ BasePeakIntensity ParentIonMZ { 1, "1 1 7794096 0.59 35.34 0 92 1300 7.1E+9 0.000 5.5E+8 0.00 positive False 696.00" }, { 2, "2 1 7794096 1.10 66.27 0 92 1300 7.2E+9 0.000 5.6E+8 0.00 positive False 696.00" }, { 3, "3 1 7794096 1.62 97.18 0 92 1300 7.2E+9 0.000 5.5E+8 0.00 positive False 696.00" }, { 4, "4 1 7794096 2.14 128.17 0 92 1300 7.1E+9 0.000 5.3E+8 0.00 positive False 696.00" }, { 5, "5 1 7794096 2.65 159.12 0 92 1300 7.1E+9 0.000 5.4E+8 0.00 positive False 696.00" } }; expectedData.Add("2016_04_12_Background_000001", file1Data); var file2Data = new Dictionary <int, string> { { 1, "1 1 7615807 3.58 214.92 0 111 1200 3.6E+10 0.000 3.1E+9 0.00 negative False 655.50" } }; expectedData.Add("Blank-2_05May16_Leopard_Infuse_1_01_7976", file2Data); var file3Data = new Dictionary <int, string> { { 15, "15 1 39775 2.38 142.89 0 983 984 0.0E+0 0.000 0.0E+0 0.00 positive False 983.50" }, { 16, "16 1 39775 2.53 152.06 0 983 984 0.0E+0 0.000 0.0E+0 0.00 positive False 983.50" }, { 17, "17 1 39775 2.69 161.24 0 983 984 0.0E+0 0.000 0.0E+0 0.00 positive False 983.50" }, { 18, "18 1 39775 2.84 170.41 0 983 984 0.0E+0 0.000 0.0E+0 0.00 positive False 983.50" }, { 19, "19 1 39775 2.99 179.58 0 983 984 0.0E+0 0.000 0.0E+0 0.00 positive False 983.50" }, { 20, "20 1 39775 3.15 188.76 0 983 984 0.0E+0 0.000 0.0E+0 0.00 positive False 983.50" } }; expectedData.Add("Humira_100fmol_20121026_hi_res_9_01_716", file3Data); var file4Data = new Dictionary <int, string> { { 1, "1 2 8214787 2.20 131.89 0 207 10000 6.0E+8 0.000 1.3E+7 1600.00 cid negative False 1600.00" } }; expectedData.Add("MZ20160603PPS_edta_000004", file4Data); var dataFolder = GetBrukerDataFolder(dotDFolderName); using (var reader = new MSDataFileReader(dataFolder.FullName)) { Console.WriteLine("Scan info for {0}", dataFolder.Name); Console.WriteLine("{0} {1} {2} {3} {4} {5} {6} {7} {8} {9} {10} {11} {12} {13} {14} {15}", "Scan", "MSLevel", "NumPeaks", "RetentionTime", "ScanStartTime", "DriftTimeMsec", "LowMass", "HighMass", "TotalIonCurrent", "BasePeakMZ", "BasePeakIntensity", "ParentIonMZ", "ActivationType", "IonMode", "IsCentroided", "IsolationMZ"); var scanNumberToIndexMap = reader.GetScanToIndexMapping(); var scanCountMS1 = 0; var scanCountMS2 = 0; foreach (var scan in scanNumberToIndexMap.Where(x => x.Key >= scanStart && x.Key <= scanEnd)) { var scanNumber = scan.Key; var spectrumIndex = scan.Value; var spectrum = reader.GetSpectrum(spectrumIndex, true); var spectrumParams = reader.GetSpectrumCVParamData(spectrumIndex); var cvScanInfo = reader.GetSpectrumScanInfo(spectrumIndex); Assert.IsTrue(spectrum != null, "GetSpectrum returned a null object for scan " + scanNumber); var totalIonCurrent = cvParamUtilities.GetCvParamValueDbl(spectrumParams, cvParamUtilities.CVIDs.MS_TIC); var basePeakMZ = cvParamUtilities.GetCvParamValueDbl(spectrumParams, cvParamUtilities.CVIDs.MS_base_peak_m_z); var basePeakIntensity = cvParamUtilities.GetCvParamValueDbl(spectrumParams, cvParamUtilities.CVIDs.MS_base_peak_intensity); double isolationMZ = 0; double parentIonMZ = 0; var activationType = string.Empty; if (spectrum.Precursors.Length > 0) { var precursor = spectrum.Precursors[0]; isolationMZ = precursor.IsolationMz.GetValueOrDefault(); parentIonMZ = precursor.PrecursorMz.GetValueOrDefault(); if (precursor.ActivationTypes != null) { activationType = string.Join(", ", precursor.ActivationTypes); } } GetScanMetadata(cvScanInfo, out var scanStartTime, out var lowMass, out var highMass); var retentionTime = cvParamUtilities.CheckNull(spectrum.RetentionTime); var numPeaks = spectrum.Mzs.Length; var ionMode = spectrum.NegativeCharge ? "negative" : "positive"; var scanSummary = string.Format( "{0} {1} {2,5} {3,6:0.00} {4,6:0.00} {5:0} {6,3:0} {7,5:0} {8,6:0.0E+0} {9,8:0.000} {10,6:0.0E+0} {11,8:0.00} {12,-8} {13} {14,-5} {15,8:0.00}", scanNumber, spectrum.Level, numPeaks, retentionTime, scanStartTime, cvParamUtilities.CheckNull(spectrum.DriftTimeMsec), lowMass, highMass, totalIonCurrent, basePeakMZ, basePeakIntensity, parentIonMZ, activationType, ionMode, spectrum.Centroided, isolationMZ); Console.WriteLine(scanSummary); if (spectrum.Level > 1) { scanCountMS2++; } else { scanCountMS1++; } if (!expectedData.TryGetValue(Path.GetFileNameWithoutExtension(dataFolder.Name), out var expectedDataThisFile)) { Assert.Fail("Dataset {0} not found in dictionary expectedData", dataFolder.Name); } if (expectedDataThisFile.TryGetValue(scanNumber, out var expectedScanSummary)) { Assert.AreEqual(expectedScanSummary, scanSummary, "Scan summary mismatch, scan " + scanNumber); } var expectedNativeId = string.Format("scan={0}", scanNumber); Assert.AreEqual(spectrum.NativeId, expectedNativeId, "NativeId is not in the expected format for scan {0}", scanNumber); } Console.WriteLine("scanCountMS1={0}", scanCountMS1); Console.WriteLine("scanCountMS2={0}", scanCountMS2); Assert.AreEqual(expectedMS1, scanCountMS1, "MS1 scan count mismatch"); Assert.AreEqual(expectedMS2, scanCountMS2, "MS2 scan count mismatch"); } }