public void UpdateLevelValues(MobileObservableCollection<SampleUnit> samples, bool recalculateSamples = false) { if (recalculateSamples) { var sampleList = OriginalData.Select(item => new SamplePrimitive(item.YValue, 0, "Number")).ToList(); samples.Clear(); foreach (var computeSubgroup in ComputeSubgroups(sampleList, 0, 0)) samples.Add(computeSubgroup); return; } var minX = 0.0; var maxx = 0.0; var standardStepCount = GetStepCount(OriginalData.Count); _minimum = OriginalData.Count > 0 ? Math.Floor(OriginalData.Min(x => (double)x.YValue)) : 0; var max = OriginalData.Count > 0 ? OriginalData.Max(x => (double)x.YValue) : 0; var integerMax = Math.Ceiling(max); if ((max % integerMax).Equals(0.0)) integerMax++; _maximum = integerMax; _stepWidth = Math.Abs(_maximum - _minimum) / ParentPanel.RangeSteps; if (_stepWidth > 1 && ParentPanel.RangeSteps == standardStepCount) { _stepWidth = Convert.ToInt32(_stepWidth); ParentPanel.SetSilently(ChartPanel.ExponentProperty, 0); } else { var e = ParentPanel.Exponent == 0 ? (int) Math.Ceiling(Math.Log10(1/_stepWidth)) : ParentPanel.Exponent; if (ParentPanel.Exponent < e) ParentPanel.SetSilently(ChartPanel.ExponentProperty, e); else e = ParentPanel.Exponent; _stepWidth = Math.Round(_stepWidth, e); } if (samples.Any()) _maximum = Convert.ToDouble(samples.Last().CategoryValue.LabelValue, CultureInfo.InvariantCulture); var list = new List<double>(); if (ShowLSL) list.Add(ParentPanel.LSL); list.Add(UseCustomCLs ? ParentPanel.CustomLCL : LCL); list.Add(_minimum); minX = list.Min(); list = new List<double>(); if (ShowUSL) list.Add(ParentPanel.USL); list.Add(UseCustomCLs ? ParentPanel.CustomUCL : UCL); list.Add(_maximum); maxx = list.Max(); var deltaMin = _minimum - minX; if (deltaMin > 0) { var newDelta = deltaMin + (_stepWidth - (deltaMin % _stepWidth)); var deltaLength = newDelta / _stepWidth; var startValue = _minimum - _stepWidth; for (var i = 0; i < deltaLength; i++) { var subgroupSample = SpcManager.CreateSample(null, 0, i); subgroupSample.SetXLabelValue(startValue, LabelValueDataTypes.Number); subgroupSample.SetSampleSize(0); samples.Insert(0, subgroupSample); startValue -= _stepWidth; } _minimum = startValue + _stepWidth; } else { var sample = SpcManager.CreateSample(null, 0, 0); sample.SetXLabelValue(_minimum - _stepWidth, LabelValueDataTypes.Number); sample.SetSampleSize(0); samples.Insert(0, sample); } var deltaMax = maxx - _maximum; if (deltaMax > 0) { var newDelta = deltaMax + (_stepWidth - (deltaMax % _stepWidth)); var deltaLength = newDelta / _stepWidth; var startValue = _maximum + _stepWidth; for (var i = 0; i < deltaLength; i++) { var subgroupSample = SpcManager.CreateSample(null, 0, i); subgroupSample.SetXLabelValue(startValue, LabelValueDataTypes.Number); subgroupSample.SetSampleSize(0); samples.Add(subgroupSample); startValue += _stepWidth; } _maximum = startValue - _stepWidth; } else { var sample = SpcManager.CreateSample(null, 0, 0); sample.SetXLabelValue(_maximum + _stepWidth, LabelValueDataTypes.Number); sample.SetSampleSize(0); samples.Add(sample); } for (var i = 0; i < samples.Count; i++) { samples[i].SetIndex(i); samples[i].CategoryValue.Index = i; } MinXValue = _minimum = deltaMin > 0 ? _minimum : _minimum - _stepWidth; MaxXValue = _maximum = deltaMax > 0 ? _maximum + _stepWidth : _maximum + _stepWidth * 2; XStep = _stepWidth; BellCurveData = new MobileObservableCollection<ElementarySampleInfo>(); var nh = 0.0; if (OriginalData != null) nh = (OriginalData.Count * XStep); //needed to bring bell curve to the scale of histogram var floatingSigma = Mean - 4 * Sigma; for (var i = 0; i < 49; i++) { var value = (1 / (Sigma * Math.Sqrt(2 * Math.PI))) * Math.Pow(Math.E, -0.5 * Math.Pow((floatingSigma - Mean) / Sigma, 2)) * nh; BellCurveData.Add(DataPortal.Fetch<ElementarySampleInfo>(new LimitData(floatingSigma, value))); floatingSigma += 1 / 6.0 * Sigma; } }