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; }
internal void AddNewMeasurement(SingleMultiFrameMeasurement measurement) { if (measurement != null) { if (m_AllMeasurements.ContainsKey(measurement.FrameNo)) return; m_AllMeasurements.Add(measurement.FrameNo, measurement); double minRa = measurement.RADeg - measurement.StdDevRAArcSec / 3600.0; double maxRa = measurement.RADeg + measurement.StdDevRAArcSec / 3600.0; double minDe = measurement.DEDeg - measurement.StdDevDEArcSec / 3600.0; double maxDe = measurement.DEDeg + measurement.StdDevDEArcSec / 3600.0; if (m_MinRA > minRa) m_MinRA = minRa; if (m_MaxRA < maxRa) m_MaxRA = maxRa; if (m_MinDE > minDe) m_MinDE = minDe; if (m_MaxDE < maxDe) m_MaxDE = maxDe; if (m_MinFrame > measurement.FrameNo) m_MinFrame = measurement.FrameNo; if (m_MaxFrame < measurement.FrameNo) m_MaxFrame = measurement.FrameNo; DrawRAPanel(); DrawDEPanel(); } }
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 TestInstrumentalDelayInAVI(int integratedFrames, int measureFramesPerInterval, double frameRate, double instrumentalDelaySec, bool missFirstFrame, int? clickedFrameIndex) { // Simulated 10 integrated frames with integration starting at frame 100 // Simulated motion in RA with rate 2.34567s per minute // Simulated motion in DEC with rate 34.5678" per minute double frameDurationSec = 1.0 / frameRate; const double raArcSecRatePerMinute = 2.34567; double raArcSecRatePerIntegrationPeriod = integratedFrames * frameDurationSec * raArcSecRatePerMinute / 60.0; const double startingRaDeg = 123.0; const int firstFrameId = 100; const int numIntegrationIntervalsMeasured = 10; DateTime firstIntegratedFrameRealMidExposureUT = DateTime.ParseExact("2016 09 08 13:45:04.718", "yyyy MM dd HH:mm:ss.fff", CultureInfo.InvariantCulture); const double decArcSecRatePerMinute = 34.5678; double decArcSecRatePerIntegrationPeriod = integratedFrames * frameDurationSec * decArcSecRatePerMinute / 60.0; const double startingDecDeg = 42.0; DateTime midExpWithDelay = firstIntegratedFrameRealMidExposureUT.AddSeconds(instrumentalDelaySec); DateTime endFirstFieldTimeStamp = midExpWithDelay; var measurements = new Dictionary<int, SingleMultiFrameMeasurement>(); var fittingContext = new FittingContext() { AavStackedMode = false, FirstFrameIdInIntegrationPeroid = firstFrameId, FirstFrameUtcTime = endFirstFieldTimeStamp, FrameRate = frameRate, FrameTimeType = FrameTimeType.TimeStampOfFirstIntegratedFrame, InstrumentalDelay = instrumentalDelaySec, InstrumentalDelayUnits = InstrumentalDelayUnits.Seconds, IntegratedFramesCount = integratedFrames, MovementExpectation = MovementExpectation.SlowFlyby, NativeVideoFormat = null, ObjectExposureQuality = ObjectExposureQuality.GoodSignal }; var meaContext = new FlybyMeasurementContext() { FirstVideoFrame = 0, /* First frame is in the whole video file */ MaxStdDev = 0, UserMidValue = 0 /* This is used for plotting only */ }; for (int i = 0; i < numIntegrationIntervalsMeasured; i++) { double de = startingDecDeg + (decArcSecRatePerIntegrationPeriod * i) / 3600; double ra = startingRaDeg + (raArcSecRatePerIntegrationPeriod * i) / 3600; for (int f = 0; f < measureFramesPerInterval; f++) { var mea = new SingleMultiFrameMeasurement() { RADeg = ra, DEDeg = de, FrameNo = firstFrameId + i * integratedFrames + f, Mag = 14 }; measurements.Add(mea.FrameNo, mea); } } if (missFirstFrame) // Simulate a prevoous buggy condition: Missed first frame measurements.Remove(firstFrameId); meaContext.MinFrameNo = measurements.Keys.Min(); meaContext.MaxFrameNo = measurements.Keys.Max(); if (clickedFrameIndex == null) // When not specified explicitely compute a normal position close to the last measured frame meaContext.UserMidFrame = meaContext.MaxFrameNo; else meaContext.UserMidFrame = meaContext.MinFrameNo + clickedFrameIndex.Value; var fitter = new FlyByMotionFitter(); double motionRate; var raFit = fitter.FitAndPlotSlowFlyby( measurements, meaContext, fittingContext, FittingValue.RA, null, null, null, 0, 0, 0, 0, out motionRate); var deFit = fitter.FitAndPlotSlowFlyby( measurements, meaContext, fittingContext, FittingValue.DEC, null, null, null, 0, 0, 0, 0, out motionRate); Assert.IsNotNull(raFit); Assert.IsNotNull(deFit); Assert.IsTrue(raFit.IsVideoNormalPosition); Assert.IsTrue(deFit.IsVideoNormalPosition); #region Compute Expected Normal Position and Time of Normal Position int userFrameIntegrationInterval = (meaContext.UserMidFrame - firstFrameId) / integratedFrames; double userFrameIntegrationIntervalMidFrame = firstFrameId + userFrameIntegrationInterval * integratedFrames + integratedFrames / 2 - (frameDurationSec / 2 /* Correction for finding the middle even frames block */); DateTime userFrameIntegrationIntervalMidExposureRealTimeStamp = firstIntegratedFrameRealMidExposureUT.AddSeconds(userFrameIntegrationInterval * integratedFrames * frameDurationSec); double userFrameOffsetFromMidExposureSec = (meaContext.UserMidFrame - userFrameIntegrationIntervalMidFrame) * frameDurationSec; DateTime userFrameRealProjectedTimeStamp = userFrameIntegrationIntervalMidExposureRealTimeStamp.AddSeconds(userFrameOffsetFromMidExposureSec); double fractionalDaysProjectedTimeStamp = GetFractionalDays(userFrameRealProjectedTimeStamp); double fractionalDaysClosestNormalTimeStamp = Math.Round(fractionalDaysProjectedTimeStamp * 1E6) / 1E6; DateTime closestNormalTimeStamp = new DateTime(userFrameRealProjectedTimeStamp.Year, userFrameRealProjectedTimeStamp.Month, userFrameRealProjectedTimeStamp.Day).AddDays(fractionalDaysClosestNormalTimeStamp); #endregion TimeSpan diffExpectedMinusFitted = closestNormalTimeStamp - raFit.FittedValueTime; if (diffExpectedMinusFitted.TotalMilliseconds > 0.5) { diffExpectedMinusFitted = closestNormalTimeStamp.AddDays(0.000001) - raFit.FittedValueTime; if (diffExpectedMinusFitted.TotalMilliseconds > 0.5) { diffExpectedMinusFitted = closestNormalTimeStamp.AddDays(-0.000001) - raFit.FittedValueTime; if (diffExpectedMinusFitted.TotalMilliseconds > 0.5) { Assert.Fail("Normal Time Difference. Expected: {0:0.0000000}, Actual: {1:0.0000000}", GetFractionalDays(closestNormalTimeStamp), GetFractionalDays(raFit.FittedValueTime)); } } } // Make sure we calculate the position for the selected normal frame by the fitter, which may be 1 microday away from ours closestNormalTimeStamp = raFit.FittedValueTime; TimeSpan diffNormalMinusStartTime = closestNormalTimeStamp - firstIntegratedFrameRealMidExposureUT; double raAtNormalTimeArcSec = startingRaDeg * 3600 + raArcSecRatePerMinute * diffNormalMinusStartTime.TotalMinutes; double deAtNormalTimeArcSec = startingDecDeg * 3600 + decArcSecRatePerMinute * diffNormalMinusStartTime.TotalMinutes; double fittedRaArcSec = raFit.FittedValue * 3600; double fittedDecArcSec = deFit.FittedValue * 3600; Trace.WriteLine(string.Format("RA-Diff={0}\", DEC-Diff-{1}\"", Math.Abs(raAtNormalTimeArcSec - fittedRaArcSec), Math.Abs(deAtNormalTimeArcSec - fittedDecArcSec))); Assert.AreEqual(raAtNormalTimeArcSec, fittedRaArcSec, 0.1 /* 0.1 arcsec */); Assert.AreEqual(deAtNormalTimeArcSec, fittedDecArcSec, 0.1 /* 0.1 arcsec */); }