Ejemplo n.º 1
0
        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;
            }
        }