Beispiel #1
0
        public static double ComputeWeight(WeightingMode mode, double solutionUncertaintyArcSec, double fwhmArcSec, double snr, double detection, double minUncertainty)
        {
            if (mode == WeightingMode.SNR)
            {
                // Positional uncertainty estimation by Neuschaefer and Windhorst 1994
                var sigmaPosition = fwhmArcSec / (2.355 * snr);
                if (sigmaPosition < minUncertainty)
                {
                    sigmaPosition = minUncertainty;
                }
                var combinedUncertainty = Math.Sqrt(sigmaPosition * sigmaPosition + solutionUncertaintyArcSec * solutionUncertaintyArcSec);
                return(1 / (combinedUncertainty * combinedUncertainty));
            }
            else if (mode == WeightingMode.SolutionUncertainty)
            {
                if (solutionUncertaintyArcSec < minUncertainty)
                {
                    return(1 / (minUncertainty * minUncertainty));
                }
                else
                {
                    return(1 / (solutionUncertaintyArcSec * solutionUncertaintyArcSec));
                }
            }
            else if (mode == WeightingMode.Detection)
            {
                return(detection / (solutionUncertaintyArcSec * solutionUncertaintyArcSec));
            }

            return(1);
        }
Beispiel #2
0
        private void Recalculate()
        {
            if (m_DataProvider != null && !m_LoadingData)
            {
                WeightingMode mode = WeightingMode.None;
                if (rbWeightingPosAstr.Checked)
                {
                    mode = WeightingMode.SNR;
                }
                else if (rbWeightingAstr.Checked)
                {
                    mode = WeightingMode.SolutionUncertainty;
                }

                var settings = new ReductionSettings()
                {
                    InstrumentalDelaySec              = nudInstDelaySec.Value,
                    Weighting                         = mode,
                    NumberOfChunks                    = (int)nudMeaIntervals.Value,
                    RemoveOutliers                    = cbxOutlierRemoval.Checked,
                    ConstraintPattern                 = cbxContraintPattern.SelectedIndex,
                    BestPositionUncertaintyArcSec     = TangraConfig.Settings.Astrometry.AssumedPositionUncertaintyPixels * (double)nudPixelsPerArcSec.Value,
                    SmallestReportedUncertaintyArcSec = TangraConfig.Settings.Astrometry.SmallestReportedUncertaintyArcSec,
                    FactorInPositionalUncertainty     = cbxFactorInPositionalUncertainty.Checked,
                    ErrorMethod                       = (ErrorMethod)cbxErrorMethod.SelectedIndex,
                    OutliersSigmaThreashold           = (double)nudSigmaExclusion.Value
                };

                m_PositionExtractor.Calculate(
                    m_DataProvider,
                    settings);

                Replot();

                var lines = m_PositionExtractor.ExtractPositions(tbxObsCode.Text, tbxObjectDesign.Text, dtpDate.Value.Date, m_RovingObservatoryProvider);
                tbxMeasurements.Text = string.Join("\r\n", lines);
            }
        }
Beispiel #3
0
        private double ComputePositionWeight(double solutionUncertaintyArcSec, SingleMultiFrameMeasurement measurement, double minUncertainty, WeightingMode mode)
        {
            if (mode == WeightingMode.SNR)
            {
                // Positional uncertainty estimation by Neuschaefer and Windhorst 1994
                var sigmaPosition = measurement.FWHMArcSec / (2.355 * measurement.SNR);
                var combinedUncertainty = Math.Sqrt(sigmaPosition * sigmaPosition + solutionUncertaintyArcSec * solutionUncertaintyArcSec);
                if (combinedUncertainty < minUncertainty) combinedUncertainty = minUncertainty;
                return 1 / (combinedUncertainty * combinedUncertainty);
            }
            else if (mode == WeightingMode.Detection)
            {
                return measurement.Detection / (solutionUncertaintyArcSec * solutionUncertaintyArcSec);
            }

            return 1;
        }
Beispiel #4
0
 private double ComputePositionWeight(double solutionUncertaintyArcSec, SingleMultiFrameMeasurement measurement, double minUncertainty, WeightingMode mode)
 {
     return(FlyByMotionFitter.ComputeWeight(mode, solutionUncertaintyArcSec, measurement.FWHMArcSec, measurement.SNR, measurement.Detection, minUncertainty));
 }
Beispiel #5
0
        public void Calculate(
            MeasurementPositionEntry[] entries, WeightingMode weighting, bool removeOutliers, double outlierSigmaCoeff,
            double instDelayTimeOfDay, double minUncertainty,
            bool includePositionalUncertainties, ErrorMethod errorMethod, double smallestReportedUncertaintyArcSec)
        {
            m_InstDelayTimeOfDay = instDelayTimeOfDay;
            m_Weighting          = weighting;
            m_ErrorMethod        = errorMethod;
            m_SmallestReportedUncertaintyArcSec = smallestReportedUncertaintyArcSec;

            m_MinSinglePositionUncertainty = minUncertainty;

            var regRA = new LinearRegression();
            var regDE = new LinearRegression();

            foreach (var entry in entries)
            {
                var midFrameTime = entry.TimeOfDayUTC - instDelayTimeOfDay;
                if (weighting == WeightingMode.None)
                {
                    regRA.AddDataPoint(midFrameTime, entry.RADeg);
                    regDE.AddDataPoint(midFrameTime, entry.DEDeg);
                }
                else
                {
                    var weightRA = CalulateWeight(entry, entry.SolutionUncertaintyRACosDEArcSec);
                    var weightDE = CalulateWeight(entry, entry.SolutionUncertaintyDEArcSec);
                    regRA.AddDataPoint(midFrameTime, entry.RADeg, weightRA);
                    regDE.AddDataPoint(midFrameTime, entry.DEDeg, weightDE);
                }
            }

            m_Entries = new List <MeasurementPositionEntry>();

            regRA.Solve();
            regDE.Solve();

            RemovedOutliers = 0;

            if (removeOutliers)
            {
                var outlierLimitRA = regRA.StdDev * outlierSigmaCoeff;
                var residualsRA    = regRA.Residuals.ToArray();
                var outlierLimitDE = regDE.StdDev * outlierSigmaCoeff;
                var residualsDE    = regDE.Residuals.ToArray();

                for (int i = 0; i < entries.Length; i++)
                {
                    if (Math.Abs(residualsRA[i]) <= outlierLimitRA && Math.Abs(residualsDE[i]) <= outlierLimitDE)
                    {
                        m_Entries.Add(entries[i]);
                    }
                    else
                    {
                        RemovedOutliers++;
                    }
                }

                m_RegressionRA = new LinearRegression();
                m_RegressionDE = new LinearRegression();

                foreach (var entry in m_Entries)
                {
                    var midFrameTime = entry.TimeOfDayUTC - instDelayTimeOfDay;

                    if (weighting == WeightingMode.None)
                    {
                        m_RegressionRA.AddDataPoint(midFrameTime, entry.RADeg);
                        m_RegressionDE.AddDataPoint(midFrameTime, entry.DEDeg);
                    }
                    else
                    {
                        var weightRA = CalulateWeight(entry, entry.SolutionUncertaintyRACosDEArcSec);
                        m_RegressionRA.AddDataPoint(midFrameTime, entry.RADeg, weightRA);

                        var weightDE = CalulateWeight(entry, entry.SolutionUncertaintyDEArcSec);
                        m_RegressionDE.AddDataPoint(midFrameTime, entry.DEDeg, weightDE);
                    }
                }

                m_RegressionRA.Solve();
                m_RegressionDE.Solve();
            }
            else
            {
                m_RegressionRA = regRA;
                m_RegressionDE = regDE;
                m_Entries      = entries.ToList();
            }

            if (includePositionalUncertainties)
            {
                var posUncertaintyAveLst = new List <double>();
                foreach (var entry in m_Entries)
                {
                    var posUncertainty = entry.FWHMArcSec / (2.355 * entry.SNR);
                    if (posUncertainty < m_MinSinglePositionUncertainty)
                    {
                        posUncertainty = m_MinSinglePositionUncertainty;
                    }
                    posUncertaintyAveLst.Add(posUncertainty);
                }
                var posUncertaintyMedian = posUncertaintyAveLst.Median();
                m_PosUncertaintyMedArcSec = posUncertaintyMedian / Math.Sqrt(posUncertaintyAveLst.Count);
            }
            else
            {
                m_PosUncertaintyMedArcSec = null;
            }
        }