Пример #1
0
        public static MassCalibrationResults RunMassCalibration(IEnumerable <Lipid> lipidList, LcMsRun lcmsRun, double hcdMassError, IProgress <int> progress = null)
        {
            var ppmErrorList = new List <double>();

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

            foreach (var kvp in lipidsGroupedByTarget)
            {
                var target = kvp.Key;

                var spectrumSearchResultList = InformedWorkflow.RunInformedWorkflow(target, lcmsRun, hcdMassError, 500, scoreModel: null);

                if (spectrumSearchResultList.Any())
                {
                    var targetIon = new Ion(target.Composition - Composition.Hydrogen, 1);
                    var targetMz  = targetIon.GetMonoIsotopicMz();

                    var bestSpectrumSearchResult = spectrumSearchResultList.OrderBy(x => x.Score).First();

                    var massSpectrum = bestSpectrumSearchResult.PrecursorSpectrum.Peaks;
                    var closestPeak  = massSpectrum.OrderBy(x => Math.Abs(x.Mz - targetMz)).First();

                    var ppmError = LipidUtil.PpmError(targetMz, closestPeak.Mz);
                    ppmErrorList.Add(ppmError);
                }
            }

            var ppmHistogram = QcUtil.CalculateHistogram(ppmErrorList, hcdMassError, 0.25);

            var massCalibrationResults = new MassCalibrationResults(ppmHistogram);

            return(massCalibrationResults);
        }
Пример #2
0
        public void OnMsMsSearchResultChange(SpectrumSearchResult spectrumSearchResult)
        {
            CurrentSpectrumSearchResult = spectrumSearchResult;
            CurrentLipidTarget          = LipidUtil.CreateLipidTarget((spectrumSearchResult.HcdSpectrum ?? spectrumSearchResult.CidSpectrum).IsolationWindow.IsolationWindowTargetMz, TargetFragmentationMode, TargetAdduct);

            OnPropertyChanged("CurrentSpectrumSearchResult");
            OnPropertyChanged("CurrentLipidTarget");
        }
Пример #3
0
        public void TestFitMinusOneScore(int precursor, string adduct, string commonName, string id, string rawFilePath)
        {
            var lipid = new Lipid()
            {
                AdductFull = adduct, CommonName = commonName
            };
            var lipidTarget = lipid.CreateLipidTarget();

            var composition = lipidTarget.Composition;
            var compMinus1  = new Composition(composition.C, composition.H - 1, composition.N, composition.O, composition.S, composition.P); //Subtract one hydrogen to make this a minus1 fit score

            var lcmsRun = PbfLcMsRun.GetLcMsRun(rawFilePath);

            var spectrum = lcmsRun.GetSpectrum(precursor);

            var relativeIntensityThreshold = 0.1;

            var tolerance = new Tolerance(30, ToleranceUnit.Ppm);

            //Get the values to use to calculate pearson correlation
            var observedPeaks = LipidUtil.GetAllIsotopePeaks(spectrum, compMinus1, tolerance,
                                                             relativeIntensityThreshold);

            if (observedPeaks == null)
            {
                Console.WriteLine("Observed peaks is null for scan " + id);
            }

            var isotopomerEnvelope = IsoProfilePredictor.GetIsotopomerEnvelop(
                compMinus1.C,
                compMinus1.H,
                compMinus1.N,
                compMinus1.O,
                compMinus1.S);

            var observedIntensities = new double[observedPeaks.Length];

            for (var i = 0; i < observedPeaks.Length; i++)
            {
                var observedPeak = observedPeaks[i];
                observedIntensities[i] = observedPeak != null ? (float)observedPeak.Intensity : 0.0;
            }

            Console.WriteLine("The theoretical y values are: ");
            foreach (var value in isotopomerEnvelope.Envolope)
            {
                Console.WriteLine(value + ", ");
            }

            Console.WriteLine("The observed peak intensity x values are: ");
            foreach (var value in observedIntensities)
            {
                Console.WriteLine(value + ", ");
            }
        }
Пример #4
0
        private async void ProcessAllTargetsButtonClick(object sender, RoutedEventArgs e)
        {
            var fragmentationMode = (FragmentationMode)FragmentationModeComboBox.SelectedItem;
            var precursorError    = double.Parse(PrecursorErrorTextBox.Text);
            var hcdMassError      = double.Parse(HcdErrorTextBox.Text);
            var cidMassError      = double.Parse(CidErrorTextBox.Text);
            var resultsPerScan    = int.Parse(ResultsPerScanTextBox.Text);

            LipidGroupSearchResultsDataGrid.Visibility = Visibility.Hidden;
            ExportGlobalResultsButton.Visibility       = Visibility.Hidden;
            ExportAllGlobalResultsButton.Visibility    = Visibility.Hidden;
            await Task.Run(() => SingleTargetViewModel.OnProcessAllTarget(hcdMassError, cidMassError, fragmentationMode, resultsPerScan));

            LipidGroupSearchResultsDataGrid.Visibility = Visibility.Visible;
            ExportGlobalResultsButton.Visibility       = Visibility.Visible;
            ExportAllGlobalResultsButton.Visibility    = Visibility.Visible;

            // Select the best spectrum search result
            if (SingleTargetViewModel.LipidGroupSearchResultList.Count > 0)
            {
                double currentMz = 0;
                List <LipidGroupSearchResult> removeList = new List <LipidGroupSearchResult>();
                foreach (LipidGroupSearchResult entry in SingleTargetViewModel.LipidGroupSearchResultList)
                {
                    var targetMz = entry.LipidTarget.MzRounded;
                    if (entry.SpectrumSearchResult.PrecursorSpectrum != null)
                    {
                        var massSpectrum = entry.SpectrumSearchResult.PrecursorSpectrum.Peaks;
                        var closestPeak  = massSpectrum.OrderBy(x => Math.Abs(x.Mz - targetMz)).First();
                        currentMz = closestPeak.Mz;
                    }
                    else
                    {
                        var isolationMz = entry.SpectrumSearchResult.HcdSpectrum?.IsolationWindow.IsolationWindowTargetMz ??
                                          entry.SpectrumSearchResult.CidSpectrum.IsolationWindow.IsolationWindowTargetMz;

                        currentMz = isolationMz;
                    }
                    double currentPpmError = LipidUtil.PpmError(targetMz, currentMz);
                    if (Math.Abs(currentPpmError) > Math.Abs(precursorError))
                    {
                        removeList.Add(entry);
                    }
                }
                foreach (LipidGroupSearchResult remove in removeList)
                {
                    SingleTargetViewModel.LipidGroupSearchResultList.Remove(remove);
                }

                var dataGrid = LipidGroupSearchResultsDataGrid;

                dataGrid.SelectedItem = SingleTargetViewModel.LipidGroupSearchResultList[0];
                dataGrid.ScrollIntoView(SingleTargetViewModel.LipidGroupSearchResultList[0]);
            }
        }
Пример #5
0
        public LipidTarget CreateLipidTarget()
        {
            Adduct            adduct;
            FragmentationMode fragmentationMode;

            if (AdductFull == "[M+H]+")
            {
                adduct            = Adduct.Hydrogen;
                fragmentationMode = FragmentationMode.Positive;
            }
            else if (AdductFull == "[M+NH4]+")
            {
                adduct            = Adduct.Ammonium;
                fragmentationMode = FragmentationMode.Positive;
            }
            else if (AdductFull == "[M+Na]+")
            {
                adduct            = Adduct.Sodium;
                fragmentationMode = FragmentationMode.Positive;
            }
            else if (AdductFull == "[M+K]+")
            {
                adduct            = Adduct.Potassium;
                fragmentationMode = FragmentationMode.Positive;
            }
            else if (AdductFull == "[M+Oac]-")
            {
                adduct            = Adduct.Acetate;
                fragmentationMode = FragmentationMode.Negative;
            }
            else if (AdductFull == "[M-H]-")
            {
                adduct            = Adduct.Hydrogen;
                fragmentationMode = FragmentationMode.Negative;
            }
            else if (AdductFull == "[M-2H]--")
            {
                adduct            = Adduct.Dihydrogen;
                fragmentationMode = FragmentationMode.Negative;
            }
            else
            {
                throw new SystemException("Unknown adduct: " + AdductFull);
            }

            var lipidTarget = LipidUtil.CreateLipidTarget(CommonName, fragmentationMode, adduct);

            return(lipidTarget);
        }
Пример #6
0
        public void SearchForTarget(string commonName, Adduct adduct, FragmentationMode fragmentationMode, double hcdMassError, double cidMassError)
        {
            CurrentLipidTarget = LipidUtil.CreateLipidTarget(commonName, fragmentationMode, adduct);
            OnPropertyChanged("CurrentLipidTarget");

            SpectrumSearchResultList = InformedWorkflow.RunInformedWorkflow(CurrentLipidTarget, LcMsRun, hcdMassError, cidMassError, ScoreModel);
            OnPropertyChanged("SpectrumSearchResultList");

            if (SpectrumSearchResultList.Any())
            {
                var spectrumSearchResult = SpectrumSearchResultList.OrderByDescending(x => x.NumMatchingMsMsPeaks).First();
                OnSpectrumSearchResultChange(spectrumSearchResult);
            }
            else
            {
                CurrentSpectrumSearchResult = null;
            }
        }
Пример #7
0
        public void SearchForFragments(double hcdError, double cidError, FragmentationMode fragmentationMode, int numResultsPerScanToInclude, int minMatches, Adduct adduct)
        {
            IProgress <int> progress = new Progress <int>(ReportFragmentSearchProgress);

            SpectrumSearchResultList = InformedWorkflow.RunFragmentWorkflow(FragmentSearchList, LcMsRun, hcdError, cidError, minMatches, progress);
            OnPropertyChanged("SpectrumSearchResultList");
            progress.Report(0);
            if (SpectrumSearchResultList.Any())
            {
                var spectrumSearchResult =
                    SpectrumSearchResultList.OrderByDescending(x => x.ApexScanNum).First();
                CurrentLipidTarget = LipidUtil.CreateLipidTarget((spectrumSearchResult.HcdSpectrum ?? spectrumSearchResult.CidSpectrum).IsolationWindow.IsolationWindowTargetMz, fragmentationMode, adduct);
                //OnMsMsSearchResultChange(spectrumSearchResult);
                OnSpectrumSearchResultChange(spectrumSearchResult);
            }
            else
            {
                CurrentSpectrumSearchResult = null;
            }
        }
Пример #8
0
        public void TestSingleTarget()
        {
            // Testing PC(16:0/18:1) +H
            const string            commonName        = "PC(16:0/18:1)";
            const string            empiricalFormula  = "C42H83NO8P";
            const LipidClass        lipidClass        = LipidClass.PC;
            const FragmentationMode fragmentationMode = FragmentationMode.Positive;
            var acylChainList = new List <AcylChain> {
                new AcylChain("16:0"), new AcylChain("18:1")
            };

            var lipidTarget = LipidUtil.CreateLipidTarget(commonName, empiricalFormula, lipidClass, fragmentationMode, acylChainList);

            var rawFileLocation  = @"../../../testFiles/XGA121_lipid_Skin_1.raw";
            var informedWorkflow = new InformedWorkflow(rawFileLocation);
            var resultList       = informedWorkflow.RunInformedWorkflow(lipidTarget, 30, 500);

            foreach (var result in resultList.OrderByDescending(x => x.GetNumMatchingMsMsPeaks()))
            {
                Console.WriteLine(result.Xic.GetApexScanNum() + " - " + result.HcdSpectrum.ScanNum + " - " + result.CidSpectrum.ScanNum + " - " + result.GetNumMatchingMsMsPeaks());
            }
        }
Пример #9
0
        public void TestSingleConfidentTarget()
        {
            // Testing PE(18:3/20:5) +H
            const string            commonName        = "PE(18:3/20:5)";
            const string            empiricalFormula  = "C43H71NO8P";
            const LipidClass        lipidClass        = LipidClass.PE;
            const FragmentationMode fragmentationMode = FragmentationMode.Positive;
            var acylChainList = new List <AcylChain> {
                new AcylChain("18:3"), new AcylChain("20:5")
            };

            var lipidTarget = LipidUtil.CreateLipidTarget(commonName, empiricalFormula, lipidClass, fragmentationMode, acylChainList);

            var rawFileLocation  = @"../../../testFiles/Daphnia_gut_TLE_POS_Gimli_21Jan14_13-07-01.raw";
            var informedWorkflow = new InformedWorkflow(rawFileLocation);
            var resultList       = informedWorkflow.RunInformedWorkflow(lipidTarget, 30, 500);

            foreach (var result in resultList.OrderByDescending(x => x.GetNumMatchingMsMsPeaks()))
            {
                Console.WriteLine(result.Xic.GetApexScanNum() + " - " + result.HcdSpectrum.ScanNum + " - " + result.CidSpectrum.ScanNum + " - " + result.GetNumMatchingMsMsPeaks());
            }
        }
Пример #10
0
        private static void OutputResultsToTsv(
            IReadOnlyCollection <LipidGroupSearchResult> lipidGroupSearchResults,
            string fileLocation,
            string rawFileName,
            IProgress <int> progress = null,
            bool writeHeader         = true)
        {
            using (TextWriter textWriter = new StreamWriter(fileLocation, true))
            {
                if (writeHeader)
                {
                    textWriter.WriteLine("Raw Data File\tLM_ID\tCommon Name\tAdduct\tCategory\tMain Class\tSub Class\tExact m/z\tFormula\tObserved m/z\tppm Error\tApex RT\tPrecursor RT\tApex NET\tIntensity\tPeak Area\tScore\tMS/MS Scan\tPrecursor Scan\tApex Scan\tPUBCHEM_SID\tPUBCHEM_CID\tINCHI_KEY\tKEGG_ID\tHMDBID\tCHEBI_ID\tLIPIDAT_ID\tLIPIDBANK_ID");
                }
                var progressCounter = 0;

                foreach (var lipidGroupSearchResult in lipidGroupSearchResults)
                {
                    var lipidTarget          = lipidGroupSearchResult.LipidTarget;
                    var spectrumSearchResult = lipidGroupSearchResult.SpectrumSearchResult;
                    var Precursor            = spectrumSearchResult.PrecursorSpectrum != null;

                    var targetMz   = lipidTarget.MzRounded;
                    var observedMz = spectrumSearchResult.HcdSpectrum?.IsolationWindow.IsolationWindowTargetMz ??
                                     spectrumSearchResult.CidSpectrum.IsolationWindow.IsolationWindowTargetMz;

                    if (Precursor)
                    {
                        var massSpectrum = spectrumSearchResult.PrecursorSpectrum.Peaks;
                        var closestPeak  = massSpectrum.OrderBy(x => Math.Abs(x.Mz - targetMz)).First();
                        observedMz = closestPeak.Mz;
                    }

                    var score    = lipidGroupSearchResult.Score;
                    var msmsScan = spectrumSearchResult.HcdSpectrum?.ScanNum ?? spectrumSearchResult.CidSpectrum.ScanNum;
                    var ppmError = LipidUtil.PpmError(targetMz, observedMz);

                    foreach (var lipid in lipidGroupSearchResult.LipidList)
                    {
                        var line = new StringBuilder();
                        line.Append(rawFileName + "\t");
                        line.Append(lipid.LipidMapsId + "\t");
                        line.Append(lipidTarget.StrippedDisplay + "\t");
                        line.Append(lipid.AdductFull + "\t");
                        line.Append(lipid.Category + "\t");
                        line.Append(lipid.MainClass + "\t");
                        line.Append(lipid.SubClass + "\t");
                        line.Append(lipidTarget.MzRounded + "\t");
                        line.Append(lipidTarget.EmpiricalFormula + "\t");
                        line.Append(observedMz + "\t");
                        line.Append(ppmError + "\t");
                        line.Append(spectrumSearchResult.RetentionTime + "\t");
                        if (Precursor)
                        {
                            line.Append(spectrumSearchResult.PrecursorSpectrum.ElutionTime + "\t");
                        }
                        else
                        {
                            line.Append("\t");
                        }
                        line.Append(spectrumSearchResult.NormalizedElutionTime + "\t");
                        line.Append(spectrumSearchResult.ApexIntensity + "\t");
                        line.Append(spectrumSearchResult.PeakArea + "\t");
                        line.Append(score + "\t");
                        line.Append(msmsScan + "\t");
                        if (Precursor)
                        {
                            line.Append(spectrumSearchResult.PrecursorSpectrum.ScanNum + "\t");
                        }
                        else
                        {
                            line.Append("\t");
                        }
                        line.Append(spectrumSearchResult.ApexScanNum + "\t");
                        line.Append(lipid.PubChemSid + "\t");
                        line.Append(lipid.PubChemCid + "\t");
                        line.Append(lipid.InchiKey + "\t");
                        line.Append(lipid.KeggId + "\t");
                        line.Append(lipid.HmdbId + "\t");
                        line.Append(lipid.ChebiId + "\t");
                        line.Append(lipid.LipidatId + "\t");
                        line.Append(lipid.LipidBankId + "\t");

                        textWriter.WriteLine(line.ToString());
                    }
                    if (progress != null)
                    {
                        progressCounter++;
                        var currentProgress = (int)(progressCounter / (double)lipidGroupSearchResults.Count * 100);
                        progress.Report(currentProgress);
                    }
                }
            }
        }
Пример #11
0
        private static void OutputResultsToMzTab(IReadOnlyCollection <LipidGroupSearchResult> lipidGroupSearchResults,
                                                 string fileLocation, string rawFileName, IProgress <int> progress = null)
        {
            using (TextWriter textWriter = new StreamWriter(fileLocation))
            {
                var progressCounter = 0;
                var mods            = new List <string>();
                foreach (var lipidGroupSearchResult in lipidGroupSearchResults)
                {
                    foreach (var lipid in lipidGroupSearchResult.LipidList)
                    {
                        if (!mods.Contains(lipid.AdductFull))
                        {
                            mods.Add(lipid.AdductFull);
                        }
                    }
                }

                //Write meta-data
                textWriter.WriteLine("MTD\tmzTabVersion\t1.0 rc5");
                textWriter.WriteLine("MTD\tmzTab-mode\tComplete");
                textWriter.WriteLine("MTD\tmzTab-type\tQuantification");
                textWriter.WriteLine("MTD\tsoftware[1]\t[, , LIQUID, ]");
                textWriter.WriteLine("MTD\tsmallmolecule_search_engine_score[1]\t[, , LIQUID_Score_Analyzer, ]");
                textWriter.WriteLine("MTD\tfixed_mod[1]\t[MS, MS:1002038, unlabeled sample, ]");
                foreach (var variableMod in mods)
                {
                    textWriter.WriteLine("MTD\tvariable_mod[1]\t[, , {0}]", variableMod);
                }
                textWriter.WriteLine("MTD\tquantification_method\t[, , LIQUID_Analysis, ]");
                textWriter.WriteLine("MTD\tsmall_molecule-quantification_unit\t[PRIDE, PRIDE:0000330, Arbitrary quantification unit, ]");
                //Get the raw/mzml location

                textWriter.WriteLine("MTD\tms_run[1]-location\t{0}", rawFileName); //TODO:
                textWriter.WriteLine("MTD\tassay[1]-quantification_reagent\t[MS, MS:1002038, unlabeled sample, ]");
                textWriter.WriteLine("MTD\tassay[1]-ms_run_ref\tms_run[1]");
                textWriter.WriteLine("MTD\tstudy_variable[1]-assay_refs\tassay[1]");
                textWriter.WriteLine("MTD\tstudy_variable[1]-description\tLIQUID Quantification");
                textWriter.WriteLine("MTD\tcolunit-small_molecule\tretention_time=[UO, UO:0000031, minute, ]");
                textWriter.WriteLine("");

                //Write small molecule section headers
                textWriter.WriteLine("SMH\tidentifier\tchemical_formula\tsmiles\tinchi_key\tdescription\texp_mass_to_charge\tcalc_mass_to_charge\tcharge\tretention_time\ttaxid\tspecies\tdatabase\tdatabase_version\tspectra_ref\tsearch_engine\tbest_search_engine_score[1]\tsearch_engine_score[1]_ms_run[1]\tmodification\tsmallmolecule_abundance_assay[1]\tsmallmolecule_abundance_study_variable[1]\tsmallmolecule_abundance_stdev_study_variable[1]\tsmallmolecule_abundance_std_error_study_variable[1]");

                //Write small molecule section datas
                foreach (var lipidGroupSearchResult in lipidGroupSearchResults)
                {
                    var lipidTarget          = lipidGroupSearchResult.LipidTarget;
                    var spectrumSearchResult = lipidGroupSearchResult.SpectrumSearchResult;
                    var targetMz             = lipidTarget.MzRounded;
                    var massSpectrum         = spectrumSearchResult.PrecursorSpectrum.Peaks;
                    var closestPeak          = massSpectrum.OrderBy(x => Math.Abs(x.Mz - targetMz)).First();
                    var observedMz           = closestPeak.Mz;
                    var ppmError             = LipidUtil.PpmError(targetMz, closestPeak.Mz);
                    var score    = lipidGroupSearchResult.Score;
                    var msmsScan = spectrumSearchResult.HcdSpectrum?.ScanNum ?? spectrumSearchResult.CidSpectrum.ScanNum;

                    //TODO: var charge = calculatedFromMZ

                    foreach (var lipid in lipidGroupSearchResult.LipidList)
                    {
                        var line = new StringBuilder();
                        line.Append("SML\t");

                        //var indexToStartRemove = lipid.LipidTarget.StrippedDisplay.IndexOf("/");
                        //var id = lipid.LipidTarget.StrippedDisplay.Substring(0, indexToStartRemove);
                        //id = id.Replace("(", "");
                        var id = lipid.LipidTarget.StrippedDisplay;
                        line.Append(id + "\t");
                        //if (!string.IsNullOrWhiteSpace(lipid.LipidMapsId))
                        //    line.Append(lipid.LipidMapsId + "\t"); // identifier
                        //else
                        //    line.Append("null" + "\t");
                        line.Append(lipidTarget.EmpiricalFormula + "\t");   // chemical_formula
                        line.Append("null" + "\t");                         // smiles
                        if (!string.IsNullOrWhiteSpace(lipid.InchiKey))
                        {
                            line.Append(lipid.InchiKey + "\t"); // inchi_key
                        }
                        else
                        {
                            line.Append("null" + "\t");
                        }
                        line.Append(lipid.SubClass + " : " + lipidTarget.FragmentationMode.ToString() + " charge" + "\t"); // description
                        line.Append(observedMz + "\t");                                                                    // exp_mass_to_charge
                        line.Append(lipidTarget.MzRounded + "\t");                                                         // calc_mass_to_charge
                        line.Append("1" + "\t");                                                                           // charge
                        line.Append(spectrumSearchResult.RetentionTime + "\t");                                            // retention_time
                        line.Append("null" + "\t");                                                                        // taxid
                        line.Append("null" + "\t");                                                                        // species
                        line.Append("null" + "\t");                                                                        // database
                        line.Append("null" + "\t");                                                                        // database_version
                        //line.Append(spectrumSearchResult.PrecursorSpectrum.ScanNum + "\t"); // spectra_ref
                        line.Append(msmsScan + "\t");                                                                      // spectra_ref
                        line.Append("[, , Liquid, ]" + "\t");                                                              // search_engine
                        line.Append(score + "\t");                                                                         // best_search_engine_score[1]
                        line.Append(score + "\t");                                                                         // search_engine_score[1]_ms_run[1]
                        line.Append(lipid.AdductFull + "\t");                                                              // FROM ADDUCTFULL
                        line.Append(spectrumSearchResult.ApexIntensity + "\t");                                            // small_molecule_abundance_assay[1]
                        line.Append("null" + "\t");                                                                        // ^^Study_variable[1]
                        line.Append("null" + "\t");                                                                        // stdev_study_variable[1]
                        line.Append("null" + "\t");                                                                        // std_err_study_variable[1]

                        textWriter.WriteLine(line.ToString());
                    }
                    if (progress != null)
                    {
                        progressCounter++;
                        var currentProgress = (int)(progressCounter / (double)lipidGroupSearchResults.Count * 100);
                        progress.Report(currentProgress);
                    }
                }
            }
        }
Пример #12
0
        private static void OutputResultsToMspLibrary(IEnumerable <LipidGroupSearchResult> lipidGroupSearchResults, string fileLocation)
        {
            using (TextWriter textWriter = new StreamWriter(fileLocation))
            {
                foreach (var lipidGroupSearchResult in lipidGroupSearchResults)
                {
                    var lipidTarget          = lipidGroupSearchResult.LipidTarget;
                    var spectrumSearchResult = lipidGroupSearchResult.SpectrumSearchResult;
                    var massSpectrum         = spectrumSearchResult.PrecursorSpectrum.Peaks;
                    var targetMz             = lipidTarget.MzRounded;
                    var closestPeak          = massSpectrum.OrderBy(x => Math.Abs(x.Mz - targetMz)).First();
                    var hcdResults           = spectrumSearchResult.HcdSearchResultList;
                    var cidResults           = spectrumSearchResult.CidSearchResultList;
                    var hcdSpectrum          = spectrumSearchResult.HcdSpectrum;
                    var cidSpectrum          = spectrumSearchResult.CidSpectrum;
                    var hcdCount             = hcdSpectrum.Peaks.Length;
                    var cidCount             = cidSpectrum.Peaks.Length;

                    var name = lipidTarget.StrippedDisplay;

                    var    firstLipid = lipidGroupSearchResult.LipidList.FirstOrDefault();
                    string adduct;
                    if (firstLipid == null)
                    {
                        adduct = string.Empty;
                    }
                    else
                    {
                        adduct = firstLipid.AdductFull;
                    }

                    var    observedMz = closestPeak.Mz;
                    var    formula    = lipidTarget.EmpiricalFormula;
                    var    RT         = spectrumSearchResult.RetentionTime;
                    double MW         = 0;

                    if (lipidTarget.FragmentationMode == FragmentationMode.Positive)
                    {
                        MW = lipidTarget.Composition.Mass - LipidUtil.GetCompositionOfAdduct(lipidTarget.Adduct).Mass;
                    }
                    else if (lipidTarget.FragmentationMode == FragmentationMode.Negative)
                    {
                        MW = lipidTarget.Composition.Mass + LipidUtil.GetCompositionOfAdduct(lipidTarget.Adduct).Mass;
                    }

                    textWriter.WriteLine("Name: {0}; {1}", name, adduct);
                    textWriter.WriteLine("MW: {0}", MW);
                    textWriter.WriteLine("PRECURSORMZ: {0}", observedMz);
                    textWriter.WriteLine("RETENTIONTIME: {0}", RT);
                    textWriter.WriteLine("FORMULA: {0}", formula);
                    textWriter.WriteLine("Comment: CID");
                    textWriter.WriteLine("Num Peaks: {0}", cidCount);
                    foreach (var peak in cidSpectrum.Peaks)
                    {
                        var mz        = peak.Mz;
                        var intensity = peak.Intensity;
                        var match     = cidResults.Where(x => x.ObservedPeak != null).FirstOrDefault(x => x.ObservedPeak.Mz.Equals(peak.Mz));
                        if (match != null)
                        {
                            var annotation = match.TheoreticalPeak.DescriptionForUi;
                            textWriter.WriteLine("{0} {1} \"{2}\"", mz, intensity, annotation);
                        }
                        else
                        {
                            textWriter.WriteLine("{0} {1}", mz, intensity);
                        }
                    }
                    textWriter.WriteLine();


                    textWriter.WriteLine("Name: {0}; {1}", name, adduct);
                    textWriter.WriteLine("MW: {0}", MW);
                    textWriter.WriteLine("PRECURSORMZ: {0}", observedMz);
                    textWriter.WriteLine("RETENTIONTIME: {0}", RT);
                    textWriter.WriteLine("FORMULA: {0}", formula);
                    textWriter.WriteLine("Comment: HCD");
                    textWriter.WriteLine("Num Peaks: {0}", hcdCount);
                    foreach (var peak in hcdSpectrum.Peaks)
                    {
                        var mz        = peak.Mz;
                        var intensity = peak.Intensity;
                        var match     = hcdResults.Where(x => x.ObservedPeak != null).FirstOrDefault(x => x.ObservedPeak.Mz.Equals(peak.Mz));
                        if (match != null)
                        {
                            var annotation = match.TheoreticalPeak.DescriptionForUi;
                            textWriter.WriteLine("{0} {1} \"{2}\"", mz, intensity, annotation);
                        }
                        else
                        {
                            textWriter.WriteLine("{0} {1}", mz, intensity);
                        }
                    }
                    textWriter.WriteLine();
                }
            }
        }
Пример #13
0
 public List <MsMsSearchUnit> GetMsMsSearchUnits()
 {
     return(LipidUtil.CreateMsMsSearchUnits(CommonName, Composition.Mass / Charge, LipidClass, FragmentationMode, AcylChainList));
 }
Пример #14
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);
        }