public static void TestDigestIndices() { ModificationMotif.TryGetMotif("X", out ModificationMotif motif); Modification mod = new ModificationWithMass(null, null, motif, TerminusLocalization.Any, double.NaN); IDictionary <int, List <Modification> > modDict = new Dictionary <int, List <Modification> > { { 2, new List <Modification> { mod } }, { 8, new List <Modification> { mod } } }; var prot = new Protein("MNNNNKRRRRR", null, null, null, modDict); var protease = new Protease("Custom Protease", new List <string> { "K" }, new List <string>(), TerminusType.C, CleavageSpecificity.Full, null, null, null); DigestionParams digestionParams = new DigestionParams { Protease = protease, InitiatorMethionineBehavior = InitiatorMethionineBehavior.Retain, MaxMissedCleavages = 0, }; var digestList = prot.Digest(digestionParams, new List <ModificationWithMass>(), new List <ModificationWithMass>()).ToList(); var ok1 = digestList[1]; var ok2 = digestList[3]; Assert.AreEqual(1, ok1.NumMods); Assert.IsTrue(ok1.allModsOneIsNterminus.ContainsKey(3)); Assert.AreEqual(1, ok2.NumMods); Assert.IsTrue(ok2.allModsOneIsNterminus.ContainsKey(3)); }
//TO THINK: Is it reasonable to transfer Glycan to Modification the first time Glycan is read in? Which could save time. //Use glycan index and modification index to reduce space. public static Modification NGlycanToModification(Glycan glycan) { Dictionary <DissociationType, List <double> > neutralLosses = new Dictionary <DissociationType, List <double> >(); if (glycan.Ions != null) { List <double> lossMasses = glycan.Ions.Where(p => p.IonMass < 57000000).Select(p => (double)p.LossIonMass / 1E5).OrderBy(p => p).ToList(); //570 is a cutoff for glycan ion size 2N1H, which will generate fragment ions. neutralLosses.Add(DissociationType.HCD, lossMasses); neutralLosses.Add(DissociationType.CID, lossMasses); neutralLosses.Add(DissociationType.EThcD, lossMasses); } Dictionary <DissociationType, List <double> > diagnosticIons = new Dictionary <DissociationType, List <double> >(); diagnosticIons.Add(DissociationType.HCD, glycan.DiagnosticIons.Select(p => (double)p / 1E5).ToList()); diagnosticIons.Add(DissociationType.CID, glycan.DiagnosticIons.Select(p => (double)p / 1E5).ToList()); diagnosticIons.Add(DissociationType.EThcD, glycan.DiagnosticIons.Select(p => (double)p / 1E5).ToList()); ModificationMotif.TryGetMotif("N", out ModificationMotif finalMotif); //TO DO: only one motif can be write here. var id = Glycan.GetKindString(glycan.Kind); Modification modification = new Modification( _originalId: id, _modificationType: "N-Glycosylation", _monoisotopicMass: (double)glycan.Mass / 1E5, _locationRestriction: "Anywhere.", _target: finalMotif, _neutralLosses: neutralLosses, _diagnosticIons: diagnosticIons ); return(modification); }
public void DoNotWriteSameModTwiceButWriteInHeaderSinceDifferent() { Loaders.LoadElements(Path.Combine(TestContext.CurrentContext.TestDirectory, "elements2.dat")); var sampleModList = PtmListLoader.ReadModsFromFile(Path.Combine(TestContext.CurrentContext.TestDirectory, "z.txt")).ToList(); Protein protein = new Protein("MCSSSSSSSSSS", "accession", "organism", new List <Tuple <string, string> >(), new Dictionary <int, List <Modification> > { { 2, sampleModList.OfType <Modification>().ToList() } }, null, "name", "full_name", false, false, new List <DatabaseReference>(), new List <SequenceVariation>(), new List <DisulfideBond>()); Assert.AreEqual(1, protein.OneBasedPossibleLocalizedModifications[2].OfType <ModificationWithMass>().Count()); Dictionary <string, HashSet <Tuple <int, Modification> > > dictWithThisMod = new Dictionary <string, HashSet <Tuple <int, Modification> > >(); HashSet <Tuple <int, Modification> > value = new HashSet <Tuple <int, Modification> >(); ModificationMotif.TryGetMotif("C", out ModificationMotif motif); ModificationWithMass newMod = new ModificationWithMass("Palmitoylation of C", "mt", motif, TerminusLocalization.Any, double.NaN, null, null); Assert.AreNotEqual(newMod, sampleModList.First()); value.Add(new Tuple <int, Modification>(2, newMod)); dictWithThisMod.Add("accession", value); var newModResEntries = ProteinDbWriter.WriteXmlDatabase(dictWithThisMod, new List <Protein> { protein }, Path.Combine(TestContext.CurrentContext.TestDirectory, "test_modifications_with_proteins2.xml")); Assert.AreEqual(0, newModResEntries.Count); List <Protein> new_proteins = ProteinDbLoader.LoadProteinXML(Path.Combine(TestContext.CurrentContext.TestDirectory, "test_modifications_with_proteins2.xml"), true, DecoyType.None, new List <Modification>(), false, new List <string>(), out Dictionary <string, Modification> um); Assert.AreEqual(1, new_proteins.Count); Assert.AreEqual(1, new_proteins[0].OneBasedPossibleLocalizedModifications.Count); Assert.AreEqual(2, new_proteins[0].OneBasedPossibleLocalizedModifications.SelectMany(kv => kv.Value).Count()); }
public static void TestVeryCloseExperimentalsModern() { IDictionary <int, List <Modification> > mods = new Dictionary <int, List <Modification> >(); ModificationMotif.TryGetMotif("M", out ModificationMotif motif); var prot = new Protein("MMMM", null, null, null, mods); DigestionParams digestionParams = new DigestionParams(minPeptideLength: 1); var thePep = prot.Digest(digestionParams, new List <Modification>(), new List <Modification>()).First(); var frags = new List <Product>(); thePep.Fragment(DissociationType.HCD, FragmentationTerminus.Both, frags); var massArray = frags.Select(p => p.NeutralMass).ToArray(); Array.Sort(massArray); double[] intensities = new double[] { 1, 1, 1, 1 }; double[] mz = new double[] { 1, 2, massArray[4].ToMz(1), massArray[4].ToMz(1) + 1e-9 }; MzSpectrum massSpectrum = new MzSpectrum(mz, intensities, false); MsDataScan scan = new MsDataScan(massSpectrum, 1, 1, true, Polarity.Positive, 1, new MzRange(300, 2000), "", MZAnalyzerType.Unknown, massSpectrum.SumOfAllY, null, null, "scan=1", 0, null, null, 0, null, DissociationType.Unknown, 1, null); PeptideSpectralMatch[] globalPsms = new PeptideSpectralMatch[1]; Ms2ScanWithSpecificMass[] arrayOfSortedMS2Scans = { new Ms2ScanWithSpecificMass(scan, 600, 1, null, new CommonParameters()) }; CommonParameters CommonParameters = new CommonParameters(productMassTolerance: new PpmTolerance(5), scoreCutoff: 1, digestionParams: new DigestionParams(maxMissedCleavages: 0, minPeptideLength: 1, maxModificationIsoforms: int.MaxValue, initiatorMethionineBehavior: InitiatorMethionineBehavior.Retain)); var indexEngine = new IndexingEngine(new List <Protein> { prot }, new List <Modification>(), new List <Modification>(), null, null, null, 1, DecoyType.Reverse, CommonParameters, null, 30000, false, new List <FileInfo>(), TargetContaminantAmbiguity.RemoveContaminant, new List <string>()); var indexResults = (IndexingResults)indexEngine.Run(); var cse = new ModernSearchEngine(globalPsms, arrayOfSortedMS2Scans, indexResults.PeptideIndex, indexResults.FragmentIndex, 0, CommonParameters, null, new OpenSearchMode(), 0, new List <string>()); cse.Run(); Assert.Less(globalPsms[0].Score, 2); Assert.Greater(globalPsms[0].Score, 1); }
public void Test_read_xml_write_read_fasta() { ModificationMotif.TryGetMotif("X", out ModificationMotif motif); var nice = new List <Modification> { new Modification("fayk", null, "mt", null, motif, "Anywhere.", null, null, null, null, null, null, null, null) }; List <Protein> ok = ProteinDbLoader.LoadProteinXML(Path.Combine(TestContext.CurrentContext.TestDirectory, "DatabaseTests", @"xml2.xml"), true, DecoyType.None, nice, false, null, out Dictionary <string, Modification> un); ProteinDbWriter.WriteFastaDatabase(ok, Path.Combine(TestContext.CurrentContext.TestDirectory, "DatabaseTests", @"rewrite_xml_test.fasta"), "|"); List <Protein> ok2 = ProteinDbLoader.LoadProteinFasta(Path.Combine(TestContext.CurrentContext.TestDirectory, "DatabaseTests", @"rewrite_xml_test.fasta"), true, DecoyType.None, false, ProteinDbLoader.UniprotAccessionRegex, ProteinDbLoader.UniprotFullNameRegex, ProteinDbLoader.UniprotNameRegex, ProteinDbLoader.UniprotGeneNameRegex, ProteinDbLoader.UniprotOrganismRegex, out var b); Assert.AreEqual(ok.Count, ok2.Count); Assert.True(Enumerable.Range(0, ok.Count).All(i => ok[i].BaseSequence == ok2[i].BaseSequence)); Assert.True(Enumerable.Range(0, ok.Count).All(i => ok[i].Name == ok2[i].Name)); Assert.True(Enumerable.Range(0, ok.Count).All(i => ok[i].Organism == ok2[i].Organism)); Assert.True(Enumerable.Range(0, ok.Count).All(i => ok[i].GeneNames.First().Item2 == ok2[i].GeneNames.First().Item2)); Assert.True(ok.All(p => p.ProteolysisProducts.All(prod => prod.OneBasedBeginPosition == null || prod.OneBasedBeginPosition > 0 && prod.OneBasedBeginPosition <= p.Length))); Assert.True(ok.All(p => p.ProteolysisProducts.All(prod => prod.OneBasedEndPosition == null || prod.OneBasedEndPosition > 0 && prod.OneBasedEndPosition <= p.Length))); Assert.True(ok2.All(p => p.ProteolysisProducts.All(prod => prod.OneBasedBeginPosition == null || prod.OneBasedBeginPosition > 0 && prod.OneBasedBeginPosition <= p.Length))); Assert.True(ok2.All(p => p.ProteolysisProducts.All(prod => prod.OneBasedEndPosition == null || prod.OneBasedEndPosition > 0 && prod.OneBasedEndPosition <= p.Length))); }
public static void Test_ProteinDigest() { DigestionParams d = new DigestionParams( maxMissedCleavages: 0, minPeptideLength: 5, initiatorMethionineBehavior: InitiatorMethionineBehavior.Retain); ModificationMotif.TryGetMotif("D", out ModificationMotif motif); Modification mod = new Modification(_originalId: "mod1", _modificationType: "mt", _target: motif, _locationRestriction: "Anywhere.", _monoisotopicMass: 10); IDictionary <int, List <Modification> > oneBasedModification = new Dictionary <int, List <Modification> > { { 3, new List <Modification> { mod } } }; Protein prot1 = new Protein("MEDEEK", "prot1", oneBasedModifications: oneBasedModification); var pep1 = prot1.Digest(d, new List <Modification>(), new List <Modification>()).First(); var pep2 = prot1.Digest(d, new List <Modification>(), new List <Modification>()).Last(); Assert.AreEqual("MEDEEK", pep1.FullSequence); Assert.AreEqual("MED[mt:mod1 on D]EEK", pep2.FullSequence); }
public static TheoreticalProteoform make_a_theoretical(string a, double mass, int lysine_count) { ModificationMotif motif; ModificationMotif.TryGetMotif("X", out motif); Modification unmodification = new Modification("Unmodified", _target: motif, _locationRestriction: "Anywhere.", _monoisotopicMass: 0); ProteinWithGoTerms p1 = new ProteinWithGoTerms("MSSSSSSSSSSS", "T1", new List <Tuple <string, string> > { new Tuple <string, string>("", "") }, new Dictionary <int, List <Modification> > { { 0, new List <Modification> { unmodification } } }, new List <ProteolysisProduct> { new ProteolysisProduct(1, 12, "") }, "T2", "T3", true, false, new List <DatabaseReference> { new DatabaseReference("GO", ":", new List <Tuple <string, string> > { new Tuple <string, string>("term", "P:") }) }, new List <GoTerm> { new GoTerm(new DatabaseReference("GO", ":", new List <Tuple <string, string> > { new Tuple <string, string>("term", "P:") })) }); PtmSet set = new PtmSet(new List <Ptm> { new Ptm() }); var t = new TheoreticalProteoform(a, "", p1.BaseSequence, new List <ProteinWithGoTerms> { p1 }, mass, lysine_count, set, true, false, new Dictionary <InputFile, Protein[]>()); t.modified_mass = mass; return(t); }
public static void TestCompactPeptideMasses_cTerminalModifiedPeptide() { Protein p = new Protein("PET", "accession"); ModificationMotif.TryGetMotif("T", out ModificationMotif motif); Modification phosphorylation = new Modification(_originalId: "phospho", _modificationType: "CommonBiological", _target: motif, _locationRestriction: "Anywhere.", _chemicalFormula: ChemicalFormula.ParseFormula("H1O3P1")); DigestionParams digestionParams = new DigestionParams(minPeptideLength: 2); var aPeptideWithSetModifications = p.Digest(digestionParams, new List <Modification> { phosphorylation }, new List <Modification>()).First(); var aCompactPeptide = aPeptideWithSetModifications.CompactPeptide(FragmentationTerminus.Both); //evaluate N-terminal masses var nTerminalMasses = aCompactPeptide.TerminalMasses.Where(v => v.Terminus == FragmentationTerminus.N); HashSet <int> expectedNTerminalMasses = new HashSet <int> { 97, 226 }; Assert.That(expectedNTerminalMasses.SetEquals(nTerminalMasses.Select(v => (int)Math.Round(v.NeutralMass, 1)))); //evaluate C-terminal masses var cTerminalMasses = aCompactPeptide.TerminalMasses.Where(v => v.Terminus == FragmentationTerminus.C); HashSet <int> expectedCTerminalMasses = new HashSet <int> { 181, 310, 407 }; Assert.That(expectedCTerminalMasses.SetEquals(cTerminalMasses.Select(v => (int)Math.Round(v.NeutralMass, 1)))); }
public void Test_modification3_hash_set() // numerical tolerance is 1e-9 so these two mods need to evaluate as identical { ModificationMotif.TryGetMotif("K", out ModificationMotif motif); Modification m1 = new Modification(_originalId: "id1", _modificationType: "modificationType", _target: motif, _locationRestriction: "Anywhere.", _monoisotopicMass: 1.11111d, _databaseReference: new Dictionary <string, IList <string> >(), _neutralLosses: new Dictionary <DissociationType, List <double> > { { DissociationType.AnyActivationType, new List <double> { 2.222222 } } }, _diagnosticIons: new Dictionary <DissociationType, List <double> > { { DissociationType.AnyActivationType, new List <double> { 1.2233 } } }); Modification m2 = new Modification(_originalId: "id1", _modificationType: "modificationType", _target: motif, _locationRestriction: "Anywhere.", _monoisotopicMass: 1.11111d - 1e-10, _databaseReference: new Dictionary <string, IList <string> >(), _neutralLosses: new Dictionary <DissociationType, List <double> > { { DissociationType.AnyActivationType, new List <double> { 2.222222 + 1e-10 } } }, _diagnosticIons: new Dictionary <DissociationType, List <double> > { { DissociationType.AnyActivationType, new List <double> { 1.2233 } } }); m1.DatabaseReference.Add("key", new List <string> { "value" }); m2.DatabaseReference.Add("key", new List <string> { "value" }); HashSet <Modification> mods = new HashSet <Modification>(new Modification[] { m1, m2 }); Assert.AreEqual(1, mods.Count); Assert.IsTrue(m1.Equals(m2)); }
public static void TestCompactPeptideMasses_internallyModifiedPeptide_NeutralLoss() { Protein p = new Protein("PET", "accession"); ModificationMotif.TryGetMotif("E", out ModificationMotif motif); Modification phosphorylation = new Modification(_originalId: "phospho", _modificationType: "CommonBiological", _target: motif, _locationRestriction: "Anywhere.", _chemicalFormula: ChemicalFormula.ParseFormula("H1O3P1"), _neutralLosses: new Dictionary <DissociationType, List <double> > { { MassSpectrometry.DissociationType.HCD, new List <double> { 0, ChemicalFormula.ParseFormula("H3O4P1").MonoisotopicMass } } }); DigestionParams digestionParams = new DigestionParams(minPeptideLength: 2); var aPeptideWithSetModifications = p.Digest(digestionParams, new List <Modification> { phosphorylation }, new List <Modification>()).First(); var aCompactPeptide = aPeptideWithSetModifications.CompactPeptide(FragmentationTerminus.Both); var allFragmentNeutralMasses = aPeptideWithSetModifications.Fragment(DissociationType.HCD, FragmentationTerminus.Both); //evaluate N-terminal masses var n = allFragmentNeutralMasses.Where(f => f.TerminusFragment.Terminus == FragmentationTerminus.N).ToList(); HashSet <int> expectedNTerminalMasses = new HashSet <int> { 97, 306, 208 }; Assert.That(expectedNTerminalMasses.SetEquals(n.Select(v => (int)Math.Round(v.NeutralMass, 1)))); //evaluate C-terminal masses var c = allFragmentNeutralMasses.Where(f => f.TerminusFragment.Terminus == FragmentationTerminus.C).ToList(); HashSet <int> expectedCTerminalMasses = new HashSet <int> { 119, 328, 230 }; Assert.That(expectedCTerminalMasses.SetEquals(c.Select(v => (int)Math.Round(v.NeutralMass, 1)))); }
public static void TestCompactPeptideMasses_nTerminalModifiedPeptide_NeutralLoss_DissociationTypes_CID_and_HCD()//there should be no added neutral losses in this case becuase the allowed dissociation type doesn't match the dissociation type used in the experiment { Protein p = new Protein("PET", "accession"); ModificationMotif.TryGetMotif("P", out ModificationMotif motif); Modification phosphorylation = new Modification(_originalId: "phospho", _modificationType: "CommonBiological", _target: motif, _locationRestriction: "Anywhere.", _chemicalFormula: ChemicalFormula.ParseFormula("H1O3P1"), _neutralLosses: new Dictionary <DissociationType, List <double> > { { MassSpectrometry.DissociationType.CID, new List <double> { 0, ChemicalFormula.ParseFormula("H3O4P1").MonoisotopicMass } } }); DigestionParams digestionParams = new DigestionParams(minPeptideLength: 2); var aPeptideWithSetModifications = p.Digest(digestionParams, new List <Modification> { phosphorylation }, new List <Modification>()).First(); var aCompactPeptide = aPeptideWithSetModifications.CompactPeptide(FragmentationTerminus.Both); //evaluate N-terminal masses var nTerminalMasses = aCompactPeptide.TerminalMasses.Where(v => v.Terminus == FragmentationTerminus.N); HashSet <int> expectedNTerminalMasses = new HashSet <int> { 177, 306 }; Assert.That(expectedNTerminalMasses.SetEquals(nTerminalMasses.Select(v => (int)Math.Round(v.NeutralMass, 1)))); //evaluate C-terminal masses var cTerminalMasses = aCompactPeptide.TerminalMasses.Where(v => v.Terminus == FragmentationTerminus.C); HashSet <int> expectedCTerminalMasses = new HashSet <int> { 101, 230, 407 }; Assert.That(expectedCTerminalMasses.SetEquals(cTerminalMasses.Select(v => (int)Math.Round(v.NeutralMass, 1)))); }
//Motif should be writen with required form public static List <int> GetPossibleModSites(PeptideWithSetModifications peptide, string[] motifs) { List <int> possibleModSites = new List <int>(); List <Modification> modifications = new List <Modification>(); foreach (var mtf in motifs) { if (ModificationMotif.TryGetMotif(mtf, out ModificationMotif aMotif)) { Modification modWithMotif = new Modification(_target: aMotif, _locationRestriction: "Anywhere."); modifications.Add(modWithMotif); } } foreach (var modWithMotif in modifications) { for (int r = 0; r < peptide.Length; r++) { if (peptide.AllModsOneIsNterminus.Keys.Contains(r + 2)) { continue; } //FullSequence is used here to avoid duplicated modification on same sites? if (ModificationLocalization.ModFits(modWithMotif, peptide.BaseSequence, r + 1, peptide.Length, r + 1)) { possibleModSites.Add(r + 2); } } } return(possibleModSites); }
public static bool MotifExist(string baseSeq, string[] motifs) { List <Modification> modifications = new List <Modification>(); foreach (var mtf in motifs) { if (ModificationMotif.TryGetMotif(mtf, out ModificationMotif aMotif)) { Modification modWithMotif = new Modification(_target: aMotif, _locationRestriction: "Anywhere."); modifications.Add(modWithMotif); } } foreach (var modWithMotif in modifications) { for (int r = 0; r < baseSeq.Length; r++) { //Modification is not considered. if (ModificationLocalization.ModFits(modWithMotif, baseSeq, r + 1, baseSeq.Length, r + 1)) { return(true); } } } return(false); }
public void Test_FragmentationModNeutralLoss() { // Now we'll check the mass of modified peptide with no neutral losses ModificationMotif.TryGetMotif("T", out ModificationMotif motif); Modification mod = new Modification(_originalId: "phospho", _modificationType: "testModType", _target: motif, _chemicalFormula: ChemicalFormula.ParseFormula("H1 O3 P1"), _neutralLosses: new Dictionary <DissociationType, List <double> > { { DissociationType.HCD, new List <double> { ChemicalFormula.ParseFormula("H3 O4 P1").MonoisotopicMass } } }, _locationRestriction: "Anywhere."); List <Modification> modlist = new List <Modification> { mod }; DigestionParams digestionParams = new DigestionParams( protease: "trypsin", maxMissedCleavages: 0, minPeptideLength: 1, initiatorMethionineBehavior: InitiatorMethionineBehavior.Retain); var prot = new Protein("PEPTIDE", null, oneBasedModifications: new Dictionary <int, List <Modification> > { { 4, modlist } }); var ye = prot.Digest(digestionParams, new List <Modification>(), new List <Modification>()).ToList(); var peptideWithNeutralMassMod = ye.Where(v => v.AllModsOneIsNterminus.Count > 0).First(); var myModFragments = peptideWithNeutralMassMod.Fragment(DissociationType.HCD, FragmentationTerminus.Both).ToList(); HashSet <int> neutralMasses = new HashSet <int>(myModFragments.Select(m => (int)m.NeutralMass.ToMz(1)).ToList()); HashSet <int> expectedMasses = new HashSet <int> { 98, 227, 324, 407, 520, 635, 505, 618, 733, //b-ions with and without neutral loss 148, 263, 376, 459, 556, 685, 557, 654, 783, //y-ions with and without neutral loss 782 }; //molecular ion with neutral loss Assert.That(neutralMasses.SetEquals(expectedMasses)); }
public static void TestPeptideWithSetModifications() { var prot = new Protein("M", null); DigestionParams digestionParams = new DigestionParams(maxMissedCleavages: 0, minPeptideLength: 1, maxModsForPeptides: 3); // if you pass Custom Protease7 this test gets really flakey. List <Modification> variableModifications = new List <Modification>(); ModificationMotif.TryGetMotif("M", out ModificationMotif motif); variableModifications.Add(new Modification(_originalId: "ProtNmod", _target: motif, _locationRestriction: "N-terminal.", _chemicalFormula: ChemicalFormula.ParseFormula("H"), _monoisotopicMass: GetElement(1).PrincipalIsotope.AtomicMass)); variableModifications.Add(new Modification(_originalId: "pepNmod", _target: motif, _locationRestriction: "Peptide N-terminal.", _chemicalFormula: ChemicalFormula.ParseFormula("H"), _monoisotopicMass: GetElement(1).PrincipalIsotope.AtomicMass)); variableModifications.Add(new Modification(_originalId: "resMod", _target: motif, _locationRestriction: "Anywhere.", _chemicalFormula: ChemicalFormula.ParseFormula("H"), _monoisotopicMass: GetElement(1).PrincipalIsotope.AtomicMass)); variableModifications.Add(new Modification(_originalId: "PepCmod", _target: motif, _locationRestriction: "Peptide C-terminal.", _chemicalFormula: ChemicalFormula.ParseFormula("H"), _monoisotopicMass: GetElement(1).PrincipalIsotope.AtomicMass)); variableModifications.Add(new Modification(_originalId: "ProtCmod", _target: motif, _locationRestriction: "C-terminal.", _chemicalFormula: ChemicalFormula.ParseFormula("H"), _monoisotopicMass: GetElement(1).PrincipalIsotope.AtomicMass)); var ye = prot.Digest(digestionParams, new List <Modification>(), variableModifications).ToList(); Assert.AreEqual(3 * 2 * 3, ye.Count); Assert.AreEqual("[H]M[H][H]", ye.Last().SequenceWithChemicalFormulas); double m1 = 5 * GetElement("H").PrincipalIsotope.AtomicMass + Residue.ResidueMonoisotopicMass['M'] + GetElement("O").PrincipalIsotope.AtomicMass; m1 = Math.Round(m1, 9, MidpointRounding.AwayFromZero); double m2 = ye.Last().MonoisotopicMass; double m3 = m1 - m2; Assert.IsTrue(m3 < 1e-9); }
public void TestInvalidModificationHash() { ModificationMotif.TryGetMotif("K", out ModificationMotif motif); Modification m1 = new Modification(_originalId: "id1", _modificationType: "modificationType", _target: motif, _locationRestriction: "Anywhere."); Modification m2 = new Modification(_originalId: "id1", _modificationType: "modificationType", _target: motif, _locationRestriction: "Anywhere."); HashSet <Modification> mods = new HashSet <Modification>(new Modification[] { m1, m2 }); Assert.IsFalse(m1.ValidModification); Assert.IsFalse(m2.ValidModification); Assert.True(m1.Equals(m2)); Assert.AreEqual(1, mods.Count); // test comparing invalid mods with null vs not-null MMs m1 = new Modification(_originalId: "id1", _target: motif, _locationRestriction: "Anywhere.", _monoisotopicMass: 1); m2 = new Modification(_originalId: "id1", _target: motif, _locationRestriction: "Anywhere."); mods = new HashSet <Modification>(new Modification[] { m1, m2 }); Assert.IsFalse(m1.ValidModification); Assert.IsFalse(m2.ValidModification); Assert.False(m1.Equals(m2)); Assert.AreEqual(2, mods.Count); // test comparing invalid mods with null vs not-null IDs m1 = new Modification(_originalId: "id1", _target: motif, _locationRestriction: "Anywhere."); m2 = new Modification(_target: motif, _locationRestriction: "Anywhere."); mods = new HashSet <Modification>(new Modification[] { m1, m2 }); Assert.IsFalse(m1.ValidModification); Assert.IsFalse(m2.ValidModification); Assert.False(m1.Equals(m2)); Assert.AreEqual(2, mods.Count); }
public static void TestDigestIndices() { ModificationMotif.TryGetMotif("N", out ModificationMotif motifN); ModificationMotif.TryGetMotif("R", out ModificationMotif motifR); Modification modN = new Modification("myMod", null, "myModType", null, motifN, "Anywhere.", null, 10, null, null, null, null, null, null); Modification modR = new Modification("myMod", null, "myModType", null, motifR, "Anywhere.", null, 10, null, null, null, null, null, null); IDictionary <int, List <Modification> > modDict = new Dictionary <int, List <Modification> > { { 2, new List <Modification> { modN } }, { 8, new List <Modification> { modR } } }; var prot = new Protein("MNNNNKRRRRR", null, null, null, modDict, isDecoy: true); DigestionParams digestionParams = new DigestionParams(minPeptideLength: 5, initiatorMethionineBehavior: InitiatorMethionineBehavior.Retain); var digestedList = prot.Digest(digestionParams, new List <Modification>(), new List <Modification>()).ToList(); var ok1 = digestedList[1]; var ok2 = digestedList[3]; Assert.AreEqual(1, ok1.NumMods); Assert.IsTrue(ok1.AllModsOneIsNterminus.ContainsKey(3)); Assert.AreEqual(1, ok2.NumMods); Assert.IsTrue(ok2.AllModsOneIsNterminus.ContainsKey(3)); }
public static TheoreticalProteoform make_a_theoretical(string a, string d, double mass, ProteinWithGoTerms p, Dictionary <InputFile, Protein[]> dict) { ModificationMotif motif; ModificationMotif.TryGetMotif("K", out motif); string mod_title = "oxidation"; ModificationWithMass m = new ModificationWithMass(mod_title, new Tuple <string, string>("", mod_title), motif, ModificationSites.K, 1, new Dictionary <string, IList <string> >(), new List <double>(), new List <double>(), ""); ProteinWithGoTerms p1 = new ProteinWithGoTerms("MSSSSSSSSSSS", "T1", new List <Tuple <string, string> > { new Tuple <string, string>("ordered locus", "GENE") }, new Dictionary <int, List <Modification> > { { 1, new List <Modification> { m } } }, new int?[] { 0 }, new int?[] { 0 }, new string[] { "" }, "T2", "T3", true, false, new List <DatabaseReference> { new DatabaseReference("GO", ":", new List <Tuple <string, string> > { new Tuple <string, string>("term", "P:") }) }, new List <GoTerm> { new GoTerm(new DatabaseReference("GO", ":", new List <Tuple <string, string> > { new Tuple <string, string>("term", "P:") })) }); PtmSet set = new PtmSet(new List <Ptm> { new Ptm(0, m) }); return(new TheoreticalProteoform(a, d, new List <ProteinWithGoTerms> { p }, mass, 0, set, true, false, dict)); }
/// <summary> /// Tests that a PeptideWithSetModifications object can be parsed correctly from a string, with mod info /// </summary> public static void TestReadPeptideFromString() { // set up the test ModificationMotif.TryGetMotif("T", out ModificationMotif target); Modification carbamidomethylOnC = new Modification(_originalId: "Carbamidomethyl on C", _modificationType: "Common Fixed", _target: target, _chemicalFormula: ChemicalFormula.ParseFormula("C2H3NO")); string sequence = "HQVC[Common Fixed:Carbamidomethyl on C]TPGGTTIAGLC[Common Fixed:Carbamidomethyl on C]VMEEK"; // parse the peptide from the string PeptideWithSetModifications peptide = new PeptideWithSetModifications(sequence, new Dictionary <string, Modification> { { carbamidomethylOnC.IdWithMotif, carbamidomethylOnC } }); // test base sequence and full sequence Assert.That(peptide.BaseSequence == "HQVCTPGGTTIAGLCVMEEK"); Assert.That(peptide.FullSequence == sequence); // test peptide mass Assert.That(Math.Round(peptide.MonoisotopicMass, 5) == 2187.01225); // test mods (correct id, correct number of mods, correct location of mods) Assert.That(peptide.AllModsOneIsNterminus.First().Value.IdWithMotif == "Carbamidomethyl on C"); Assert.That(peptide.AllModsOneIsNterminus.Count == 2); Assert.That(new HashSet <int>(peptide.AllModsOneIsNterminus.Keys).SetEquals(new HashSet <int>() { 5, 16 })); // calculate fragments. just check that they exist and it doesn't crash List <Product> theoreticalFragments = new List <Product>(); peptide.Fragment(DissociationType.HCD, FragmentationTerminus.Both, theoreticalFragments); Assert.That(theoreticalFragments.Count > 0); }
public static void XmlTest() { ModificationMotif.TryGetMotif("X", out ModificationMotif motif); var nice = new List <Modification> { new ModificationWithLocation("fayk", "mt", motif, TerminusLocalization.Any, null) }; var ok = ProteinDbLoader.LoadProteinXML(Path.Combine(TestContext.CurrentContext.TestDirectory, @"xml.xml"), true, DecoyType.Reverse, nice, false, null, out Dictionary <string, Modification> un); Assert.AreEqual('M', ok[0][0]); Assert.AreEqual('M', ok[1][0]); Assert.AreEqual("P62805|H4_HUMAN|Histone H4", ok[0].FullDescription); Assert.AreEqual("DECOY_P62805|H4_HUMAN|Histone H4", ok[1].FullDescription); Assert.AreEqual("ENST00000244537", ok[0].DatabaseReferences.First(dbRef => dbRef.Type == "Ensembl").Id); Assert.AreEqual("protein sequence ID", ok[0].DatabaseReferences.First(dbRef => dbRef.Type == "Ensembl").Properties.First().Item1); Assert.AreEqual("ENSP00000244537", ok[0].DatabaseReferences.First(dbRef => dbRef.Type == "Ensembl").Properties.First().Item2); Assert.AreEqual(42, ok[0].GeneNames.Count()); Assert.AreEqual(14, ok[0].GeneNames.Where(t => t.Item1 == "primary").Count()); Assert.AreEqual("HIST1H4A", ok[0].GeneNames.Where(t => t.Item1 == "primary").First().Item2); Assert.AreEqual(23, ok[0].DatabaseReferences.Count(dbRef => dbRef.Type == "Ensembl")); Assert.AreEqual(0, ok[0].DisulfideBonds.Count()); Assert.AreEqual(1, ok[0].SequenceVariations.Count()); Assert.AreEqual(1, ok[1].SequenceVariations.Count()); // decoys get the same sequence variations Assert.AreEqual(64, ok[0].SequenceVariations.First().OneBasedBeginPosition); Assert.AreEqual(64, ok[0].SequenceVariations.First().OneBasedEndPosition); Assert.AreEqual(103 - 64 + 2, ok[1].SequenceVariations.First().OneBasedBeginPosition); Assert.AreEqual(103 - 64 + 2, ok[1].SequenceVariations.First().OneBasedEndPosition); Assert.AreNotEqual(ok[0].SequenceVariations.First().Description, ok[1].SequenceVariations.First().Description); //decoys and target variations don't have the same desc. }
public static TheoreticalProteoform make_a_theoretical(string a, string d, double mass, ProteinWithGoTerms p, Dictionary <InputFile, Protein[]> dict) { ModificationMotif motif; ModificationMotif.TryGetMotif("X", out motif); string mod_title = "oxidation"; Modification m = new Modification(mod_title, _modificationType: "modtype", _target: motif, _locationRestriction: "Anywhere.", _monoisotopicMass: 1); ProteinWithGoTerms p1 = new ProteinWithGoTerms("MSSSSSSSSSSS", "T1", new List <Tuple <string, string> > { new Tuple <string, string>("ordered locus", "GENE") }, new Dictionary <int, List <Modification> > { { 1, new List <Modification> { m } } }, new List <ProteolysisProduct> { new ProteolysisProduct(1, 12, "") }, "T2", "T3", true, false, new List <DatabaseReference> { new DatabaseReference("GO", ":", new List <Tuple <string, string> > { new Tuple <string, string>("term", "P:") }) }, new List <GoTerm> { new GoTerm(new DatabaseReference("GO", ":", new List <Tuple <string, string> > { new Tuple <string, string>("term", "P:") })) }); PtmSet set = new PtmSet(new List <Ptm> { new Ptm(0, m) }); return(new TheoreticalProteoform(a, d, p1.BaseSequence, new List <ProteinWithGoTerms> { p }, mass, 0, set, true, false, dict)); }
public static void SeqVarXmlTest() { ModificationMotif.TryGetMotif("X", out ModificationMotif motif); var nice = new List <Modification> { new ModificationWithLocation("fayk", "mt", motif, TerminusLocalization.Any, null) }; var ok = ProteinDbLoader.LoadProteinXML(Path.Combine(TestContext.CurrentContext.TestDirectory, @"seqvartests.xml"), true, DecoyType.Reverse, nice, false, null, out Dictionary <string, Modification> un); Assert.AreEqual('M', ok[0][0]); Assert.AreEqual('M', ok[1][0]); List <SequenceVariation> seqvar0 = ok[0].SequenceVariations.ToList(); List <SequenceVariation> seqvar1 = ok[1].SequenceVariations.ToList(); Assert.AreEqual(seqvar0.Count + 1, seqvar1.Count); Assert.AreEqual('M', ok[0].SequenceVariations.First().OriginalSequence[0]); Assert.AreEqual('M', ok[0].SequenceVariations.First().VariantSequence[0]); Assert.AreEqual('A', ok[1].SequenceVariations.First().OriginalSequence[0]); Assert.AreEqual('P', ok[1].SequenceVariations.First().VariantSequence[0]); Assert.AreEqual('M', seqvar0[1].OriginalSequence[0]); Assert.AreEqual("", seqvar1[1].VariantSequence); foreach (SequenceVariation s in seqvar0) { Assert.AreEqual(s.OriginalSequence, ok[0].BaseSequence.Substring(s.OneBasedBeginPosition - 1, s.OneBasedEndPosition - s.OneBasedBeginPosition + 1)); } foreach (SequenceVariation s in seqvar1) { Assert.AreEqual(s.OriginalSequence, ok[1].BaseSequence.Substring(s.OneBasedBeginPosition - 1, s.OneBasedEndPosition - s.OneBasedBeginPosition + 1)); } Assert.AreNotEqual(ok[0].SequenceVariations.First().Description, ok[1].SequenceVariations.First().Description); //decoys and target variations don't have the same desc. }
public void Test_write_with_custom_mods() { var nice = new List <Modification> { new ModificationWithLocation("fayk", null, null, ModificationSites.A, null, null) }; ModificationMotif.TryGetMotif("K", out ModificationMotif motif); ModificationWithMass m = new ModificationWithMass("mod", new Tuple <string, string>("", ""), motif, ModificationSites.Any, 1, new Dictionary <string, IList <string> >(), new List <double> { -1 }, new List <double>(), ""); Dictionary <string, HashSet <Tuple <int, ModificationWithMass> > > new_mods = new Dictionary <string, HashSet <Tuple <int, ModificationWithMass> > > { { "P53863", new HashSet <Tuple <int, ModificationWithMass> > { new Tuple <int, ModificationWithMass>(2, m) } } }; List <Protein> ok = ProteinDbLoader.LoadProteinXML(Path.Combine(TestContext.CurrentContext.TestDirectory, @"xml2.xml"), false, nice, false, null, out Dictionary <string, Modification> un); var newModResEntries = ProteinDbWriter.WriteXmlDatabase(new_mods, ok, Path.Combine(TestContext.CurrentContext.TestDirectory, @"rewrite_xml2.xml")); Assert.AreEqual(1, newModResEntries.Count); List <Protein> ok2 = ProteinDbLoader.LoadProteinXML(Path.Combine(TestContext.CurrentContext.TestDirectory, @"rewrite_xml2.xml"), false, nice, false, null, out un); Assert.AreEqual(ok.Count, ok2.Count); Assert.True(Enumerable.Range(0, ok.Count).All(i => ok[i].BaseSequence == ok2[i].BaseSequence)); Assert.AreEqual(2, ok[0].OneBasedPossibleLocalizedModifications.Count); Assert.AreEqual(3, ok2[0].OneBasedPossibleLocalizedModifications.Count); }
public static void DisulfideXmlTest() { ModificationMotif.TryGetMotif("X", out ModificationMotif motif); var nice = new List <Modification> { new ModificationWithLocation("fayk", "mt", motif, TerminusLocalization.Any, null) }; var ok = ProteinDbLoader.LoadProteinXML(Path.Combine(TestContext.CurrentContext.TestDirectory, @"disulfidetests.xml"), true, DecoyType.Reverse, nice, false, null, out Dictionary <string, Modification> un); Assert.AreEqual('M', ok[0][0]); Assert.AreEqual('M', ok[1][0]); Assert.AreEqual(3, ok[0].DisulfideBonds.Count()); Assert.AreEqual(31, ok[0].DisulfideBonds.First().OneBasedBeginPosition); Assert.AreEqual(94, ok[0].DisulfideBonds.First().OneBasedEndPosition); Assert.AreEqual(93, ok[0].DisulfideBonds.ElementAt(2).OneBasedBeginPosition); Assert.AreEqual(93, ok[0].DisulfideBonds.ElementAt(2).OneBasedEndPosition); Assert.AreEqual(3, ok[1].DisulfideBonds.Count()); Assert.AreEqual(79, ok[1].DisulfideBonds.First().OneBasedBeginPosition); Assert.AreEqual(16, ok[1].DisulfideBonds.First().OneBasedEndPosition); Assert.AreEqual(17, ok[1].DisulfideBonds.ElementAt(2).OneBasedBeginPosition); Assert.AreEqual(17, ok[1].DisulfideBonds.ElementAt(2).OneBasedEndPosition); Assert.AreNotEqual(ok[0].DisulfideBonds.First().Description, ok[1].DisulfideBonds.First().Description); //decoys and target disulfide bonds don't have the same desc. }
public void Test_modification4_hash_set() { ModificationMotif.TryGetMotif("K", out ModificationMotif motif); ModificationWithMassAndCf m1 = new ModificationWithMassAndCf(null, new Tuple <string, string>("item1", "item2"), motif, ModificationSites.K, new ChemicalFormula(), 1.11111d, new Dictionary <string, IList <string> >(), new List <double> { 2.222222 }, new List <double> { 5.55555 }, "modificationType"); ModificationWithMassAndCf m2 = new ModificationWithMassAndCf(null, new Tuple <string, string>("item1", "item2"), motif, ModificationSites.K, new ChemicalFormula(), 1.11111d, new Dictionary <string, IList <string> >(), new List <double> { 2.222222 }, new List <double> { 5.55555 }, "modificationType"); m1.linksToOtherDbs.Add("key", new List <string> { "value" }); m2.linksToOtherDbs.Add("key", new List <string> { "value" }); HashSet <Modification> mods = new HashSet <Modification>(new Modification[] { m1, m2 }); Assert.AreEqual(1, mods.Count); Assert.True(m1.Equals(m2)); }
public static void XmlTest_2entry() { ModificationMotif.TryGetMotif("X", out ModificationMotif motif); var nice = new List <Modification> { new ModificationWithLocation("fayk", "mt", motif, TerminusLocalization.Any, null) }; var ok = ProteinDbLoader.LoadProteinXML(Path.Combine(TestContext.CurrentContext.TestDirectory, @"xml2.xml"), true, DecoyType.Reverse, nice, false, null, out Dictionary <string, Modification> un); Assert.True(ok.All(p => p.ProteolysisProducts.All(d => d.OneBasedBeginPosition == null || d.OneBasedBeginPosition > 0))); Assert.True(ok.All(p => p.ProteolysisProducts.All(d => d.OneBasedEndPosition == null || d.OneBasedEndPosition <= p.Length))); Assert.False(ok.All(p => p.BaseSequence.Contains(" "))); Assert.False(ok.All(p => p.BaseSequence.Contains("\t"))); Assert.False(ok.All(p => p.BaseSequence.Contains("\n"))); //GoTerm checks List <Protein> targets = ok.Where(p => !p.IsDecoy).ToList(); Assert.AreEqual(2, targets.Count); Assert.AreEqual(1, targets[0].DatabaseReferences.Count(dbRef => dbRef.Type == "EnsemblFungi")); Assert.AreEqual(1, targets[1].DatabaseReferences.Count(dbRef => dbRef.Type == "EnsemblFungi")); }
public static Modification OGlycanToModification(Glycan glycan) { //TO THINK: what the neutralLoss for O-Glyco? Dictionary <DissociationType, List <double> > neutralLosses = new Dictionary <DissociationType, List <double> >(); if (glycan.Ions != null) { List <double> lossMasses = glycan.Ions.Select(p => (double)p.LossIonMass / 1E5).OrderBy(p => p).ToList(); neutralLosses.Add(DissociationType.HCD, lossMasses); neutralLosses.Add(DissociationType.CID, lossMasses); neutralLosses.Add(DissociationType.EThcD, lossMasses); } Dictionary <DissociationType, List <double> > diagnosticIons = new Dictionary <DissociationType, List <double> >(); diagnosticIons.Add(DissociationType.HCD, glycan.DiagnosticIons.Select(p => (double)p / 1E5).ToList()); diagnosticIons.Add(DissociationType.CID, glycan.DiagnosticIons.Select(p => (double)p / 1E5).ToList()); diagnosticIons.Add(DissociationType.EThcD, glycan.DiagnosticIons.Select(p => (double)p / 1E5).ToList()); ModificationMotif.TryGetMotif("X", out ModificationMotif finalMotif); //TO DO: only one motif can be write here. var id = Glycan.GetKindString(glycan.Kind); Modification modification = new Modification( _originalId: id, _modificationType: "O-Glycosylation", _monoisotopicMass: (double)glycan.Mass / 1E5, _locationRestriction: "Anywhere.", _target: finalMotif, _neutralLosses: neutralLosses, _diagnosticIons: diagnosticIons ); return(modification); }
public static void TestLastPeaks() { IDictionary <int, List <Modification> > mods = new Dictionary <int, List <Modification> >(); ModificationMotif.TryGetMotif("M", out ModificationMotif motif); var prot = new Protein("MMMM", null, null, null, mods); DigestionParams digestionParams = new DigestionParams(minPeptideLength: 1); PeptideWithSetModifications thePep = prot.Digest(digestionParams, new List <Modification>(), new List <Modification>()).First(); var massArray = thePep.Fragment(DissociationType.HCD, FragmentationTerminus.Both).Select(p => p.NeutralMass).ToArray(); Array.Sort(massArray); double[] intensities = new double[] { 1, 1, 1 }; double[] mz = new double[] { 1, 2, massArray[4].ToMz(1) }; MzSpectrum massSpectrum = new MzSpectrum(mz, intensities, false); MsDataScan scan = new MsDataScan(massSpectrum, 1, 1, true, Polarity.Positive, 1, new MzRange(300, 2000), "", MZAnalyzerType.Unknown, massSpectrum.SumOfAllY, null, null, "scan=1", 0, null, null, 0, null, DissociationType.Unknown, 1, null); PeptideSpectralMatch[] globalPsms = new PeptideSpectralMatch[1]; Ms2ScanWithSpecificMass[] arrayOfSortedMS2Scans = { new Ms2ScanWithSpecificMass(scan, 0, 1, null, new CommonParameters()) }; CommonParameters CommonParameters = new CommonParameters( scoreCutoff: 1, productMassTolerance: new PpmTolerance(5), digestionParams: new DigestionParams( maxMissedCleavages: 0, minPeptideLength: 1, maxModificationIsoforms: int.MaxValue, initiatorMethionineBehavior: InitiatorMethionineBehavior.Retain)); ClassicSearchEngine cse = new ClassicSearchEngine(globalPsms, arrayOfSortedMS2Scans, new List <Modification>(), new List <Modification>(), null, new List <Protein> { prot }, new OpenSearchMode(), CommonParameters, new List <string>()); cse.Run(); Assert.Less(globalPsms[0].Score, 2); Assert.Greater(globalPsms[0].Score, 1); }
public static void GlyTest_ModificationSites() { PeptideWithSetModifications pep = new PeptideWithSetModifications("ELNPTPNVEVNVECR", null); string[] motifs = new string[] { "Nxs", "Nxt" }; var sites = GlycoSpectralMatch.GetPossibleModSites(pep, motifs); Assert.That(sites.Count() == 1 && sites[0] == 4); ModificationMotif.TryGetMotif("C", out ModificationMotif motif1); Modification mod1 = new Modification(_originalId: "Carbamidomethyl of C", _modificationType: "Common Fixed", _target: motif1, _locationRestriction: "Anywhere.", _monoisotopicMass: 57.02146372068994); ModificationMotif.TryGetMotif("N", out ModificationMotif motif2); Modification mod2 = new Modification(_originalId: "Test of N", _modificationType: "Common Fixed", _target: motif2, _locationRestriction: "Anywhere."); var testN = new PeptideWithSetModifications("C[Common Fixed:Carbamidomethyl of C]N[Common Fixed:Test of N]SSDQPKL[Common Fixed:Carbamidomethyl of C]NLSGIETP", new Dictionary <string, Modification> { { "Carbamidomethyl of C", mod1 }, { "Test of N", mod2 } }); var testSites = GlycoSpectralMatch.GetPossibleModSites(testN, motifs); Assert.That(testSites.Count() == 1 && testSites[0] == 11); var testC = new PeptideWithSetModifications("TELAAYLSC[Common Fixed:Carbamidomethyl of C]NATK", new Dictionary <string, Modification> { { "Carbamidomethyl of C", mod1 } }); var testCSites = GlycoSpectralMatch.GetPossibleModSites(testC, motifs); Assert.That(testCSites.Count() == 1 && testSites[0] == 11); }
public static void TestPeptideWithFixedModifications() { var prot = new Protein("M", null); var protease = new Protease("Custom Protease", new List <string> { "K" }, new List <string>(), TerminusType.C, CleavageSpecificity.Full, null, null, null); List <ModificationWithMass> fixedMods = new List <ModificationWithMass>(); ModificationMotif.TryGetMotif("M", out ModificationMotif motif); fixedMods.Add(new ModificationWithMassAndCf("ProtNmod", null, motif, TerminusLocalization.NProt, Chemistry.ChemicalFormula.ParseFormula("H"), GetElement(1).PrincipalIsotope.AtomicMass)); fixedMods.Add(new ModificationWithMassAndCf("PepNmod", null, motif, TerminusLocalization.NPep, Chemistry.ChemicalFormula.ParseFormula("H"), GetElement(1).PrincipalIsotope.AtomicMass)); fixedMods.Add(new ModificationWithMassAndCf("resMod", null, motif, TerminusLocalization.Any, Chemistry.ChemicalFormula.ParseFormula("H"), GetElement(1).PrincipalIsotope.AtomicMass)); fixedMods.Add(new ModificationWithMassAndCf("PepCmod", null, motif, TerminusLocalization.PepC, Chemistry.ChemicalFormula.ParseFormula("H"), GetElement(1).PrincipalIsotope.AtomicMass)); fixedMods.Add(new ModificationWithMassAndCf("ProtCmod", null, motif, TerminusLocalization.ProtC, Chemistry.ChemicalFormula.ParseFormula("H"), GetElement(1).PrincipalIsotope.AtomicMass)); DigestionParams digestionParams = new DigestionParams { MinPeptideLength = 1, }; var ok = prot.Digest(digestionParams, fixedMods, new List <ModificationWithMass>()).ToList(); Assert.AreEqual(1, ok.Count); Assert.AreEqual("[:PepNmod]M[:resMod][:ProtCmod]", ok.Last().Sequence); Assert.AreEqual("[H]M[H][H]", ok.Last().SequenceWithChemicalFormulas); Assert.AreEqual(5 * GetElement("H").PrincipalIsotope.AtomicMass + Residue.ResidueMonoisotopicMass['M'] + GetElement("O").PrincipalIsotope.AtomicMass, ok.Last().MonoisotopicMass, 1e-9); }