Пример #1
0
        public void OnSpectrumSearchResultChange(SpectrumSearchResult spectrumSearchResult)
        {
            CurrentSpectrumSearchResult = spectrumSearchResult;
            OnPropertyChanged("CurrentSpectrumSearchResult");

            CreateMsMsPlots();
        }
Пример #2
0
        public double ScoreLipid(LipidTarget lipidTarget, SpectrumSearchResult spectrumSearchResult)
        {
            var relatedScoreModelUnits = GetRelatedScoreModelUnits(lipidTarget);

            var cidResultList = spectrumSearchResult.CidSearchResultList;
            var hcdResultList = spectrumSearchResult.HcdSearchResultList;

            var cidMaxIntensity = spectrumSearchResult.CidSpectrum != null && spectrumSearchResult.CidSpectrum.Peaks.Any() ? spectrumSearchResult.CidSpectrum.Peaks.Max(x => x.Intensity) : 1;
            var hcdMaxIntensity = spectrumSearchResult.HcdSpectrum != null && spectrumSearchResult.HcdSpectrum.Peaks.Any() ? spectrumSearchResult.HcdSpectrum.Peaks.Max(x => x.Intensity) : 1;

            double lipidScore = 0;

            if (cidMaxIntensity > 1)
            {
                // Score CID Results
                lipidScore += ScoreSingleFragmentationType(cidResultList, relatedScoreModelUnits, FragmentationType.CID, cidMaxIntensity);
            }

            if (hcdMaxIntensity > 1)
            {
                // Score CID Results
                lipidScore += ScoreSingleFragmentationType(hcdResultList, relatedScoreModelUnits, FragmentationType.HCD, hcdMaxIntensity);
            }

            return(lipidScore);
        }
Пример #3
0
 /// <summary>
 /// Gets the fit score for the given spectrum and chemical formula.
 /// </summary>
 /// <param name="spectrumResult">Information about spectra and tolerances.</param>
 /// <param name="composition">Composition of liquid to find in the spectrum.</param>
 /// <returns>The correlation score between the theoretical spectrum and actual.</returns>
 public double GetFitScore(SpectrumSearchResult spectrumResult, Composition composition)
 {
     return(GetFitScore(
                spectrumResult.PrecursorSpectrum,
                composition,
                spectrumResult.PrecursorTolerance));
 }
Пример #4
0
        public void OnMsMsSearchResultChange(SpectrumSearchResult spectrumSearchResult)
        {
            CurrentSpectrumSearchResult = spectrumSearchResult;
            CurrentLipidTarget          = LipidUtil.CreateLipidTarget((spectrumSearchResult.HcdSpectrum ?? spectrumSearchResult.CidSpectrum).IsolationWindow.IsolationWindowTargetMz, TargetFragmentationMode, TargetAdduct);

            OnPropertyChanged("CurrentSpectrumSearchResult");
            OnPropertyChanged("CurrentLipidTarget");
        }
Пример #5
0
        /// <summary>
        /// Get the fit score of Mass -1.
        /// </summary>
        /// <param name="spectrumResult">Information about spectra and tolerances.</param>
        /// <param name="composition">Composition of liquid to find in the spectrum.</param>
        /// <returns>The correlation score between the theoretical spectrum and actual.</returns>
        public double GetFitMinus1Score(SpectrumSearchResult spectrumResult, Composition composition)
        {
            var compositionMinus1 = new Composition(composition.C, composition.H - 1, composition.N, composition.O, composition.S, composition.P);

            return(GetFitScore(
                       spectrumResult.PrecursorSpectrum,
                       compositionMinus1,
                       spectrumResult.PrecursorTolerance));
        }
Пример #6
0
        public void TestPearsonCorrelation(int precursor, string commonName, string composition, Tolerance tolerance)
        {
            var rawFilePath = @"\\proto-2\UnitTest_Files\Liquid\PearsonCorrelationTests\OMICS_IM102_691_1d_Lipid_pooled_POS_150mm_17Apr15_Polaroid_14-12-16.raw";

            var lcmsRun = PbfLcMsRun.GetLcMsRun(rawFilePath);

            var spectrum = lcmsRun.GetSpectrum(precursor);

            var parsedComposition     = Composition.ParseFromPlainString(composition);
            var correlationCalculator = new PearsonCorrelationFitUtil();
            //var target = new LipidTarget(commonName, LipidClass.DG, FragmentationMode.Positive, parsedComposition, new List<AcylChain>(), Adduct.Hydrogen);
            var spectrumSearchResult = new SpectrumSearchResult(null, null, spectrum, null, null, new Xic(), lcmsRun)
            {
                PrecursorTolerance = tolerance
            };
            var correlation = correlationCalculator.GetFitScore(spectrumSearchResult, parsedComposition);

            Console.WriteLine("The Pearson correlation is: " + correlation);
        }
Пример #7
0
 public void OnSpectrumSearchResultChange(SpectrumSearchResult spectrumSearchResult)
 {
     CurrentSpectrumSearchResult = spectrumSearchResult;
     OnPropertyChanged("CurrentSpectrumSearchResult");
     OnPropertyChanged("CurrentLipidTarget");
 }
Пример #8
0
        public void PearsonCorrelationFileCombiner(string directoryPath)
        {
            var dirFiles = Directory.GetFiles(directoryPath);

            var correlationCalculator = new PearsonCorrelationFitUtil();
            var cosineCalculator      = new CosineFitUtil();

            // Each dictionary corresponds to a dataset, each dictionary key corresponds to the TSV header.
            var results = new List <Dictionary <string, List <string> > >();
            var headers = new HashSet <string>();

            foreach (var pathToResults in dirFiles.Where(path => path.EndsWith(".txt")))
            {
                var datasetName = Path.GetFileNameWithoutExtension(pathToResults);
                var pathToRaw   = GetRawFilePath(directoryPath, datasetName);
                var rawName     = Path.GetFileName(pathToRaw);
                if (string.IsNullOrEmpty(pathToRaw))
                {
                    continue;
                }

                var lcmsRun   = PbfLcMsRun.GetLcMsRun(pathToRaw);
                var tolerance = new Tolerance(30, ToleranceUnit.Ppm);
                using (var reader = new StreamReader(new FileStream(pathToResults, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)))
                {
                    results.Add(new Dictionary <string, List <string> >()); // Add dictionary for new dataset.
                    var datasetResults = results.Last();                    // Results for the current dataset.
                    var lineCount      = 0;
                    var headerToIndex  = new Dictionary <string, int>();
                    while (!reader.EndOfStream)
                    {
                        var line = reader.ReadLine();
                        if (string.IsNullOrWhiteSpace(line))
                        {
                            continue;
                        }

                        var pieces = line.Split('\t').ToArray();

                        if (lineCount++ == 0)
                        {   // First line
                            for (var i = 0; i < pieces.Length; i++)
                            {
                                var header = pieces[i];
                                headerToIndex.Add(header, i);
                                datasetResults.Add(header, new List <string>());
                            }

                            datasetResults.Add("Raw File", new List <string>());
                            datasetResults.Add("Pearson Corr Score", new List <string>());
                            datasetResults.Add("Pearson Corr M-1 Score", new List <string>());
                            datasetResults.Add("Cosine Score", new List <string>());
                            datasetResults.Add("Cosine M-1 Score", new List <string>());
                            headers.UnionWith(datasetResults.Keys);
                            continue;
                        }

                        var precursor  = Convert.ToInt32(pieces[headerToIndex["Precursor Scan"]]);
                        var commonName = pieces[headerToIndex["Common Name"]];
                        var adduct     = pieces[headerToIndex["Adduct"]];
                        var spectrum   = lcmsRun.GetSpectrum(precursor);
                        if (spectrum == null)
                        {
                            Console.WriteLine("Invalid scan number: {0}", precursor);
                            continue;
                        }

                        var lipid = new Lipid {
                            AdductFull = adduct, CommonName = commonName
                        };
                        var lipidTarget          = lipid.CreateLipidTarget();
                        var spectrumSearchResult = new SpectrumSearchResult(null, null, spectrum, null, null, new Xic(), lcmsRun)
                        {
                            PrecursorTolerance = tolerance
                        };
                        var pearsonCorrScore       = correlationCalculator.GetFitScore(spectrumSearchResult, lipidTarget.Composition);
                        var pearsonCorrMinus1Score = correlationCalculator.GetFitMinus1Score(spectrumSearchResult, lipidTarget.Composition);
                        var cosineScore            = cosineCalculator.GetFitScore(spectrumSearchResult, lipidTarget.Composition);
                        var cosineMinus1Score      = cosineCalculator.GetFitScore(
                            spectrumSearchResult,
                            lipidTarget.Composition);

                        // Add results to results dictionary.
                        datasetResults["Raw File"].Add(rawName);
                        foreach (var header in headerToIndex.Keys)
                        {
                            datasetResults[header].Add(pieces[headerToIndex[header]]);
                        }

                        datasetResults["Pearson Corr Score"].Add(pearsonCorrScore.ToString());
                        datasetResults["Pearson Corr M-1 Score"].Add(pearsonCorrMinus1Score.ToString());
                        datasetResults["Cosine Score"].Add(cosineScore.ToString());
                        datasetResults["Cosine M-1 Score"].Add(cosineMinus1Score.ToString());
                    }
                }
            }

            // Write results
            var outputFilePath = Path.Combine(directoryPath, "training.tsv");

            using (var writer = new StreamWriter(outputFilePath))
            {
                // Write headers
                foreach (var header in headers)
                {
                    writer.Write("{0}\t", header);
                }

                writer.WriteLine();

                // Write data
                foreach (var datasetResults in results)
                {
                    var fileLength = datasetResults["Pearson Corr Score"].Count;
                    for (var i = 0; i < fileLength; i++)
                    {
                        foreach (var header in headers)
                        {
                            var value = datasetResults.ContainsKey(header) ? datasetResults[header][i] : string.Empty;
                            writer.Write("{0}\t", value);
                        }

                        writer.WriteLine();
                    }
                }
            }
        }
Пример #9
0
        public void TestPearsonCorrelationWholeFile(string directoryPath)
        {
            var dirFiles = Directory.GetFiles(directoryPath);

            var correlationCalculator = new PearsonCorrelationFitUtil();

            foreach (var pathToResults in dirFiles.Where(path => path.EndsWith(".txt")))
            {
                var datasetName = Path.GetFileNameWithoutExtension(pathToResults);
                var pathToRaw   = GetRawFilePath(directoryPath, datasetName);
                if (string.IsNullOrEmpty(pathToRaw))
                {
                    continue;
                }

                var lcmsRun        = PbfLcMsRun.GetLcMsRun(pathToRaw);
                var tolerance      = new Tolerance(30, ToleranceUnit.Ppm);
                var rawFileName    = Path.GetFileName(pathToRaw);
                var datasetDirPath = Path.GetDirectoryName(pathToResults);
                var outputFileName = string.Format("{0}_training.tsv", datasetName);
                var outputPath     = Path.Combine(datasetDirPath, outputFileName);
                using (var writer = new StreamWriter(outputPath))
                    using (var reader = new StreamReader(new FileStream(pathToResults, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)))
                    {
                        var lineCount     = 0;
                        var headerToIndex = new Dictionary <string, int>();
                        while (!reader.EndOfStream)
                        {
                            var line = reader.ReadLine();
                            if (string.IsNullOrWhiteSpace(line))
                            {
                                continue;
                            }

                            var pieces = line.Split('\t').ToArray();

                            if (lineCount++ == 0)
                            { // First line
                                writer.Write("Raw File\t");
                                for (var i = 0; i < pieces.Length; i++)
                                {
                                    headerToIndex.Add(pieces[i], i);
                                    writer.Write("{0}\t", pieces[i]);
                                }

                                writer.WriteLine("Fit Score\tFit M-1 Score");

                                continue;
                            }

                            var precursor  = Convert.ToInt32(pieces[headerToIndex["Precursor Scan"]]);
                            var commonName = pieces[headerToIndex["Common Name"]];
                            var adduct     = pieces[headerToIndex["Adduct"]];
                            var spectrum   = lcmsRun.GetSpectrum(precursor);
                            if (spectrum == null)
                            {
                                Console.WriteLine("Invalid scan number: {0}", precursor);
                                continue;
                            }

                            var lipid = new Lipid {
                                AdductFull = adduct, CommonName = commonName
                            };
                            var lipidTarget          = lipid.CreateLipidTarget();
                            var spectrumSearchResult = new SpectrumSearchResult(null, null, spectrum, null, null, new Xic(), lcmsRun)
                            {
                                PrecursorTolerance = tolerance
                            };
                            var fitScore       = correlationCalculator.GetFitScore(spectrumSearchResult, lipidTarget.Composition);
                            var fitMinus1Score = correlationCalculator.GetFitMinus1Score(spectrumSearchResult, lipidTarget.Composition);

                            writer.Write(rawFileName + "\t");
                            writer.Write(line);

                            writer.WriteLine("{0}\t{1}", fitScore, fitMinus1Score);
                        }
                    }
            }
        }
Пример #10
0
        public static List <SpectrumSearchResult> RunInformedWorkflow(
            LipidTarget target,
            LcMsRun lcmsRun,
            double hcdMassError,
            double cidMassError,
            ScoreModel scoreModel = null)
        {
            IEnumerable <MsMsSearchUnit> msMsSearchUnits = target.GetMsMsSearchUnits();

            // I have to subtract an H for the target Ion since InformedProteomics will assume protenated
            var targetIon    = new Ion(target.Composition - Composition.Hydrogen, 1);
            var targetMz     = target.MzRounded;
            var hcdTolerance = new Tolerance(hcdMassError, ToleranceUnit.Ppm);
            var cidTolerance = new Tolerance(cidMassError, ToleranceUnit.Ppm);
            var activationMethodCombination = GlobalWorkflow.FigureOutActivationMethodCombination(lcmsRun);

            // Find out which MS/MS scans have a precursor m/z that matches the target
            //List<int> matchingMsMsScanNumbers = lcmsRun.GetFragmentationSpectraScanNums(targetIon).ToList();
            var matchingMsMsScanNumbers = lcmsRun.GetFragmentationSpectraScanNums(targetMz).ToList();

            var spectrumSearchResultList = new List <SpectrumSearchResult>();

            for (var i = 0; i + 1 < matchingMsMsScanNumbers.Count; i += 2)
            {
                var firstScanNumber  = matchingMsMsScanNumbers[i];
                var secondScanNumber = matchingMsMsScanNumbers[i + 1];

                // Scan numbers should be consecutive.

                /*
                 * if (secondScanNumber - firstScanNumber != 1)
                 * {
                 *  i--;
                 *  continue;
                 * }
                 * */
                ProductSpectrum firstMsMsSpectrum  = null;
                ProductSpectrum secondMsMsSpectrum = null;

                if (activationMethodCombination == ActivationMethodCombination.CidThenHcd ||
                    activationMethodCombination == ActivationMethodCombination.HcdThenCid)
                {
                    // Lookup the MS/MS Spectrum
                    firstMsMsSpectrum = lcmsRun.GetSpectrum(firstScanNumber) as ProductSpectrum;
                    if (firstMsMsSpectrum == null)
                    {
                        continue;
                    }

                    // Lookup the MS/MS Spectrum
                    secondMsMsSpectrum = lcmsRun.GetSpectrum(secondScanNumber) as ProductSpectrum;
                    if (secondMsMsSpectrum == null)
                    {
                        continue;
                    }
                }
                else if (activationMethodCombination == ActivationMethodCombination.CidOnly ||
                         activationMethodCombination == ActivationMethodCombination.HcdOnly)
                {
                    firstMsMsSpectrum = lcmsRun.GetSpectrum(firstScanNumber) as ProductSpectrum;
                }

                if (firstMsMsSpectrum == null)
                {
                    continue;
                }

                // Filter MS/MS Spectrum based on mass error
                var msMsPrecursorMz = firstMsMsSpectrum.IsolationWindow.IsolationWindowTargetMz;
                //if (Math.Abs(msMsPrecursorMz - targetMz) > 0.4) continue;
                var ppmError = LipidUtil.PpmError(targetMz, msMsPrecursorMz);
                if (Math.Abs(ppmError) > hcdMassError)
                {
                    continue;
                }


                // Assign each MS/MS spectrum to HCD or CID
                ProductSpectrum hcdSpectrum;
                ProductSpectrum cidSpectrum;
                if (firstMsMsSpectrum.ActivationMethod == ActivationMethod.HCD)
                {
                    hcdSpectrum = firstMsMsSpectrum;
                    cidSpectrum = secondMsMsSpectrum;
                }
                else
                {
                    hcdSpectrum = secondMsMsSpectrum;
                    cidSpectrum = firstMsMsSpectrum;
                }

                // Get all matching peaks
                var hcdSearchResultList = hcdSpectrum != null ? (from msMsSearchUnit in msMsSearchUnits let peak = hcdSpectrum.FindPeak(msMsSearchUnit.Mz, hcdTolerance) select new MsMsSearchResult(msMsSearchUnit, peak)).ToList() : new List <MsMsSearchResult>();
                var cidSearchResultList = cidSpectrum != null ? (from msMsSearchUnit in msMsSearchUnits let peak = cidSpectrum.FindPeak(msMsSearchUnit.Mz, cidTolerance) select new MsMsSearchResult(msMsSearchUnit, peak)).ToList() : new List <MsMsSearchResult>();

                // Find the MS1 data
                //Xic xic = lcmsRun.GetPrecursorExtractedIonChromatogram(targetMz, hcdTolerance, firstScanNumber);
                var precursorScanNumber = 0;
                if (lcmsRun.MinMsLevel == 1) //Make sure there are precursor scans in file
                {
                    precursorScanNumber = lcmsRun.GetPrecursorScanNum(matchingMsMsScanNumbers[i]);
                }
                var precursorSpectrum = lcmsRun.GetSpectrum(precursorScanNumber);
                var xic = lcmsRun.GetFullPrecursorIonExtractedIonChromatogram(targetMz, hcdTolerance);


                // Bogus data
                if (precursorSpectrum != null && (xic.GetApexScanNum() < 0 || xic.GetSumIntensities() <= 0))
                {
                    continue;
                }

                SpectrumSearchResult spectrumSearchResult;
                if (precursorSpectrum != null)
                {
                    spectrumSearchResult = new SpectrumSearchResult(hcdSpectrum, cidSpectrum, precursorSpectrum, hcdSearchResultList, cidSearchResultList, xic, lcmsRun, scoreModel, target)
                    {
                        PrecursorTolerance = new Tolerance(hcdMassError, ToleranceUnit.Ppm)
                    };
                }
                else //If there are no precursor scans in this file
                {
                    spectrumSearchResult = new SpectrumSearchResult(hcdSpectrum, cidSpectrum, hcdSearchResultList, cidSearchResultList, lcmsRun, scoreModel, target)
                    {
                        PrecursorTolerance = new Tolerance(hcdMassError, ToleranceUnit.Ppm),
                    };
                }
                spectrumSearchResultList.Add(spectrumSearchResult);
            }

            return(spectrumSearchResultList);
        }
Пример #11
0
        public static List <SpectrumSearchResult> RunFragmentWorkflow(ICollection <MsMsSearchUnit> fragments, LcMsRun lcmsRun, double hcdMassError, double cidMassError, int minMatches, IProgress <int> progress = null)
        {
            var PISearchUnits = fragments.Where(x => x.Description.Equals("Product Ion")).ToList();
            var hcdTolerance  = new Tolerance(hcdMassError, ToleranceUnit.Ppm);
            var cidTolerance  = new Tolerance(cidMassError, ToleranceUnit.Ppm);
            var scanTracker   = new List <int>(); //track what scans have been included in spectrumSearchResultsList so we don't make duplicate entries for matched CID and HCD

            // Find all MS/MS scans
            var msmsScanNumers           = lcmsRun.GetScanNumbers(2);
            var spectrumSearchResultList = new List <SpectrumSearchResult>();
            var maxScans = msmsScanNumers.Count;

            foreach (var scan in msmsScanNumers)
            {
                // Lookup the MS/MS Spectrum
                var MsMsSpectrum = lcmsRun.GetSpectrum(scan) as ProductSpectrum;
                if (MsMsSpectrum == null)
                {
                    continue;
                }

                ProductSpectrum MatchedSpectrum = null;
                var             spectrum1       = lcmsRun.GetSpectrum(scan + 1);
                var             spectrum2       = lcmsRun.GetSpectrum(scan - 1);
                if (spectrum1 != null && spectrum1.MsLevel == 2)
                {
                    var productSpectrum = spectrum1 as ProductSpectrum;
                    if (productSpectrum != null)
                    {
                        var deltaMz = productSpectrum.IsolationWindow.IsolationWindowTargetMz - MsMsSpectrum.IsolationWindow.IsolationWindowTargetMz;
                        if (Math.Abs(deltaMz) < float.Epsilon)
                        {
                            MatchedSpectrum = productSpectrum;
                        }
                    }
                }
                if (spectrum2 != null && spectrum2.MsLevel == 2)
                {
                    var productSpectrum = spectrum2 as ProductSpectrum;
                    if (productSpectrum != null)
                    {
                        var deltaMz = productSpectrum.IsolationWindow.IsolationWindowTargetMz - MsMsSpectrum.IsolationWindow.IsolationWindowTargetMz;
                        if (Math.Abs(deltaMz) < float.Epsilon)
                        {
                            MatchedSpectrum = productSpectrum;
                        }
                    }
                }

                if (scanTracker.Contains(MsMsSpectrum.ScanNum))
                {
                    continue;
                }

                var msmsPrecursorMz = MsMsSpectrum.IsolationWindow.IsolationWindowTargetMz;

                var xic = lcmsRun.GetFullPrecursorIonExtractedIonChromatogram(msmsPrecursorMz, hcdTolerance);

                // Bogus data
                //if (xic.GetApexScanNum() < 0) continue;
                var msmsPrecursorScan = 0;
                if (lcmsRun.MinMsLevel == 1) //Make sure there are precursor scans in file
                {
                    msmsPrecursorScan = lcmsRun.GetPrecursorScanNum(scan);
                }
                var precursorSpectrum = lcmsRun.GetSpectrum(msmsPrecursorScan);

                // Get all matching peaks

                //IEnumerable<MsMsSearchUnit> NLSearchUnits = fragments.Where(x=> x.Description.Equals("Neutral Loss")).Select(x => {x.Mz = (msmsPrecursorMz - x.Mz); return x;});
                var NLSearchUnits   = fragments.Where(x => x.Description.Equals("Neutral Loss")).Select(y => new MsMsSearchUnit(msmsPrecursorMz - y.Mz, "Neutral Loss"));
                var MsMsSearchUnits = PISearchUnits.Concat(NLSearchUnits).ToList();
                SpectrumSearchResult spectrumSearchResult;


                var hcdSpectrum = MsMsSpectrum.ActivationMethod == ActivationMethod.HCD ? MsMsSpectrum : MatchedSpectrum;
                var cidSpectrum = MsMsSpectrum.ActivationMethod == ActivationMethod.CID ? MsMsSpectrum : MatchedSpectrum;


                var HcdSearchResultList = hcdSpectrum != null? (from msMsSearchUnit in MsMsSearchUnits
                                                                let peak = hcdSpectrum.FindPeak(msMsSearchUnit.Mz, hcdTolerance)
                                                                           select new MsMsSearchResult(msMsSearchUnit, peak)).ToList() : new List <MsMsSearchResult>();
                var CidSearchResultList = cidSpectrum != null? (from msMsSearchUnit in MsMsSearchUnits
                                                                let peak = cidSpectrum.FindPeak(msMsSearchUnit.Mz, cidTolerance)
                                                                           select new MsMsSearchResult(msMsSearchUnit, peak)).ToList() : new List <MsMsSearchResult>();
                var SearchResultList = HcdSearchResultList.Concat(CidSearchResultList).ToList();
                if (precursorSpectrum != null)
                {
                    spectrumSearchResult = new SpectrumSearchResult(hcdSpectrum, cidSpectrum, precursorSpectrum,
                                                                    HcdSearchResultList, CidSearchResultList, xic, lcmsRun)
                    {
                        PrecursorTolerance = new Tolerance(hcdMassError, ToleranceUnit.Ppm)
                    };
                }
                else
                {
                    spectrumSearchResult = new SpectrumSearchResult(hcdSpectrum, cidSpectrum, HcdSearchResultList, CidSearchResultList, lcmsRun)
                    {
                        PrecursorTolerance = new Tolerance(hcdMassError, ToleranceUnit.Ppm)
                    };
                }

                if (hcdSpectrum != null)
                {
                    scanTracker.Add(hcdSpectrum.ScanNum);
                }
                if (cidSpectrum != null)
                {
                    scanTracker.Add(cidSpectrum.ScanNum);
                }

                if (SearchResultList.Count(x => x.ObservedPeak != null) < minMatches)
                {
                    continue;
                }
                spectrumSearchResultList.Add(spectrumSearchResult);

                // Report progress
                if (progress != null)
                {
                    var currentProgress = (int)((double)scan / maxScans * 100);
                    progress.Report(currentProgress);
                }
            }

            return(spectrumSearchResultList);
        }
Пример #12
0
        public static List <LipidGroupSearchResult> RunGlobalWorkflow(IEnumerable <Lipid> lipidList, LcMsRun lcmsRun, double hcdMassError, double cidMassError, ScoreModel scoreModel, IProgress <int> progress = null)
        {
            //TextWriter textWriter = new StreamWriter("outputNeg.tsv");
            var lipidGroupSearchResultList = new List <LipidGroupSearchResult>();

            var hcdTolerance = new Tolerance(hcdMassError, ToleranceUnit.Ppm);
            var cidTolerance = new Tolerance(cidMassError, ToleranceUnit.Ppm);

            //var lipidsGroupedByTarget = lipidList.OrderBy(x => x.LipidTarget.Composition.Mass).GroupBy(x => x.LipidTarget).ToList(); //order by mz
            var lipidsGroupedByTarget = lipidList.OrderBy(x => x.LipidTarget.MzRounded).GroupBy(x => x.LipidTarget).ToList();

            var    minLcScan = lcmsRun.MinLcScan;
            double maxLcScan = lcmsRun.MaxLcScan;



            var activationMethodCombination = FigureOutActivationMethodCombination(lcmsRun);

            if (activationMethodCombination == ActivationMethodCombination.Unsupported)
            {
                throw new SystemException("Unsupported activation method.");
            }
            var useTwoScans = activationMethodCombination == ActivationMethodCombination.CidThenHcd || activationMethodCombination == ActivationMethodCombination.HcdThenCid;

            for (var i = minLcScan; i <= maxLcScan; i++)
            {
                // Lookup the MS/MS Spectrum
                var firstMsMsSpectrum = lcmsRun.GetSpectrum(i) as ProductSpectrum;
                if (firstMsMsSpectrum == null)
                {
                    continue;
                }

                // Lookup the MS/MS Spectrum
                ProductSpectrum secondMsMsSpectrum = null;
                if (useTwoScans)
                {
                    secondMsMsSpectrum = lcmsRun.GetSpectrum(i + 1) as ProductSpectrum;
                    if (secondMsMsSpectrum == null)
                    {
                        continue;
                    }

                    // If m/z values of the MS/MS spectrums do not match, just move on
                    var deltaMz = firstMsMsSpectrum.IsolationWindow.IsolationWindowTargetMz -
                                  secondMsMsSpectrum.IsolationWindow.IsolationWindowTargetMz;
                    if (Math.Abs(deltaMz) > 0.01)
                    {
                        continue;
                    }
                }

                //textWriter.WriteLine(i);
                //Console.WriteLine(DateTime.Now + "\tProcessing Scan" + i);

                // Grab Precursor Spectrum

                var precursorScanNumber = 0;
                if (lcmsRun.MinMsLevel == 1) //Make sure there are precursor scans in file
                {
                    precursorScanNumber = lcmsRun.GetPrecursorScanNum(i);
                }

                var precursorSpectrum = lcmsRun.GetSpectrum(precursorScanNumber);

                // Assign each MS/MS spectrum to HCD or CID
                ProductSpectrum hcdSpectrum;
                ProductSpectrum cidSpectrum;
                if (firstMsMsSpectrum.ActivationMethod == ActivationMethod.HCD)
                {
                    hcdSpectrum = firstMsMsSpectrum;
                    cidSpectrum = secondMsMsSpectrum;
                }
                else
                {
                    hcdSpectrum = secondMsMsSpectrum;
                    cidSpectrum = firstMsMsSpectrum;
                }

                var msMsPrecursorMz     = firstMsMsSpectrum.IsolationWindow.IsolationWindowTargetMz;
                var mzToSearchTolerance = hcdMassError * msMsPrecursorMz / 1000000;
                var lowMz  = msMsPrecursorMz - mzToSearchTolerance;
                var highMz = msMsPrecursorMz + mzToSearchTolerance;

                foreach (var grouping in lipidsGroupedByTarget)
                {
                    var lipidTarget = grouping.Key;
                    var lipidMz     = lipidTarget.MzRounded;

                    // If we reached the point where the m/z is too high, we can exit
                    if (lipidMz > highMz)
                    {
                        break;
                    }

                    if (lipidMz > lowMz)
                    {
                        // Find the MS1 data
                        //Xic xic = lcmsRun.GetPrecursorExtractedIonChromatogram(lipidMz, hcdTolerance, i);
                        var xic = lcmsRun.GetFullPrecursorIonExtractedIonChromatogram(lipidMz, hcdTolerance);

                        // Bogus data
                        if (precursorSpectrum != null && (xic.GetApexScanNum() < 0 || xic.GetSumIntensities() <= 0))
                        {
                            continue;
                        }

                        // Grab the MS/MS peak to search for
                        IEnumerable <MsMsSearchUnit> msMsSearchUnits = lipidTarget.GetMsMsSearchUnits();

                        // Get all matching peaks
                        var hcdSearchResultList = hcdSpectrum != null ? (from msMsSearchUnit in msMsSearchUnits let peak = hcdSpectrum.FindPeak(msMsSearchUnit.Mz, hcdTolerance) select new MsMsSearchResult(msMsSearchUnit, peak)).ToList() : new List <MsMsSearchResult>();
                        var cidSearchResultList = cidSpectrum != null ? (from msMsSearchUnit in msMsSearchUnits let peak = cidSpectrum.FindPeak(msMsSearchUnit.Mz, cidTolerance) select new MsMsSearchResult(msMsSearchUnit, peak)).ToList() : new List <MsMsSearchResult>();

                        // Create spectrum search results
                        SpectrumSearchResult   spectrumSearchResult;
                        LipidGroupSearchResult lipidGroupSearchResult;

                        if (precursorSpectrum != null)
                        {
                            spectrumSearchResult = new SpectrumSearchResult(hcdSpectrum, cidSpectrum, precursorSpectrum, hcdSearchResultList, cidSearchResultList, xic, lcmsRun)
                            {
                                PrecursorTolerance = new Tolerance(hcdMassError, ToleranceUnit.Ppm)
                            };
                            lipidGroupSearchResult = new LipidGroupSearchResult(lipidTarget, grouping.ToList(), spectrumSearchResult, scoreModel);
                        }
                        else //If there are no precursor scans in this file
                        {
                            spectrumSearchResult = new SpectrumSearchResult(hcdSpectrum, cidSpectrum, hcdSearchResultList, cidSearchResultList, lcmsRun)
                            {
                                PrecursorTolerance = new Tolerance(hcdMassError, ToleranceUnit.Ppm)
                            };
                            lipidGroupSearchResult = new LipidGroupSearchResult(lipidTarget, grouping.ToList(), spectrumSearchResult, scoreModel);
                        }


                        lipidGroupSearchResultList.Add(lipidGroupSearchResult);
                    }
                }

                // Skip an extra scan if we look at 2 at a time
                if (useTwoScans)
                {
                    i++;
                }

                // Report progress
                if (progress != null)
                {
                    var currentProgress = (int)(i / maxLcScan * 100);
                    progress.Report(currentProgress);
                }
            }

            //textWriter.Close();
            return(lipidGroupSearchResultList);
        }
Пример #13
0
        /*
         * public static List<LipidGroupSearchResult> RunGlobalWorkflow(IEnumerable<Lipid> lipidList, DataReader ImsRun, IEnumerable<ImsFeature> FeatureTargets, double hcdMassError,double cidMassError, ScoreModel scoreModel, IProgress<int> progress = null)
         * {
         *  Tolerance hcdTolerance = new Tolerance(hcdMassError, ToleranceUnit.Ppm);
         *  Tolerance cidTolerance = new Tolerance(cidMassError, ToleranceUnit.Ppm);
         *
         *  var lipidsGroupedByTarget = lipidList.OrderBy(x => x.LipidTarget.Composition.Mass).GroupBy(x => x.LipidTarget).ToList();
         *  int MS1Frames = ImsRun.GetNumberOfFrames(DataReader.FrameType.MS1);
         *  int MS2Frames = ImsRun.GetNumberOfFrames(DataReader.FrameType.MS2);
         *
         *  var gp = ImsRun.GetGlobalParams();
         *  var framelist = ImsRun.GetMasterFrameList();
         *
         *  ActivationMethodCombination activationMethodCombination = MS2Frames > 0 ? ActivationMethodCombination.CidOnly : ActivationMethodCombination.Unsupported;
         *  if (activationMethodCombination == ActivationMethodCombination.Unsupported) throw new SystemException("Unsupported activation method.");
         *
         *  List<Spectrum> Spectra = new List<Spectrum>();
         *  foreach (var feature in FeatureTargets)
         *  {
         *      double mzToSearchTolerance = hcdMassError * feature.Mz / 1000000;
         *      double lowMz = feature.Mz - mzToSearchTolerance;
         *      double highMz = feature.Mz + mzToSearchTolerance;
         *
         *      double[] mzArray;
         *      int[] intensityArray;
         *      ImsRun.GetSpectrum(feature.LcStart, feature.LcEnd, DataReader.FrameType.MS1, feature.ImsStart,
         *          feature.ImsEnd, out mzArray, out intensityArray);
         *
         *      foreach (var mz in mzArray)
         *      {
         *          if (mz > highMz) break;
         *          if (mz > lowMz)
         *          {
         *              //Target IMS feature found in this scan
         *              double[] MS2Mz;
         *              int[] MS2Ints;
         *              ImsRun.GetSpectrum(feature.LcStart, feature.LcEnd, DataReader.FrameType.MS2, feature.ImsStart,
         *                  feature.ImsEnd, out MS2Mz, out MS2Ints);
         *              var MS2Intensity = (from intensity in MS2Ints select (double) (intensity)).ToArray();
         *              Spectrum spec = new ProductSpectrum(MS2Mz, MS2Intensity, feature.ImsScan);
         *              spec.MsLevel = 2;
         *              Spectra.Add(spec);
         *          }
         *      }
         *
         *
         *      /*
         *      for (int lcScan = feature.LcStart; lcScan <= feature.LcEnd; lcScan++)
         *      {
         *          if (framelist[lcScan] == DataReader.FrameType.MS1)
         *          {
         *              for (int imsScan = feature.ImsStart; imsScan <= feature.ImsEnd; imsScan++)
         *              {
         *                  double[] mzArray;
         *                  int[] intensityArray;
         *                  ImsRun.GetSpectrum(lcScan, lcScan, DataReader.FrameType.MS1, imsScan, imsScan, out mzArray, out intensityArray);
         *
         *                  foreach (var mz in mzArray)
         *                  {
         *                      if (mz > highMz) break;
         *                      if (mz > lowMz)
         *                      {
         *                          //Target IMS feature found in this scan
         *                          feature.AddCoord(lcScan, imsScan);
         *                      }
         *                  }
         *              }
         *          }
         *      }
         *  }
         *
         *  return new List<LipidGroupSearchResult>();
         * }
         */

        public static List <LipidGroupSearchResult> RunGlobalWorkflowAvgSpec(
            IEnumerable <Lipid> lipidList,
            LcMsRun lcmsRun,
            double hcdMassError,
            double cidMassError,
            ScoreModel scoreModel,
            IProgress <int> progress = null)
        {
            var lipidGroupSearchResultList = new List <LipidGroupSearchResult>();

            var hcdTolerance = new Tolerance(hcdMassError, ToleranceUnit.Ppm);
            var cidTolerance = new Tolerance(cidMassError, ToleranceUnit.Ppm);

            var lipidsGroupedByTarget = lipidList.OrderBy(x => x.LipidTarget.MzRounded).GroupBy(x => x.LipidTarget).ToList();

            var    minLcScan = lcmsRun.MinLcScan;
            double maxLcScan = lcmsRun.MaxLcScan;

            var ms2scans   = lcmsRun.GetScanNumbers(2);
            var ms2spectra = ms2scans.Select(scan => lcmsRun.GetSpectrum(scan) as ProductSpectrum).ToList();
            var uniqueMz   = (from spectrum in ms2spectra select spectrum.IsolationWindow.IsolationWindowTargetMz).ToList().Distinct().ToList();

            foreach (var mz in uniqueMz)
            {
                var hcdScans      = ms2spectra.Where(x => Math.Abs(x.IsolationWindow.IsolationWindowTargetMz - mz) < float.Epsilon && x.ActivationMethod == ActivationMethod.HCD).Select(x => x.ScanNum).ToList();
                var summedSpec    = lcmsRun.GetSummedSpectrum(hcdScans);
                var summedHcdSpec = new ProductSpectrum(summedSpec.Peaks, 0)
                {
                    ActivationMethod = ActivationMethod.HCD
                };

                var cidScans = ms2spectra.Where(x => Math.Abs(x.IsolationWindow.IsolationWindowTargetMz - mz) < float.Epsilon && x.ActivationMethod == ActivationMethod.CID).Select(x => x.ScanNum).ToList();
                summedSpec = lcmsRun.GetSummedSpectrum(cidScans);
                var summedCidSpec = new ProductSpectrum(summedSpec.Peaks, 0)
                {
                    ActivationMethod = ActivationMethod.CID
                };

                var HcdPresent = summedHcdSpec.Peaks.Any();
                var CidPresent = summedCidSpec.Peaks.Any();

                if (HcdPresent)
                {
                    summedHcdSpec.IsolationWindow = new IsolationWindow(mz, hcdMassError, hcdMassError);
                }
                if (CidPresent)
                {
                    summedCidSpec.IsolationWindow = new IsolationWindow(mz, cidMassError, cidMassError);
                }

                var mzToSearchTolerance = hcdMassError * mz / 1000000;
                var lowMz  = mz - mzToSearchTolerance;
                var highMz = mz + mzToSearchTolerance;

                var      hcdSpectrum       = summedHcdSpec;
                var      cidSpectrum       = summedCidSpec;
                Spectrum precursorSpectrum = null;

                foreach (var grouping in lipidsGroupedByTarget)
                {
                    var lipidTarget = grouping.Key;
                    var lipidMz     = lipidTarget.MzRounded;

                    // If we reached the point where the m/z is too high, we can exit
                    if (lipidMz > highMz)
                    {
                        break;
                    }

                    if (lipidMz > lowMz)
                    {
                        // Find the MS1 data
                        //Xic xic = lcmsRun.GetPrecursorExtractedIonChromatogram(lipidMz, hcdTolerance, i);
                        var xic = lcmsRun.GetFullPrecursorIonExtractedIonChromatogram(lipidMz, hcdTolerance);

                        // Bogus data
                        if (precursorSpectrum != null && (xic.GetApexScanNum() < 0 || xic.GetSumIntensities() <= 0))
                        {
                            continue;
                        }

                        // Grab the MS/MS peak to search for
                        IEnumerable <MsMsSearchUnit> msMsSearchUnits = lipidTarget.GetMsMsSearchUnits();

                        // Get all matching peaks
                        var hcdSearchResultList = hcdSpectrum != null ? (from msMsSearchUnit in msMsSearchUnits let peak = hcdSpectrum.FindPeak(msMsSearchUnit.Mz, hcdTolerance) select new MsMsSearchResult(msMsSearchUnit, peak)).ToList() : new List <MsMsSearchResult>();
                        var cidSearchResultList = cidSpectrum != null ? (from msMsSearchUnit in msMsSearchUnits let peak = cidSpectrum.FindPeak(msMsSearchUnit.Mz, cidTolerance) select new MsMsSearchResult(msMsSearchUnit, peak)).ToList() : new List <MsMsSearchResult>();

                        // Create spectrum search results
                        SpectrumSearchResult   spectrumSearchResult;
                        LipidGroupSearchResult lipidGroupSearchResult;
                        if (precursorSpectrum != null)
                        {
                            spectrumSearchResult = new SpectrumSearchResult(hcdSpectrum, cidSpectrum, precursorSpectrum, hcdSearchResultList, cidSearchResultList, xic, lcmsRun)
                            {
                                PrecursorTolerance = new Tolerance(hcdMassError, ToleranceUnit.Ppm)
                            };
                            lipidGroupSearchResult = new LipidGroupSearchResult(lipidTarget, grouping.ToList(), spectrumSearchResult, scoreModel);
                        }
                        else //If there are no precursor scans in this file
                        {
                            spectrumSearchResult = new SpectrumSearchResult(hcdSpectrum, cidSpectrum, hcdSearchResultList, cidSearchResultList, lcmsRun)
                            {
                                PrecursorTolerance = new Tolerance(hcdMassError, ToleranceUnit.Ppm)
                            };
                            lipidGroupSearchResult = new LipidGroupSearchResult(lipidTarget, grouping.ToList(), spectrumSearchResult, scoreModel);
                        }


                        lipidGroupSearchResultList.Add(lipidGroupSearchResult);

                        //textWriter.WriteLine(lipidTarget.CommonName + "\t" + spectrumSearchResult.Score);
                        //Console.WriteLine(lipidTarget.CommonName + "\t" + spectrumSearchResult.Score);
                    }
                }
            }



            //var summedHcdSpectra = uniqueMz.Select(mz => new Tuple<double, ProductSpectrum>(mz, lcmsRun.GetSummedMs2Spectrum(mz, minLcScan, (int)maxLcScan, 1, 2, ActivationMethod.HCD))).ToDictionary(x => x.Item1, x => x.Item2);
            //if (summedHcdSpectra != null) { foreach (var spec in summedHcdSpectra) { spec.Value.IsolationWindow = new IsolationWindow(spec.Key, spec.Key, spec.Key); } }
            //var summedCidSpectra = uniqueMz.Select(mz => lcmsRun.GetSummedMs2Spectrum(mz, minLcScan, (int)maxLcScan, 1, 2, ActivationMethod.CID)).ToList();



            return(lipidGroupSearchResultList);
        }