public static void TestCoIsolation() { List <DigestionMotif> motifs = new List <DigestionMotif> { new DigestionMotif("K", null, 1, null) }; Protease protease = new Protease("CustProtease", CleavageSpecificity.Full, null, null, motifs); ProteaseDictionary.Dictionary.Add(protease.Name, protease); CommonParameters CommonParameters = new CommonParameters(scoreCutoff: 1, deconvolutionIntensityRatio: 50, digestionParams: new DigestionParams(protease.Name, minPeptideLength: 1)); var variableModifications = new List <Modification>(); var fixedModifications = new List <Modification>(); var proteinList = new List <Protein> { new Protein("MNNNKNDNK", null) }; var searchModes = new SinglePpmAroundZeroSearchMode(5); Proteomics.AminoAcidPolymer.Peptide pep1 = new Proteomics.AminoAcidPolymer.Peptide("NNNK"); Proteomics.AminoAcidPolymer.Peptide pep2 = new Proteomics.AminoAcidPolymer.Peptide("NDNK"); var dist1 = IsotopicDistribution.GetDistribution(pep1.GetChemicalFormula(), 0.1, 0.01); var dist2 = IsotopicDistribution.GetDistribution(pep2.GetChemicalFormula(), 0.1, 0.01); MsDataScan[] Scans = new MsDataScan[2]; double[] ms1intensities = new double[] { 0.8, 0.8, 0.2, 0.02, 0.2, 0.02 }; double[] ms1mzs = dist1.Masses.Concat(dist2.Masses).OrderBy(b => b).Select(b => b.ToMz(1)).ToArray(); double selectedIonMz = ms1mzs[1]; MzSpectrum MS1 = new MzSpectrum(ms1mzs, ms1intensities, false); Scans[0] = new MsDataScan(MS1, 1, 1, false, Polarity.Positive, 1.0, new MzRange(300, 2000), "first spectrum", MZAnalyzerType.Unknown, MS1.SumOfAllY, null, null, "scan=1"); double[] ms2intensities = new double[] { 1, 1, 1, 1, 1 }; double[] ms2mzs = new double[] { 146.106.ToMz(1), 228.086.ToMz(1), 229.07.ToMz(1), 260.148.ToMz(1), 342.129.ToMz(1) }; MzSpectrum MS2 = new MzSpectrum(ms2mzs, ms2intensities, false); double isolationMZ = selectedIonMz; Scans[1] = new MsDataScan(MS2, 2, 2, false, Polarity.Positive, 2.0, new MzRange(100, 1500), "second spectrum", MZAnalyzerType.Unknown, MS2.SumOfAllY, null, null, "scan=2", selectedIonMz, null, null, isolationMZ, 2.5, DissociationType.HCD, 1, null); var myMsDataFile = new MsDataFile(Scans, null); var listOfSortedms2Scans = MetaMorpheusTask.GetMs2Scans(myMsDataFile, null, new CommonParameters(deconvolutionIntensityRatio: 50)).OrderBy(b => b.PrecursorMass).ToArray(); PeptideSpectralMatch[] allPsmsArray = new PeptideSpectralMatch[listOfSortedms2Scans.Length];; new ClassicSearchEngine(allPsmsArray, listOfSortedms2Scans, variableModifications, fixedModifications, null, null, null, proteinList, searchModes, CommonParameters, new List <string>()).Run(); // Two matches for this single scan! Corresponding to two co-isolated masses Assert.AreEqual(2, allPsmsArray.Length); Assert.IsTrue(allPsmsArray[0].Score > 1); Assert.AreEqual(2, allPsmsArray[0].ScanNumber); Assert.AreEqual("NNNK", allPsmsArray[0].BaseSequence); Assert.AreEqual("NDNK", allPsmsArray[1].BaseSequence); }
public static void TestPeakSplittingRight() { string fileToWrite = "myMzml.mzML"; string peptide = "PEPTIDE"; double intensity = 1e6; Loaders.LoadElements(Path.Combine(TestContext.CurrentContext.TestDirectory, @"elements.dat")); // generate mzml file // 1 MS1 scan per peptide MsDataScan[] scans = new MsDataScan[10]; double[] intensityMultipliers = { 1, 3, 5, 10, 5, 3, 1, 1, 3, 1 }; for (int s = 0; s < scans.Length; s++) { ChemicalFormula cf = new Proteomics.AminoAcidPolymer.Peptide(peptide).GetChemicalFormula(); IsotopicDistribution dist = IsotopicDistribution.GetDistribution(cf, 0.125, 1e-8); double[] mz = dist.Masses.Select(v => v.ToMz(1)).ToArray(); double[] intensities = dist.Intensities.Select(v => v * intensity * intensityMultipliers[s]).ToArray(); // add the scan scans[s] = new MsDataScan(massSpectrum: new MzSpectrum(mz, intensities, false), oneBasedScanNumber: s + 1, msnOrder: 1, isCentroid: true, polarity: Polarity.Positive, retentionTime: 1.0 + s / 10.0, scanWindowRange: new MzRange(400, 1600), scanFilter: "f", mzAnalyzer: MZAnalyzerType.Orbitrap, totalIonCurrent: intensities.Sum(), injectionTime: 1.0, noiseData: null, nativeId: "scan=" + (s + 1)); } // write the .mzML IO.MzML.MzmlMethods.CreateAndWriteMyMzmlWithCalibratedSpectra(new FakeMsDataFile(scans), Path.Combine(TestContext.CurrentContext.TestDirectory, fileToWrite), false); // set up spectra file info SpectraFileInfo file1 = new SpectraFileInfo(Path.Combine(TestContext.CurrentContext.TestDirectory, fileToWrite), "", 0, 0, 0); // create some PSMs var pg = new ProteinGroup("MyProtein", "gene", "org"); Identification id1 = new Identification(file1, peptide, peptide, new Proteomics.AminoAcidPolymer.Peptide(peptide).MonoisotopicMass, 1.3 + 0.001, 1, new List <ProteinGroup> { pg }); // create the FlashLFQ engine FlashLFQEngine engine = new FlashLFQEngine(new List <Identification> { id1 }); // run the engine var results = engine.Run(); ChromatographicPeak peak = results.Peaks.First().Value.First(); Assert.That(peak.Apex.RetentionTime == 1.3); Assert.That(peak.SplitRT == 1.6); Assert.That(!peak.IsotopicEnvelopes.Any(p => p.RetentionTime > 1.6)); Assert.That(peak.IsotopicEnvelopes.Count == 6); }
public static double CalculateProteoformMass(string sequence, List <Ptm> ptm_combination) { if (Sweet.lollipop.theoretical_database.aaIsotopeMassList == null) { Sweet.lollipop.theoretical_database.populate_aa_mass_dictionary(); } if (!Sweet.lollipop.use_average_mass) { double proteoformMass = 18.010565; // start with water char[] aminoAcids = sequence.ToCharArray(); List <double> aaMasses = new List <double>(); for (int i = 0; i < sequence.Length; i++) { if (Sweet.lollipop.theoretical_database.aaIsotopeMassList.ContainsKey(aminoAcids[i])) { aaMasses.Add(Sweet.lollipop.theoretical_database.aaIsotopeMassList[aminoAcids[i]]); } } return(proteoformMass + aaMasses.Sum() + ptm_combination.Sum(p => Math.Round((double)p.modification.MonoisotopicMass, 5))); } //if most abundant mass, calculate iso distrubution, set modified/unmodified masses to most abundant. var formula = new Proteomics.AminoAcidPolymer.Peptide(sequence).GetChemicalFormula(); // append mod formulas foreach (var mod in ptm_combination) { var modCf = mod.modification.ChemicalFormula; if (modCf != null) { formula.Add(modCf); } } //Calculate isotopic distribution of the full peptide //var dist = IsotopicDistribution.GetDistribution(formula, 0.1, 1e-12); //double[] masses = dist.Masses.ToArray(); //double[] intensities = dist.Intensities.ToArray(); //double max = intensities.Max(); //int modeMassIndex = Array.IndexOf(intensities, max); //return masses[modeMassIndex]; return(formula.AverageMass); }
public ChemicalFormula GetChemicalFormula() { var formula = new Proteomics.AminoAcidPolymer.Peptide(sequence).GetChemicalFormula(); // append mod formulas foreach (var mod in ptm_list) { var modCf = mod.modification.ChemicalFormula; if (modCf != null) { formula.Add(modCf); } else { return(null); } } return(formula); }
public static void TestDeconvolution() { UsefulProteomicsDatabases.Loaders.LoadElements(); // >sp|P49703|ARL4D_HUMAN ADP-ribosylation factor-like protein 4D OS=H**o sapiens OX=9606 GN=ARL4D PE=1 SV=2 string sequence = "MGNHLTEMAPTASSFLPHFQALHVVVIGLDSAGKTSLLYRLKFKEFVQSVPTKGFNTEKIRVPLGGSRGITFQ" + "VWDVGGQEKLRPLWRSYTRRTDGLVFVVDAAEAERLEEAKVELHRISRASDNQGVPVLVLANKQDQPGALSAA" + "EVEKRLAVRELAAATLTHVQGCSAVDGLGLQQGLERLYEMILKRKKAARGGKKRR"; int charge = 15; double intensityMultiplier = 1e6; Proteomics.AminoAcidPolymer.Peptide baseSequence = new Proteomics.AminoAcidPolymer.Peptide(sequence); var formula = baseSequence.GetChemicalFormula(); var isotopicDistribution = IsotopicDistribution.GetDistribution(formula, 0.125, 1e-8); double[] masses = isotopicDistribution.Masses.ToArray(); double[] abundances = isotopicDistribution.Intensities.ToArray(); double max = abundances.Max(); List <(double, double)> peaks = new List <(double, double)>(); for (int i = 0; i < masses.Length; i++) { abundances[i] /= max; if (abundances[i] >= 0.05) { peaks.Add((masses[i].ToMz(charge), abundances[i] * intensityMultiplier)); } } Random r = new Random(1); for (int i = 0; i < 1000; i++) { double mz = r.NextDouble() * 1200 + 400; double intensity = r.NextDouble() * 30000 + 30000; peaks.Add((mz, intensity)); } peaks = peaks.OrderBy(p => p.Item1).ToList(); var spectrum = new MzSpectrum(peaks.Select(p => p.Item1).ToArray(), peaks.Select(p => p.Item2).ToArray(), true); var engine = new DeconvolutionEngine(0, 0.4, 3, 0.4, 1.5, 5, 1, 60, 2); var envs = engine.Deconvolute(spectrum, spectrum.Range).ToList(); List <string> output = new List <string> { DeconvolutedEnvelope.TabDelimitedHeader }; foreach (var env in envs) { env.SpectraFileName = "temp"; output.Add(env.ToOutputString()); } string path = Path.Combine(TestContext.CurrentContext.TestDirectory, @"TestPfmExplorerDeconOutput.tsv"); File.WriteAllLines(path, output); var species = InputReaderParser.ReadSpeciesFromFile(path, out var errors); Assert.That(!errors.Any()); Assert.That(species.Count > 0); Assert.That(species.All(p => p.DeconvolutionFeature != null)); Assert.That(species.All(p => p.DeconvolutionFeature.AnnotatedEnvelopes != null && p.DeconvolutionFeature.AnnotatedEnvelopes.Count > 0)); Assert.That(species.All(p => p.DeconvolutionFeature.AnnotatedEnvelopes.All(v => v.PeakMzs.Count > 0))); //Assert.That(species.Count == 1); }
public static void TestCoIsolation() { Protease protease = new Protease("CustProtease", new List <Tuple <string, TerminusType> > { new Tuple <string, TerminusType>("K", TerminusType.C) }, new List <Tuple <string, TerminusType> >(), CleavageSpecificity.Full, null, null, null); ProteaseDictionary.Dictionary.Add(protease.Name, protease); CommonParameters CommonParameters = new CommonParameters(scoreCutoff: 1, deconvolutionIntensityRatio: 50, digestionParams: new DigestionParams(protease.Name, minPeptideLength: 1)); var variableModifications = new List <ModificationWithMass>(); var fixedModifications = new List <ModificationWithMass>(); var proteinList = new List <Protein> { new Protein("MNNNKNDNK", null) }; var searchModes = new SinglePpmAroundZeroSearchMode(5); Proteomics.AminoAcidPolymer.Peptide pep1 = new Proteomics.AminoAcidPolymer.Peptide("NNNK"); Proteomics.AminoAcidPolymer.Peptide pep2 = new Proteomics.AminoAcidPolymer.Peptide("NDNK"); var dist1 = IsotopicDistribution.GetDistribution(pep1.GetChemicalFormula(), 0.1, 0.01); var dist2 = IsotopicDistribution.GetDistribution(pep2.GetChemicalFormula(), 0.1, 0.01); MsDataScan[] Scans = new MsDataScan[2]; double[] ms1intensities = new double[] { 0.8, 0.8, 0.2, 0.02, 0.2, 0.02 }; double[] ms1mzs = dist1.Masses.Concat(dist2.Masses).OrderBy(b => b).Select(b => b.ToMz(1)).ToArray(); double selectedIonMz = ms1mzs[1]; MzSpectrum MS1 = new MzSpectrum(ms1mzs, ms1intensities, false); Scans[0] = new MsDataScan(MS1, 1, 1, false, Polarity.Positive, 1.0, new MzRange(300, 2000), "first spectrum", MZAnalyzerType.Unknown, MS1.SumOfAllY, null, null, "scan=1"); double[] ms2intensities = new double[] { 1, 1, 1, 1, 1 }; double[] ms2mzs = new double[] { 146.106.ToMz(1), 228.086.ToMz(1), 229.07.ToMz(1), 260.148.ToMz(1), 342.129.ToMz(1) }; MzSpectrum MS2 = new MzSpectrum(ms2mzs, ms2intensities, false); double isolationMZ = selectedIonMz; Scans[1] = new MsDataScan(MS2, 2, 2, false, Polarity.Positive, 2.0, new MzRange(100, 1500), "second spectrum", MZAnalyzerType.Unknown, MS2.SumOfAllY, null, null, "scan=2", selectedIonMz, null, null, isolationMZ, 2.5, DissociationType.HCD, 1, null); var myMsDataFile = new MsDataFile(Scans, null); bool DoPrecursorDeconvolution = true; bool UseProvidedPrecursorInfo = true; double DeconvolutionIntensityRatio = 50; int DeconvolutionMaxAssumedChargeState = 10; Tolerance DeconvolutionMassTolerance = new PpmTolerance(5); var listOfSortedms2Scans = MetaMorpheusTask.GetMs2Scans(myMsDataFile, null, DoPrecursorDeconvolution, UseProvidedPrecursorInfo, DeconvolutionIntensityRatio, DeconvolutionMaxAssumedChargeState, DeconvolutionMassTolerance).OrderBy(b => b.PrecursorMass).ToArray(); PeptideSpectralMatch[] allPsmsArray = new PeptideSpectralMatch[listOfSortedms2Scans.Length]; List <ProductType> lp = new List <ProductType> { ProductType.B, ProductType.Y }; new ClassicSearchEngine(allPsmsArray, listOfSortedms2Scans, variableModifications, fixedModifications, proteinList, lp, searchModes, CommonParameters, new List <string>()).Run(); // Two matches for this single scan! Corresponding to two co-isolated masses Assert.AreEqual(2, allPsmsArray.Length); Assert.IsTrue(allPsmsArray[0].Score > 1); Assert.AreEqual(2, allPsmsArray[0].ScanNumber); var ojdfkj = (SequencesToActualProteinPeptidesEngineResults) new SequencesToActualProteinPeptidesEngine(new List <PeptideSpectralMatch> { allPsmsArray[0], allPsmsArray[1] }, proteinList, fixedModifications, variableModifications, lp, new List <DigestionParams> { CommonParameters.DigestionParams }, CommonParameters.ReportAllAmbiguity, CommonParameters, new List <string>()).Run(); foreach (var huh in allPsmsArray) { if (huh != null) { huh.MatchToProteinLinkedPeptides(ojdfkj.CompactPeptideToProteinPeptideMatching); } } Assert.AreEqual("NNNK", allPsmsArray[0].BaseSequence); Assert.AreEqual("NDNK", allPsmsArray[1].BaseSequence); }
public static void TestProteinQuantFileHeaders(bool hasDefinedExperimentalDesign, int bioreps, int fractions, int techreps) { // create the unit test directory string unitTestFolder = Path.Combine(TestContext.CurrentContext.TestDirectory, @"TestProteinQuantFileHeaders"); Directory.CreateDirectory(unitTestFolder); List <SpectraFileInfo> fileInfos = new List <SpectraFileInfo>(); string peptide = "PEPTIDE"; double ionIntensity = 1e6; string condition = hasDefinedExperimentalDesign ? "TestCondition" : ""; // create the protein database Protein prot = new Protein(peptide, @""); string dbName = Path.Combine(unitTestFolder, "testDB.fasta"); UsefulProteomicsDatabases.ProteinDbWriter.WriteFastaDatabase(new List <Protein> { prot }, dbName, ">"); // create the .mzML files to search/quantify for (int b = 0; b < bioreps; b++) { for (int f = 0; f < fractions; f++) { for (int r = 0; r < techreps; r++) { string fileToWrite = "file_" + "b" + b + "f" + f + "r" + r + ".mzML"; // generate mzml file MsDataScan[] scans = new MsDataScan[2]; // create the MS1 scan ChemicalFormula cf = new Proteomics.AminoAcidPolymer.Peptide(peptide).GetChemicalFormula(); IsotopicDistribution dist = IsotopicDistribution.GetDistribution(cf, 0.125, 1e-8); double[] mz = dist.Masses.Select(v => v.ToMz(1)).ToArray(); double[] intensities = dist.Intensities.Select(v => v * ionIntensity).ToArray(); scans[0] = new MsDataScan(massSpectrum: new MzSpectrum(mz, intensities, false), oneBasedScanNumber: 1, msnOrder: 1, isCentroid: true, polarity: Polarity.Positive, retentionTime: 1.0, scanWindowRange: new MzRange(400, 1600), scanFilter: "f", mzAnalyzer: MZAnalyzerType.Orbitrap, totalIonCurrent: intensities.Sum(), injectionTime: 1.0, noiseData: null, nativeId: "scan=1"); // create the MS2 scan var pep = new PeptideWithSetModifications(peptide, new Dictionary <string, Proteomics.Modification>()); List <Product> frags = new List <Product>(); pep.Fragment(DissociationType.HCD, FragmentationTerminus.Both, frags); double[] mz2 = frags.Select(v => v.NeutralMass.ToMz(1)).ToArray(); double[] intensities2 = frags.Select(v => 1e6).ToArray(); scans[1] = new MsDataScan(massSpectrum: new MzSpectrum(mz2, intensities2, false), oneBasedScanNumber: 2, msnOrder: 2, isCentroid: true, polarity: Polarity.Positive, retentionTime: 1.01, scanWindowRange: new MzRange(100, 1600), scanFilter: "f", mzAnalyzer: MZAnalyzerType.Orbitrap, totalIonCurrent: intensities.Sum(), injectionTime: 1.0, noiseData: null, nativeId: "scan=2", selectedIonMz: pep.MonoisotopicMass.ToMz(1), selectedIonChargeStateGuess: 1, selectedIonIntensity: 1e6, isolationMZ: pep.MonoisotopicMass.ToMz(1), isolationWidth: 1.5, dissociationType: DissociationType.HCD, oneBasedPrecursorScanNumber: 1, selectedIonMonoisotopicGuessMz: pep.MonoisotopicMass.ToMz(1), hcdEnergy: "35"); // write the .mzML string fullPath = Path.Combine(unitTestFolder, fileToWrite); IO.MzML.MzmlMethods.CreateAndWriteMyMzmlWithCalibratedSpectra( new MsDataFile(scans, new SourceFile(@"scan number only nativeID format", "mzML format", null, "SHA-1", @"C:\fake.mzML", null)), fullPath, false); var spectraFileInfo = new SpectraFileInfo(fullPath, condition, b, r, f); fileInfos.Add(spectraFileInfo); } } } // write the experimental design for this quantification test if (hasDefinedExperimentalDesign) { ExperimentalDesign.WriteExperimentalDesignToFile(fileInfos); } // run the search/quantification SearchTask task = new SearchTask(); task.RunTask(unitTestFolder, new List <DbForTask> { new DbForTask(dbName, false) }, fileInfos.Select(p => p.FullFilePathWithExtension).ToList(), ""); // read in the protein quant results Assert.That(File.Exists(Path.Combine(unitTestFolder, "AllQuantifiedProteinGroups.tsv"))); var lines = File.ReadAllLines(Path.Combine(unitTestFolder, "AllQuantifiedProteinGroups.tsv")); // check the intensity column headers var splitHeader = lines[0].Split(new char[] { '\t' }).ToList(); var intensityColumnHeaders = splitHeader.Where(p => p.Contains("Intensity", StringComparison.OrdinalIgnoreCase)).ToList(); Assert.That(intensityColumnHeaders.Count == 2); if (!hasDefinedExperimentalDesign) { Assert.That(intensityColumnHeaders[0] == "Intensity_file_b0f0r0"); Assert.That(intensityColumnHeaders[1] == "Intensity_file_b1f0r0"); } else { Assert.That(intensityColumnHeaders[0] == "Intensity_TestCondition_1"); Assert.That(intensityColumnHeaders[1] == "Intensity_TestCondition_2"); } // check the protein intensity values int ind1 = splitHeader.IndexOf(intensityColumnHeaders[0]); int ind2 = splitHeader.IndexOf(intensityColumnHeaders[1]); double intensity1 = double.Parse(lines[1].Split(new char[] { '\t' })[ind1]); double intensity2 = double.Parse(lines[1].Split(new char[] { '\t' })[ind2]); Assert.That(intensity1 > 0); Assert.That(intensity2 > 0); Assert.That(intensity1 == intensity2); Directory.Delete(unitTestFolder, true); }
public static void TestFlashLfqMatchBetweenRunsProteinQuant() { List <string> filesToWrite = new List <string> { "mzml_1", "mzml_2" }; List <string> pepSequences = new List <string> { "PEPTIDE", "PEPTIDEV", "PEPTIDEVV", "PEPTIDEVVV", "PEPTIDEVVVV" }; double intensity = 1e6; double[] file1Rt = new double[] { 1.01, 1.02, 1.03, 1.04, 1.05 }; double[] file2Rt = new double[] { 1.015, 1.030, 1.036, 1.050, 1.065 }; Loaders.LoadElements(Path.Combine(TestContext.CurrentContext.TestDirectory, @"elements.dat")); // generate mzml files (5 peptides each) for (int f = 0; f < filesToWrite.Count; f++) { // 1 MS1 scan per peptide MsDataScan[] scans = new MsDataScan[5]; for (int p = 0; p < pepSequences.Count; p++) { ChemicalFormula cf = new Proteomics.AminoAcidPolymer.Peptide(pepSequences[p]).GetChemicalFormula(); IsotopicDistribution dist = IsotopicDistribution.GetDistribution(cf, 0.125, 1e-8); double[] mz = dist.Masses.Select(v => v.ToMz(1)).ToArray(); double[] intensities = dist.Intensities.Select(v => v * intensity).ToArray(); double rt; if (f == 0) { rt = file1Rt[p]; } else { rt = file2Rt[p]; } // add the scan scans[p] = new MsDataScan(massSpectrum: new MzSpectrum(mz, intensities, false), oneBasedScanNumber: p + 1, msnOrder: 1, isCentroid: true, polarity: Polarity.Positive, retentionTime: rt, scanWindowRange: new MzRange(400, 1600), scanFilter: "f", mzAnalyzer: MZAnalyzerType.Orbitrap, totalIonCurrent: intensities.Sum(), injectionTime: 1.0, noiseData: null, nativeId: "scan=" + (p + 1)); } // write the .mzML IO.MzML.MzmlMethods.CreateAndWriteMyMzmlWithCalibratedSpectra(new FakeMsDataFile(scans), Path.Combine(TestContext.CurrentContext.TestDirectory, filesToWrite[f] + ".mzML"), false); } // set up spectra file info SpectraFileInfo file1 = new SpectraFileInfo(Path.Combine(TestContext.CurrentContext.TestDirectory, filesToWrite[0] + ".mzML"), "a", 0, 0, 0); SpectraFileInfo file2 = new SpectraFileInfo(Path.Combine(TestContext.CurrentContext.TestDirectory, filesToWrite[1] + ".mzML"), "a", 1, 0, 0); // create some PSMs var pg = new ProteinGroup("MyProtein", "gene", "org"); var myMbrProteinGroup = new ProteinGroup("MyMbrProtein", "MbrGene", "org"); Identification id1 = new Identification(file1, "PEPTIDE", "PEPTIDE", new Proteomics.AminoAcidPolymer.Peptide("PEPTIDE").MonoisotopicMass, file1Rt[0] + 0.001, 1, new List <ProteinGroup> { pg }); Identification id2 = new Identification(file1, "PEPTIDEV", "PEPTIDEV", new Proteomics.AminoAcidPolymer.Peptide("PEPTIDEV").MonoisotopicMass, file1Rt[1] + 0.001, 1, new List <ProteinGroup> { pg }); Identification id3 = new Identification(file1, "PEPTIDEVV", "PEPTIDEVV", new Proteomics.AminoAcidPolymer.Peptide("PEPTIDEVV").MonoisotopicMass, file1Rt[2] + 0.001, 1, new List <ProteinGroup> { myMbrProteinGroup }); Identification id4 = new Identification(file1, "PEPTIDEVVV", "PEPTIDEVVV", new Proteomics.AminoAcidPolymer.Peptide("PEPTIDEVVV").MonoisotopicMass, file1Rt[3] + 0.001, 1, new List <ProteinGroup> { pg }); Identification id5 = new Identification(file1, "PEPTIDEVVVV", "PEPTIDEVVVV", new Proteomics.AminoAcidPolymer.Peptide("PEPTIDEVVVV").MonoisotopicMass, file1Rt[4] + 0.001, 1, new List <ProteinGroup> { pg }); Identification id6 = new Identification(file2, "PEPTIDE", "PEPTIDE", new Proteomics.AminoAcidPolymer.Peptide("PEPTIDE").MonoisotopicMass, file2Rt[0] + 0.001, 1, new List <ProteinGroup> { pg }); Identification id7 = new Identification(file2, "PEPTIDEV", "PEPTIDEV", new Proteomics.AminoAcidPolymer.Peptide("PEPTIDEV").MonoisotopicMass, file2Rt[1] + 0.001, 1, new List <ProteinGroup> { pg }); // missing ID 8 - MBR feature Identification id9 = new Identification(file2, "PEPTIDEVVV", "PEPTIDEVVV", new Proteomics.AminoAcidPolymer.Peptide("PEPTIDEVVV").MonoisotopicMass, file2Rt[3] + 0.001, 1, new List <ProteinGroup> { pg }); Identification id10 = new Identification(file2, "PEPTIDEVVVV", "PEPTIDEVVVV", new Proteomics.AminoAcidPolymer.Peptide("PEPTIDEVVVV").MonoisotopicMass, file2Rt[4] + 0.001, 1, new List <ProteinGroup> { pg }); // test with top3 protein quant engine FlashLFQEngine engine = new FlashLFQEngine(new List <Identification> { id1, id2, id3, id4, id5, id6, id7, id9, id10 }, matchBetweenRuns: true); var results = engine.Run(); Assert.That(results.ProteinGroups["MyMbrProtein"].GetIntensity(file1) > 0); Assert.That(results.ProteinGroups["MyMbrProtein"].GetIntensity(file2) == 0); // test with advanced protein quant engine engine = new FlashLFQEngine(new List <Identification> { id1, id2, id3, id4, id5, id6, id7, id9, id10 }, matchBetweenRuns: true, advancedProteinQuant: true); results = engine.Run(); Assert.That(results.ProteinGroups["MyMbrProtein"].GetIntensity(file1) > 0); Assert.That(results.ProteinGroups["MyMbrProtein"].GetIntensity(file2) == 0); }
public static void TestFlashLfqAdvancedProteinQuant() { List <string> filesToWrite = new List <string> { "mzml_1", "mzml_2" }; List <string> pepSequences = new List <string> { "PEPTIDE", "MYPEPTIDE", "VVVVVPEPTIDE" }; double[,] amounts = new double[2, 3] { { 1000000, 1000000, 1000000 }, { 2000000, 2000000, 900000 } }; Loaders.LoadElements(Path.Combine(TestContext.CurrentContext.TestDirectory, @"elements.dat")); // generate mzml files (3 peptides each) for (int f = 0; f < filesToWrite.Count; f++) { // 1 MS1 scan per peptide MsDataScan[] scans = new MsDataScan[3]; for (int p = 0; p < pepSequences.Count; p++) { ChemicalFormula cf = new Proteomics.AminoAcidPolymer.Peptide(pepSequences[p]).GetChemicalFormula(); IsotopicDistribution dist = IsotopicDistribution.GetDistribution(cf, 0.125, 1e-8); double[] mz = dist.Masses.Select(v => v.ToMz(1)).ToArray(); double[] intensities = dist.Intensities.Select(v => v * amounts[f, p]).ToArray(); // add the scan scans[p] = new MsDataScan(massSpectrum: new MzSpectrum(mz, intensities, false), oneBasedScanNumber: p + 1, msnOrder: 1, isCentroid: true, polarity: Polarity.Positive, retentionTime: 1.0 + (p / 10.0), scanWindowRange: new MzRange(400, 1600), scanFilter: "f", mzAnalyzer: MZAnalyzerType.Orbitrap, totalIonCurrent: intensities.Sum(), injectionTime: 1.0, noiseData: null, nativeId: "scan=" + (p + 1)); } // write the .mzML IO.MzML.MzmlMethods.CreateAndWriteMyMzmlWithCalibratedSpectra(new FakeMsDataFile(scans), Path.Combine(TestContext.CurrentContext.TestDirectory, filesToWrite[f] + ".mzML"), false); } // set up spectra file info SpectraFileInfo file1 = new SpectraFileInfo(Path.Combine(TestContext.CurrentContext.TestDirectory, filesToWrite[0] + ".mzML"), "a", 0, 0, 0); SpectraFileInfo file2 = new SpectraFileInfo(Path.Combine(TestContext.CurrentContext.TestDirectory, filesToWrite[1] + ".mzML"), "a", 1, 0, 0); // create some PSMs var pg = new ProteinGroup("MyProtein", "gene", "org"); Identification id1 = new Identification(file1, "PEPTIDE", "PEPTIDE", 799.35996, 1.01, 1, new List <ProteinGroup> { pg }); Identification id2 = new Identification(file1, "MYPEPTIDE", "MYPEPTIDE", 1093.46377, 1.11, 1, new List <ProteinGroup> { pg }); Identification id3 = new Identification(file1, "VVVVVPEPTIDE", "VVVVVPEPTIDE", 1294.70203, 1.21, 1, new List <ProteinGroup> { pg }); Identification id4 = new Identification(file2, "PEPTIDE", "PEPTIDE", 799.35996, 1.01, 1, new List <ProteinGroup> { pg }); Identification id5 = new Identification(file2, "MYPEPTIDE", "MYPEPTIDE", 1093.46377, 1.11, 1, new List <ProteinGroup> { pg }); Identification id6 = new Identification(file2, "VVVVVPEPTIDE", "VVVVVPEPTIDE", 1294.70203, 1.21, 1, new List <ProteinGroup> { pg }); // create the FlashLFQ engine FlashLFQEngine engine = new FlashLFQEngine(new List <Identification> { id1, id2, id3, id4, id5, id6 }, normalize: false, advancedProteinQuant: true); // run the engine var results = engine.Run(); // third peptide should be low-weighted // protein should be ~sum of first two peptide intensities (a little lower, because some smaller isotope peaks get skipped) double file1ProteinIntensity = results.ProteinGroups["MyProtein"].GetIntensity(file1); Assert.That(file1ProteinIntensity < 2e6); Assert.That(file1ProteinIntensity > 1e6); double file2ProteinIntensity = results.ProteinGroups["MyProtein"].GetIntensity(file2); Assert.That(file2ProteinIntensity < 4e6); Assert.That(file2ProteinIntensity > 3e6); }