private string[] GetLegendLabels(PlotDataType datatype)
        {
            string solverString = null;
            OpticalProperties opticalProperties = null;
            string modelString = null;
            ForwardSolverType forwardSolver;

            switch (datatype)
            {
                case PlotDataType.Simulated:
                    solverString = "\nSimulated:";
                    opticalProperties = MeasuredOpticalPropertyVM.GetOpticalProperties();
                    forwardSolver = MeasuredForwardSolverTypeOptionVM.SelectedValue;
                    break;
                case PlotDataType.Calculated:
                    solverString = "\nCalculated:";
                    opticalProperties = ResultOpticalPropertyVM.GetOpticalProperties();
                    forwardSolver = MeasuredForwardSolverTypeOptionVM.SelectedValue;
                    break;
                case PlotDataType.Guess:
                    solverString = "\nGuess:";
                    opticalProperties = InitialGuessOpticalPropertyVM.GetOpticalProperties();
                    forwardSolver = InverseForwardSolverTypeOptionVM.SelectedValue;
                    break;
                default:
                    throw new ArgumentOutOfRangeException("datatype");
            }
            var opString = "\rμa=" + opticalProperties.Mua.ToString("F4") + " \rμs'=" + opticalProperties.Musp.ToString("F4");

            switch (forwardSolver)
            {
                case ForwardSolverType.DistributedGaussianSourceSDA:
                case ForwardSolverType.DistributedPointSourceSDA:
                case ForwardSolverType.PointSourceSDA:
                    modelString = "\rModel - SDA";
                    break;
                case ForwardSolverType.MonteCarlo:
                    modelString = "\rModel - scaled MC";
                    break;
                case ForwardSolverType.Nurbs:
                    modelString = "\rModel - nurbs";
                    break;
                case ForwardSolverType.TwoLayerSDA:
                    modelString = "\rModel - 2 layer SDA";
                    break;
            }
            
            if (_allRangeVMs.Length > 1)
            {
                var isWavelengthPlot = _allRangeVMs.Any(vm => vm.AxisType == IndependentVariableAxis.Wavelength);
                var secondaryRangeVM = isWavelengthPlot
                    ? _allRangeVMs.Where(vm => vm.AxisType != IndependentVariableAxis.Wavelength).First()
                    : _allRangeVMs.Where(vm => vm.AxisType != IndependentVariableAxis.Time && vm.AxisType != IndependentVariableAxis.Ft).First();

                string[] secondaryAxesStrings = secondaryRangeVM.Values.Select(value => "\r" + secondaryRangeVM.AxisType.GetInternationalizedString() + " = " + value.ToString()).ToArray();
                return secondaryAxesStrings.Select(sas => solverString + modelString + sas + (isWavelengthPlot ? "\r(spectral μa,μs')" : opString)).ToArray();
            }

            return new []{ solverString + modelString + opString };
        }
        private OpticalProperties[] GetDuplicatedListofOpticalProperties()
        {
            var initialGuessOPs = InitialGuessOpticalPropertyVM.GetOpticalProperties();
            if (SolutionDomainTypeOptionVM.IndependentVariableAxisOptionVM.SelectedValues.Contains(IndependentVariableAxis.Wavelength))
            {
                var wavelengths = GetParameterValues(IndependentVariableAxis.Wavelength);
                return wavelengths.Select(_ => initialGuessOPs.Clone()).ToArray();
            }

            return null;
        }
 private object GetInitialGuessOpticalProperties()
 {
     return GetDuplicatedListofOpticalProperties() ?? new[] { InitialGuessOpticalPropertyVM.GetOpticalProperties() };
 }