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]);
        }
Ejemplo n.º 4
0
        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);
        }