Beispiel #1
0
        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;
                }
            }
        }
Beispiel #2
0
        //[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);
            }
        }
Beispiel #3
0
        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);
            }
        }
Beispiel #4
0
 public MzMLFusionContainer(string filename)
 {
     this.filename = filename;
     if (filename != null)
     {
         SimpleMzMLReader reader = new SimpleMzMLReader(filename);
         _spectra = reader.ReadAllSpectra();
     }
 }
Beispiel #5
0
        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);
            }
        }
Beispiel #6
0
        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();
            }
        }
Beispiel #7
0
        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);
                }
            }
        }
Beispiel #8
0
        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());
        }
Beispiel #10
0
        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;
            }
        }