Beispiel #1
0
        public void NextFrame(int frameNo, IAstroImage astroImage, IStarMap starMap, LeastSquareFittedAstrometry astrometricFit)
        {
            IsTrackedSuccessfully = false;

            ImagePixel centroid = AstrometryContext.Current.StarMap.GetCentroid(
                (int)TrackedObject.LastKnownX,
                (int)TrackedObject.LastKnownY,
                CoreAstrometrySettings.Default.PreMeasureSearchCentroidRadius);

            if (centroid != null)
            {
                PSFFit psfFit;
                AstrometryContext.Current.StarMap.GetPSFFit(
                    centroid.X, centroid.Y, PSFFittingMethod.NonLinearFit, out psfFit);

                if (psfFit != null)
                {
                    double ra, de;
                    astrometricFit.GetRADEFromImageCoords(psfFit.XCenter, psfFit.YCenter, out ra, out de);

                    double maxPosDiffArcSec =
                            astrometricFit.GetDistanceInArcSec(astrometricFit.Image.CenterXImage, astrometricFit.Image.CenterYImage,
                            astrometricFit.Image.CenterXImage + CoreAstrometrySettings.Default.PreMeasureSearchCentroidRadius, astrometricFit.Image.CenterYImage);

                    if (!double.IsNaN(TrackedObject.RAHours))
                    {
                        double posDif = 3600 * AngleUtility.Elongation(15 * TrackedObject.RAHours, TrackedObject.DEDeg, ra, de);
                        if (posDif > maxPosDiffArcSec)
                        {
                            // NOTE: Not a valid measurement
                            Trace.WriteLine(string.Format("The target position is too far from the last measured position", posDif));
                            return;
                        }
                    }

                    TrackedObject.RAHours = ra / 15.0;
                    TrackedObject.DEDeg = de;
                    TrackedObject.LastKnownX = psfFit.XCenter;
                    TrackedObject.LastKnownY = psfFit.YCenter;
                    TrackedObject.PSFFit = psfFit;

                    IsTrackedSuccessfully = true;
                }
            }
        }
Beispiel #2
0
        public static LeastSquareFittedAstrometry FromReflectedObject(object reflObj)
        {
            var rv = new LeastSquareFittedAstrometry();

            rv.m_RA0Deg         = StarMap.GetPropValue <double>(reflObj, "m_RA0Deg");
            rv.m_DE0Deg         = StarMap.GetPropValue <double>(reflObj, "m_DE0Deg");
            rv.m_Variance       = StarMap.GetPropValue <double>(reflObj, "m_Variance");
            rv.m_StdDevRAArcSec = StarMap.GetPropValue <double>(reflObj, "m_StdDevRAArcSec");
            rv.m_StdDevDEArcSec = StarMap.GetPropValue <double>(reflObj, "m_StdDevDEArcSec");

            object image = StarMap.GetPropValue <object>(reflObj, "m_Image");

            rv.m_Image = AstroPlate.FromReflectedObject(image);

            object constants = StarMap.GetPropValue <object>(reflObj, "m_SolvedConstants");

            if (constants != null)
            {
                rv.m_SolvedConstants = PlateConstantsFit.FromReflectedObject(constants);
            }

            return(rv);
        }
        public static LeastSquareFittedAstrometry FromReflectedObject(object reflObj)
        {
            var rv = new LeastSquareFittedAstrometry();

            rv.m_RA0Deg = StarMap.GetPropValue<double>(reflObj, "m_RA0Deg");
            rv.m_DE0Deg = StarMap.GetPropValue<double>(reflObj, "m_DE0Deg");
            rv.m_Variance = StarMap.GetPropValue<double>(reflObj, "m_Variance");
            rv.m_StdDevRAArcSec = StarMap.GetPropValue<double>(reflObj, "m_StdDevRAArcSec");
            rv.m_StdDevDEArcSec = StarMap.GetPropValue<double>(reflObj, "m_StdDevDEArcSec");

            object image = StarMap.GetPropValue<object>(reflObj, "m_Image");
            rv.m_Image = AstroPlate.FromReflectedObject(image);

            object constants = StarMap.GetPropValue<object>(reflObj, "m_SolvedConstants");

            if (constants != null)
                rv.m_SolvedConstants = PlateConstantsFit.FromReflectedObject(constants);

            return rv;
        }
Beispiel #4
0
        public void NextFrame(int frameNo, IAstroImage astroImage, IStarMap starMap, LeastSquareFittedAstrometry astrometricFit)
        {
            IsTrackedSuccessfully = false;

            PSFFit psfFit = null;

            if (m_RepeatedIntergationPositions * 4 < m_PastFrameNos.Count)
            {
                var expectedPos = GetExpectedPosition(frameNo);
                if (expectedPos != null)
                    AstrometryContext.Current.StarMap.GetPSFFit(expectedPos.X, expectedPos.Y, PSFFittingMethod.NonLinearFit, out psfFit);
            }

            if (psfFit == null)
            {
                var brightestFeature = starMap.GetFeatureInRadius((int)TrackedObject.LastKnownX, (int)TrackedObject.LastKnownY, CoreAstrometrySettings.Default.PreMeasureSearchCentroidRadius);

                if (brightestFeature != null)
                {
                    var center = brightestFeature.GetCenter();
                    var referenceStarFeatures = astrometricFit.FitInfo.AllStarPairs.Where(x => x.FitInfo.UsedInSolution).ToList();
                    var refStar = referenceStarFeatures.FirstOrDefault(s => Math.Sqrt((s.x - center.X) * (s.x - center.X) + (s.y - center.Y) * (s.y - center.Y)) < 2);
                    if (refStar == null)
                        // The brightest feature is not a reference star, so we assume it is our object
                        AstrometryContext.Current.StarMap.GetPSFFit(center.X, center.Y, PSFFittingMethod.NonLinearFit, out psfFit);
                }
            }

            if (psfFit == null)
            {
                ImagePixel centroid = AstrometryContext.Current.StarMap.GetCentroid(
                    (int)TrackedObject.LastKnownX,
                    (int)TrackedObject.LastKnownY,
                    CoreAstrometrySettings.Default.PreMeasureSearchCentroidRadius);

                if (centroid != null)
                    AstrometryContext.Current.StarMap.GetPSFFit(centroid.X, centroid.Y, PSFFittingMethod.NonLinearFit, out psfFit);
            }

            if (psfFit != null)
            {
                double ra, de;
                astrometricFit.GetRADEFromImageCoords(psfFit.XCenter, psfFit.YCenter, out ra, out de);

                double maxPosDiffArcSec =
                        astrometricFit.GetDistanceInArcSec(astrometricFit.Image.CenterXImage, astrometricFit.Image.CenterYImage,
                        astrometricFit.Image.CenterXImage + CoreAstrometrySettings.Default.PreMeasureSearchCentroidRadius, astrometricFit.Image.CenterYImage);

                if (!double.IsNaN(TrackedObject.RAHours))
                {
                    double posDif = 3600 * AngleUtility.Elongation(15 * TrackedObject.RAHours, TrackedObject.DEDeg, ra, de);
                    if (posDif > maxPosDiffArcSec)
                    {
                        // NOTE: Not a valid measurement
                        Trace.WriteLine(string.Format("The target position is too far from the last measured position", posDif));
                        return;
                    }
                }

                TrackedObject.RAHours = ra / 15.0;
                TrackedObject.DEDeg = de;
                TrackedObject.LastKnownX = psfFit.XCenter;
                TrackedObject.LastKnownY = psfFit.YCenter;
                TrackedObject.PSFFit = psfFit;

                IsTrackedSuccessfully = true;
            }

            if (psfFit != null && psfFit.XCenter > 0 && psfFit.YCenter > 0)
            {
                m_PastFramePosX.Add(psfFit.XCenter);
                m_PastFramePosY.Add(psfFit.YCenter);
                m_PastFrameNos.Add(frameNo);
            }
        }
        private LeastSquareFittedAstrometry SolveWithLinearRegression(FitOrder fitOrder, int minNumberOfStars, double maxResidual, bool upgradeIfPossible, out LeastSquareFittedAstrometry firstFit)
        {
            bool failed = false;
            try
            {
                PlateConstantsFit firstPlateConstantsFit = null;

                if (!upgradeIfPossible)
                {
                    PlateConstantsFit bestFit = LinearFitWithExcludingResiduals(fitOrder, minNumberOfStars, maxResidual, out firstPlateConstantsFit);

                    firstFit = firstPlateConstantsFit != null ? new LeastSquareFittedAstrometry(m_PlateConfig, m_Tangent_RA0, m_Tangent_DE0, firstPlateConstantsFit) : null;

                    if (bestFit != null)
                        return new LeastSquareFittedAstrometry(m_PlateConfig, m_Tangent_RA0, m_Tangent_DE0, bestFit);
                }
                else
                {
                    // less than 11 stars - do a linear fit
                    // between 12 and 19 - do a quadratic fit
                    // more than 20 - do a cubic fit

                    PlateConstantsFit bestFit = null;

                    int numStars = m_Pairs.Count;
                    if (m_Pairs.Count >= MIN_STARS_FOR_CUBIC_FIT)
                    {
                        bestFit = LinearFitWithExcludingResiduals(FitOrder.Cubic, minNumberOfStars, maxResidual, out firstPlateConstantsFit);

                        if (bestFit != null)
                            numStars = bestFit.FitInfo.NumberOfStarsUsedInSolution();
                        else
                            numStars = MIN_STARS_FOR_CUBIC_FIT - 1;
                    }

                    if (numStars >= MIN_STARS_FOR_QUADRATIC_FIT && numStars < MIN_STARS_FOR_CUBIC_FIT)
                    {
                        bestFit = LinearFitWithExcludingResiduals(FitOrder.Quadratic, minNumberOfStars, maxResidual, out firstPlateConstantsFit);

                        if (bestFit != null)
                            numStars = bestFit.FitInfo.NumberOfStarsUsedInSolution();
                        else
                            numStars = MIN_STARS_FOR_QUADRATIC_FIT - 1;
                    }

                    if (numStars < MIN_STARS_FOR_QUADRATIC_FIT)
                    {
                        bestFit = LinearFitWithExcludingResiduals(FitOrder.Linear, minNumberOfStars, maxResidual, out firstPlateConstantsFit);
                    }

                    firstFit = firstPlateConstantsFit != null ? new LeastSquareFittedAstrometry(m_PlateConfig, m_Tangent_RA0, m_Tangent_DE0, firstPlateConstantsFit) : null;

                    if (bestFit != null)
                        return new LeastSquareFittedAstrometry(m_PlateConfig, m_Tangent_RA0, m_Tangent_DE0, bestFit);
                }

                failed = true;
                return null;
            }
            finally
            {
                m_IncludedInSolution.Clear();
                m_ExcludedForBadResiduals.Clear();

                for (int i = 0; i < m_Pairs.Count; i++)
                {
            #if ASTROMETRY_DEBUG
                    Trace.Assert(!m_IncludedInSolution.ContainsKey(m_Pairs[i].StarNo));
            #endif
                    m_IncludedInSolution.Add(m_Pairs[i].StarNo, m_Pairs[i].FitInfo.UsedInSolution);

            #if ASTROMETRY_DEBUG
                    Trace.Assert(!m_ExcludedForBadResiduals.ContainsKey(m_Pairs[i].StarNo));
            #endif
                    m_ExcludedForBadResiduals.Add(m_Pairs[i].StarNo, m_Pairs[i].FitInfo.ExcludedForHighResidual);
                }

                if (failed)
                {
                    if (TangraConfig.Settings.TraceLevels.PlateSolving.TraceInfo())
                        Trace.WriteLine(string.Format("Solution LeastSquareFit failed. {0} included stars, {1} excluded for high residuals.", m_IncludedInSolution.Count, m_ExcludedForBadResiduals.Count));
                }
            }
        }
        public LeastSquareFittedAstrometry SolveWithLinearRegression(IAstrometrySettings settings, out LeastSquareFittedAstrometry firstFit)
        {
            double maxResidual = m_PlateConfig.GetDistanceInArcSec(
                    m_PlateConfig.CenterXImage, m_PlateConfig.CenterYImage,
                    m_PlateConfig.CenterXImage + settings.MaxResidualInPixels, m_PlateConfig.CenterYImage + settings.MaxResidualInPixels);

            if (m_Pairs.Count < CorePyramidConfig.Default.MinStarsForImprovementForThreshold)
            {
                double minResidual = m_PlateConfig.GetDistanceInArcSec(
                    m_PlateConfig.CenterXImage, m_PlateConfig.CenterYImage,
                    m_PlateConfig.CenterXImage + CorePyramidConfig.Default.MaxResidualThresholdForImprovementInPixels, m_PlateConfig.CenterYImage);

                if (maxResidual < minResidual)
                    maxResidual = minResidual;
            }

            if (settings.Method == AstrometricMethod.AutomaticFit)
                return SolveWithLinearRegression(FitOrder.Cubic, settings.MinimumNumberOfStars, maxResidual, true, out firstFit);
            else if (settings.Method == AstrometricMethod.LinearFit)
                return SolveWithLinearRegression(FitOrder.Linear, settings.MinimumNumberOfStars, maxResidual, false, out firstFit);
            else if (settings.Method == AstrometricMethod.QuadraticFit)
                return SolveWithLinearRegression(FitOrder.Quadratic, settings.MinimumNumberOfStars, maxResidual, false, out firstFit);
            else if (settings.Method == AstrometricMethod.CubicFit)
                return SolveWithLinearRegression(FitOrder.Cubic, settings.MinimumNumberOfStars, maxResidual, false, out firstFit);
            else
                throw new NotImplementedException();
        }
 public LeastSquareFittedAstrometry SolveWithLinearRegression(FitOrder fitOrder, int minNumberOfStars, double maxResidual, out LeastSquareFittedAstrometry firstFit)
 {
     return SolveWithLinearRegression(fitOrder, minNumberOfStars, maxResidual, false, out firstFit);
 }
        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"));
            }
        }
Beispiel #9
0
        private LeastSquareFittedAstrometry SolveWithLinearRegression(FitOrder fitOrder, int minNumberOfStars, double maxResidual, bool upgradeIfPossible, out LeastSquareFittedAstrometry firstFit)
        {
            bool failed = false;

            try
            {
                PlateConstantsFit firstPlateConstantsFit = null;

                if (!upgradeIfPossible)
                {
                    PlateConstantsFit bestFit = LinearFitWithExcludingResiduals(fitOrder, minNumberOfStars, maxResidual, out firstPlateConstantsFit);

                    firstFit = firstPlateConstantsFit != null ? new LeastSquareFittedAstrometry(m_PlateConfig, m_Tangent_RA0, m_Tangent_DE0, firstPlateConstantsFit) : null;

                    if (bestFit != null)
                    {
                        return(new LeastSquareFittedAstrometry(m_PlateConfig, m_Tangent_RA0, m_Tangent_DE0, bestFit));
                    }
                }
                else
                {
                    // less than 11 stars - do a linear fit
                    // between 12 and 19 - do a quadratic fit
                    // more than 20 - do a cubic fit

                    PlateConstantsFit bestFit = null;

                    int numStars = m_Pairs.Count;
                    if (m_Pairs.Count >= MIN_STARS_FOR_CUBIC_FIT)
                    {
                        bestFit = LinearFitWithExcludingResiduals(FitOrder.Cubic, minNumberOfStars, maxResidual, out firstPlateConstantsFit);

                        if (bestFit != null)
                        {
                            numStars = bestFit.FitInfo.NumberOfStarsUsedInSolution();
                        }
                        else
                        {
                            numStars = MIN_STARS_FOR_CUBIC_FIT - 1;
                        }
                    }


                    if (numStars >= MIN_STARS_FOR_QUADRATIC_FIT && numStars < MIN_STARS_FOR_CUBIC_FIT)
                    {
                        bestFit = LinearFitWithExcludingResiduals(FitOrder.Quadratic, minNumberOfStars, maxResidual, out firstPlateConstantsFit);

                        if (bestFit != null)
                        {
                            numStars = bestFit.FitInfo.NumberOfStarsUsedInSolution();
                        }
                        else
                        {
                            numStars = MIN_STARS_FOR_QUADRATIC_FIT - 1;
                        }
                    }

                    if (numStars < MIN_STARS_FOR_QUADRATIC_FIT)
                    {
                        bestFit = LinearFitWithExcludingResiduals(FitOrder.Linear, minNumberOfStars, maxResidual, out firstPlateConstantsFit);
                    }

                    firstFit = firstPlateConstantsFit != null ? new LeastSquareFittedAstrometry(m_PlateConfig, m_Tangent_RA0, m_Tangent_DE0, firstPlateConstantsFit) : null;

                    if (bestFit != null)
                    {
                        return(new LeastSquareFittedAstrometry(m_PlateConfig, m_Tangent_RA0, m_Tangent_DE0, bestFit));
                    }
                }

                failed = true;
                return(null);
            }
            finally
            {
                m_IncludedInSolution.Clear();
                m_ExcludedForBadResiduals.Clear();

                for (int i = 0; i < m_Pairs.Count; i++)
                {
#if ASTROMETRY_DEBUG
                    Trace.Assert(!m_IncludedInSolution.ContainsKey(m_Pairs[i].StarNo));
#endif
                    m_IncludedInSolution.Add(m_Pairs[i].StarNo, m_Pairs[i].FitInfo.UsedInSolution);

#if ASTROMETRY_DEBUG
                    Trace.Assert(!m_ExcludedForBadResiduals.ContainsKey(m_Pairs[i].StarNo));
#endif
                    m_ExcludedForBadResiduals.Add(m_Pairs[i].StarNo, m_Pairs[i].FitInfo.ExcludedForHighResidual);
                }

                if (failed)
                {
                    if (TangraConfig.Settings.TraceLevels.PlateSolving.TraceInfo())
                    {
                        Trace.WriteLine(string.Format("Solution LeastSquareFit failed. {0} included stars, {1} excluded for high residuals.", m_IncludedInSolution.Count, m_ExcludedForBadResiduals.Count));
                    }
                }
            }
        }
Beispiel #10
0
        public LeastSquareFittedAstrometry SolveWithLinearRegression(IAstrometrySettings settings, out LeastSquareFittedAstrometry firstFit)
        {
            double maxResidual = m_PlateConfig.GetDistanceInArcSec(
                m_PlateConfig.CenterXImage, m_PlateConfig.CenterYImage,
                m_PlateConfig.CenterXImage + settings.MaxResidualInPixels, m_PlateConfig.CenterYImage + settings.MaxResidualInPixels);

            if (m_Pairs.Count < CorePyramidConfig.Default.MinStarsForImprovementForThreshold)
            {
                double minResidual = m_PlateConfig.GetDistanceInArcSec(
                    m_PlateConfig.CenterXImage, m_PlateConfig.CenterYImage,
                    m_PlateConfig.CenterXImage + CorePyramidConfig.Default.MaxResidualThresholdForImprovementInPixels, m_PlateConfig.CenterYImage);

                if (maxResidual < minResidual)
                {
                    maxResidual = minResidual;
                }
            }

            if (settings.Method == AstrometricMethod.AutomaticFit)
            {
                return(SolveWithLinearRegression(FitOrder.Cubic, settings.MinimumNumberOfStars, maxResidual, true, out firstFit));
            }
            else if (settings.Method == AstrometricMethod.LinearFit)
            {
                return(SolveWithLinearRegression(FitOrder.Linear, settings.MinimumNumberOfStars, maxResidual, false, out firstFit));
            }
            else if (settings.Method == AstrometricMethod.QuadraticFit)
            {
                return(SolveWithLinearRegression(FitOrder.Quadratic, settings.MinimumNumberOfStars, maxResidual, false, out firstFit));
            }
            else if (settings.Method == AstrometricMethod.CubicFit)
            {
                return(SolveWithLinearRegression(FitOrder.Cubic, settings.MinimumNumberOfStars, maxResidual, false, out firstFit));
            }
            else
            {
                throw new NotImplementedException();
            }
        }
Beispiel #11
0
 public LeastSquareFittedAstrometry SolveWithLinearRegression(FitOrder fitOrder, int minNumberOfStars, double maxResidual, out LeastSquareFittedAstrometry firstFit)
 {
     return(SolveWithLinearRegression(fitOrder, minNumberOfStars, maxResidual, false, out firstFit));
 }
        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);
                    }
                }
            }
        }
Beispiel #13
0
        // TODO: Use the imeplementation in the MainForm instead
        private void DrawHighResFeature(ImagePixel pixel, PlateConstStarPair selectedPair, LeastSquareFittedAstrometry astrometry)
        {
            int x0 = pixel.X;
            int y0 = pixel.Y;
            if (x0 < 15) x0 = 15; if (y0 < 15) y0 = 15;
            if (x0 > AstrometryContext.Current.FullFrame.Width - 15) x0 = AstrometryContext.Current.FullFrame.Width - 15;
            if (y0 > AstrometryContext.Current.FullFrame.Height - 15) y0 = AstrometryContext.Current.FullFrame.Height - 15;

            int bytes;
            int bytesPerPixel;
            int selIdx;

            Bitmap featureBitmap = new Bitmap(31 * 8, 31 * 8, PixelFormat.Format24bppRgb);
            m_VideoController.UpdateZoomedImage(featureBitmap, pixel);

            BitmapData zoomedData = featureBitmap.LockBits(new Rectangle(0, 0, 31 * 8, 31 * 8), ImageLockMode.ReadWrite, featureBitmap.PixelFormat);
            try
            {
                bytes = zoomedData.Stride * featureBitmap.Height;
                byte[] zoomedValues = new byte[bytes];

                Marshal.Copy(zoomedData.Scan0, zoomedValues, 0, bytes);

                bytesPerPixel = AstrometryContext.Current.BytesPerPixel;

                byte saturatedR = TangraConfig.Settings.Color.Saturation.R;
                byte saturatedG = TangraConfig.Settings.Color.Saturation.G;
                byte saturatedB = TangraConfig.Settings.Color.Saturation.B;

                selIdx = 0;
                for (int y = 0; y < 31; y++)
                    for (int x = 0; x < 31; x++)
                    {
                        for (int i = 0; i < 8; i++)
                            for (int j = 0; j < 8; j++)
                            {
                                int zoomedX = 8 * x + i;
                                int zoomedY = 8 * y + j;

                                int zoomedIdx = zoomedData.Stride * zoomedY + zoomedX * bytesPerPixel;

                                if (zoomedValues[zoomedIdx] > TangraConfig.Settings.Photometry.Saturation.Saturation8Bit)
                                {
                                    // Saturation detected
                                    zoomedValues[zoomedIdx] = saturatedR;
                                    zoomedValues[zoomedIdx + 1] = saturatedG;
                                    zoomedValues[zoomedIdx + 2] = saturatedB;
                                }
                            }

                        selIdx++;
                    }

                Marshal.Copy(zoomedValues, 0, zoomedData.Scan0, bytes);
            }
            finally
            {
                featureBitmap.UnlockBits(zoomedData);
            }

            Pen starPen = catalogStarPen;

            double xFitUnscaled = pixel.XDouble;
            double yFitUnscaled = pixel.YDouble;

            if (selectedPair != null && selectedPair.FitInfo.UsedInSolution)
            {
                starPen = referenceStarPen;
                astrometry.GetImageCoordsFromRADE(selectedPair.RADeg, selectedPair.DEDeg, out xFitUnscaled, out yFitUnscaled);
            }
            else if (selectedPair != null && selectedPair.FitInfo.ExcludedForHighResidual)
            {
                starPen = rejectedStarPen;
                astrometry.GetImageCoordsFromRADE(selectedPair.RADeg, selectedPair.DEDeg, out xFitUnscaled, out yFitUnscaled);
            }
            else
            {
                starPen = unrecognizedStarPen;
            }

            double xFit = (8 * (xFitUnscaled - x0 + 16)) - 4;
            double yFit = (8 * (yFitUnscaled - y0 + 16)) - 4;
        }