public void BuildPlotmodel(ISession session, IPlotSettings plotSettings, double startTime, double endTime, ERemoveOutlierMethod eRemoveOutlinerMethod, Action <PlotModel> onFinishAction = null)
        {
            var plotModel = PlotModel;

            Reset();
            if (session == null)
            {
                return;
            }

            plotModel.Axes.Add(AxisDefinitions[EPlotAxis.XAXIS]);
            plotModel.Axes.Add(AxisDefinitions[EPlotAxis.YAXISFRAMETIMES]);

            SetFrametimeChart(plotModel, session.GetFrametimePointsTimeWindow(startTime, endTime, _frametimeStatisticProviderOptions, eRemoveOutlinerMethod));

            if (plotSettings.IsAnyGraphVisible && session.HasValidSensorData())
            {
                plotModel.Axes.Add(AxisDefinitions[EPlotAxis.YAXISPERCENTAGE]);

                if (plotSettings.ShowGpuLoad)
                {
                    SetGPULoadChart(plotModel, session.GetGPULoadPointTimeWindow());
                }
                if (plotSettings.ShowCpuLoad)
                {
                    SetCPULoadChart(plotModel, session.GetCPULoadPointTimeWindow());
                }
                if (plotSettings.ShowCpuMaxThreadLoad)
                {
                    SetCPUMaxThreadLoadChart(plotModel, session.GetCPUMaxThreadLoadPointTimeWindow());
                }
                if (plotSettings.ShowGpuPowerLimit)
                {
                    SetGpuPowerLimitChart(plotModel, session.GetGpuPowerLimitPointTimeWindow());
                }
            }
            onFinishAction?.Invoke(plotModel);
            plotModel.InvalidatePlot(true);
        }
        public void BuildPlotmodel(ISession session, IPlotSettings plotSettings, double startTime, double endTime, ERemoveOutlierMethod eRemoveOutlinerMethod, EFilterMode filterMode, Action <PlotModel> onFinishAction = null)
        {
            var plotModel = PlotModel;

            Reset();

            if (session == null)
            {
                return;
            }

            plotModel.Axes.Add(AxisDefinitions[EPlotAxis.XAXIS]);
            plotModel.Axes.Add(AxisDefinitions[EPlotAxis.YAXISFPS]);


            var    frametimes = session.GetFrametimeTimeWindow(startTime, endTime, _frametimeStatisticProviderOptions, eRemoveOutlinerMethod);
            double average = frametimes.Count * 1000 / frametimes.Sum();
            double yMin, yMax;

            plotModel.Series.Clear();

            var rawFpsPoints = session.GetFpsPointsTimeWindow(startTime, endTime, _frametimeStatisticProviderOptions, eRemoveOutlinerMethod, EFilterMode.None);

            if (filterMode is EFilterMode.RawPlusAverage)
            {
                var avgFpsPoints = session.GetFpsPointsTimeWindow(startTime, endTime, _frametimeStatisticProviderOptions, eRemoveOutlinerMethod, EFilterMode.TimeIntervalAverage);

                SetRawFPS(plotModel, rawFpsPoints);
                SetFpsChart(plotModel, avgFpsPoints, rawFpsPoints, average, 2, OxyColor.FromRgb(241, 125, 32));


                yMin = rawFpsPoints.Min(pnt => pnt.Y);
                yMax = rawFpsPoints.Max(pnt => pnt.Y);
            }
            else
            {
                var fpsPoints = session.GetFpsPointsTimeWindow(startTime, endTime, _frametimeStatisticProviderOptions, eRemoveOutlinerMethod, filterMode);

                SetFpsChart(plotModel, fpsPoints, rawFpsPoints, average, filterMode is EFilterMode.None ? 1 : 2, Constants.FpsStroke);

                yMin = fpsPoints.Min(pnt => pnt.Y);
                yMax = fpsPoints.Max(pnt => pnt.Y);
            }
            UpdateYAxisMinMaxBorders(yMin, yMax, average);

            if (plotSettings.IsAnyGraphVisible && session.HasValidSensorData())
            {
                plotModel.Axes.Add(AxisDefinitions[EPlotAxis.YAXISPERCENTAGE]);

                if (plotSettings.ShowGpuLoad)
                {
                    SetGPULoadChart(plotModel, session.GetGPULoadPointTimeWindow());
                }
                if (plotSettings.ShowCpuLoad)
                {
                    SetCPULoadChart(plotModel, session.GetCPULoadPointTimeWindow());
                }
                if (plotSettings.ShowCpuMaxThreadLoad)
                {
                    SetCPUMaxThreadLoadChart(plotModel, session.GetCPUMaxThreadLoadPointTimeWindow());
                }
                if (plotSettings.ShowGpuPowerLimit)
                {
                    SetGpuPowerLimitChart(plotModel, session.GetGpuPowerLimitPointTimeWindow());
                }
            }

            onFinishAction?.Invoke(plotModel);
            plotModel.InvalidatePlot(true);
        }