// todo: rename? this was to get a concise name for the legend
        private string[] GetLegendLabels()
        {
            string modelString = null;

            switch (ForwardSolverTypeOptionVM.SelectedValue)
            {
            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;
            }

            string opString = null;

            if (IsMultiRegion && MultiRegionTissueVM != null)
            {
                var regions = MultiRegionTissueVM.GetTissueInput().Regions;
                opString = "\rμa1=" + regions[0].RegionOP.Mua.ToString("F4") + "\rμs'1=" + regions[0].RegionOP.Musp.ToString("F4") +
                           "\rμa2=" + regions[1].RegionOP.Mua.ToString("F4") + "\rμs'2=" + regions[1].RegionOP.Musp.ToString("F4");
            }
            else
            {
                var opticalProperties = OpticalPropertyVM.GetOpticalProperties();
                opString = "\rμa=" + opticalProperties.Mua.ToString("F4") + " \rμs'=" + opticalProperties.Musp.ToString("F4");
            }

            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 => modelString + sas + (isWavelengthPlot ? "\r(spectral μa,μs')" : opString)).ToArray());
            }

            return(new [] { modelString + opString });
        }
Esempio n. 2
0
        private object GetOpticalProperties()
        {
            if (
                SolutionDomainTypeOptionVM.IndependentVariableAxisOptionVM.SelectedValues.Contains(
                    IndependentVariableAxis.Wavelength) &&
                SolutionDomainTypeOptionVM.UseSpectralInputs &&
                WindowViewModel.Current != null &&
                WindowViewModel.Current.SpectralMappingVM != null)
            {
                var tissue      = WindowViewModel.Current.SpectralMappingVM.SelectedTissue;
                var wavelengths = GetParameterValues(IndependentVariableAxis.Wavelength);
                var ops         = tissue.GetOpticalProperties(wavelengths);

                if (IsMultiRegion && MultiRegionTissueVM != null)
                {
                    return(ops.Select(op =>
                    {
                        var regions =
                            MultiRegionTissueVM.GetTissueInput()
                            .Regions.Select(region => (IOpticalPropertyRegion)region)
                            .ToArray();
                        regions.ForEach(region =>
                        {
                            region.RegionOP.Mua = op.Mua;
                            region.RegionOP.Musp = op.Musp;
                            region.RegionOP.G = op.G;
                            region.RegionOP.N = op.N;
                        });
                        return regions.ToArray();
                    }));
                }

                return(ops);
            }

            if (IsMultiRegion && MultiRegionTissueVM != null)
            {
                return(new[]
                {
                    MultiRegionTissueVM.GetTissueInput()
                    .Regions.Select(region => (IOpticalPropertyRegion)region)
                    .ToArray()
                });
            }

            return(new[] { OpticalPropertyVM.GetOpticalProperties() });
        }
Esempio n. 3
0
        private object GetOpticalProperties()
        {
            // todo: add-in spectral panel data
            //if (SolutionDomainTypeOptionVM.IndependentVariableAxisOptionVM.SelectedValues.Contains(IndependentVariableAxis.Wavelength) &&
            //    UseSpectralPanelData &&
            //    SolverDemoViewModel.Current != null &&
            //    SolverDemoViewModel.Current.SpectralMappingVM != null)
            //{
            //    var tissue = SolverDemoViewModel.Current.SpectralMappingVM.SelectedTissue;
            //    var wavelengths = GetParameterValues(IndependentVariableAxis.Wavelength);
            //    var ops = tissue.GetOpticalProperties(wavelengths);

            //    if (IsMultiRegion && MultiRegionTissueVM != null)
            //    {
            //        return ops.Select(op =>
            //        {
            //            var regions = MultiRegionTissueVM.GetTissueInput().Regions.Select(region => (IOpticalPropertyRegion)region).ToArray();
            //            regions.ForEach(region =>
            //            {
            //                region.RegionOP.Mua = op.Mua;
            //                region.RegionOP.Musp = op.Musp;
            //                region.RegionOP.G = op.G;
            //                region.RegionOP.N = op.N;
            //            });
            //            return regions.ToArray();
            //        });
            //    }

            //    return ops;
            //}

            if (IsMultiRegion && MultiRegionTissueVM != null)
            {
                return(new[]
                {
                    MultiRegionTissueVM.GetTissueInput()
                    .Regions.Select(region => (IOpticalPropertyRegion)region)
                    .ToArray()
                });
            }

            return(new[] { OpticalPropertyVM.GetOpticalProperties() });
        }
Esempio n. 4
0
 public void UpdateOpticalProperties_Executed()
 {
     //need to get the value from the checkbox in case UseSpectralPanelData has not yet been updated
     if (SolutionDomainTypeOptionVM != null)
     {
         UseSpectralPanelData = SolutionDomainTypeOptionVM.UseSpectralInputs;
     }
     if (UseSpectralPanelData && WindowViewModel.Current != null &&
         WindowViewModel.Current.SpectralMappingVM != null)
     {
         if (IsMultiRegion && MultiRegionTissueVM != null)
         {
             MultiRegionTissueVM.RegionsVM.ForEach(region =>
                                                   ((dynamic)region).OpticalPropertyVM.SetOpticalProperties(
                                                       WindowViewModel.Current.SpectralMappingVM.OpticalProperties));
         }
         else if (OpticalPropertyVM != null)
         {
             OpticalPropertyVM.SetOpticalProperties(WindowViewModel.Current.SpectralMappingVM.OpticalProperties);
         }
     }
 }
Esempio n. 5
0
        public ForwardSolverViewModel()
        {
            _showOpticalProperties = true;
            _useSpectralPanelData  = false;


            _allRangeVMs = new[] { new RangeViewModel {
                                       Title = StringLookup.GetLocalizedString("IndependentVariableAxis_Rho")
                                   } };

#if WHITELIST
            ForwardSolverTypeOptionVM = new OptionViewModel <ForwardSolverType>("Forward Model", false, WhiteList.ForwardSolverTypes);
#else
            ForwardSolverTypeOptionVM = new OptionViewModel <ForwardSolverType>("Forward Model", false);
#endif
            SolutionDomainTypeOptionVM = new SolutionDomainOptionViewModel("Solution Domain", SolutionDomainType.ROfRho);

            ForwardAnalysisTypeOptionVM = new OptionViewModel <ForwardAnalysisType>(StringLookup.GetLocalizedString("Heading_ModelAnalysisOutput"), true);

            ForwardSolverTypeOptionVM.PropertyChanged += (sender, args) =>
            {
                OnPropertyChanged("IsGaussianForwardModel");
                OnPropertyChanged("IsMultiRegion");
                OnPropertyChanged("IsSemiInfinite");
                TissueInputVM = GetTissueInputVM(IsMultiRegion ? "MultiLayer" : "SemiInfinite");
                UpdateAvailableOptions();
            };
            ForwardSolverTypeOptionVM.SelectedValue = ForwardSolverType.PointSourceSDA; // force the model choice here?

            Action <double> updateSolutionDomainWithWavelength = wv =>
            {
                var wvAxis =
                    SolutionDomainTypeOptionVM.ConstantAxesVMs.FirstOrDefault(
                        axis => axis.AxisType == IndependentVariableAxis.Wavelength);
                if (wvAxis != null)
                {
                    wvAxis.AxisValue = wv;
                }
            };

            SolutionDomainTypeOptionVM.PropertyChanged += (sender, args) =>
            {
                if (args.PropertyName == "UseSpectralInputs")
                {
                    UseSpectralPanelData = SolutionDomainTypeOptionVM.UseSpectralInputs;
                }
                if (args.PropertyName == "IndependentAxesVMs")
                {
                    var useSpectralPanelDataAndNotNull = SolutionDomainTypeOptionVM.UseSpectralInputs &&
                                                         WindowViewModel.Current != null &&
                                                         WindowViewModel.Current.SpectralMappingVM != null;

                    AllRangeVMs =
                        (from i in
                         Enumerable.Range(0,
                                          SolutionDomainTypeOptionVM.IndependentVariableAxisOptionVM.SelectedValues.Length)
                         orderby i descending
                         // descending so that wavelength takes highest priority, then time/time frequency, then space/spatial frequency
                         select
                         useSpectralPanelDataAndNotNull&&
                         SolutionDomainTypeOptionVM.IndependentVariableAxisOptionVM.SelectedValues[i] ==
                         IndependentVariableAxis.Wavelength
                                    ? WindowViewModel.Current.SpectralMappingVM.WavelengthRangeVM
                         // bind to same instance, not a copy
                                    : SolutionDomainTypeOptionVM.IndependentAxesVMs[i].AxisRangeVM).ToArray();

                    // if the independent axis is wavelength, then hide optical properties (because they come from spectral panel)
                    ShowOpticalProperties =
                        _allRangeVMs.All(value => value.AxisType != IndependentVariableAxis.Wavelength);

                    // update solution domain wavelength constant if applicable
                    if (useSpectralPanelDataAndNotNull &&
                        SolutionDomainTypeOptionVM.ConstantAxesVMs.Any(
                            axis => axis.AxisType == IndependentVariableAxis.Wavelength))
                    {
                        updateSolutionDomainWithWavelength(WindowViewModel.Current.SpectralMappingVM.Wavelength);
                    }
                }
            };

            ExecuteForwardSolverCommand = new RelayCommand(() => ExecuteForwardSolver_Executed(null, null));

            OpticalPropertyVM.PropertyChanged += (sender, args) =>
            {
                //need to get the value from the checkbox in case UseSpectralPanelData has not yet been updated
                if (SolutionDomainTypeOptionVM != null)
                {
                    UseSpectralPanelData = SolutionDomainTypeOptionVM.UseSpectralInputs;
                }
                if (UseSpectralPanelData && WindowViewModel.Current != null &&
                    WindowViewModel.Current.SpectralMappingVM != null)
                {
                    updateSolutionDomainWithWavelength(WindowViewModel.Current.SpectralMappingVM.Wavelength);
                }
            };

            if (WindowViewModel.Current.SpectralMappingVM != null)
            {
                WindowViewModel.Current.SpectralMappingVM.PropertyChanged += (sender, args) =>
                {
                    if (args.PropertyName == "Wavelength")
                    {
                        //need to get the value from the checkbox in case UseSpectralPanelData has not yet been updated
                        if (SolutionDomainTypeOptionVM != null)
                        {
                            UseSpectralPanelData = SolutionDomainTypeOptionVM.UseSpectralInputs;
                        }
                        if (UseSpectralPanelData && WindowViewModel.Current != null &&
                            WindowViewModel.Current.SpectralMappingVM != null)
                        {
                            updateSolutionDomainWithWavelength(WindowViewModel.Current.SpectralMappingVM.Wavelength);
                        }
                    }

                    if (args.PropertyName == "OpticalProperties")
                    {
                        //need to get the value from the checkbox in case UseSpectralPanelData has not yet been updated
                        if (SolutionDomainTypeOptionVM != null)
                        {
                            UseSpectralPanelData = SolutionDomainTypeOptionVM.UseSpectralInputs;
                        }
                        if (UseSpectralPanelData && WindowViewModel.Current != null &&
                            WindowViewModel.Current.SpectralMappingVM != null)
                        {
                            if (IsMultiRegion && MultiRegionTissueVM != null)
                            {
                                MultiRegionTissueVM.RegionsVM.ForEach(region =>
                                                                      ((dynamic)region).OpticalPropertyVM.SetOpticalProperties(
                                                                          WindowViewModel.Current.SpectralMappingVM.OpticalProperties));
                            }
                            else if (OpticalPropertyVM != null)
                            {
                                OpticalPropertyVM.SetOpticalProperties(
                                    WindowViewModel.Current.SpectralMappingVM.OpticalProperties);
                            }
                        }
                    }
                };
            }
        }