Exemplo n.º 1
0
        /// <summary>
        /// Функция, осуществляющая подгонку вторичной серии к референсной
        /// </summary>
        async public Task <BeamParams> DoFusion(BeamParams b)
        {
            CurrentBeam = b.Clone();

            // Настройка шкалы яркостей на диапазон от 0 до 255 градаций
            correctIntencityRange(b);

            try
            {
                // Предварительное определение положения центрального шврика
                FitCentralBallPosition(CurrentBeam);
                FitCentralBallPosition(CurrentBeam);
                FitCentralBallPosition(CurrentBeam);

                Simplex fitter = new Simplex();
                fitter.FTol = 1e-12;
                fitter.NMAX = 1000;
                fitter.OptimizationObject = this;

                //ROISS.RST.Math.Solvers.SimplexAnnealing fitter = new RST.Math.Solvers.SimplexAnnealing();
                //fitter.FTol = 1e-12;
                //fitter.NMax = 100;
                //fitter.NRuns = 20;
                //fitter.TT = 0.5;
                //fitter.OptimizationObject = this;

                // Поиск
                await fitter.Search();

                CurrentBeam.FitParameters = fitter.Result;

                // DEBUG
                //DumpChisqDistributions("C:/tmp/chisq.txt");
            }
            catch (System.Exception except)
            {
                System.Windows.MessageBox.Show("Ошибка при чтении данных: \n" + except.Message, "Ошибка!",
                                               MessageBoxButton.OK, MessageBoxImage.Exclamation);
            }

            return(CurrentBeam);
        }
Exemplo n.º 2
0
        async private void DumpChisqDistributions(string fname)
        {
            int    i, j;
            double shiftPixelStep = 0.2;
            double shiftStep      = 0.02;
            double angleStep      = 0.05;

            double[] ds = new double[8];
            double[,] chq = new double[9, 101];

            // В версии без подгонки центра шарика изменения его положения следует передавать через CurrentBeam
            BeamParams bbackup = CurrentBeam.Clone();

            for (i = 0; i < 8; i++)
            {
                // Вектор шага
                for (j = 0; j < 8; j++)
                {
                    ds[j] = 0;
                }
                if (i < 2)
                {
                    ds[i] = shiftPixelStep;
                }
                else if (i == 7)
                {
                    ds[i] = angleStep;
                }
                else if (i == 6)
                {
                    ds[i] = shiftStep * 0.01;              // размер пиксела с учетом расстояния до пленки
                }
                else
                {
                    ds[i] = shiftStep;
                }

                CurrentBeam = bbackup.Clone();
                for (j = 0; j < 50; j++)
                {
                    shiftBeam(CurrentBeam, ds, -1.0);
                }
                for (j = 0; j <= 100; j++)
                {
                    chq[i, j] = await ValueAt(CurrentBeam.FitParameters);

                    shiftBeam(CurrentBeam, ds, 1.0);
                }
            }

            System.IO.StreamWriter file = new System.IO.StreamWriter(fname);

            file.WriteLine("\tB.O.X\tB.O.Y\tB.CC.X\tB.CC.Y\tB.Mlc.X\tB.Mlc.Y\tB.PS\tB.FCA");

            for (i = 0; i < 8; i++)
            {
                for (j = 0; j <= 100; j++)
                {
                    file.Write("{0}", j - 50);
                    for (i = 0; i < 8; i++)
                    {
                        file.Write("\t{0}", chq[i, j]);
                    }
                    file.WriteLine();
                }
            }

            file.Close();

            CurrentBeam = bbackup.Clone();
        }