public void Test_deserialize_spectral_data() { var postData = "{\"spectralPlotType\":\"musp\",\"plotName\":\"μs'\",\"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},\"scatteringType\":\"PowerLaw\",\"powerLawScatterer\":{\"a\":1.2,\"b\":1.42},\"intralipidScatterer\":{\"volumeFraction\":0.01},\"mieScatterer\":{\"particleRadius\":0.5,\"ParticleRefractiveIndexMismatch\":1.4,\"MediumRefractiveIndexMismatch\":1,\"volumeFraction\":0.01},\"xAxis\":{\"start\":650,\"stop\":1000,\"count\":36}}"; var xAxis = new DoubleRange(650, 1000, 36); var powerLawScatterer = new PowerLawScatterer(1.2, 1.42); var intralipidScatterer = new IntralipidScatterer(0.01); var mieScatterer = new MieScatterer(0.5, 1.4, 1, 0.01); var absorberConcentrations = new[] { new LabelValuePair() { Label = "Hb", Value = 28.4 } }; var spectralPlotParameters = JsonConvert.DeserializeObject <SpectralPlotParameters>(postData); Assert.AreEqual(xAxis.Start, spectralPlotParameters.XAxis.Start); Assert.AreEqual(xAxis.Stop, spectralPlotParameters.XAxis.Stop); Assert.AreEqual(xAxis.Count, spectralPlotParameters.XAxis.Count); Assert.AreEqual(xAxis.Delta, spectralPlotParameters.XAxis.Delta); Assert.IsNull(spectralPlotParameters.YAxis); Assert.AreEqual(SpectralPlotType.Musp, spectralPlotParameters.SpectralPlotType); Assert.AreEqual("μs'", spectralPlotParameters.PlotName); Assert.IsNull(spectralPlotParameters.Tissue); Assert.IsNull(spectralPlotParameters.Wavelengths); Assert.AreEqual("Skin", spectralPlotParameters.TissueType); Assert.AreEqual(ScatteringType.PowerLaw, spectralPlotParameters.ScatteringType); Assert.AreEqual(absorberConcentrations[0].Label, spectralPlotParameters.AbsorberConcentration[0].Label); Assert.AreEqual(absorberConcentrations[0].Value, spectralPlotParameters.AbsorberConcentration[0].Value); Assert.AreEqual(powerLawScatterer.A, spectralPlotParameters.PowerLawScatterer.A); Assert.AreEqual(intralipidScatterer.VolumeFraction, spectralPlotParameters.IntralipidScatterer.VolumeFraction); Assert.AreEqual(mieScatterer.ParticleRadius, spectralPlotParameters.MieScatterer.ParticleRadius); }
public void validate_spectral_generation_of_OpticalProperties_with_scatterers_and_absorbers() { var scatterer = new IntralipidScatterer(0.01); var fatAbsorber = new ChromophoreAbsorber(ChromophoreType.Fat, 0.01); var waterAbsorber = new ChromophoreAbsorber(ChromophoreType.H2O, 0.99); var wvs = new DoubleRange(650, 1000, 36).AsEnumerable().ToArray(); var n = 1.4; var rho = 10; var ops = wvs.Select(wv => { var mua = fatAbsorber.GetMua(wv) + waterAbsorber.GetMua(wv); var musp = scatterer.GetMusp(wv); var g = scatterer.GetG(wv); return(new OpticalProperties(mua, musp, g, n)); }).ToArray(); var fs = new PointSourceSDAForwardSolver(); var reflectanceVsWavelength = fs.ROfRho(ops, rho); Assert.NotNull(reflectanceVsWavelength); Assert.AreEqual(reflectanceVsWavelength.Length, wvs.Length); // check that change in scattering changes the reflectance Assert.IsTrue(reflectanceVsWavelength[0] != reflectanceVsWavelength[1]); // check that change in absorption changes the reflectance Assert.IsTrue(reflectanceVsWavelength[1] != reflectanceVsWavelength[2]); }
public void validate_spectral_generation_of_OpticalProperties_with_tissue() { var scatterer = new IntralipidScatterer(0.01); var fatAbsorber = new ChromophoreAbsorber(ChromophoreType.Fat, 0.01); var waterAbsorber = new ChromophoreAbsorber(ChromophoreType.H2O, 0.99); var _twoLayerSDAForwardSolver = new TwoLayerSDAForwardSolver(); var _oneLayerPointSourceForwardSolver = new PointSourceSDAForwardSolver(); var n = 1.4; var wvs = new DoubleRange(650, 1000, 36).AsEnumerable().ToArray(); var rho = 10; var tissue = new Tissue( new IChromophoreAbsorber[] { fatAbsorber, waterAbsorber }, scatterer, "test_tissue", n); var ops = wvs.Select(wv => tissue.GetOpticalProperties(wv)).ToArray(); var fs = new PointSourceSDAForwardSolver(); var reflectanceVsWavelength = fs.ROfRho(ops, rho); Assert.NotNull(reflectanceVsWavelength); Assert.AreEqual(reflectanceVsWavelength.Length, wvs.Length); // check that change in scattering changes the reflectance Assert.IsTrue(reflectanceVsWavelength[0] != reflectanceVsWavelength[1]); // check that change in absorption changes the reflectance Assert.IsTrue(reflectanceVsWavelength[1] != reflectanceVsWavelength[2]); }
public override IScatterer ReadJson(JsonReader reader, Type objectType, IScatterer existingValue, bool hasExistingValue, JsonSerializer serializer) { IScatterer scatterer; double volumeFraction; // Load the JSON for the scatterer into a JObject var jsonObject = JObject.Load(reader); var currentToken = reader.Path; ScatteringType scatteringType; switch (existingValue) { case PowerLawScatterer _: scatteringType = ScatteringType.PowerLaw; break; case IntralipidScatterer _: scatteringType = ScatteringType.Intralipid; break; case MieScatterer _: scatteringType = ScatteringType.Mie; break; default: var scattererEnum = currentToken.Replace("Scatterer", ""); Enum.TryParse <ScatteringType>(scattererEnum, true, out scatteringType); break; } switch (scatteringType) { case ScatteringType.Intralipid: if (jsonObject["volumeFraction"] != null) { volumeFraction = jsonObject["volumeFraction"].Value <double>(); scatterer = new IntralipidScatterer(volumeFraction); } else { scatterer = new IntralipidScatterer(); } break; case ScatteringType.Mie: if (jsonObject["particleRadius"] != null && jsonObject["particleRefractiveIndex"] != null && jsonObject["mediumRefractiveIndex"] != null && jsonObject["volumeFraction"] != null) { var particleRadius = jsonObject["particleRadius"].Value <double>(); var particleRefractiveIndex = jsonObject["particleRefractiveIndex"].Value <double>(); var mediumRefractiveIndex = jsonObject["mediumRefractiveIndex"].Value <double>(); volumeFraction = jsonObject["volumeFraction"].Value <double>(); scatterer = new MieScatterer(particleRadius, particleRefractiveIndex, mediumRefractiveIndex, volumeFraction); } else { scatterer = new MieScatterer(); } break; case ScatteringType.PowerLaw: if (jsonObject["a"] != null && jsonObject["b"] != null) { var a = jsonObject["a"].Value <double>(); var b = jsonObject["b"].Value <double>(); scatterer = new PowerLawScatterer(a, b); } else { scatterer = new PowerLawScatterer(); } break; default: scatterer = new PowerLawScatterer(); break; } // Return the scatterer return(scatterer); }