public void Get_solution_domain_service_from_factory() { var postData = "{\"forwardSolverType\":\"DistributedPointSourceSDA\",\"solutionDomain\":\"ROfRho\",\"independentAxes\":{\"show\":false,\"first\":\"ρ\",\"second\":\"t\",\"label\":\"t\",\"value\":0.05,\"units\":\"ns\",\"firstUnits\":\"mm\",\"secondUnits\":\"ns\"},\"xAxis\":{\"title\":\"Detector Positions\",\"startLabel\":\"Begin\",\"startLabelUnits\":\"mm\",\"start\":0.5,\"endLabel\":\"End\",\"endLabelUnits\":\"mm\",\"stop\":9.5,\"numberLabel\":\"Number\",\"count\":19},\"opticalProperties\":{\"title\":\"Optical Properties\",\"mua\":0.01,\"musp\":1,\"g\":0.8,\"n\":1.4},\"modelAnalysis\":\"R\",\"noiseValue\":\"0\"}"; var solutionDomainPlotParameters = JsonConvert.DeserializeObject <SolutionDomainPlotParameters>(postData); _plotFactory = new PlotFactory(_serviceProvider); var data = _plotFactory.GetPlot(PlotType.SolutionDomain, solutionDomainPlotParameters); var results = "{\"Id\":\"ROfRho\",\"PlotList\":[{\"Label\":\"DistributedPointSourceSDA μa=0.01 μs'=1\",\"Data\":[[0.5,0.046625597794768131],[1.0,0.020915537635778064],[1.5,0.012316866807976681],[2.0,0.0080842309517170675],[2.5,0.005623379122941038],[3.0,0.0040562789854642293],[3.5,0.0030006454971476613],[4.0,0.0022621931768063925],[4.5,0.0017313878247261138],[5.0,0.001341834630580925],[5.5,0.00105114060787151],[6.0,0.00083118079655800016],[6.5,0.00066274418610378413],[7.0,0.00053240356107749358],[7.5,0.00043059663530889934],[8.0,0.00035040528102366],[8.5,0.00028675569244185416],[9.0,0.000235881710029713],[9.5,0.00019495753939373391]]}]}"; Assert.AreEqual(results, data); }
public string GetPlotData(SolutionDomainPlotParameters plotParameters) { try { var msg = _plotFactory.GetPlot(PlotType.SolutionDomain, plotParameters); return(msg); } catch (Exception e) { _logger.LogError("An error occurred: {Message}", e.Message); throw; } }
public string GetPlotData(SolutionDomainPlotParameters plotParameters) { try { var inverseSolver = plotParameters.InverseSolverType; var initialGuessParams = _parameterTools.GetParametersInOrder( _parameterTools.GetOpticalPropertiesObject(plotParameters.OpticalProperties), plotParameters.XAxis.AsEnumerable().ToArray(), plotParameters.SolutionDomain, plotParameters.IndependentAxes.Label, plotParameters.IndependentAxes.Value); var initialGuessParamsConvert = initialGuessParams.Values.ToArray(); // get measured data from inverse solver analysis component var measuredPoints = plotParameters.MeasuredData; var dependentValues = measuredPoints.Select(p => p.Last()).ToArray(); // get y value var lowerBounds = new double[] { 0, 0, 0, 0 }; var upperBounds = new [] { double.PositiveInfinity, double.PositiveInfinity, double.PositiveInfinity, double.PositiveInfinity }; var fit = ComputationFactory.SolveInverse( plotParameters.InverseSolverType, plotParameters.OptimizerType, plotParameters.SolutionDomain, dependentValues, dependentValues, // set standard deviation to measured to match WPF plotParameters.OptimizationParameters, initialGuessParamsConvert, lowerBounds, upperBounds); var fitops = ComputationFactory.UnFlattenOpticalProperties(fit); //var fitparms = // GetParametersInOrder(fitops, independentValues, sd, independentAxis, independentAxisValue); plotParameters.ForwardSolverType = inverseSolver; plotParameters.OpticalProperties = fitops[0]; // not sure [0] is always going to work here plotParameters.NoiseValue = 0; var msg = _plotFactory.GetPlot(PlotType.SolutionDomain, plotParameters); return(msg); } catch (Exception e) { _logger.LogError("An error occurred: {Message}", e.Message); throw; } }
public string GetPlotData(SpectralPlotParameters plotParameters) { _logger.LogInformation("Get the plot data for the Spectral Panel"); plotParameters.YAxis = plotParameters.PlotName; // set up the absorber concentrations var chromophoreAbsorbers = new List <IChromophoreAbsorber>(); foreach (var absorber in plotParameters.AbsorberConcentration) { chromophoreAbsorbers.Add(new ChromophoreAbsorber(Enum.Parse <ChromophoreType>(absorber.Label, true), absorber.Value)); } // set up the scatterer IScatterer scatterer; switch (plotParameters.ScatteringType) { case ScatteringType.PowerLaw: scatterer = plotParameters.PowerLawScatterer; break; case ScatteringType.Intralipid: scatterer = plotParameters.IntralipidScatterer; break; case ScatteringType.Mie: scatterer = plotParameters.MieScatterer; break; default: scatterer = new PowerLawScatterer(); break; } // get the wavelength plotParameters.Wavelengths = plotParameters.XAxis.AsEnumerable().ToArray(); // set up the tissue plotParameters.Tissue = new Tissue(chromophoreAbsorbers, scatterer, plotParameters.TissueType); return(_plotFactory.GetPlot(PlotType.Spectral, plotParameters)); }
public void Get_spectral_service_from_factory() { var postData = "{\"spectralPlotType\":\"mua\",\"plotName\":\"μa\",\"tissueType\":\"Skin\",\"absorberConcentration\":[{\"label\":\"Hb\",\"value\":28.4,\"units\":\"μM\"},{\"label\":\"HbO2\",\"value\":22.4,\"units\":\"μM\"},{\"label\":\"H2O\",\"value\":0.7,\"units\":\"vol. frac.\"},{\"label\":\"Fat\",\"value\":0,\"units\":\"vol. frac.\"},{\"label\":\"Melanin\",\"value\":0.0051,\"units\":\"vol. frac.\"}],\"bloodConcentration\":{\"totalHb\":50.8,\"bloodVolume\":0.021844,\"stO2\":0.4409448818897638,\"visible\":true},\"scatteringType\":\"PowerLaw\",\"powerLawScatterer\":{\"a\":1.2,\"b\":1.42,\"show\":true},\"intralipidScatterer\":{\"volumeFraction\":0.01,\"show\":false},\"mieScatterer\":{\"particleRadius\":0.5,\"ParticleRefractiveIndexMismatch\":1.4,\"MediumRefractiveIndexMismatch\":1,\"volumeFraction\":0.01,\"show\":false},\"xAxis\":{\"title\":\"Wavelength Range\",\"startLabel\":\"Begin\",\"startLabelUnits\":\"nm\",\"start\":650,\"endLabel\":\"End\",\"endLabelUnits\":\"nm\",\"stop\":1000,\"numberLabel\":\"Number\",\"count\":36}}"; var spectralPlotParameters = JsonConvert.DeserializeObject <SpectralPlotParameters>(postData); var xAxis = new DoubleRange(650, 1000, 36); spectralPlotParameters.YAxis = spectralPlotParameters.PlotName; spectralPlotParameters.Wavelengths = xAxis.AsEnumerable().ToArray(); var chromophoreAbsorbers = new List <IChromophoreAbsorber>(); foreach (var absorber in spectralPlotParameters.AbsorberConcentration) { chromophoreAbsorbers.Add(new ChromophoreAbsorber(Enum.Parse <ChromophoreType>(absorber.Label, true), absorber.Value)); } var scatterer = new PowerLawScatterer(1.2, 1.42); spectralPlotParameters.Tissue = new Tissue(chromophoreAbsorbers, scatterer, spectralPlotParameters.TissueType); _plotFactory = new PlotFactory(_serviceProvider); var data = _plotFactory.GetPlot(PlotType.Spectral, spectralPlotParameters); var muaResults = "{\"Id\":\"SpectralMua\",\"PlotList\":[{\"Label\":\"Skin μa\",\"Data\":[[650.0,0.16765660516524314],[660.0,0.15671650246614327],[670.0,0.14697135542801],[680.0,0.13799908824769305],[690.0,0.12973522277796562],[700.0,0.12260932419347584],[710.0,0.11583351729772583],[720.0,0.11010170400729173],[730.0,0.10472095509441402],[740.0,0.10129111493244414],[750.0,0.099521779546167088],[760.0,0.096959293661164639],[770.0,0.092068432646702891],[780.0,0.087311046148140767],[790.0,0.082850035254262877],[800.0,0.079106164468758858],[810.0,0.076218507603072],[820.0,0.07371667586209707],[830.0,0.0719944590933807],[840.0,0.070298642060247829],[850.0,0.0683344235938162],[860.0,0.066498798013490928],[870.0,0.06488501473536043],[880.0,0.063512933452956943],[890.0,0.062254209691212314],[900.0,0.061061385509031681],[910.0,0.060018918288031978],[920.0,0.059569360145074537],[930.0,0.060352136653759242],[940.0,0.062968288552839938],[950.0,0.06862831638709066],[960.0,0.07645596009583773],[970.0,0.077403147687485074],[980.0,0.075685057055814575],[990.0,0.071645012147578471],[1000.0,0.066587976157675921]]}]}"; Assert.AreEqual(muaResults, data); }
public string GetPlotData(SolutionDomainPlotParameters plotParameters) { try { var inverseSolver = plotParameters.InverseSolverType; var igparms = GetParametersInOrder( GetInitialGuessOpticalProperties(plotParameters.OpticalProperties), plotParameters.XAxis.AsEnumerable().ToArray(), plotParameters.SolutionDomain.ToString(), plotParameters.IndependentAxes.Label, plotParameters.IndependentAxes.Value); object[] igparmsConvert = igparms.Values.ToArray(); // get measured data from inverse solver analysis component var measuredPoints = plotParameters.MeasuredData; var meas = measuredPoints.Select(p => p.Last()).ToArray(); // get y value var lbs = new double[] { 0, 0, 0, 0 }; var ubs = new double[] { double.PositiveInfinity, double.PositiveInfinity, double.PositiveInfinity, double.PositiveInfinity }; double[] fit = ComputationFactory.SolveInverse( plotParameters.InverseSolverType, plotParameters.OptimizerType, plotParameters.SolutionDomain, meas, meas, // set standard deviation to measured to match WPF plotParameters.OptimizationParameters, igparmsConvert, lbs, ubs); var fitops = ComputationFactory.UnFlattenOpticalProperties(fit); //var fitparms = // GetParametersInOrder(fitops, independentValues, sd, independentAxis, independentAxisValue); plotParameters.ForwardSolverType = inverseSolver; plotParameters.OpticalProperties = fitops[0]; // not sure [0] is always going to work here plotParameters.NoiseValue = 0; var msg = _plotFactory.GetPlot(PlotType.SolutionDomain, plotParameters); return(msg); } catch (Exception e) { _logger.LogError("An error occurred: {Message}", e.Message); throw; } // this needs further development when add in wavelength refer to WPF code object GetInitialGuessOpticalProperties(OpticalProperties igops) { return(new[] { igops }); } // the following needs to change when Wavelength is added into independent variable list IDictionary <IndependentVariableAxis, object> GetParametersInOrder( object opticalProperties, double[] xs, string sd, string independentAxis, double independentValue) { // make list of independent vars with independent first then constant var listIndepVars = new List <IndependentVariableAxis>(); string isConstant = ""; if (sd == "ROfRho") { listIndepVars.Add(IndependentVariableAxis.Rho); } else if (sd == "ROfRhoAndTime") { listIndepVars.Add(IndependentVariableAxis.Rho); listIndepVars.Add(IndependentVariableAxis.Time); if (independentAxis == "t") { isConstant = "t"; } else { isConstant = "rho"; } } else if (sd == "ROfRhoAndFt") { listIndepVars.Add(IndependentVariableAxis.Ft); listIndepVars.Add(IndependentVariableAxis.Rho); if (independentAxis == "ft") { isConstant = "ft"; } else { isConstant = "rho"; } } else if (sd == "ROfFx") { listIndepVars.Add(IndependentVariableAxis.Fx); } else if (sd == "ROfFxAndTime") { listIndepVars.Add(IndependentVariableAxis.Time); listIndepVars.Add(IndependentVariableAxis.Fx); if (independentAxis == "t") { isConstant = "t"; } else { isConstant = "fx"; } } else if (sd == "ROfFxAndFt") { listIndepVars.Add(IndependentVariableAxis.Ft); listIndepVars.Add(IndependentVariableAxis.Fx); if (independentAxis == "ft") { isConstant = "ft"; } else { isConstant = "fx"; } } // get all parameters in order var allParameters = from iva in listIndepVars where iva != IndependentVariableAxis.Wavelength orderby GetParameterOrder(iva) select new KeyValuePair <IndependentVariableAxis, object>(iva, GetParameterValues(iva, isConstant, independentValue, xs)); // OPs are always first in the list return (new KeyValuePair <IndependentVariableAxis, object>(IndependentVariableAxis.Wavelength, opticalProperties) .AsEnumerable() .Concat(allParameters).ToDictionary()); } int GetParameterOrder(IndependentVariableAxis axis) { switch (axis) { case IndependentVariableAxis.Wavelength: return(0); case IndependentVariableAxis.Rho: return(1); case IndependentVariableAxis.Fx: return(1); case IndependentVariableAxis.Time: return(2); case IndependentVariableAxis.Ft: return(2); case IndependentVariableAxis.Z: return(3); default: throw new InvalidEnumArgumentException("There is no Enum of this type"); } } // this has commented out code that might come into play when we add wavelength as axis double[] GetParameterValues(IndependentVariableAxis axis, string isConstant, double independentValue, double[] xs) { if (((axis == IndependentVariableAxis.Rho) && (isConstant == "rho")) || ((axis == IndependentVariableAxis.Time) && (isConstant == "t")) || ((axis == IndependentVariableAxis.Fx) && (isConstant == "fx")) || ((axis == IndependentVariableAxis.Ft) && (isConstant == "ft"))) { return(new[] { independentValue }); } else { if (axis != IndependentVariableAxis.Time) { return(xs.ToArray()); } else { return(xs.ToArray()); } } //{ // var positionIndex = 0; //hard-coded for now // switch (positionIndex) // { // case 0: // default: // return new[] {independentValue}; //case 1: //return new[] { SolutionDomainTypeOptionVM.ConstantAxesVMs[1].AxisValue }; //case 2: // return new[] { SolutionDomainTypeOptionVM.ConstantAxisThreeValue }; //} //} //else //{ // //var numAxes = axis.Count(); // var numAxes = 1; // var positionIndex = 0; //hard-coded for now // //var positionIndex = SolutionDomainTypeOptionVM.IndependentVariableAxisOptionVM.SelectedValues.IndexOf(axis); // switch (numAxes) // { // case 1: // default: // //return AllRangeVMs[0].Values.ToArray(); // return xs.ToArray(); //case 2: // switch (positionIndex) // { // case 0: // default: // return AllRangeVMs[1].Values.ToArray(); // case 1: // return AllRangeVMs[0].Values.ToArray(); // } //case 3: // switch (positionIndex) // { // case 0: // default: // return AllRangeVMs[2].Values.ToArray(); // case 1: // return AllRangeVMs[1].Values.ToArray(); // case 2: // return AllRangeVMs[0].Values.ToArray(); // } //} //} } }