Example #1
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);
            }
        }
Example #2
0
 public MzMLFusionContainer(string filename)
 {
     this.filename = filename;
     if (filename != null)
     {
         SimpleMzMLReader reader = new SimpleMzMLReader(filename);
         _spectra = reader.ReadAllSpectra();
     }
 }
Example #3
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);
            }
        }
        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 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;
            }
        }