Пример #1
0
        public static double CalcPtmScore(double ms2Tol, string ms2TolUnit, int topx, string sequence, Modification[] fixedModifications,
                                          Modification[] variableModifications, int[] modCount, double[] specMasses, float[] specIntensities, double mz,
                                          int charge, out bool incomplete, out PeptideModificationState outMods, out int counts,
                                          out double delta, out MsmsPeakAnnotation[] description, out float[] intensities,
                                          out float[] massDiffs, out Dictionary <ushort, double[]> modProb,
                                          out Dictionary <ushort, double[]> modScoreDiffs, bool alternative)
        {
            if (!AminoAcid.ValidSequence(sequence))
            {
                incomplete    = true;
                outMods       = null;
                counts        = 0;
                delta         = 0;
                description   = null;
                intensities   = null;
                massDiffs     = null;
                modProb       = null;
                modScoreDiffs = null;
                return(0);
            }
            Peptide p = new Peptide(sequence);

            p.ApplyFixedModifications(fixedModifications);
            PeptideModificationState[] mpeps = p.ApplyVariableModificationsFixedNumbers(variableModifications, modCount, out incomplete);
            counts = mpeps.Length;
            double maxScore  = -double.MaxValue;
            double maxScore2 = -double.MaxValue;
            PeptideModificationState bestPep = null;

            description = null;
            intensities = null;
            massDiffs   = null;
            double sumScore = 0;

            modProb = new Dictionary <ushort, double[]>();
            Dictionary <ushort, double[, ]> scoreDiffs = new Dictionary <ushort, double[, ]>();

            ushort[]         w  = mpeps[0].GetModifications();
            HashSet <ushort> um = new HashSet <ushort>();

            foreach (ushort x in w)
            {
                if (x != ushort.MaxValue && !um.Contains(x))
                {
                    um.Add(x);
                }
            }
            ushort[] uniqueMods = um.ToArray();
            foreach (ushort m in uniqueMods)
            {
                if (!modProb.ContainsKey(m))
                {
                    modProb.Add(m, new double[w.Length]);
                    scoreDiffs.Add(m, new double[2, w.Length]);
                }
            }
            foreach (PeptideModificationState mpep in mpeps)
            {
                MsmsPeakAnnotation[] desc;
                float[] intens;
                float[] dm;
                double  score = Score(specMasses, specIntensities, p, ms2Tol, ms2TolUnit, mz, charge,
                                      out desc, out intens, out dm, topx, mpep);
                ushort[] mm = mpep.GetModifications();
                double   x  = Math.Exp((score - 100) * NumUtil.log10 / 10.0);
                for (int i = 0; i < mm.Length; i++)
                {
                    if (mm[i] != ushort.MaxValue)
                    {
                        modProb[mm[i]][i] += x;
                    }
                    foreach (ushort mod in uniqueMods)
                    {
                        if (mm[i] == mod)
                        {
                            if (score > scoreDiffs[mod][0, i])
                            {
                                scoreDiffs[mod][0, i] = score;
                            }
                        }
                        else
                        {
                            if (score > scoreDiffs[mod][1, i])
                            {
                                scoreDiffs[mod][1, i] = score;
                            }
                        }
                    }
                }
                sumScore += x;
                if (score > maxScore)
                {
                    maxScore2   = maxScore;
                    maxScore    = score;
                    bestPep     = mpep;
                    description = desc;
                    intensities = intens;
                    massDiffs   = dm;
                }
                else if (score > maxScore2)
                {
                    maxScore2 = score;
                }
            }
            modScoreDiffs = new Dictionary <ushort, double[]>();
            foreach (ushort mod in uniqueMods)
            {
                Modification modi = Tables.modificationList[mod];
                modScoreDiffs.Add(mod, new double[w.Length]);
                for (int i = 0; i < sequence.Length; i++)
                {
                    char aa = sequence[i];
                    if (modi.HasAA(aa))
                    {
                        modScoreDiffs[mod][i] = scoreDiffs[mod][0, i] - scoreDiffs[mod][1, i];
                    }
                    else
                    {
                        modScoreDiffs[mod][i] = double.NaN;
                    }
                }
            }
            foreach (double[] y in modProb.Values)
            {
                for (int i = 0; i < y.Length; i++)
                {
                    y[i] /= sumScore;
                }
            }
            if (maxScore2 == -double.MaxValue)
            {
                delta = maxScore;
            }
            else
            {
                delta = maxScore - maxScore2;
            }
            outMods = bestPep;
            return(maxScore);
        }