Esempio n. 1
0
        public FitReport Fit(IEnumerable <double> x, IEnumerable <double> y, BasisFunctionsEnum basisFunction, ref double[] coeffs)
        {
            var functionSelector = BasisFunctionFactory.BasisFunctionSelector(basisFunction);

            //incase the coefficients input are the wrong dimension
            var coeffCount = functionSelector.Coefficients.Count();

            if (coeffs.Length != coeffCount)
            {
                coeffs = functionSelector.Coefficients;
            }

            var worked = EvaluateFunction(x.ToList(), y.ToList(), functionSelector, ref coeffs);

            var results = new FitReportALGLIB(worked, worked.DidConverge);

            return(results);
        }
Esempio n. 2
0
        public void SolveAsymmetricGaussianFactory(string path, BasisFunctionsEnum functionChoise)
        {
            var data    = ReadXicDatabase(Path.Combine(TestPathSingleton.TestDirectory, path));
            var newData = new List <Xic>();

            foreach (var xic in data)
            {
                var basisFunction = BasisFunctionFactory.BasisFunctionSelector(functionChoise);

                var coefficients = basisFunction.Coefficients;
                var start        = xic.x.Min() - .5;
                var stop         = xic.x.Max() + .5;
                var A            = xic.y.Max();
                A += (A * .05);
                var width = Math.Abs(stop - start);

                coefficients[0] = start + ((stop - start) / 2);
                coefficients[1] = A;
                coefficients[2] = width * .5;
                coefficients[3] = coefficients[2];

                //Console.WriteLine("Xic {0}", xic.id);
                //Console.WriteLine();

                for (var i = 0; i < xic.x.Count; i++)
                {
                    // Console.WriteLine("{0}\t{1}", xic.x[i], xic.y[i]);
                }
                SolverReport worked = null;
                Console.WriteLine();
                var showDetails = false;

                try
                {
                    worked = EvaluateFunction(xic.x, xic.y, basisFunction, ref coefficients, showDetails);
                }
                catch (Exception)
                {
                    continue;
                }

                // First solve for the function
                var solver = new LevenburgMarquadtSolver();

                var numberOfSamples = 100;

                // Calculate the width an spacing of each of the trapezoids.
                var delta = width / Convert.ToDouble(numberOfSamples);
                var x     = start;

                var newXic = new Xic();
                newXic.x         = new List <double>();
                newXic.y         = new List <double>();
                newXic.charge    = xic.charge;
                newXic.scoreName = xic.scoreName;
                newXic.score     = xic.score;
                newXic.id        = xic.id;
                newXic.prevXic   = xic;
                newXic.report    = worked;
                newXic.reviewer  = xic.reviewer;

                // We already evaluated the first point, now for each element within
                for (var i = 0; i < numberOfSamples + 1; i++)
                {
                    x += delta;
                    var y = basisFunction.Evaluate(coefficients, x);

                    newXic.x.Add(x);
                    newXic.y.Add(y);
                    // Console.WriteLine("{0}\t{1}", x, y);
                }
                //Console.WriteLine();

                newData.Add(newXic);
            }

            var newPath = path.Replace(".xic", functionChoise + "_fit.xic");

            using (TextWriter writer = File.CreateText(newPath))
            {
                foreach (var feature in newData)
                {
                    writer.WriteLine("id\t{0}\tcharge\t{1}", feature.id, feature.charge);
                    writer.WriteLine("score\t{0}\tscoreName\t{1}", feature.score, feature.scoreName);
                    writer.WriteLine("reviewer\t{0}", feature.reviewer);
                    writer.WriteLine("R2\t{0}", feature.report.RSquared);
                    writer.WriteLine("Rms\t{0}", feature.report.RmsError);
                    writer.WriteLine("Converged\t{0}", feature.report.DidConverge);
                    writer.WriteLine("mz\ttime\tintensity");

                    var prev = feature.prevXic;
                    for (var i = 0; i < feature.x.Count; i++)
                    {
                        var prevTime = "";
                        var prevInt  = "";
                        if (prev != null && i < prev.x.Count)
                        {
                            prevTime = prev.x[i].ToString();
                            prevInt  = prev.y[i].ToString();
                        }

                        writer.WriteLine("{0}\t{1}\t{2}\t{3}\t{4}", feature.mz, feature.x[i], feature.y[i], prevTime, prevInt);
                    }
                    writer.WriteLine();
                }
            }
        }
Esempio n. 3
0
        public static BasisFunctionBase BasisFunctionSelector(BasisFunctionsEnum functionChoise)
        {
            //default
            BasisFunctionBase solver = null;

            switch (functionChoise)
            {
            case BasisFunctionsEnum.AsymmetricGaussian:
                solver = new AsymmetricGaussian();
                solver.Coefficients    = new double[4];
                solver.Coefficients[0] = .5;
                solver.Coefficients[1] = .5;
                solver.Coefficients[2] = .3;
                solver.Coefficients[3] = 1;
                break;

            case BasisFunctionsEnum.Linear:
                solver = new Linear();
                solver.Coefficients    = new double[2];
                solver.Coefficients[0] = 1;     // m
                solver.Coefficients[1] = 0;     // b
                break;

            case BasisFunctionsEnum.PolynomialQuadratic:
            {
                solver = new Quadratic();
                solver.Coefficients    = new double[3];
                solver.Coefficients[0] = 1;        //ax^2
                solver.Coefficients[1] = 1;        //bx
                solver.Coefficients[2] = 1;        //c
            }
            break;

            case BasisFunctionsEnum.PolynomialCubic:
            {
                solver = new Cubic();
                solver.Coefficients    = new double[7];
                solver.Coefficients[0] = 1;        //ax^3
                solver.Coefficients[1] = 1;        //bx^2
                solver.Coefficients[2] = 1;        //cx
                solver.Coefficients[3] = 1;        //d
                solver.Coefficients[4] = 1;        //d
                solver.Coefficients[5] = 1;        //d
                solver.Coefficients[6] = 1;        //d
            }
            break;

            case BasisFunctionsEnum.Lorentzian:
            {
                solver = new Lorentian();
                solver.Coefficients    = new double[3];
                solver.Coefficients[0] = 6;        //width
                solver.Coefficients[1] = 50;       //height
                solver.Coefficients[2] = -1;       //xoffset
            }
            break;

            case BasisFunctionsEnum.Gaussian:
            {
                solver = new Gaussian();
                solver.Coefficients    = new double[3];
                solver.Coefficients[0] = 6;        //sigma
                solver.Coefficients[1] = 50;       //height
                solver.Coefficients[2] = -1;       //xoffset
            }
            break;

            case BasisFunctionsEnum.Chebyshev:
            {
                solver = new Chebyshev();
                solver.Coefficients    = new double[6];
                solver.Coefficients[0] = 0;        //?
                solver.Coefficients[1] = 1;        //?
                solver.Coefficients[2] = 1;        //?
                solver.Coefficients[3] = 0;        //?
                solver.Coefficients[4] = 0;        //?
                solver.Coefficients[5] = 0;        //?
            }
            break;

            case BasisFunctionsEnum.Orbitrap:
            {
                solver = new OrbitrapFunction();
                solver.Coefficients    = new double[3];
                solver.Coefficients[0] = 1;        //?
                solver.Coefficients[1] = 1;        //?
                solver.Coefficients[2] = 1;        //?
                //quadSolver.Coefficients[3] = 1;//?
                //quadSolver.Coefficients[4] = 1;//?
                //quadSolver.Coefficients[4] = 1;//?
            }
            break;

            case BasisFunctionsEnum.Hanning:
            {
                solver = new Hanning();
                solver.Coefficients    = new double[3];
                solver.Coefficients[0] = 1;        //?
                solver.Coefficients[1] = 1;        //?
                solver.Coefficients[2] = 1;        //?
            }
            break;
            }
            return(solver);
        }