internal void FindNextPeak() { if (!this.DataItem.IsAnalyzed || this.DataItem.LocatedPeaks == null) { return; } if (this.CurrentPeakIndex < 0) { return; } var currentPeak = this.DataItem.LocatedPeaks[this.CurrentPeakIndex]; int currentPeakSample = currentPeak.Sample; int?nearestStimulusIndex = this.DataItem.GetNearestStimulusIndex(currentPeak); if (nearestStimulusIndex.HasValue) { ++currentPeakSample; var nearestStimulus = this.DataItem.Sweeps[nearestStimulusIndex.Value].StimulusInfo; int endSample = nearestStimulus.StartSample; if (nearestStimulus.StartSample < currentPeakSample) { nearestStimulusIndex = nearestStimulusIndex.Value + 1; if (nearestStimulusIndex >= this.DataItem.Sweeps.Length) { endSample = this.DataItem.SamplesCount - 1; } else { endSample = this.DataItem.Sweeps[nearestStimulusIndex.Value].StimulusInfo.StartSample; } } var contSignal = this.DataItem.CreateContinuousSignal(); var diffSignal = DataProcessor.ComputeDiff(contSignal); var prevDiffValue = diffSignal[currentPeakSample]; for (int i = currentPeakSample + 1; i < endSample; i++) { var currentDiffValue = diffSignal[i]; if (prevDiffValue > 0 && currentDiffValue <= 0) { this.DataItem.LocatedPeaks[this.CurrentPeakIndex].Sample = i; this.DataItem.LocatedPeaks[this.CurrentPeakIndex].Pos = new Point(i * this.DataItem.Recording.Xscale, contSignal[i]); this.RefreshSelectedPeakInfo(); return; } prevDiffValue = currentDiffValue; } } }
internal void FindPrevPeak() { if (!this.DataItem.IsAnalyzed || this.DataItem.LocatedPeaks == null) { return; } if (this.CurrentPeakIndex < 0) { return; } var currentPeak = this.DataItem.LocatedPeaks[this.CurrentPeakIndex]; int currentPeakSample = currentPeak.Sample; int?nearestStimulusIndex = this.DataItem.GetNearestStimulusIndex(currentPeak); --currentPeakSample; var nearestStimulusSample = this.DataItem.Sweeps[nearestStimulusIndex.Value].StimulusInfo; if (nearestStimulusSample.StartSample > currentPeakSample) { nearestStimulusIndex = nearestStimulusIndex.Value - 1; nearestStimulusSample = this.DataItem.Sweeps[nearestStimulusIndex.Value].StimulusInfo; } var contSignal = this.DataItem.CreateContinuousSignal(); var diffSignal = DataProcessor.ComputeDiff(contSignal); var prevDiffValue = diffSignal[currentPeakSample]; for (int i = currentPeakSample - 1; i > nearestStimulusSample.StartSample; i--) { var currentDiffValue = diffSignal[i]; if (prevDiffValue < 0 && currentDiffValue >= 0) { ++i; this.DataItem.LocatedPeaks[this.CurrentPeakIndex].Sample = i; this.DataItem.LocatedPeaks[this.CurrentPeakIndex].Pos = new Point(i * this.DataItem.Recording.Xscale, contSignal[i]); this.RefreshSelectedPeakInfo(); return; } prevDiffValue = currentDiffValue; } }
void OnCurrentDataItemViewModelChanged(DataItemViewModel oldItem, DataItemViewModel newItem) { this.Title = string.Empty; Part_Plotter.Children.Remove(m_selectedPeakGraph); Part_Plotter.Children.Remove(m_peaksGraph); Part_Plotter.Children.Remove(m_diffSignalGraph); Part_Plotter.Children.Remove(m_signalGraph); Part_Plotter.Children.Remove(m_cursorGraph); Part_Plotter.Children.Remove(m_peakThresholdGraph); Part_Plotter.Children.Remove(m_stimuliStartsGraph); Part_Plotter.Children.Remove(m_filteredSignalGraph); m_selectedPeakGraph = null; m_peaksGraph = null; m_diffSignalGraph = null; m_signalGraph = null; m_cursorGraph = null; m_peakThresholdGraph = null; m_stimuliStartsGraph = null; m_filteredSignalGraph = null; if (oldItem != null) { oldItem.CurrentPeakIndexChanged += OnCurrentPeakIndexChanged; oldItem.DataItem.LocatedPeaksUpdated -= OnData_LocatedPeaksUpdated; oldItem.DataItem.SweepsChanged -= OnSweepsChangedChanged; oldItem.DataItem.PeakDetectionSettings.CalculatedThresholdChanged -= OnCalculatedThresholdChanged; } if (newItem == null) { return; } this.Title = System.IO.Path.GetFileNameWithoutExtension(newItem.DataItem.Recording.FilePath); newItem.CurrentPeakIndexChanged += OnCurrentPeakIndexChanged; newItem.DataItem.LocatedPeaksUpdated += OnData_LocatedPeaksUpdated; newItem.DataItem.SweepsChanged += OnSweepsChangedChanged; newItem.DataItem.PeakDetectionSettings.CalculatedThresholdChanged += OnCalculatedThresholdChanged; var points = newItem.DataItem.CreateContinuousSignal(); { var xs = Enumerable.Range(0, points.Length).Select(item => item * newItem.DataItem.Recording.Xscale); CompositeDataSource origSignal = new CompositeDataSource(xs.AsXDataSource(), points.AsYDataSource()); m_signalGraph = new DXLineGraph() { DataSource = origSignal, LineColor = Colors.Blue }; if (Settings.Settings.Instance.ViewSettings.IsSignalVisible) { Part_Plotter.Children.Add(m_signalGraph); } double samplingPeriod = 1.0 / (newItem.DataItem.Recording.SamplingFrequency * 1000); double cutoffFrequency = 300; // bool isLowPass = false; var filter = PeaksProcessing.Processing.FirFilter.Create(cutoffFrequency, samplingPeriod, FilterType.HighPass); var filteredPoints = newItem.DataItem.CreateContinuousSignal(); filter.FilterInPlace(filteredPoints); //var mad = DataProcessor.MAD(filteredPoints); //double sigma = 1.4826 * mad.Value; //var curvatures = DataProcessor.CalculateCurvatures(points); CompositeDataSource curvaturesSignal = new CompositeDataSource(xs.AsXDataSource(), filteredPoints.AsYDataSource()); m_filteredSignalGraph = new DXLineGraph() { DataSource = curvaturesSignal, LineColor = Colors.Green }; Part_Plotter.Children.Add(m_filteredSignalGraph); //m_curvaturesGraph = new DXLineGraph() { DataSource = curvaturesSignal, LineColor = Colors.Green }; //Part_Plotter.Children.Add(m_curvaturesGraph); } { var xsDiff = Enumerable.Range(0, points.Length - 1).Select(item => item * newItem.DataItem.Recording.Xscale); CompositeDataSource diffSignal = new CompositeDataSource(xsDiff.AsXDataSource(), DataProcessor.ComputeDiff(points).AsYDataSource()); m_diffSignalGraph = new DXLineGraph() { DataSource = diffSignal, LineColor = Colors.Red }; if (Settings.Settings.Instance.ViewSettings.IsDiffSignalVisible) { Part_Plotter.Children.Add(m_diffSignalGraph); } } m_cursorGraph = new CursorCoordinateGraph() { CustomXFormat = "{0:F}", CustomYFormat = "{0:F}" }; Part_Plotter.Children.Add(m_cursorGraph); Part_Plotter.FitToView(); RefreshPeaksGraph(); RefreshStimuliStartsGraph(); OrderGraphs(); }