/// <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); }
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(); }