Esempio n. 1
0
 internal void SetTimes(OccultationEventInfo evt)
 {
     m_Event = evt;
 }
Esempio n. 2
0
 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);
            }
        }