Esempio n. 1
0
        public RetentionTimeProviderData(IrtRegressionType regressionType, IRetentionTimeProvider retentionTimes,
                                         IReadOnlyList <DbIrtPeptide> standardPeptides, IReadOnlyList <DbIrtPeptide> heavyStandardPeptides)
        {
            RetentionTimeProvider = retentionTimes;

            Peptides = new List <Peptide>(standardPeptides.Count);
            for (var i = 0; i < standardPeptides.Count; i++)
            {
                var heavy    = heavyStandardPeptides[i] != null;
                var standard = heavy ? heavyStandardPeptides[i] : standardPeptides[i];
                var rt       = retentionTimes.GetRetentionTime(standard.ModifiedTarget);
                if (!rt.HasValue && heavy)
                {
                    standard = standardPeptides[i];
                    rt       = retentionTimes.GetRetentionTime(standard.ModifiedTarget);
                }
                Peptides.Add(new Peptide(standard.ModifiedTarget, rt, standard.Irt));
            }
            Peptides.Sort((x, y) => x.Irt.CompareTo(y.Irt));

            if (!FilteredPeptides.Any())
            {
                Regression        = null;
                RegressionRefined = null;
                RegressionSuccess = false;
            }

            var filteredRt  = FilteredPeptides.Select(pep => pep.RetentionTime.Value).ToList();
            var filteredIrt = FilteredPeptides.Select(pep => pep.Irt).ToList();
            var removed     = new List <Tuple <double, double> >();

            if (ReferenceEquals(regressionType, IrtRegressionType.LINEAR))
            {
                Regression = new RegressionLine(filteredRt.ToArray(), filteredIrt.ToArray());
            }
            else if (ReferenceEquals(regressionType, IrtRegressionType.LOGARITHMIC))
            {
                Regression = new LogRegression(filteredRt, filteredIrt);
            }
            else if (ReferenceEquals(regressionType, IrtRegressionType.LOWESS))
            {
                Regression = new LoessRegression(filteredRt.ToArray(), filteredIrt.ToArray());
            }
            else
            {
                throw new ArgumentException();
            }

            IIrtRegression regressionRefined;

            if (IrtRegression.Accept(Regression, MinPoints))
            {
                regressionRefined = Regression;
                Regression        = null;
                RegressionSuccess = true;
            }
            else
            {
                RegressionSuccess = IrtRegression.TryGet(Regression, filteredRt, filteredIrt, MinPoints, out regressionRefined, removed);
            }

            RegressionRefined = regressionRefined;
            foreach (var remove in removed)
            {
                for (var i = 0; i < Peptides.Count; i++)
                {
                    var peptide = Peptides[i];
                    if (peptide.RetentionTime.Equals(remove.Item1) && peptide.Irt.Equals(remove.Item2))
                    {
                        Peptides[i] = new Peptide(peptide, true);
                    }
                }
            }
        }