public static Dictionary <string, List <string> > GetPeptideCompositions(double maxMass) { Dictionary <string, List <string> > result = new Dictionary <string, List <string> >(); double mg = glycine.MonoIsotopicMass; int maxN = (int)((maxMass - Molecule.massWater) / mg); string aas = StandardSingleLetterAas; double[] masses = AaMonoMasses; NumUtils.GetPartitions(maxN, 21, i1 => { double m1 = Molecule.massWater; for (int i = 0; i < i1.Length; i++) { if (i < 20) { m1 += i1[i] * masses[aas[i]]; } } return(m1 <= maxMass); }, i2 => { string seq = GetSequence(i2, aas); Molecule m = GetPeptideMolecule(seq); string formula = m.GetEmpiricalFormula(); if (!result.ContainsKey(formula)) { result.Add(formula, new List <string>()); } result[formula].Add(seq); }); return(result); }
private static void Partition(TmpPartitionNew x, int len, double maxMass, IList <double> masses, string aas, ISet <string> result) { if (x.remainder == 0 && x.partition.Count == len) { IList <int> part = x.partition; double m1 = Molecule.massWater; for (int i = 0; i < part.Count; i++) { if (i < 20) { m1 += part[i] * masses[aas[i]]; } } if (m1 <= maxMass) { string seq = GetSequence(part, aas); Molecule m = GetPeptideMolecule(seq); string formula = m.GetEmpiricalFormula(); if (!result.Contains(formula)) { result.Add(formula); } } return; } if (x.partition.Count == len) { return; } for (int i = 0; i <= x.remainder; i++) { TmpPartitionNew w = x.Add(i, masses, aas); if (w.mass > maxMass) { break; } Partition(w, len, maxMass, masses, aas, result); } }