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); }
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); } }
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; }
private double ComputePositionWeight(double solutionUncertaintyArcSec, SingleMultiFrameMeasurement measurement, double minUncertainty, WeightingMode mode) { return(FlyByMotionFitter.ComputeWeight(mode, solutionUncertaintyArcSec, measurement.FWHMArcSec, measurement.SNR, measurement.Detection, minUncertainty)); }
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; } }