// 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 }); }
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() }); }
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() }); }
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); } } }
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); } } } }; } }