示例#1
0
        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);
        }
示例#2
0
 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);
     }
 }