internal void SetTimes(OccultationEventInfo evt) { m_Event = evt; }
void ILightCurveDataProvider.SetFoundOccultationEvent(int eventId, float dFrame, float rFrame, float dFrameErrorMinus, float dFrameErrorPlus, float rFrameErrorMinus, float rFrameErrorPlus, string dTime, string rTime, bool cameraDelaysKnownToAOTA) { if (m_EventTimesReport != null) { m_EventTimesReport.IsThisAMiss = false; var evt = new OccultationEventInfo() { EventId = eventId, DFrame = dFrame, RFrame = rFrame, DFrameErrorMinus = dFrameErrorMinus, DFrameErrorPlus = dFrameErrorPlus, RFrameErrorMinus = rFrameErrorMinus, RFrameErrorPlus = rFrameErrorPlus, DTimeString = dTime, RTimeString = rTime }; if (m_LCFile != null) { m_LCFile.Header.LcFile = m_LCFile; // NOTE: For AOTA xx.0 is the beginning of the frame and xx.5 is the middle of the frame. // Tangra associates all frame times with the middle of the frame so we adjust the AOTA frames to Tangra frames by subtracting 0.5 below bool gotTimes = false; if (m_LCFile.FrameTiming != null && m_LCFile.FrameTiming.Count > 0) { DateTime DTimeFrom = m_LCFile.Header.GetTimeForFrameFromFrameTiming(dFrame - 0.5 + dFrameErrorMinus, true); DateTime DTimeTo = m_LCFile.Header.GetTimeForFrameFromFrameTiming(dFrame - 0.5 + dFrameErrorPlus, true); evt.DTime = new DateTime((DTimeFrom.Ticks + DTimeTo.Ticks) / 2); evt.DTimeErrorMS = (int)Math.Round(new TimeSpan(DTimeTo.Ticks - DTimeFrom.Ticks).TotalMilliseconds / 2); DateTime RTimeFrom = m_LCFile.Header.GetTimeForFrameFromFrameTiming(rFrame - 0.5 + rFrameErrorMinus, true); DateTime RTimeTo = m_LCFile.Header.GetTimeForFrameFromFrameTiming(rFrame - 0.5 + rFrameErrorPlus, true); evt.RTime = new DateTime((RTimeFrom.Ticks + RTimeTo.Ticks) / 2); evt.RTimeErrorMS = (int)Math.Round(new TimeSpan(RTimeTo.Ticks - RTimeFrom.Ticks).TotalMilliseconds / 2); evt.DTimeMostProbable = m_LCFile.Header.GetTimeForFrameFromFrameTiming(dFrame - 0.5, true); evt.RTimeMostProbable = m_LCFile.Header.GetTimeForFrameFromFrameTiming(rFrame - 0.5, true); gotTimes = true; } else if (m_LCFile.Header.TimingType == MeasurementTimingType.UserEnteredFrameReferences && m_LCFile.Header.FirstTimedFrameNo != m_LCFile.Header.LastTimedFrameNo) { DateTime DTimeFrom = m_LCFile.Header.GetTimeForFrameFromManuallyEnteredTimes(dFrame - 0.5 + dFrameErrorMinus); DateTime DTimeTo = m_LCFile.Header.GetTimeForFrameFromManuallyEnteredTimes(dFrame - 0.5 + dFrameErrorPlus); evt.DTime = new DateTime((DTimeFrom.Ticks + DTimeTo.Ticks) / 2); evt.DTimeErrorMS = (int)Math.Round(new TimeSpan(DTimeTo.Ticks - DTimeFrom.Ticks).TotalMilliseconds / 2); DateTime RTimeFrom = m_LCFile.Header.GetTimeForFrameFromManuallyEnteredTimes(rFrame - 0.5 + rFrameErrorMinus); DateTime RTimeTo = m_LCFile.Header.GetTimeForFrameFromManuallyEnteredTimes(rFrame - 0.5 + rFrameErrorPlus); evt.RTime = new DateTime((RTimeFrom.Ticks + RTimeTo.Ticks) / 2); evt.RTimeErrorMS = (int)Math.Round(new TimeSpan(RTimeTo.Ticks - RTimeFrom.Ticks).TotalMilliseconds / 2); evt.DTimeMostProbable = m_LCFile.Header.GetTimeForFrameFromManuallyEnteredTimes(dFrame - 0.5); evt.RTimeMostProbable = m_LCFile.Header.GetTimeForFrameFromManuallyEnteredTimes(rFrame - 0.5); gotTimes = true; } else { // TODO: Use the times from AOTA?? } DateTime? aotaDTime = null; DateTime? aotaRTime = null; // Parse the +/- part of each time e.g. "9 40 25.79 ± 0.07" string[] tokens = dTime.Split('±'); if (tokens.Length == 2) { evt.DTimeErrorMSAOTA = (int)Math.Round(double.Parse(tokens[1].Trim()) * 1000.0); string[] ttokens = tokens[0].Trim().Split(' '); aotaDTime = m_LCFile.Header.GetFrameTime(m_LCFile.Header.MinFrame); if (aotaDTime.HasValue) { double secs = double.Parse(ttokens[2]); int secsInt = (int) secs; int millilsecsInt = (int) Math.Round((secs - secsInt)*1000.0); aotaDTime = new DateTime(aotaDTime.Value.Year, aotaDTime.Value.Month, aotaDTime.Value.Day, int.Parse(ttokens[0]), int.Parse(ttokens[1]), secsInt, millilsecsInt); tokens = rTime.Split('±'); if (tokens.Length == 2) { evt.RTimeErrorMSAOTA = (int)Math.Round(double.Parse(tokens[1].Trim()) * 1000.0); ttokens = tokens[0].Trim().Split(' '); aotaRTime = m_LCFile.Header.GetFrameTime(m_LCFile.Header.MinFrame); if (aotaRTime.HasValue) { secs = double.Parse(ttokens[2]); secsInt = (int)secs; millilsecsInt = (int)Math.Round((secs - secsInt) * 1000.0); aotaRTime = new DateTime(aotaRTime.Value.Year, aotaRTime.Value.Month, aotaRTime.Value.Day, int.Parse(ttokens[0]), int.Parse(ttokens[1]), secsInt, millilsecsInt); if (aotaRTime.Value < aotaDTime.Value) aotaRTime.Value.AddDays(1); evt.DTimeAOTA = aotaDTime.Value; evt.RTimeAOTA = aotaRTime.Value; } } } } if (gotTimes && m_EventTimesReport.TangraCanApplyInstrumentalDelays == InstrumentalDelayStatus.Yes) { double instrDelay = m_LCFile.GetInstrumentalDelayAtFrameInSeconds(dFrame - 0.5); evt.DTime = evt.DTime.AddSeconds(instrDelay); evt.RTime = evt.RTime.AddSeconds(instrDelay); evt.DTimeMostProbable = evt.DTimeMostProbable.AddSeconds(instrDelay); evt.RTimeMostProbable = evt.RTimeMostProbable.AddSeconds(instrDelay); } if (aotaDTime.HasValue && aotaRTime.HasValue && (Math.Abs(new TimeSpan(aotaDTime.Value.Ticks - evt.DTime.Ticks).TotalMilliseconds) > 10 || Math.Abs(new TimeSpan(aotaRTime.Value.Ticks - evt.RTime.Ticks).TotalMilliseconds) > 10) && m_EventTimesReport.VideoFileFormat != "AVI" && m_EventTimesReport.TangraCanApplyInstrumentalDelays == InstrumentalDelayStatus.Yes && cameraDelaysKnownToAOTA) { // AOTA and Tangra times are different. Ask the use which times they want to use // Add a flag in the report to indicate which times to be used in OW var frm = new frmChooseTimesToReport(); frm.SetTimes(evt); frm.CameraNameTangra = m_LCFile.Footer.CameraName; frm.CameraNameAOTA = m_EventTimesReport.CameraName; frm.TangraKnowsCameraDelays = m_EventTimesReport.TangraCanApplyInstrumentalDelays == InstrumentalDelayStatus.Yes; frm.AOTAKnowsCameraDelays = cameraDelaysKnownToAOTA; frm.ShowDialog(this); evt.ReportTangraTimesRatherThanAOTATimes = frm.UseTangrasTimes; evt.InstrumentalDelaysApplied = evt.ReportTangraTimesRatherThanAOTATimes ? m_EventTimesReport.TangraCanApplyInstrumentalDelays == InstrumentalDelayStatus.Yes : cameraDelaysKnownToAOTA; } else if (m_EventTimesReport.VideoFileFormat == "AVI") { // Always use the times provided by AOTA when working with AVI files evt.InstrumentalDelaysApplied = cameraDelaysKnownToAOTA; evt.ReportTangraTimesRatherThanAOTATimes = false; } else if ((m_EventTimesReport.VideoFileFormat == "ADV" || m_EventTimesReport.VideoFileFormat == "AAV") && !cameraDelaysKnownToAOTA) { // For ADV/AAV files prefer Tangra's times (when AOTA doesn't know hwo to apply delays) evt.InstrumentalDelaysApplied = m_EventTimesReport.TangraCanApplyInstrumentalDelays != InstrumentalDelayStatus.No; evt.ReportTangraTimesRatherThanAOTATimes = true; } else { // Otherwise use AOTA's Times evt.InstrumentalDelaysApplied = cameraDelaysKnownToAOTA; evt.ReportTangraTimesRatherThanAOTATimes = false; } } m_EventTimesReport.Events.Add(evt); } }