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 void SpatialAndTemporalFrequencyTwoLayerSDATest() { var _thresholdValue = 0.03; double[] fxs = new double[] { 0.0, 0.02 }; // 0.3 just doesn't give good results var _twoLayerSDAForwardSolver = new TwoLayerSDAForwardSolver(); var _oneLayerNurbsForwardSolver = new NurbsForwardSolver(); // make sure layer thickess is greater than l*=1/(mua+musp)=1mm LayerTissueRegion[] _twoLayerTissue = new LayerTissueRegion[] { new LayerTissueRegion(new DoubleRange(0, 3), new OpticalProperties(ops)), new LayerTissueRegion(new DoubleRange(3, 100), new OpticalProperties(ops)), }; for (int ifx = 0; ifx < fxs.Length; ifx++) { var oneLayerResult = _oneLayerNurbsForwardSolver.ROfFxAndFt(ops, fxs[ifx], ft); var twoLayerResult = _twoLayerSDAForwardSolver.ROfFxAndFt(_twoLayerTissue, fxs[ifx], ft); var relDiffRe = Math.Abs(twoLayerResult.Real - oneLayerResult.Real) / oneLayerResult.Real; var relDiffIm = Math.Abs((twoLayerResult.Imaginary - oneLayerResult.Imaginary) / oneLayerResult.Imaginary); Assert.IsTrue(relDiffRe < _thresholdValue, "Test failed for fx =" + fxs[ifx] + " and ft=", +ft + ", with Real relative difference " + relDiffRe); Assert.IsTrue(relDiffIm < _thresholdValue, "Test failed for fx =" + fxs[ifx] + " and ft=", +ft + ", with Imag relative difference " + relDiffIm); } }
public void SpatialFrequencyAndTemporalTwoLayerSDATest() { var _thresholdValue = 0.06; double[] _fxs = new double[] { 0.0, 0.02 }; // 0.3 just doesn't give good results double[] _times = { 0.004, 0.014 }; // ns, these times were chosen for each fx var _twoLayerSDAForwardSolver = new TwoLayerSDAForwardSolver(); var _oneLayerSDAForwardSolver = new PointSourceSDAForwardSolver(); // make sure layer thickess is greater than l*=1/(mua+musp)=1mm LayerTissueRegion[] _twoLayerTissue = new LayerTissueRegion[] { new LayerTissueRegion(new DoubleRange(0, 3), new OpticalProperties(ops)), new LayerTissueRegion(new DoubleRange(3, 100), new OpticalProperties(ops)), }; for (int i = 0; i < _fxs.Length; i++) { var oneLayerResult = _oneLayerSDAForwardSolver.ROfFxAndTime(ops, _fxs[i], _times[i]); var twoLayerResult = _twoLayerSDAForwardSolver.ROfFxAndTime(_twoLayerTissue, _fxs[i], _times[i]); var relDiffRe = Math.Abs(twoLayerResult - oneLayerResult) / oneLayerResult; Assert.IsTrue(relDiffRe < _thresholdValue, "Test failed for fx =" + _fxs[i] + " and ft=", +_times[i] + ", with relative difference " + relDiffRe); } }
public void TemporalFrequencyTwoLayerSDATest() { var _thresholdValue = 1e-8; var _twoLayerSDAForwardSolver = new TwoLayerSDAForwardSolver(); var _oneLayerPointSourceSDAForwardSolver = new PointSourceSDAForwardSolver(); // make sure layer thickess is greater than l*=1/(mua+musp)=1mm LayerTissueRegion[] _twoLayerTissue = new LayerTissueRegion[] { new LayerTissueRegion(new DoubleRange(0, 3), new OpticalProperties(ops)), new LayerTissueRegion(new DoubleRange(3, 100), new OpticalProperties(ops)), }; for (int irho = 0; irho < rhos.Length; irho++) { var oneLayerResult = _oneLayerPointSourceSDAForwardSolver.ROfRhoAndFt(ops, rhos[irho], ft); var twoLayerResult = _twoLayerSDAForwardSolver.ROfRhoAndFt(_twoLayerTissue, rhos[irho], ft); var relDiffRe = Math.Abs(twoLayerResult.Real - oneLayerResult.Real) / oneLayerResult.Real; var relDiffIm = Math.Abs((twoLayerResult.Imaginary - oneLayerResult.Imaginary) / oneLayerResult.Imaginary); Assert.IsTrue(relDiffRe < _thresholdValue, "Test failed for rho =" + rhos[irho] + "mm, with Real relative difference " + relDiffRe); Assert.IsTrue(relDiffIm < _thresholdValue, "Test failed for rho =" + rhos[irho] + "mm, with Imaginary relative difference " + relDiffIm); } }
public void TemporalTwoLayerSDATest() { var _twoLayerSDAForwardSolver = new TwoLayerSDAForwardSolver(); var _oneLayerForwardSolver = new PointSourceSDAForwardSolver(); double _thresholdValue = 0.03; double[] _rhos = { 1, 3, 6, 10 }; double[] _times = { 0.0038, 0.014, 0.058, 0.14 }; // ns, these times where chosen for each rho // make sure layer thickess is greater than l*=1/(mua+musp)=1mm LayerTissueRegion[] _twoLayerTissue = new LayerTissueRegion[] { new LayerTissueRegion(new DoubleRange(0, 3), new OpticalProperties(ops)), new LayerTissueRegion(new DoubleRange(3, 100), new OpticalProperties(ops)), }; for (int i = 0; i < _rhos.Length; i++) { var oneLayerResult = _oneLayerForwardSolver.ROfRhoAndTime(ops, _rhos[i], _times[i]); var twoLayerResult = _twoLayerSDAForwardSolver.ROfRhoAndTime(_twoLayerTissue, _rhos[i], _times[i]); var relDiff = Math.Abs(twoLayerResult - oneLayerResult) / oneLayerResult; Assert.IsTrue(relDiff < _thresholdValue, "Test failed for rho =" + _rhos[i] + "mm, with relative difference " + relDiff); } }
public void SteadyStateTwoLayerSDATest() { var _thresholdValue = 1e-8; var _twoLayerSDAForwardSolver = new TwoLayerSDAForwardSolver(); var _oneLayerPointSourceForwardSolver = new PointSourceSDAForwardSolver(); // make sure layer thickess is greater than l*=1/(mua+musp)=1mm LayerTissueRegion[] _twoLayerTissue = new LayerTissueRegion[] { new LayerTissueRegion(new DoubleRange(0, 3), new OpticalProperties(ops)), new LayerTissueRegion(new DoubleRange(3, 100), new OpticalProperties(ops)), }; for (int irho = 0; irho < rhos.Length; irho++) { var oneLayerResult = _oneLayerPointSourceForwardSolver.ROfRho(ops, rhos[irho]); var twoLayerResult = _twoLayerSDAForwardSolver.ROfRho(_twoLayerTissue, rhos[irho]); var relDiff = Math.Abs(twoLayerResult - oneLayerResult) / oneLayerResult; Assert.IsTrue(relDiff < _thresholdValue, "Test failed for rho =" + rhos[irho] + "mm, with relative difference " + relDiff); } }
public void SpatialFrequencyTwoLayerSDATest() { var _thresholdValue = 0.03; double[] fxs = new double[] { 0.0, 0.02 }; // 0.3 results not good var _twoLayerSDAForwardSolver = new TwoLayerSDAForwardSolver(); var _oneLayerNurbsForwardSolver = new NurbsForwardSolver(); // make sure layer thickess is greater than l*=1/(mua+musp)=1mm LayerTissueRegion[] _twoLayerTissue = new LayerTissueRegion[] { new LayerTissueRegion(new DoubleRange(0, 3), new OpticalProperties(ops)), new LayerTissueRegion(new DoubleRange(3, 100), new OpticalProperties(ops)), }; for (int ifx = 0; ifx < fxs.Length; ifx++) { var oneLayerResult = _oneLayerNurbsForwardSolver.ROfFx(ops, fxs[ifx]); var twoLayerResult = _twoLayerSDAForwardSolver.ROfFx(_twoLayerTissue, fxs[ifx]); var relDiff = Math.Abs(twoLayerResult - oneLayerResult) / oneLayerResult; Assert.IsTrue(relDiff < _thresholdValue, "Test failed for fx =" + fxs[ifx] + ", with relative difference " + relDiff); } }