コード例 #1
0
        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");
            }
        }
コード例 #2
0
        public void TestGetScanInfo(string uimfFileName, int frameStart, int frameEnd, int expectedMS1, int expectedMS2)
        {
            var expectedData = new Dictionary <string, Dictionary <KeyValuePair <int, int>, string> >();

            // Keys in this dictionary are the FrameNum, ScanNum whose metadata is being retrieved
            var file1Data = new Dictionary <KeyValuePair <int, int>, string>
            {
                // Scan MSLevel NumPeaks RetentionTime DriftTimeMsec IonMobilityDriftTime LowMass HighMass TotalIonCurrent BasePeakMZ BasePeakIntensity ParentIonMZ ActivationType IonMode IsCentroided ScanStartTime IonInjectionTime FilterText
                { new KeyValuePair <int, int>(1, 0), "   1    0 1     3   0.01   0.01     0.00     0.00   0 14384 0.0E+0    0.000 0.0E+0     0.00          positive False  7192.23" },
                { new KeyValuePair <int, int>(1, 100), "   1  100 1  1317   0.01   0.01    24.68    24.68   0 14384 0.0E+0    0.000 0.0E+0     0.00          positive False  7192.23" },
                { new KeyValuePair <int, int>(1, 200), "   1  200 1     3   0.01   0.01    49.36    49.36   0 14384 0.0E+0    0.000 0.0E+0     0.00          positive False  7192.23" },
                { new KeyValuePair <int, int>(2, 0), "   2    0 1    16   0.25   0.25     0.00     0.00   0 14384 0.0E+0    0.000 0.0E+0     0.00          positive False  7192.23" },
                { new KeyValuePair <int, int>(2, 1), "   2    1 1     6   0.25   0.25     0.25     0.25   0 14384 0.0E+0    0.000 0.0E+0     0.00          positive False  7192.23" },
                { new KeyValuePair <int, int>(2, 100), "   2  100 1  3429   0.25   0.25    24.70    24.70   0 14384 0.0E+0    0.000 0.0E+0     0.00          positive False  7192.23" },
                { new KeyValuePair <int, int>(2, 200), "   2  200 1     9   0.25   0.25    49.39    49.39   0 14384 0.0E+0    0.000 0.0E+0     0.00          positive False  7192.23" },
                { new KeyValuePair <int, int>(3, 0), "   3    0 1    21   0.50   0.50     0.00     0.00   0 14384 0.0E+0    0.000 0.0E+0     0.00          positive False  7192.23" },
                { new KeyValuePair <int, int>(3, 100), "   3  100 1  4216   0.50   0.50    24.65    24.65   0 14384 0.0E+0    0.000 0.0E+0     0.00          positive False  7192.23" },
                { new KeyValuePair <int, int>(3, 200), "   3  200 1     3   0.50   0.50    49.31    49.31   0 14384 0.0E+0    0.000 0.0E+0     0.00          positive False  7192.23" },
                { new KeyValuePair <int, int>(4, 0), "   4    0 1     3   0.75   0.75     0.00     0.00   0 14384 0.0E+0    0.000 0.0E+0     0.00          positive False  7192.23" },
                { new KeyValuePair <int, int>(4, 1), "   4    1 1     6   0.75   0.75     0.25     0.25   0 14384 0.0E+0    0.000 0.0E+0     0.00          positive False  7192.23" },
                { new KeyValuePair <int, int>(4, 100), "   4  100 1  5640   0.75   0.75    24.58    24.58   0 14384 0.0E+0    0.000 0.0E+0     0.00          positive False  7192.23" },
                { new KeyValuePair <int, int>(4, 200), "   4  200 1     6   0.75   0.75    49.16    49.16   0 14384 0.0E+0    0.000 0.0E+0     0.00          positive False  7192.23" },
                { new KeyValuePair <int, int>(5, 0), "   5    0 1     9   1.00   1.00     0.00     0.00   0 14384 0.0E+0    0.000 0.0E+0     0.00          positive False  7192.23" },
                { new KeyValuePair <int, int>(5, 100), "   5  100 1  4605   1.00   1.00    24.70    24.70   0 14384 0.0E+0    0.000 0.0E+0     0.00          positive False  7192.23" },
                { new KeyValuePair <int, int>(5, 200), "   5  200 1     3   1.00   1.00    49.39    49.39   0 14384 0.0E+0    0.000 0.0E+0     0.00          positive False  7192.23" }
            };

            expectedData.Add("9_Peptide_Mix_16Oct14_Cedar_Infuse", file1Data);

            var file2Data = new Dictionary <KeyValuePair <int, int>, string>
            {
                { new KeyValuePair <int, int>(1, 38), "   1   38 1    15   0.01   0.01     6.11     6.11   0  2646 0.0E+0    0.000 0.0E+0     0.00          positive False  1322.76" },
                { new KeyValuePair <int, int>(1, 114), "   1  114 1  1215   0.01   0.01    18.34    18.34   0  2646 0.0E+0    0.000 0.0E+0     0.00          positive False  1322.76" },
                { new KeyValuePair <int, int>(1, 152), "   1  152 1   222   0.01   0.01    24.45    24.45   0  2646 0.0E+0    0.000 0.0E+0     0.00          positive False  1322.76" },
                { new KeyValuePair <int, int>(1, 228), "   1  228 1     3   0.01   0.01    36.67    36.67   0  2646 0.0E+0    0.000 0.0E+0     0.00          positive False  1322.76" },
                { new KeyValuePair <int, int>(1, 304), "   1  304 1     9   0.01   0.01    48.89    48.89   0  2646 0.0E+0    0.000 0.0E+0     0.00          positive False  1322.76" }
            };

            expectedData.Add("9pep_mix_1uM_4bit_50_3Jun16", file2Data);

            var file3Data = new Dictionary <KeyValuePair <int, int>, string>
            {
                { new KeyValuePair <int, int>(1, 100), "   1  100 1   504   0.01   0.01    16.37    16.37   0  2646 0.0E+0    0.000 0.0E+0     0.00          positive False  1322.79" },
                { new KeyValuePair <int, int>(2, 100), "   2  100 1   494   0.06   0.06    16.42    16.42   0  2646 0.0E+0    0.000 0.0E+0     0.00          positive False  1322.79" },
                { new KeyValuePair <int, int>(3, 100), "   3  100 1  1109   0.11   0.11    16.43    16.43   0  2646 0.0E+0    0.000 0.0E+0     0.00          positive False  1322.79" },
                { new KeyValuePair <int, int>(4, 0), "   4    0 1     3   0.17   0.17     0.00     0.00   0  2646 0.0E+0    0.000 0.0E+0     0.00          positive False  1322.79" },
                { new KeyValuePair <int, int>(4, 100), "   4  100 1  1061   0.17   0.17    16.41    16.41   0  2646 0.0E+0    0.000 0.0E+0     0.00          positive False  1322.79" },
                { new KeyValuePair <int, int>(5, 0), "   5    0 1     3   0.22   0.22     0.00     0.00   0  2646 0.0E+0    0.000 0.0E+0     0.00          positive False  1322.79" },
                { new KeyValuePair <int, int>(5, 100), "   5  100 1  1087   0.22   0.22    16.44    16.44   0  2646 0.0E+0    0.000 0.0E+0     0.00          positive False  1322.79" },
            };

            expectedData.Add("QC_Shew_IMER_500ng_Run-1_4May16_Oak_15-01-16", file3Data);

            var file4Data = new Dictionary <KeyValuePair <int, int>, string>
            {
                { new KeyValuePair <int, int>(1, 1), "   1    1 1   344   0.00   0.00     0.12     0.12   0  1700 0.0E+0    0.000 0.0E+0     0.00          positive False   849.87" },
                { new KeyValuePair <int, int>(1, 100), "   1  100 1   345   0.00   0.00    12.10    12.10   0  1700 0.0E+0    0.000 0.0E+0     0.00          positive False   849.87" },
                { new KeyValuePair <int, int>(1, 200), "   1  200 1   577   0.00   0.00    24.20    24.20   0  1700 0.0E+0    0.000 0.0E+0     0.00          positive False   849.87" },
                { new KeyValuePair <int, int>(1, 300), "   1  300 1   996   0.00   0.00    36.30    36.30   0  1700 0.0E+0    0.000 0.0E+0     0.00          positive False   849.87" },
                { new KeyValuePair <int, int>(1, 400), "   1  400 1   469   0.00   0.00    48.40    48.40   0  1700 0.0E+0    0.000 0.0E+0     0.00          positive False   849.87" },
                { new KeyValuePair <int, int>(1, 500), "   1  500 1   336   0.00   0.00    60.50    60.50   0  1700 0.0E+0    0.000 0.0E+0     0.00          positive False   849.87" },
                { new KeyValuePair <int, int>(1, 600), "   1  600 1   369   0.00   0.00    72.60    72.60   0  1700 0.0E+0    0.000 0.0E+0     0.00          positive False   849.87" },
                { new KeyValuePair <int, int>(1, 700), "   1  700 1   423   0.00   0.00    84.70    84.70   0  1700 0.0E+0    0.000 0.0E+0     0.00          positive False   849.87" },
                { new KeyValuePair <int, int>(2, 1), "   2    1 1   381   0.00   0.00     0.12     0.12   0  1700 0.0E+0    0.000 0.0E+0     0.00          positive False   849.87" },
                { new KeyValuePair <int, int>(2, 100), "   2  100 1   243   0.00   0.00    12.10    12.10   0  1700 0.0E+0    0.000 0.0E+0     0.00          positive False   849.87" },
                { new KeyValuePair <int, int>(2, 200), "   2  200 1   669   0.00   0.00    24.20    24.20   0  1700 0.0E+0    0.000 0.0E+0     0.00          positive False   849.87" },
                { new KeyValuePair <int, int>(2, 300), "   2  300 1   770   0.00   0.00    36.30    36.30   0  1700 0.0E+0    0.000 0.0E+0     0.00          positive False   849.87" },
                { new KeyValuePair <int, int>(2, 400), "   2  400 1   372   0.00   0.00    48.40    48.40   0  1700 0.0E+0    0.000 0.0E+0     0.00          positive False   849.87" },
                { new KeyValuePair <int, int>(2, 500), "   2  500 1   355   0.00   0.00    60.50    60.50   0  1700 0.0E+0    0.000 0.0E+0     0.00          positive False   849.87" },
                { new KeyValuePair <int, int>(2, 600), "   2  600 1   441   0.00   0.00    72.60    72.60   0  1700 0.0E+0    0.000 0.0E+0     0.00          positive False   849.87" },
                { new KeyValuePair <int, int>(2, 700), "   2  700 1   328   0.00   0.00    84.70    84.70   0  1700 0.0E+0    0.000 0.0E+0     0.00          positive False   849.87" },
                { new KeyValuePair <int, int>(3, 1), "   3    1 1   405   0.00   0.00     0.12     0.12   0  1700 0.0E+0    0.000 0.0E+0     0.00          positive False   849.87" },
                { new KeyValuePair <int, int>(3, 100), "   3  100 1   419   0.00   0.00    12.10    12.10   0  1700 0.0E+0    0.000 0.0E+0     0.00          positive False   849.87" },
                { new KeyValuePair <int, int>(3, 200), "   3  200 1   705   0.00   0.00    24.20    24.20   0  1700 0.0E+0    0.000 0.0E+0     0.00          positive False   849.87" },
                { new KeyValuePair <int, int>(3, 300), "   3  300 1  1080   0.00   0.00    36.30    36.30   0  1700 0.0E+0    0.000 0.0E+0     0.00          positive False   849.87" },
                { new KeyValuePair <int, int>(3, 400), "   3  400 1   387   0.00   0.00    48.40    48.40   0  1700 0.0E+0    0.000 0.0E+0     0.00          positive False   849.87" },
                { new KeyValuePair <int, int>(3, 500), "   3  500 1   423   0.00   0.00    60.50    60.50   0  1700 0.0E+0    0.000 0.0E+0     0.00          positive False   849.87" },
                { new KeyValuePair <int, int>(3, 600), "   3  600 1   402   0.00   0.00    72.60    72.60   0  1700 0.0E+0    0.000 0.0E+0     0.00          positive False   849.87" },
                { new KeyValuePair <int, int>(3, 700), "   3  700 1   333   0.00   0.00    84.70    84.70   0  1700 0.0E+0    0.000 0.0E+0     0.00          positive False   849.87" },
                { new KeyValuePair <int, int>(4, 1), "   4    1 1   348   0.00   0.00     0.12     0.12   0  1700 0.0E+0    0.000 0.0E+0     0.00          positive False   849.87" },
                { new KeyValuePair <int, int>(4, 100), "   4  100 1   343   0.00   0.00    12.10    12.10   0  1700 0.0E+0    0.000 0.0E+0     0.00          positive False   849.87" },
                { new KeyValuePair <int, int>(4, 200), "   4  200 1   625   0.00   0.00    24.20    24.20   0  1700 0.0E+0    0.000 0.0E+0     0.00          positive False   849.87" },
                { new KeyValuePair <int, int>(4, 300), "   4  300 1  1125   0.00   0.00    36.29    36.29   0  1700 0.0E+0    0.000 0.0E+0     0.00          positive False   849.87" },
                { new KeyValuePair <int, int>(4, 400), "   4  400 1   384   0.00   0.00    48.39    48.39   0  1700 0.0E+0    0.000 0.0E+0     0.00          positive False   849.87" },
                { new KeyValuePair <int, int>(4, 500), "   4  500 1   399   0.00   0.00    60.49    60.49   0  1700 0.0E+0    0.000 0.0E+0     0.00          positive False   849.87" },
                { new KeyValuePair <int, int>(4, 600), "   4  600 1   362   0.00   0.00    72.59    72.59   0  1700 0.0E+0    0.000 0.0E+0     0.00          positive False   849.87" },
                { new KeyValuePair <int, int>(4, 700), "   4  700 1   360   0.00   0.00    84.69    84.69   0  1700 0.0E+0    0.000 0.0E+0     0.00          positive False   849.87" }
            };

            expectedData.Add("20160524_TuneMix_1574V_neg_001", file4Data);


            var dataFile = GetUimfDataFile(uimfFileName);

            using (var reader = new MSDataFileReader(dataFile.FullName))
            {
                Console.WriteLine("Scan info for {0}", dataFile.Name);
                Console.WriteLine("{0} {1} {2} {3} {4} {5} {6} {7} {8} {9} {10} {11} {12} {13} {14} {15} {16} {17}",
                                  "Frame", "Scan", "MSLevel",
                                  "NumPeaks", "RetentionTime",
                                  "ScanStartTime",
                                  "DriftTimeMsec",
                                  "IonMobilityDriftTime",
                                  "LowMass", "HighMass", "TotalIonCurrent",
                                  "BasePeakMZ", "BasePeakIntensity",
                                  "ParentIonMZ", "ActivationType",
                                  "IonMode", "IsCentroided",
                                  "IsolationMZ");

                var frameScanPairToIndexMap = reader.GetUimfFrameScanPairToIndexMapping();

                var scanCountMS1 = 0;
                var scanCountMS2 = 0;

                foreach (var frame in frameScanPairToIndexMap)
                {
                    var frameNumber   = frame.Key.Key;
                    var scanNumber    = frame.Key.Value;
                    var spectrumIndex = frame.Value;

                    if (frameNumber < frameStart || frameNumber > frameEnd)
                    {
                        continue;
                    }

                    if (string.Equals(uimfFileName, "9pep_mix_1uM_4bit_50_3Jun16.uimf", StringComparison.InvariantCultureIgnoreCase))
                    {
                        if (!(scanNumber == 1 || scanNumber % 38 == 0))
                        {
                            continue;
                        }
                    }
                    else
                    {
                        if (!(scanNumber == 1 || scanNumber % 100 == 0))
                        {
                            continue;
                        }
                    }

                    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 frame {0}, scan {1} ", frameNumber, 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 ionMobilityDriftTime, 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,4} {1,4} {2} {3,5} {4,6:0.00} {5,6:0.00} {6,8:0.00} {7,8:0.00} {8,3:0} {9,5:0} {10,6:0.0E+0} {11,8:0.000} {12,6:0.0E+0} {13,8:0.00} {14,-8} {15} {16,-5} {17,8:0.00}",
                            frameNumber, scanNumber, spectrum.Level,
                            numPeaks, retentionTime, scanStartTime,
                            cvParamUtilities.CheckNull(spectrum.DriftTimeMsec),
                            ionMobilityDriftTime,
                            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(dataFile.Name), out var expectedDataThisFile))
                    {
                        Assert.Fail("Dataset {0} not found in dictionary expectedData", dataFile.Name);
                    }

                    if (expectedDataThisFile.TryGetValue(new KeyValuePair <int, int>(frameNumber, scanNumber), out var expectedScanSummary))
                    {
                        if (!string.Equals(expectedScanSummary, scanSummary))
                        {
                            Console.WriteLine(
                                "{0,4} {1,4} {2} {3,5} {4,6} {5,6} {6,8} {7,8} {8,3} {9,5} {10,6} {11,8} {12,6} {13,8} {14,-8} {15} {16,-5} {17,8}",
                                "Frame", "Scan", "MSLevel",
                                "NumPeaks", "RetentionTime", "ScanStartTime",
                                "DriftTimeMsec",
                                "IonMobilityDriftTime",
                                "LowMass", "HighMass",
                                "TIC", "BasePeakMZ", "BPI", "ParentIonMZ",
                                "ActivationType", "IonMode",
                                "Centroided?", "IsolationMZ");
                        }

                        Assert.AreEqual(expectedScanSummary, scanSummary,
                                        "Scan summary mismatch, scan " + scanNumber);
                    }

                    var expectedNativeId = string.Format("frame={0} scan={1} frameType=1", frameNumber, scanNumber);
                    Assert.AreEqual(spectrum.NativeId, expectedNativeId, "NativeId is not in the expected format for frame {0}, scan {1} ", frameNumber, 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");
            }
        }