Example #1
0
        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;
                }
            }
        }
Example #2
0
        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();
        }