internal void PresentAstrometricFit(LeastSquareFittedAstrometry fit, StarMagnitudeFit magFit)
        {
            pnlAstrometry.Visible = true;
            pnlObject.Visible = false;
            pnlMeasurements.Visible = false;
            pnlAstrometry.Top = 0;
            pnlAstrometry.Left = 0;

            pnlAstrometry.Visible = fit != null;
            pnlFitSuccessful.Visible = fit != null;
            pnlFitFailed.Visible = !pnlFitSuccessful.Visible;
            pnlFitInfo.Visible = fit != null;

            if (fit != null)
            {
                lblStdDevRA.Text = string.Format("{0}\"", fit.StdDevRAArcSec.ToString("0.00"));
                lblStdDevDE.Text = string.Format("{0}\"", fit.StdDevDEArcSec.ToString("0.00"));

                if (magFit != null)
                {
                    if (double.IsNaN(magFit.Sigma))
                        lblStdDevMag.Text = "NaN";
                    else
                        lblStdDevMag.Text = string.Format("{0} mag", magFit.Sigma.ToString("0.00"));
                }
                else
                    lblStdDevMag.Text = "N/A";

                double onePixX = fit.GetDistanceInArcSec(fit.Image.CenterXImage, fit.Image.CenterYImage, fit.Image.CenterXImage + 1, fit.Image.CenterYImage);
                double onePixY = fit.GetDistanceInArcSec(fit.Image.CenterXImage, fit.Image.CenterYImage, fit.Image.CenterXImage, fit.Image.CenterYImage + 1);

                lblPixelSizeX.Text = string.Format("{0}\"", onePixX.ToString("0.0"));
                lblPixelSizeY.Text = string.Format("{0}\"", onePixY.ToString("0.0"));
            }
        }
        public AstrometricSolutionImpl(LeastSquareFittedAstrometry astrometry, StarMagnitudeFit photometry, AstrometricState state, FieldSolveContext fieldSolveContext)
        {
            StarCatalog = fieldSolveContext.StarCatalogueFacade.CatalogNETCode;
            UtcTime = fieldSolveContext.UtcTime;
            FrameNoOfUtcTime = fieldSolveContext.FrameNoOfUtcTime;
            AutoLimitMagnitude = (float)fieldSolveContext.AutoLimitMagnitude;

            ResolvedFocalLength = (float)fieldSolveContext.FocalLength;

            if (astrometry != null)
            {
                ResolvedCenterRADeg = (float)astrometry.RA0Deg;
                ResolvedCenterDEDeg = (float)astrometry.DE0Deg;
                StdDevRAArcSec = (float)astrometry.StdDevRAArcSec;
                StdDevDEArcSec = (float)astrometry.StdDevDEArcSec;
            }
            else
            {
                ResolvedCenterRADeg = float.NaN;
                ResolvedCenterDEDeg = float.NaN;
                StdDevRAArcSec = float.NaN;
                StdDevDEArcSec = float.NaN;
            }

            if (state.SelectedObject != null)
            {
                m_UserObject = new TangraUserObjectImpl();
                m_UserObject.RADeg = (float)state.SelectedObject.RADeg;
                m_UserObject.DEDeg = (float)state.SelectedObject.DEDeg;
                m_UserObject.X = (float)state.SelectedObject.X0;
                m_UserObject.Y = (float)state.SelectedObject.Y0;

                if (state.IdentifiedObjects != null &&
                    state.IdentifiedObjects.Count == 1)
                {
                    foreach (IIdentifiedObject idObj in state.IdentifiedObjects)
                    {
                        if (AngleUtility.Elongation(idObj.RAHours * 15.0, idObj.DEDeg, state.SelectedObject.RADeg, state.SelectedObject.DEDeg) * 3600 < 120)
                        {
                            m_UserObject.ResolvedName = idObj.ObjectName;
                            break;
                        }
                    }
                }
            }

            m_MeasurementsImpl = new List<TangraAstrometricMeasurementImpl>();

            if (state.Measurements != null)
            {
                foreach (var mea in state.Measurements)
                {
                    m_MeasurementsImpl.Add(new TangraAstrometricMeasurementImpl()
                    {
                        DEDeg = mea.DEDeg,
                        RADeg = mea.RADeg,
                        FrameNo = mea.FrameNo,
                        SolutionUncertaintyRACosDEArcSec = mea.SolutionUncertaintyRACosDEArcSec,
                        SolutionUncertaintyDEArcSec = mea.SolutionUncertaintyDEArcSec,
                        FWHMArcSec = mea.FWHMArcSec,
                        Detection = mea.Detection,
                        SNR = mea.SNR,
                        UncorrectedTimeStamp = mea.OCRedTimeStamp ?? mea.CalculatedTimeStamp,
                        Mag = mea.Mag
                    });
                }
            }

            m_MatchedStarImpl = new List<TangraMatchedStarImpl>();

            if (astrometry != null)
            {
                foreach (PlateConstStarPair pair in astrometry.FitInfo.AllStarPairs)
                {
                    if (pair.FitInfo.UsedInSolution)
                    {
                        var star = new TangraMatchedStarImpl()
                        {
                            X = (float)pair.x,
                            Y = (float)pair.y,
                            RADeg = (float)pair.RADeg,
                            DEDeg = (float)pair.DEDeg,
                            StarNo = pair.StarNo,
                            ExcludedForHighResidual = pair.FitInfo.ExcludedForHighResidual,
                            ResidualRAArcSec = (float)pair.FitInfo.ResidualRAArcSec,
                            ResidualDEArcSec = (float)pair.FitInfo.ResidualDEArcSec,
                            DetectionCertainty = (float)pair.DetectionCertainty,
                            PSFAmplitude = (int)pair.Intensity,
                            IsSaturated = pair.IsSaturated,
                            Mag = (float)pair.Mag
                        };

                        TangraCatalogStarImpl catStar = null;

                        IStar catalogStar = fieldSolveContext.CatalogueStars.Find(s => s.StarNo == pair.StarNo);
                        if (catalogStar != null)
                        {
                            if (catalogStar is UCAC4Entry)
                                catStar = new TangraAPASSStar();
                            else
                                catStar = new TangraCatalogStarImpl();

                            catStar.StarNo = catalogStar.StarNo;
                            catStar.MagR = (float)catalogStar.MagR;
                            catStar.MagV = (float)catalogStar.MagV;
                            catStar.MagB = (float)catalogStar.MagB;
                            catStar.Mag = (float)catalogStar.Mag;

                            if (catalogStar is UCAC3Entry)
                            {
                                UCAC3Entry ucac3Star = (UCAC3Entry)catalogStar;
                                catStar.MagJ = (float)(ucac3Star.jmag * 0.001);
                                catStar.MagK = (float)(ucac3Star.kmag * 0.001);
                                catStar.RAJ2000Deg = (float)ucac3Star.RACat;
                                catStar.DEJ2000Deg = (float)ucac3Star.DECat;
                            }
                            else if (catalogStar is UCAC2Entry)
                            {
                                UCAC2Entry ucac2Star = (UCAC2Entry)catalogStar;
                                catStar.MagJ = (float)(ucac2Star._2m_J * 0.001);
                                catStar.MagK = (float)(ucac2Star._2m_Ks * 0.001);
                                catStar.RAJ2000Deg = (float)ucac2Star.RACat;
                                catStar.DEJ2000Deg = (float)ucac2Star.DECat;
                            }
                            else if (catalogStar is NOMADEntry)
                            {
                                NOMADEntry nomadStar = (NOMADEntry)catalogStar;
                                catStar.MagJ = (float)(nomadStar.m_J * 0.001);
                                catStar.MagK = (float)(nomadStar.m_K * 0.001);
                                catStar.RAJ2000Deg = (float)nomadStar.RACat;
                                catStar.DEJ2000Deg = (float)nomadStar.DECat;
                            }
                            else if (catalogStar is UCAC4Entry)
                            {
                                UCAC4Entry ucac4Star = (UCAC4Entry)catalogStar;
                                catStar.MagJ = (float)(ucac4Star.MagJ);
                                catStar.MagK = (float)(ucac4Star.MagK);
                                catStar.RAJ2000Deg = (float)ucac4Star.RACat;
                                catStar.DEJ2000Deg = (float)ucac4Star.DECat;

                                ((TangraAPASSStar)catStar).B = (float)ucac4Star.MagB;
                                ((TangraAPASSStar)catStar).V = (float)ucac4Star.MagV;
                                ((TangraAPASSStar)catStar).g = (float)ucac4Star.Mag_g;
                                ((TangraAPASSStar)catStar).r = (float)ucac4Star.Mag_r;
                                ((TangraAPASSStar)catStar).i = (float)ucac4Star.Mag_i;
                                ((TangraAPASSStar)catStar).e_B = ucac4Star.apase_B * 0.001f;
                                ((TangraAPASSStar)catStar).e_V = ucac4Star.apase_V * 0.001f;
                                ((TangraAPASSStar)catStar).e_g = ucac4Star.apase_g * 0.001f;
                                ((TangraAPASSStar)catStar).e_r = ucac4Star.apase_r * 0.001f;
                                ((TangraAPASSStar)catStar).e_i = ucac4Star.apase_i * 0.001f;
                            }
                        }

                        star.CatalogStar = catStar;

                        if (photometry != null)
                        {
                            IStar photometryStar = photometry.StarNumbers.FirstOrDefault(s => s.StarNo == pair.StarNo);
                            if (photometryStar != null)
                            {
                                int idx = photometry.StarNumbers.IndexOf(photometryStar);
                                star.Intensity = (float)photometry.Intencities[idx];
                                star.IsSaturated = photometry.SaturatedFlags[idx];
                                star.MeaSignalMethod = ConvertSignalMethod(photometry.MeaSignalMethod);
                                star.MeaBackgroundMethod = ConvertBackgroundMethod(photometry.MeaBackgroundMethod);
                                star.MeaSingleApertureSize = photometry.MeaSingleAperture;
                                star.MeaBackgroundPixelCount = photometry.MeaBackgroundPixelCount;
                                star.MeaSaturationLevel = photometry.MeaSaturationLevel;
                            }
                        }

                        m_MatchedStarImpl.Add(star);
                    }
                }
            }
        }