/// <summary>
        /// Define SimulationInput to describe homogeneous and two layer tissue
        /// </summary>
        /// <returns></returns>
        private void GenerateReferenceDatabase()
        {
            var simulationOptions = new SimulationOptions(
                0,
                RandomNumberGeneratorType.MersenneTwister,
                AbsorptionWeightingType.Discrete,
                PhaseFunctionType.HenyeyGreenstein,
                new List <DatabaseType>()
            {
                DatabaseType.pMCDiffuseReflectance
            },
                false, // track statistics
                0.0,   // RR threshold -> 0 = no RR performed
                0);
            var sourceInput = new DirectionalPointSourceInput(
                new Position(0.0, 0.0, 0.0),
                new Direction(0.0, 0.0, 1.0),
                1);
            var detectorInputs = new List <IDetectorInput>()
            {
                new ROfRhoDetectorInput()
                {
                    Rho = new DoubleRange(0.0, 10.0, 101)
                },
                new ROfRhoAndTimeDetectorInput()
                {
                    Rho = new DoubleRange(0.0, 10.0, 101), Time = new DoubleRange(0.0, 1.0, 101)
                }
            };

            _referenceInputTwoLayerTissue = new SimulationInput(
                100,
                "",
                simulationOptions,
                sourceInput,
                new MultiLayerTissueInput(
                    new ITissueRegion[]
            {
                new LayerRegion(
                    new DoubleRange(double.NegativeInfinity, 0.0),
                    new OpticalProperties(0.0, 1e-10, 1.0, 1.0)),
                new LayerRegion(
                    new DoubleRange(0.0, _layerThickness),
                    new OpticalProperties(0.01, 1.0, 0.8, 1.4)),
                new LayerRegion(
                    new DoubleRange(_layerThickness, 20.0),
                    new OpticalProperties(0.01, 1.0, 0.8, 1.4)),
                new LayerRegion(
                    new DoubleRange(20.0, double.PositiveInfinity),
                    new OpticalProperties(0.0, 1e-10, 1.0, 1.0))
            }
                    ),
                detectorInputs);

            _factor = 1.0 - Optics.Specular(
                _referenceInputTwoLayerTissue.TissueInput.Regions[0].RegionOP.N,
                _referenceInputTwoLayerTissue.TissueInput.Regions[1].RegionOP.N);
            _referenceOutputTwoLayerTissue = new MonteCarloSimulation(_referenceInputTwoLayerTissue).Run();
            _databaseTwoLayerTissue        = pMCDatabase.FromFile("DiffuseReflectanceDatabase", "CollisionInfoDatabase");
        }
示例#2
0
        public void execute_Monte_Carlo()
        {
            // delete previously generated files
            clear_folders_and_files();

            var simulationOptions = new SimulationOptions(
                0,
                RandomNumberGeneratorType.MersenneTwister,
                AbsorptionWeightingType.Continuous,
                PhaseFunctionType.HenyeyGreenstein,
                new List <DatabaseType>()
            {
                DatabaseType.pMCDiffuseReflectance
            },
                false, // track statistics
                0.0,   // RR threshold -> 0 = no RR performed
                0);
            var sourceInput = new DirectionalPointSourceInput(
                new Position(0.0, 0.0, 0.0),
                new Direction(0.0, 0.0, 1.0),
                1);
            var detectorInputs = new List <IDetectorInput>()
            {
                new ROfRhoDetectorInput()
                {
                    Rho = new DoubleRange(0.0, 10.0, 101)
                },
                new ROfRhoAndTimeDetectorInput()
                {
                    Rho = new DoubleRange(0.0, 10.0, 101), Time = new DoubleRange(0.0, 1.0, 101)
                },
                new ROfFxDetectorInput()
                {
                    Fx = new DoubleRange(0.0, 0.5, 11)
                },
                new ROfFxAndTimeDetectorInput()
                {
                    Fx = new DoubleRange(0.0, 0.5, 11), Time = new DoubleRange(0.0, 1.0, 101)
                }
            };

            _referenceInputOneLayerTissue = new SimulationInput(
                100,
                "",  // can't create folder in isolated storage
                simulationOptions,
                sourceInput,
                new MultiLayerTissueInput(
                    new ITissueRegion[]
            {
                new LayerTissueRegion(
                    new DoubleRange(double.NegativeInfinity, 0.0),
                    new OpticalProperties(0.0, 1e-10, 1.0, 1.0)),
                new LayerTissueRegion(
                    new DoubleRange(0.0, 20.0),
                    new OpticalProperties(0.01, 1.0, 0.8, 1.4)),
                new LayerTissueRegion(
                    new DoubleRange(20.0, double.PositiveInfinity),
                    new OpticalProperties(0.0, 1e-10, 1.0, 1.0))
            }
                    ),
                detectorInputs);
            _factor = 1.0 - Optics.Specular(
                _referenceInputOneLayerTissue.TissueInput.Regions[0].RegionOP.N,
                _referenceInputOneLayerTissue.TissueInput.Regions[1].RegionOP.N);
            _referenceOutputOneLayerTissue = new MonteCarloSimulation(_referenceInputOneLayerTissue).Run();

            _databaseOneLayerTissue = pMCDatabase.FromFile("DiffuseReflectanceDatabase", "CollisionInfoDatabase");
        }
        public void execute_Monte_Carlo()
        {
            // delete previously generated files
            clear_folders_and_files();

            // instantiate common classes
            var simulationOptions = new SimulationOptions(
                0,
                RandomNumberGeneratorType.MersenneTwister,
                AbsorptionWeightingType.Discrete,
                PhaseFunctionType.HenyeyGreenstein,
                new List <DatabaseType>()
            {
            },         // databases to be written
                false, // track statistics
                0.0,   // RR threshold -> 0 = no RR performed
                0);
            var source = new DirectionalPointSourceInput(
                new Position(0.0, 0.0, 0.0),
                new Direction(0.0, 0.0, 1.0),
                1);      // start inside tissue
            var oneLayerDetectors = new List <IDetectorInput>
            {
                new ROfFxDetectorInput()
                {
                    Fx = new DoubleRange(0.0, 0.5, 11), TallySecondMoment = true
                },
                new TOfFxDetectorInput()
                {
                    Fx = new DoubleRange(0.0, 0.5, 11)
                },
                new ReflectedDynamicMTOfFxAndSubregionHistDetectorInput()
                {
                    Fx                  = new DoubleRange(0.0, 0.5, 11),   // fx bins MAKE SURE AGREES with ROfFx fx specification for unit test below
                    Z                   = new DoubleRange(0.0, 10.0, 21),
                    MTBins              = new DoubleRange(0.0, 500.0, 51), // MT bins
                    FractionalMTBins    = new DoubleRange(0.0, 1.0, 11),
                    BloodVolumeFraction = new List <double>()
                    {
                        0, 0.5, 0
                    }
                },
                new TransmittedDynamicMTOfFxAndSubregionHistDetectorInput()
                {
                    Fx                  = new DoubleRange(0.0, 0.5, 11),   // fx bins MAKE SURE AGREES with TOfFx fx specification for unit test below
                    Z                   = new DoubleRange(0.0, 10.0, 21),
                    MTBins              = new DoubleRange(0.0, 500.0, 51), // MT bins
                    FractionalMTBins    = new DoubleRange(0.0, 1.0, 11),
                    BloodVolumeFraction = new List <double>()
                    {
                        0, 0.5, 0
                    }
                },
            };

            _inputOneLayerTissue = new SimulationInput(
                100,
                "",
                simulationOptions,
                source,
                new MultiLayerTissueInput(
                    new ITissueRegion[]
            {
                new LayerTissueRegion(
                    new DoubleRange(double.NegativeInfinity, 0.0),
                    new OpticalProperties(0.0, 1e-10, 1.0, 1.0)),
                new LayerTissueRegion(
                    new DoubleRange(0.0, 20.0),
                    new OpticalProperties(0.01, 1.0, 0.8, 1.4)),
                new LayerTissueRegion(
                    new DoubleRange(20.0, double.PositiveInfinity),
                    new OpticalProperties(0.0, 1e-10, 1.0, 1.0))
            }
                    ),
                oneLayerDetectors);
            _outputOneLayerTissue = new MonteCarloSimulation(_inputOneLayerTissue).Run();

            var twoLayerDetectors = new List <IDetectorInput>
            {
                new ReflectedDynamicMTOfFxAndSubregionHistDetectorInput()
                {
                    Fx                  = new DoubleRange(0.0, 0.5, 11),
                    Z                   = new DoubleRange(0.0, 10.0, 21),
                    MTBins              = new DoubleRange(0.0, 500.0, 51), // MT bins
                    FractionalMTBins    = new DoubleRange(0.0, 1.0, 11),
                    BloodVolumeFraction = new List <double>()
                    {
                        0, 0.2, 0.5, 0
                    }
                },
                new TransmittedDynamicMTOfFxAndSubregionHistDetectorInput()
                {
                    Fx                  = new DoubleRange(0.0, 0.5, 11),
                    Z                   = new DoubleRange(0.0, 10.0, 21),
                    MTBins              = new DoubleRange(0.0, 500.0, 51), // MT bins
                    FractionalMTBins    = new DoubleRange(0.0, 1.0, 11),
                    BloodVolumeFraction = new List <double>()
                    {
                        0, 0.2, 0.5, 0
                    }
                }
            };

            _inputTwoLayerTissue = new SimulationInput(
                100,
                "",
                simulationOptions,
                source,
                new MultiLayerTissueInput(
                    new ITissueRegion[]
            {
                new LayerTissueRegion(
                    new DoubleRange(double.NegativeInfinity, 0.0),
                    new OpticalProperties(0.0, 1e-10, 1.0, 1.0)),
                new LayerTissueRegion(
                    new DoubleRange(0.0, _layerThickness),
                    new OpticalProperties(0.01, 1.0, 0.8, 1.4)),
                new LayerTissueRegion(
                    new DoubleRange(_layerThickness, 20.0),
                    new OpticalProperties(0.01, 1.0, 0.8, 1.4)),
                new LayerTissueRegion(
                    new DoubleRange(20.0, double.PositiveInfinity),
                    new OpticalProperties(0.0, 1e-10, 1.0, 1.0))
            }
                    ),
                twoLayerDetectors);
            _outputTwoLayerTissue = new MonteCarloSimulation(_inputTwoLayerTissue).Run();
        }
        public void execute_Monte_Carlo()
        {
            // delete previously generated files
            clear_folders_and_files();

            // instantiate common classes
            var simulationOptions = new SimulationOptions(
                0,
                RandomNumberGeneratorType.MersenneTwister,
                AbsorptionWeightingType.Discrete,
                PhaseFunctionType.HenyeyGreenstein,
                new List <DatabaseType>()
            {
            },         // databases to be written
                false, // track statistics
                0.0,   // RR threshold -> 0 = no RR performed
                0);
            var source = new DirectionalPointSourceInput(
                new Position(0.0, 0.0, 0.0),
                new Direction(0.0, 0.0, 1.0),
                1);      // start inside tissue
            var detectors = new List <IDetectorInput>
            {
                new RDiffuseDetectorInput(),
                new ROfAngleDetectorInput()
                {
                    Angle = new DoubleRange(Math.PI / 2, Math.PI, 2)
                },
                new ROfRhoDetectorInput()
                {
                    Rho = new DoubleRange(0.0, 10.0, 101), TallySecondMoment = true
                },
                new ROfRhoAndAngleDetectorInput()
                {
                    Rho = new DoubleRange(0.0, 10.0, 101), Angle = new DoubleRange(Math.PI / 2, Math.PI, 2)
                },
                new ROfRhoAndTimeDetectorInput()
                {
                    Rho = new DoubleRange(0.0, 10.0, 101), Time = new DoubleRange(0.0, 1.0, 101), TallySecondMoment = true
                },
                new ROfXAndYDetectorInput()
                {
                    X = new DoubleRange(-10.0, 10.0, 101), Y = new DoubleRange(-10.0, 10.0, 101)
                },
                new ROfRhoAndOmegaDetectorInput()
                {
                    Rho = new DoubleRange(0.0, 10.0, 101), Omega = new DoubleRange(0.05, 1.0, 20)
                },                                                                                                                      // DJC - edited to reflect frequency sampling points (not bins)
                new ROfFxDetectorInput()
                {
                    Fx = new DoubleRange(0.0, 0.5, 51)
                },
                new TDiffuseDetectorInput(),
                new TOfAngleDetectorInput()
                {
                    Angle = new DoubleRange(0.0, Math.PI / 2, 2)
                },
                new TOfRhoDetectorInput()
                {
                    Rho = new DoubleRange(0.0, 10.0, 101)
                },
                new TOfRhoAndAngleDetectorInput()
                {
                    Rho = new DoubleRange(0.0, 10.0, 101), Angle = new DoubleRange(0.0, Math.PI / 2, 2)
                },
                new TOfXAndYDetectorInput()
                {
                    X = new DoubleRange(-10.0, 10.0, 101), Y = new DoubleRange(-10.0, 10.0, 101)
                },
                new TOfFxDetectorInput()
                {
                    Fx = new DoubleRange(0.0, 0.5, 51)
                },
                new AOfRhoAndZDetectorInput()
                {
                    Rho = new DoubleRange(0.0, 10.0, 101), Z = new DoubleRange(0.0, 10.0, 101)
                },
                new AOfXAndYAndZDetectorInput()
                {
                    X = new DoubleRange(-10.0, 10.0, 101),
                    Y = new DoubleRange(-10.0, 10.0, 101),
                    Z = new DoubleRange(0.0, 10.0, 101),
                    TallySecondMoment = true
                },
                new ATotalDetectorInput()
                {
                    TallySecondMoment = true
                },
                new FluenceOfRhoAndZDetectorInput()
                {
                    Rho = new DoubleRange(0.0, 10.0, 101), Z = new DoubleRange(0.0, 10.0, 101)
                },
                new FluenceOfXAndYAndZDetectorInput()
                {
                    X = new DoubleRange(-10.0, 10.0, 11),
                    Y = new DoubleRange(-10.0, 10.0, 11),
                    Z = new DoubleRange(0.0, 10.0, 11),
                    TallySecondMoment = true
                },
                new FluenceOfXAndYAndZAndOmegaDetectorInput()
                {
                    X     = new DoubleRange(-10.0, 10.0, 11),
                    Y     = new DoubleRange(-10.0, 10.0, 11),
                    Z     = new DoubleRange(0.0, 10.0, 11),
                    Omega = new DoubleRange(0.05, 1.0, 20)
                },
                new RadianceOfRhoAtZDetectorInput()
                {
                    ZDepth = _dosimetryDepth, Rho = new DoubleRange(0.0, 10.0, 101)
                },
                new RadianceOfRhoAndZAndAngleDetectorInput()
                {
                    Rho = new DoubleRange(0.0, 10.0, 101), Z = new DoubleRange(0.0, 10.0, 101), Angle = new DoubleRange(0, Math.PI, 5)
                },
                new RadianceOfFxAndZAndAngleDetectorInput()
                {
                    Fx = new DoubleRange(0.0, 0.5, 51), Z = new DoubleRange(0.0, 10, 101), Angle = new DoubleRange(0, Math.PI, 5)
                },
                new RadianceOfXAndYAndZAndThetaAndPhiDetectorInput()
                {
                    X     = new DoubleRange(-10.0, 10.0, 11),
                    Y     = new DoubleRange(-10.0, 10.0, 11),
                    Z     = new DoubleRange(0.0, 10.0, 11),
                    Theta = new DoubleRange(0.0, Math.PI, 5),      // theta (polar angle)
                    Phi   = new DoubleRange(-Math.PI, Math.PI, 5), // phi (azimuthal angle)
                },
                new ReflectedMTOfRhoAndSubregionHistDetectorInput()
                {
                    Rho              = new DoubleRange(0.0, 10.0, 101), // rho bins MAKE SURE AGREES with ROfRho rho specification for unit test below
                    MTBins           = new DoubleRange(0.0, 500.0, 51), // MT bins
                    FractionalMTBins = new DoubleRange(0.0, 1.0, 11)
                },
                new TransmittedMTOfRhoAndSubregionHistDetectorInput()
                {
                    Rho              = new DoubleRange(0.0, 10.0, 101), // rho bins MAKE SURE AGREES with TOfRho rho specification for unit test below
                    MTBins           = new DoubleRange(0.0, 500.0, 51), // MT bins
                    FractionalMTBins = new DoubleRange(0.0, 1.0, 11)
                },
                new ReflectedMTOfXAndYAndSubregionHistDetectorInput()
                {
                    X                 = new DoubleRange(-10.0, 10.0, 101),
                    Y                 = new DoubleRange(-10.0, 10.0, 101),
                    MTBins            = new DoubleRange(0.0, 500.0, 51), // MT bins
                    FractionalMTBins  = new DoubleRange(0.0, 1.0, 11),
                    TallySecondMoment = true
                },
                new TransmittedMTOfXAndYAndSubregionHistDetectorInput()
                {
                    X                = new DoubleRange(-10.0, 10.0, 101),
                    Y                = new DoubleRange(-10.0, 10.0, 101),
                    MTBins           = new DoubleRange(0.0, 500.0, 51), // MT bins
                    FractionalMTBins = new DoubleRange(0.0, 1.0, 11)
                }
            };

            _inputOneLayerTissue = new SimulationInput(
                100,
                "",
                simulationOptions,
                source,
                new MultiLayerTissueInput(
                    new ITissueRegion[]
            {
                new LayerTissueRegion(
                    new DoubleRange(double.NegativeInfinity, 0.0),
                    new OpticalProperties(0.0, 1e-10, 1.0, 1.0)),
                new LayerTissueRegion(
                    new DoubleRange(0.0, 20.0),
                    new OpticalProperties(0.01, 1.0, 0.8, 1.4)),
                new LayerTissueRegion(
                    new DoubleRange(20.0, double.PositiveInfinity),
                    new OpticalProperties(0.0, 1e-10, 1.0, 1.0))
            }
                    ),
                detectors);
            _outputOneLayerTissue = new MonteCarloSimulation(_inputOneLayerTissue).Run();

            _inputTwoLayerTissue = new SimulationInput(
                100,
                "",
                simulationOptions,
                source,
                new MultiLayerTissueInput(
                    new ITissueRegion[]
            {
                new LayerTissueRegion(
                    new DoubleRange(double.NegativeInfinity, 0.0),
                    new OpticalProperties(0.0, 1e-10, 1.0, 1.0)),
                new LayerTissueRegion(
                    new DoubleRange(0.0, _layerThickness),
                    new OpticalProperties(0.01, 1.0, 0.8, 1.4)),
                new LayerTissueRegion(
                    new DoubleRange(_layerThickness, 20.0),
                    new OpticalProperties(0.01, 1.0, 0.8, 1.4)),
                new LayerTissueRegion(
                    new DoubleRange(20.0, double.PositiveInfinity),
                    new OpticalProperties(0.0, 1e-10, 1.0, 1.0))
            }
                    ),
                detectors);
            _outputTwoLayerTissue = new MonteCarloSimulation(_inputTwoLayerTissue).Run();

            _factor = 1.0 - Optics.Specular(
                _inputOneLayerTissue.TissueInput.Regions[0].RegionOP.N,
                _inputOneLayerTissue.TissueInput.Regions[1].RegionOP.N);
        }
        public void execute_Monte_Carlo()
        {
            // delete previously generated files
            clear_folders_and_files();

            // instantiate common classes
            var simulationOptions = new SimulationOptions(
                0,
                RandomNumberGeneratorType.MersenneTwister,
                AbsorptionWeightingType.Discrete,
                PhaseFunctionType.HenyeyGreenstein,
                new List <DatabaseType>()
            {
            },         // databases to be written
                false, // track statistics
                0.0,   // RR threshold -> 0 = no RR performed
                0);
            var source = new DirectionalPointSourceInput(
                new Position(0.0, 0.0, 0.0),
                new Direction(0.0, 0.0, 1.0),
                1);      // start inside tissue
            var detectors =
                new List <IDetectorInput>
            {
                new RDiffuseDetectorInput(),
                new ROfAngleDetectorInput()
                {
                    Angle = new DoubleRange(Math.PI / 2, Math.PI, 2)
                },
                new ROfXAndYDetectorInput()
                {
                    X = new DoubleRange(-200.0, 200.0, 401), Y = new DoubleRange(-200.0, 200.0, 401)
                },
                new TDiffuseDetectorInput(),
                new TOfAngleDetectorInput()
                {
                    Angle = new DoubleRange(0.0, Math.PI / 2, 2)
                },
                new ATotalDetectorInput(),
            };

            _inputOneRegionTissue = new SimulationInput(
                100,
                "",
                simulationOptions,
                source,
                new MultiLayerTissueInput(
                    new ITissueRegion[]
            {
                new LayerTissueRegion(
                    new DoubleRange(double.NegativeInfinity, 0.0),
                    new OpticalProperties(0.0, 1e-10, 1.0, 1.0)),
                new LayerTissueRegion(
                    new DoubleRange(0.0, 20.0),
                    new OpticalProperties(0.01, 1.0, 0.8, 1.4)),
                new LayerTissueRegion(
                    new DoubleRange(20.0, double.PositiveInfinity),
                    new OpticalProperties(0.0, 1e-10, 1.0, 1.0))
            }
                    ),
                detectors);
            _outputOneRegionTissue = new MonteCarloSimulation(_inputOneRegionTissue).Run();

            _inputTwoRegionTissue = new SimulationInput(
                100,
                "",
                simulationOptions,
                source,
                new SingleVoxelTissueInput(
                    new VoxelTissueRegion(
                        new DoubleRange(-5, 5),
                        new DoubleRange(-5, 5),
                        new DoubleRange(1e-9, 5),                  // smallest Z.Start with tests passing is 1e-9
                        new OpticalProperties(0.01, 1.0, 0.8, 1.4) //debug with g=1
                        ),
                    new LayerTissueRegion[]
            {
                new LayerTissueRegion(
                    new DoubleRange(double.NegativeInfinity, 0.0),
                    new OpticalProperties(0.0, 1e-10, 1.0, 1.0)),
                new LayerTissueRegion(
                    new DoubleRange(0.0, 20.0),                  // debug with thin slab d=2
                    new OpticalProperties(0.01, 1.0, 0.8, 1.4)), // debug with g=1
                new LayerTissueRegion(
                    new DoubleRange(20.0, double.PositiveInfinity),
                    new OpticalProperties(0.0, 1e-10, 1.0, 1.0))
            }
                    ),
                detectors);
            _outputTwoRegionTissue = new MonteCarloSimulation(_inputTwoRegionTissue).Run();

            _factor = 1.0 - Optics.Specular(
                _inputOneRegionTissue.TissueInput.Regions[0].RegionOP.N,
                _inputOneRegionTissue.TissueInput.Regions[1].RegionOP.N);
        }
示例#6
0
        public void execute_Monte_Carlo()
        {
            // instantiate common classes
            var simulationOptions = new SimulationOptions(
                0,
                RandomNumberGeneratorType.MersenneTwister,
                AbsorptionWeightingType.Discrete,
                PhaseFunctionType.HenyeyGreenstein,
                new List <DatabaseType>()
            {
                DatabaseType.pMCDiffuseReflectance
            },         // write database for pMC tests
                false, // track statistics
                0.0,   // RR threshold -> 0 = no RR performed
                0);
            var source = new DirectionalPointSourceInput(
                new Position(0.0, 0.0, 0.0),
                new Direction(0.0, 0.0, 1.0),
                0);      // start in air
            var tissue = new MultiLayerTissueInput(
                new ITissueRegion[]
            {
                new LayerTissueRegion(
                    new DoubleRange(double.NegativeInfinity, 0.0),
                    new OpticalProperties(0.0, 1e-10, 1.0, 1.0)),
                new LayerTissueRegion(
                    new DoubleRange(0.0, 10.0),     // make tissue layer thin so transmittance results improved
                    new OpticalProperties(0.01, 1.0, 0.8, 1.4)),
                new LayerTissueRegion(
                    new DoubleRange(10.0, double.PositiveInfinity),
                    new OpticalProperties(0.0, 1e-10, 1.0, 1.0))
            });
            var detectorsNA0 = new List <IDetectorInput>
            {
                new RDiffuseDetectorInput()
                {
                    FinalTissueRegionIndex = 0, NA = 0.0
                },
                new ROfAngleDetectorInput()
                {
                    Angle = new DoubleRange(Math.PI / 2, Math.PI, 2), FinalTissueRegionIndex = 0, NA = 0.0
                },
                new ROfRhoDetectorInput()
                {
                    Rho = new DoubleRange(0.0, 10.0, 11), FinalTissueRegionIndex = 0, NA = 0.0
                },
                new ROfRhoAndAngleDetectorInput()
                {
                    Rho = new DoubleRange(0.0, 10.0, 11), Angle = new DoubleRange(Math.PI / 2, Math.PI, 2), FinalTissueRegionIndex = 0, NA = 0.0
                },
                new ROfRhoAndTimeDetectorInput()
                {
                    Rho = new DoubleRange(0.0, 10.0, 11), Time = new DoubleRange(0.0, 1.0, 11), FinalTissueRegionIndex = 0, NA = 0.0
                },
                new ROfRhoAndOmegaDetectorInput()
                {
                    Rho = new DoubleRange(0.0, 10.0, 11), Omega = new DoubleRange(0.05, 1.0, 20), FinalTissueRegionIndex = 0, NA = 0.0
                },
                new ROfXAndYDetectorInput()
                {
                    X = new DoubleRange(-10.0, 10.0, 11), Y = new DoubleRange(-10.0, 10.0, 11), FinalTissueRegionIndex = 0, NA = 0.0
                },
                new ROfXAndYAndTimeDetectorInput()
                {
                    X = new DoubleRange(-10.0, 10.0, 11), Y = new DoubleRange(-10.0, 10.0, 11), Time = new DoubleRange(0, 1, 11), FinalTissueRegionIndex = 0, NA = 0.0
                },
                new ROfXAndYAndMaxDepthDetectorInput()
                {
                    X = new DoubleRange(-10.0, 10.0, 11), Y = new DoubleRange(-10.0, 10.0, 11), MaxDepth = new DoubleRange(0, 10.0, 11), FinalTissueRegionIndex = 0, NA = 0.0
                },
                new ROfFxDetectorInput()
                {
                    Fx = new DoubleRange(0.0, 0.5, 51), FinalTissueRegionIndex = 0, NA = 0.0
                },
                new ROfFxAndTimeDetectorInput()
                {
                    Fx = new DoubleRange(0.0, 0.5, 51), Time = new DoubleRange(0.0, 1.0, 11), FinalTissueRegionIndex = 0, NA = 0.0
                },
                new RSpecularDetectorInput()
                {
                    FinalTissueRegionIndex = 0, NA = 0.0
                },
                new TDiffuseDetectorInput()
                {
                    FinalTissueRegionIndex = 2, NA = 0.0
                },
                new TOfAngleDetectorInput()
                {
                    Angle = new DoubleRange(0.0, Math.PI / 2, 2), FinalTissueRegionIndex = 2, NA = 0.0
                },
                new TOfRhoAndAngleDetectorInput()
                {
                    Rho = new DoubleRange(0.0, 10.0, 11), Angle = new DoubleRange(0.0, Math.PI / 2, 2), FinalTissueRegionIndex = 2, NA = 0.0
                },
                new TOfRhoDetectorInput()
                {
                    Rho = new DoubleRange(0.0, 10.0, 11), FinalTissueRegionIndex = 2, NA = 0.0
                },
                new TOfXAndYDetectorInput()
                {
                    X = new DoubleRange(-10.0, 10.0, 11), Y = new DoubleRange(-10.0, 10.0, 11), FinalTissueRegionIndex = 2, NA = 0.0
                },
                new RadianceOfRhoAtZDetectorInput()
                {
                    ZDepth = _dosimetryDepth, Rho = new DoubleRange(0.0, 10.0, 11), FinalTissueRegionIndex = 1, NA = 0.0
                },

                new ReflectedMTOfRhoAndSubregionHistDetectorInput()
                {
                    Rho                    = new DoubleRange(0.0, 10.0, 11),
                    MTBins                 = new DoubleRange(0.0, 500.0, 5),
                    FractionalMTBins       = new DoubleRange(0.0, 1.0, 11),
                    FinalTissueRegionIndex = 0,
                    NA = 0.0
                },
                new ReflectedMTOfXAndYAndSubregionHistDetectorInput()
                {
                    X                      = new DoubleRange(-10.0, 10.0, 11),
                    Y                      = new DoubleRange(-10.0, 10.0, 11),
                    MTBins                 = new DoubleRange(0.0, 500.0, 5),
                    FractionalMTBins       = new DoubleRange(0.0, 1.0, 11),
                    FinalTissueRegionIndex = 0,
                    NA                     = 0.0
                },
                new TransmittedMTOfRhoAndSubregionHistDetectorInput()
                {
                    Rho                    = new DoubleRange(0.0, 10.0, 11),
                    MTBins                 = new DoubleRange(0.0, 500.0, 5),
                    FractionalMTBins       = new DoubleRange(0.0, 1.0, 11),
                    FinalTissueRegionIndex = 2,
                    NA = 0.0
                },
                new TransmittedMTOfXAndYAndSubregionHistDetectorInput()
                {
                    X                      = new DoubleRange(-10.0, 10.0, 11),
                    Y                      = new DoubleRange(-10.0, 10.0, 11),
                    MTBins                 = new DoubleRange(0.0, 500.0, 5),
                    FractionalMTBins       = new DoubleRange(0.0, 1.0, 11),
                    FinalTissueRegionIndex = 2,
                    NA                     = 0.0
                },
            };
            var input = new SimulationInput(
                100,
                "",
                simulationOptions,
                source,
                tissue,
                detectorsNA0);

            _outputNA0 = new MonteCarloSimulation(input).Run();

            _inputForPMC = input;                                                                       // set pMC input to one that specified database generation
            _pMCDatabase = pMCDatabase.FromFile("DiffuseReflectanceDatabase", "CollisionInfoDatabase"); // grab database


            var detectorsNA0p3 = new List <IDetectorInput>
            {
                new RDiffuseDetectorInput()
                {
                    FinalTissueRegionIndex = 0, NA = 0.3
                },
                new ROfAngleDetectorInput()
                {
                    Angle = new DoubleRange(Math.PI / 2, Math.PI, 2), FinalTissueRegionIndex = 0, NA = 0.3
                },
                new ROfRhoDetectorInput()
                {
                    Rho = new DoubleRange(0.0, 10.0, 11), FinalTissueRegionIndex = 0, NA = 0.3
                },
                new ROfRhoAndAngleDetectorInput()
                {
                    Rho = new DoubleRange(0.0, 10.0, 11), Angle = new DoubleRange(Math.PI / 2, Math.PI, 2), FinalTissueRegionIndex = 0, NA = 0.3
                },
                new ROfRhoAndTimeDetectorInput()
                {
                    Rho = new DoubleRange(0.0, 10.0, 11), Time = new DoubleRange(0.0, 1.0, 11), FinalTissueRegionIndex = 0, NA = 0.3
                },
                new ROfRhoAndOmegaDetectorInput()
                {
                    Rho = new DoubleRange(0.0, 10.0, 11), Omega = new DoubleRange(0.05, 1.0, 20), FinalTissueRegionIndex = 0, NA = 0.3
                },
                new ROfXAndYDetectorInput()
                {
                    X = new DoubleRange(-10.0, 10.0, 11), Y = new DoubleRange(-10.0, 10.0, 11), FinalTissueRegionIndex = 0, NA = 0.3
                },
                new ROfXAndYAndTimeDetectorInput()
                {
                    X = new DoubleRange(-10.0, 10.0, 11), Y = new DoubleRange(-10.0, 10.0, 11), Time = new DoubleRange(0, 1, 11), FinalTissueRegionIndex = 0, NA = 0.3
                },
                new ROfXAndYAndMaxDepthDetectorInput()
                {
                    X = new DoubleRange(-10.0, 10.0, 11), Y = new DoubleRange(-10.0, 10.0, 11), MaxDepth = new DoubleRange(0, 10.0, 11), FinalTissueRegionIndex = 0, NA = 0.3
                },
                new ROfFxDetectorInput()
                {
                    Fx = new DoubleRange(0.0, 0.5, 51), FinalTissueRegionIndex = 0, NA = 0.3
                },
                new ROfFxAndTimeDetectorInput()
                {
                    Fx = new DoubleRange(0.0, 0.5, 5), Time = new DoubleRange(0.0, 1.0, 11), FinalTissueRegionIndex = 0, NA = 0.3
                },
                new RSpecularDetectorInput()
                {
                    FinalTissueRegionIndex = 0, NA = 0.3
                },
                new TDiffuseDetectorInput()
                {
                    FinalTissueRegionIndex = 2, NA = 0.3
                },
                new TOfAngleDetectorInput()
                {
                    Angle = new DoubleRange(0.0, Math.PI / 2, 2), FinalTissueRegionIndex = 2, NA = 0.3
                },
                new TOfRhoAndAngleDetectorInput()
                {
                    Rho = new DoubleRange(0.0, 10.0, 11), Angle = new DoubleRange(0.0, Math.PI / 2, 2), FinalTissueRegionIndex = 2, NA = 0.3
                },
                new TOfRhoDetectorInput()
                {
                    Rho = new DoubleRange(0.0, 10.0, 11), FinalTissueRegionIndex = 2, NA = 0.3
                },
                new TOfXAndYDetectorInput()
                {
                    X = new DoubleRange(-10.0, 10.0, 11), Y = new DoubleRange(-10.0, 10.0, 11), FinalTissueRegionIndex = 2, NA = 0.3
                },

                new RadianceOfRhoAtZDetectorInput()
                {
                    ZDepth = _dosimetryDepth, Rho = new DoubleRange(0.0, 10.0, 11), FinalTissueRegionIndex = 1, NA = 0.3
                },

                new ReflectedMTOfRhoAndSubregionHistDetectorInput()
                {
                    Rho                    = new DoubleRange(0.0, 10.0, 11),
                    MTBins                 = new DoubleRange(0.0, 500.0, 5),
                    FractionalMTBins       = new DoubleRange(0.0, 1.0, 11),
                    FinalTissueRegionIndex = 0,
                    NA = 0.3
                },
                new ReflectedMTOfXAndYAndSubregionHistDetectorInput()
                {
                    X                      = new DoubleRange(-10.0, 10.0, 11),
                    Y                      = new DoubleRange(-10.0, 10.0, 11),
                    MTBins                 = new DoubleRange(0.0, 500.0, 5),
                    FractionalMTBins       = new DoubleRange(0.0, 1.0, 11),
                    FinalTissueRegionIndex = 0,
                    NA                     = 0.3
                },
                new TransmittedMTOfRhoAndSubregionHistDetectorInput()
                {
                    Rho                    = new DoubleRange(0.0, 10.0, 11),
                    MTBins                 = new DoubleRange(0.0, 500.0, 5),
                    FractionalMTBins       = new DoubleRange(0.0, 1.0, 11),
                    FinalTissueRegionIndex = 2,
                    NA = 0.3
                },
                new TransmittedMTOfXAndYAndSubregionHistDetectorInput()
                {
                    X                      = new DoubleRange(-10.0, 10.0, 11),
                    Y                      = new DoubleRange(-10.0, 10.0, 11),
                    MTBins                 = new DoubleRange(0.0, 500.0, 5),
                    FractionalMTBins       = new DoubleRange(0.0, 1.0, 11),
                    FinalTissueRegionIndex = 2,
                    NA                     = 0.3
                },
            };

            input = new SimulationInput(
                100,
                "",
                simulationOptions,
                source,
                tissue,
                detectorsNA0p3);
            _outputNA0p3 = new MonteCarloSimulation(input).Run();

            var detectorsNoNASpecified = new List <IDetectorInput>
            {
                new RDiffuseDetectorInput()
                {
                },
                new ROfAngleDetectorInput()
                {
                    Angle = new DoubleRange(Math.PI / 2, Math.PI, 2)
                },
                new ROfRhoDetectorInput()
                {
                    Rho = new DoubleRange(0.0, 10.0, 11)
                },
                new ROfRhoAndAngleDetectorInput()
                {
                    Rho = new DoubleRange(0.0, 10.0, 11), Angle = new DoubleRange(Math.PI / 2, Math.PI, 2)
                },
                new ROfRhoAndTimeDetectorInput()
                {
                    Rho = new DoubleRange(0.0, 10.0, 11), Time = new DoubleRange(0.0, 1.0, 11)
                },
                new ROfRhoAndOmegaDetectorInput()
                {
                    Rho = new DoubleRange(0.0, 10.0, 11), Omega = new DoubleRange(0.05, 1.0, 20)
                },
                new ROfXAndYDetectorInput()
                {
                    X = new DoubleRange(-10.0, 10.0, 11), Y = new DoubleRange(-10.0, 10.0, 11)
                },
                new ROfXAndYAndTimeDetectorInput()
                {
                    X = new DoubleRange(-10.0, 10.0, 11), Y = new DoubleRange(-10.0, 10.0, 11), Time = new DoubleRange(0, 1, 11), FinalTissueRegionIndex = 0, NA = 0.3
                },
                new ROfXAndYAndMaxDepthDetectorInput()
                {
                    X = new DoubleRange(-10.0, 10.0, 11), Y = new DoubleRange(-10.0, 10.0, 11), MaxDepth = new DoubleRange(0, 10.0, 11), FinalTissueRegionIndex = 0, NA = 0.3
                },
                new ROfFxDetectorInput()
                {
                    Fx = new DoubleRange(0.0, 0.5, 51)
                },
                new ROfFxAndTimeDetectorInput()
                {
                    Fx = new DoubleRange(0.0, 0.5, 5), Time = new DoubleRange(0.0, 1.0, 11)
                },
                new RSpecularDetectorInput()
                {
                },
                new TDiffuseDetectorInput()
                {
                },
                new TOfAngleDetectorInput()
                {
                    Angle = new DoubleRange(0.0, Math.PI / 2, 2)
                },
                new TOfRhoAndAngleDetectorInput()
                {
                    Rho = new DoubleRange(0.0, 10.0, 11), Angle = new DoubleRange(0.0, Math.PI / 2, 2)
                },
                new TOfRhoDetectorInput()
                {
                    Rho = new DoubleRange(0.0, 10.0, 11)
                },
                new TOfXAndYDetectorInput()
                {
                    X = new DoubleRange(-10.0, 10.0, 11), Y = new DoubleRange(-10.0, 10.0, 11)
                },

                new RadianceOfRhoAtZDetectorInput()
                {
                    ZDepth = _dosimetryDepth, Rho = new DoubleRange(0.0, 10.0, 11)
                },

                new ReflectedMTOfRhoAndSubregionHistDetectorInput()
                {
                    Rho              = new DoubleRange(0.0, 10.0, 11),
                    MTBins           = new DoubleRange(0.0, 500.0, 5),
                    FractionalMTBins = new DoubleRange(0.0, 1.0, 11),
                },
                new ReflectedMTOfXAndYAndSubregionHistDetectorInput()
                {
                    X                = new DoubleRange(-10.0, 10.0, 11),
                    Y                = new DoubleRange(-10.0, 10.0, 11),
                    MTBins           = new DoubleRange(0.0, 500.0, 5),
                    FractionalMTBins = new DoubleRange(0.0, 1.0, 11),
                },
                new TransmittedMTOfRhoAndSubregionHistDetectorInput()
                {
                    Rho              = new DoubleRange(0.0, 10.0, 11),
                    MTBins           = new DoubleRange(0.0, 500.0, 5),
                    FractionalMTBins = new DoubleRange(0.0, 1.0, 11),
                },
                new TransmittedMTOfXAndYAndSubregionHistDetectorInput()
                {
                    X                = new DoubleRange(-10.0, 10.0, 11),
                    Y                = new DoubleRange(-10.0, 10.0, 11),
                    MTBins           = new DoubleRange(0.0, 500.0, 5),
                    FractionalMTBins = new DoubleRange(0.0, 1.0, 11),
                },
            };

            input = new SimulationInput(
                100,
                "",
                simulationOptions,
                source,
                tissue,
                detectorsNoNASpecified);
            _outputNoNASpecified = new MonteCarloSimulation(input).Run();
        }
        public void execute_Monte_Carlo()
        {
            // delete any previously generated files
            clear_folders_and_files();

            // instantiate common classes
            var simulationOptions = new SimulationOptions(
                0,     // rng seed = same as linux (0)
                RandomNumberGeneratorType.MersenneTwister,
                AbsorptionWeightingType.Continuous,
                PhaseFunctionType.HenyeyGreenstein,
                new List <DatabaseType>()
            {
            },           // databases to be written
                false,   // track statistics
                0.0,     // RR threshold -> 0 = no RR performed
                0);
            var source = new DirectionalPointSourceInput(
                new Position(0.0, 0.0, 0.0),
                new Direction(0.0, 0.0, 1.0),
                1);     // start inside tissue
            var detectors =
                new List <IDetectorInput>
            {
                new ATotalDetectorInput(),
                new RDiffuseDetectorInput()
                {
                    TallySecondMoment = true
                },
                new ROfAngleDetectorInput()
                {
                    Angle = new DoubleRange(Math.PI / 2, Math.PI, 2)
                },
                new ROfRhoAndAngleDetectorInput()
                {
                    Rho = new DoubleRange(0.0, 10.0, 101), Angle = new DoubleRange(Math.PI / 2, Math.PI, 2)
                },
                new ROfRhoDetectorInput()
                {
                    Rho = new DoubleRange(0.0, 10.0, 101), TallySecondMoment = true
                },
                new ROfRhoAndTimeDetectorInput()
                {
                    Rho = new DoubleRange(0.0, 10.0, 101), Time = new DoubleRange(0.0, 1.0, 101)
                },
                new ROfXAndYDetectorInput()
                {
                    X = new DoubleRange(-10.0, 10.0, 101), Y = new DoubleRange(-10.0, 10.0, 101)
                },
                new ROfRhoAndOmegaDetectorInput()
                {
                    Rho = new DoubleRange(0.0, 10.0, 101), Omega = new DoubleRange(0.05, 1.0, 20)
                },                                                                                                                      // DJC - edited to reflect frequency sampling points (not bins)
                new TDiffuseDetectorInput(),
                new TOfAngleDetectorInput()
                {
                    Angle = new DoubleRange(0.0, Math.PI / 2, 2)
                },
                new TOfRhoDetectorInput()
                {
                    Rho = new DoubleRange(0.0, 10.0, 101)
                },
                new TOfRhoAndAngleDetectorInput()
                {
                    Rho = new DoubleRange(0.0, 10.0, 101), Angle = new DoubleRange(0.0, Math.PI / 2, 2)
                },
                new TOfXAndYDetectorInput()
                {
                    X = new DoubleRange(-10.0, 10.0, 101), Y = new DoubleRange(-10.0, 10.0, 101)
                },
                new ReflectedTimeOfRhoAndSubregionHistDetectorInput()
                {
                    Rho = new DoubleRange(0.0, 10.0, 101), Time = new DoubleRange(0.0, 1.0, 101)
                },
            };
            // one tissue layer
            var inputOneLayerTissue = new SimulationInput(
                100,
                "",
                simulationOptions,
                source,
                new MultiLayerTissueInput(
                    new ITissueRegion[]
            {
                new LayerTissueRegion(
                    new DoubleRange(double.NegativeInfinity, 0.0),
                    new OpticalProperties(0.0, 1e-10, 1.0, 1.0)),
                new LayerTissueRegion(
                    new DoubleRange(0.0, 20.0),
                    new OpticalProperties(0.01, 1.0, 0.8, 1.4)),
                new LayerTissueRegion(
                    new DoubleRange(20.0, double.PositiveInfinity),
                    new OpticalProperties(0.0, 1e-10, 1.0, 1.0))
            }
                    ),
                detectors);

            _outputOneLayerTissue = new MonteCarloSimulation(inputOneLayerTissue).Run();
            // two tissue layers with same optical properties
            var inputTwoLayerTissue = new SimulationInput(
                100,
                "Output",
                simulationOptions,
                source,
                new MultiLayerTissueInput(
                    new ITissueRegion[]
            {
                new LayerTissueRegion(
                    new DoubleRange(double.NegativeInfinity, 0.0),
                    new OpticalProperties(0.0, 1e-10, 1.0, 1.0)),
                new LayerTissueRegion(
                    new DoubleRange(0.0, _layerThickness),
                    new OpticalProperties(0.01, 1.0, 0.8, 1.4)),
                new LayerTissueRegion(
                    new DoubleRange(_layerThickness, 20.0),
                    new OpticalProperties(0.01, 1.0, 0.8, 1.4)),
                new LayerTissueRegion(
                    new DoubleRange(20.0, double.PositiveInfinity),
                    new OpticalProperties(0.0, 1e-10, 1.0, 1.0))
            }
                    ),
                detectors);

            _outputTwoLayerTissue = new MonteCarloSimulation(inputTwoLayerTissue).Run();

            _factor = 1.0 - Optics.Specular(
                inputOneLayerTissue.TissueInput.Regions[0].RegionOP.N,
                inputOneLayerTissue.TissueInput.Regions[1].RegionOP.N);
        }
        public void execute_Monte_Carlo()
        {
            // delete previously generated files
            clear_folders_and_files();

            // instantiate common classes
            var simulationOptions = new SimulationOptions(
                0, // reproducible
                RandomNumberGeneratorType.MersenneTwister,
                AbsorptionWeightingType.Discrete,
                PhaseFunctionType.HenyeyGreenstein,
                new List <DatabaseType>()
            {
            },         // databases to be written
                false, // track statistics
                0.0,   // RR threshold -> 0 = no RR performed
                0);
            var source = new DirectionalPointSourceInput(
                new Position(0.0, 0.0, 0.0),
                new Direction(0.0, 0.0, 1.0),
                1);                       // start inside tissue
            var detectors =
                new List <IDetectorInput> // no cylindrical cylinders inconsistent with tissue geometry
            {
                new RDiffuseDetectorInput(),
                new ROfAngleDetectorInput()
                {
                    Angle = new DoubleRange(Math.PI / 2, Math.PI, 2)
                },
                new ROfXAndYDetectorInput()
                {
                    X = new DoubleRange(-20.0, 20.0, 41),
                    Y = new DoubleRange(-20.0, 20.0, 2)
                },
                new TDiffuseDetectorInput(),
                new TOfAngleDetectorInput()
                {
                    Angle = new DoubleRange(0.0, Math.PI / 2, 2)
                },
                new ATotalDetectorInput(),
                new AOfXAndYAndZDetectorInput()
                {
                    X = new DoubleRange(-20.0, 20.0, 41),
                    Y = new DoubleRange(-20.0, 20.0, 2),
                    Z = new DoubleRange(0, 20, 21)
                }
            };

            _inputOneRegionTissue = new SimulationInput(
                100,
                "",
                simulationOptions,
                source,
                new MultiLayerTissueInput(
                    new ITissueRegion[]
            {
                new LayerTissueRegion(
                    new DoubleRange(double.NegativeInfinity, 0.0),
                    new OpticalProperties(0.0, 1e-10, 1.0, 1.0)),
                new LayerTissueRegion(
                    new DoubleRange(0.0, 20.0),
                    new OpticalProperties(0.01, 1.0, 0.8, 1.4)),
                new LayerTissueRegion(
                    new DoubleRange(20.0, double.PositiveInfinity),
                    new OpticalProperties(0.0, 1e-10, 1.0, 1.0))
            }
                    ),
                detectors);
            _outputOneRegionTissue = new MonteCarloSimulation(_inputOneRegionTissue).Run();

            _inputThreeRegionTissue = new SimulationInput(
                100,
                "",
                simulationOptions,
                source,
                new MultiConcentricInfiniteCylinderTissueInput(
                    new ITissueRegion[]
            {
                new InfiniteCylinderTissueRegion(
                    new Position(0, 0, 1),
                    0.75,
                    new OpticalProperties(0.01, 1.0, 0.8, 1.4)          //debug with g=1
                    ),
                new InfiniteCylinderTissueRegion(
                    new Position(0, 0, 1),
                    0.5,
                    new OpticalProperties(0.01, 1.0, 0.8, 1.4)          //debug with g=1
                    ),
            },
                    new ITissueRegion[]
            {
                new LayerTissueRegion(
                    new DoubleRange(double.NegativeInfinity, 0.0),
                    new OpticalProperties(0.0, 1e-10, 1.0, 1.0)),
                new LayerTissueRegion(
                    new DoubleRange(0.0, 20.0),                  // debug with thin slab d=2
                    new OpticalProperties(0.01, 1.0, 0.8, 1.4)), // debug with g=1
                new LayerTissueRegion(
                    new DoubleRange(20.0, double.PositiveInfinity),
                    new OpticalProperties(0.0, 1e-10, 1.0, 1.0))
            }
                    ),
                detectors);
            _outputThreeRegionTissue = new MonteCarloSimulation(_inputThreeRegionTissue).Run();
        }
示例#9
0
        public void execute_Monte_Carlo()
        {
            // instantiate common classes
            var simulationOptions = new SimulationOptions(
                0,
                RandomNumberGeneratorType.MersenneTwister,
                AbsorptionWeightingType.Discrete,
                PhaseFunctionType.HenyeyGreenstein,
                new List <DatabaseType>()
            {
            },
                false, // track statistics
                0.0,   // RR threshold -> 0 = no RR performed
                0);
            var source = new DirectionalPointSourceInput(
                new Position(0.0, 0.0, 0.0),
                new Direction(0.0, 0.0, 1.0),
                0);      // start in air
            var tissue = new MultiLayerTissueInput(
                new ITissueRegion[]
            {
                new LayerTissueRegion(
                    new DoubleRange(double.NegativeInfinity, 0.0),
                    new OpticalProperties(0.0, 1e-10, 1.0, 1.0)),
                new LayerTissueRegion(
                    new DoubleRange(0.0, 10.0),     // make tissue layer thin so transmittance results improved
                    new OpticalProperties(0.01, 1.0, 0.8, 1.4)),
                new LayerTissueRegion(
                    new DoubleRange(10.0, double.PositiveInfinity),
                    new OpticalProperties(0.0, 1e-10, 1.0, 1.0))
            });
            var detectorsNA0 = new List <IDetectorInput>
            {
                new ReflectedDynamicMTOfFxAndSubregionHistDetectorInput()
                {
                    Fx                  = new DoubleRange(0.0, 0.5, 11),
                    Z                   = new DoubleRange(0.0, 10.0, 11),
                    MTBins              = new DoubleRange(0.0, 500.0, 5),
                    FractionalMTBins    = new DoubleRange(0.0, 1.0, 11),
                    BloodVolumeFraction = new List <double>()
                    {
                        0, 0.5, 0
                    },
                    FinalTissueRegionIndex = 0,
                    NA = 0.0
                },
                new TransmittedDynamicMTOfFxAndSubregionHistDetectorInput()
                {
                    Fx                  = new DoubleRange(0.0, 0.5, 11),
                    Z                   = new DoubleRange(0.0, 10.0, 11),
                    MTBins              = new DoubleRange(0.0, 500.0, 5),
                    FractionalMTBins    = new DoubleRange(0.0, 1.0, 11),
                    BloodVolumeFraction = new List <double>()
                    {
                        0, 0.5, 0
                    },
                    FinalTissueRegionIndex = 2,
                    NA = 0.0
                },
                new ReflectedDynamicMTOfRhoAndSubregionHistDetectorInput()
                {
                    Rho                 = new DoubleRange(0.0, 10.0, 11),
                    Z                   = new DoubleRange(0.0, 10.0, 11),
                    MTBins              = new DoubleRange(0.0, 500.0, 5),
                    FractionalMTBins    = new DoubleRange(0.0, 1.0, 11),
                    BloodVolumeFraction = new List <double>()
                    {
                        0, 0.5, 0
                    },
                    FinalTissueRegionIndex = 0,
                    NA = 0.0
                },
                new TransmittedDynamicMTOfRhoAndSubregionHistDetectorInput()
                {
                    Rho                 = new DoubleRange(0.0, 10.0, 11),
                    Z                   = new DoubleRange(0.0, 10.0, 11),
                    MTBins              = new DoubleRange(0.0, 500.0, 5),
                    FractionalMTBins    = new DoubleRange(0.0, 1.0, 11),
                    BloodVolumeFraction = new List <double>()
                    {
                        0, 0.5, 0
                    },
                    FinalTissueRegionIndex = 2,
                    NA = 0.0
                },
                new ReflectedDynamicMTOfXAndYAndSubregionHistDetectorInput()
                {
                    X                   = new DoubleRange(-10.0, 10.0, 11),
                    Y                   = new DoubleRange(-10.0, 10.0, 11),
                    Z                   = new DoubleRange(0.0, 10.0, 21),
                    MTBins              = new DoubleRange(0.0, 500.0, 5),
                    FractionalMTBins    = new DoubleRange(0.0, 1.0, 11),
                    BloodVolumeFraction = new List <double>()
                    {
                        0, 0.5, 0
                    },
                    FinalTissueRegionIndex = 0,
                    NA = 0.0
                },
                new TransmittedDynamicMTOfXAndYAndSubregionHistDetectorInput()
                {
                    X                   = new DoubleRange(-10.0, 10.0, 11),
                    Y                   = new DoubleRange(-10.0, 10.0, 11),
                    Z                   = new DoubleRange(0.0, 10.0, 11),
                    MTBins              = new DoubleRange(0.0, 500.0, 5),
                    FractionalMTBins    = new DoubleRange(0.0, 1.0, 11),
                    BloodVolumeFraction = new List <double>()
                    {
                        0, 0.5, 0
                    },
                    FinalTissueRegionIndex = 2,
                    NA = 0.0
                }
            };
            var input = new SimulationInput(
                100,
                "",
                simulationOptions,
                source,
                tissue,
                detectorsNA0);

            _outputNA0 = new MonteCarloSimulation(input).Run();

            var detectorsNA0p3 = new List <IDetectorInput>
            {
                new ReflectedDynamicMTOfRhoAndSubregionHistDetectorInput()
                {
                    Rho                 = new DoubleRange(0.0, 10.0, 11),
                    Z                   = new DoubleRange(0.0, 10.0, 11),
                    MTBins              = new DoubleRange(0.0, 500.0, 5),
                    FractionalMTBins    = new DoubleRange(0.0, 1.0, 11),
                    BloodVolumeFraction = new List <double>()
                    {
                        0, 0.5, 0
                    },
                    FinalTissueRegionIndex = 0,
                    NA = 0.3
                },
                new TransmittedDynamicMTOfRhoAndSubregionHistDetectorInput()
                {
                    Rho                 = new DoubleRange(0.0, 10.0, 11),
                    Z                   = new DoubleRange(0.0, 10.0, 11),
                    MTBins              = new DoubleRange(0.0, 500.0, 5),
                    FractionalMTBins    = new DoubleRange(0.0, 1.0, 11),
                    BloodVolumeFraction = new List <double>()
                    {
                        0, 0.5, 0
                    },
                    FinalTissueRegionIndex = 2,
                    NA = 0.3
                },
                new ReflectedDynamicMTOfXAndYAndSubregionHistDetectorInput()
                {
                    X                   = new DoubleRange(-10.0, 10.0, 11),
                    Y                   = new DoubleRange(-10.0, 10.0, 11),
                    Z                   = new DoubleRange(0.0, 10.0, 21),
                    MTBins              = new DoubleRange(0.0, 500.0, 5),
                    FractionalMTBins    = new DoubleRange(0.0, 1.0, 11),
                    BloodVolumeFraction = new List <double>()
                    {
                        0, 0.5, 0
                    },
                    FinalTissueRegionIndex = 0,
                    NA = 0.3
                },
                new TransmittedDynamicMTOfXAndYAndSubregionHistDetectorInput()
                {
                    X                   = new DoubleRange(-10.0, 10.0, 11),
                    Y                   = new DoubleRange(-10.0, 10.0, 11),
                    Z                   = new DoubleRange(0.0, 10.0, 11),
                    MTBins              = new DoubleRange(0.0, 500.0, 5),
                    FractionalMTBins    = new DoubleRange(0.0, 1.0, 11),
                    BloodVolumeFraction = new List <double>()
                    {
                        0, 0.5, 0
                    },
                    FinalTissueRegionIndex = 2,
                    NA = 0.3
                }
            };

            input = new SimulationInput(
                100,
                "",
                simulationOptions,
                source,
                tissue,
                detectorsNA0p3);
            _outputNA0p3 = new MonteCarloSimulation(input).Run();

            var detectorsNoNASpecified = new List <IDetectorInput>
            {
                new ReflectedDynamicMTOfRhoAndSubregionHistDetectorInput()
                {
                    Rho                 = new DoubleRange(0.0, 10.0, 11),
                    Z                   = new DoubleRange(0.0, 10.0, 11),
                    MTBins              = new DoubleRange(0.0, 500.0, 5),
                    FractionalMTBins    = new DoubleRange(0.0, 1.0, 11),
                    BloodVolumeFraction = new List <double>()
                    {
                        0, 0.5, 0
                    },
                },
                new TransmittedDynamicMTOfRhoAndSubregionHistDetectorInput()
                {
                    Rho                 = new DoubleRange(0.0, 10.0, 11),
                    Z                   = new DoubleRange(0.0, 10.0, 11),
                    MTBins              = new DoubleRange(0.0, 500.0, 5),
                    FractionalMTBins    = new DoubleRange(0.0, 1.0, 11),
                    BloodVolumeFraction = new List <double>()
                    {
                        0, 0.5, 0
                    },
                },
                new ReflectedDynamicMTOfXAndYAndSubregionHistDetectorInput()
                {
                    X                   = new DoubleRange(-10.0, 10.0, 11),
                    Y                   = new DoubleRange(-10.0, 10.0, 11),
                    Z                   = new DoubleRange(0.0, 10.0, 21),
                    MTBins              = new DoubleRange(0.0, 500.0, 5),
                    FractionalMTBins    = new DoubleRange(0.0, 1.0, 11),
                    BloodVolumeFraction = new List <double>()
                    {
                        0, 0.5, 0
                    },
                },
                new TransmittedDynamicMTOfXAndYAndSubregionHistDetectorInput()
                {
                    X                   = new DoubleRange(-10.0, 10.0, 11),
                    Y                   = new DoubleRange(-10.0, 10.0, 11),
                    Z                   = new DoubleRange(0.0, 10.0, 11),
                    MTBins              = new DoubleRange(0.0, 500.0, 5),
                    FractionalMTBins    = new DoubleRange(0.0, 1.0, 11),
                    BloodVolumeFraction = new List <double>()
                    {
                        0, 0.5, 0
                    },
                }
            };

            input = new SimulationInput(
                100,
                "",
                simulationOptions,
                source,
                tissue,
                detectorsNoNASpecified);
            _outputNoNASpecified = new MonteCarloSimulation(input).Run();
        }
示例#10
0
        public void execute_Monte_Carlo()
        {
            // instantiate common classes
            var simulationOptions = new SimulationOptions(
                0,
                RandomNumberGeneratorType.MersenneTwister,
                AbsorptionWeightingType.Discrete,
                PhaseFunctionType.HenyeyGreenstein,
                new List <DatabaseType>()
            {
            },         // databases to be written
                false, // track statistics
                0.0,   // RR threshold -> 0 = no RR performed
                0);
            var source = new DirectionalPointSourceInput(
                new Position(0.0, 0.0, 0.0),
                new Direction(0.0, 0.0, 1.0),
                1);      // start inside tissue
            var detectors =
                new List <IDetectorInput>
            {
                new RDiffuseDetectorInput(),
                new ROfAngleDetectorInput()
                {
                    Angle = new DoubleRange(Math.PI / 2, Math.PI, 2)
                },
                new ROfRhoDetectorInput()
                {
                    Rho = new DoubleRange(0.0, 10.0, 101), TallySecondMoment = true
                },
                new ROfRhoAndAngleDetectorInput()
                {
                    Rho = new DoubleRange(0.0, 10.0, 101), Angle = new DoubleRange(Math.PI / 2, Math.PI, 2)
                },
                new ROfRhoAndTimeDetectorInput()
                {
                    Rho = new DoubleRange(0.0, 10.0, 101), Time = new DoubleRange(0.0, 1.0, 101)
                },
                new ROfXAndYDetectorInput()
                {
                    X = new DoubleRange(-200.0, 200.0, 401), Y = new DoubleRange(-200.0, 200.0, 401)
                },
                new ROfRhoAndOmegaDetectorInput()
                {
                    Rho = new DoubleRange(0.0, 10.0, 101), Omega = new DoubleRange(0.0, 1.0, 21)
                },
                new TDiffuseDetectorInput(),
                new TOfAngleDetectorInput()
                {
                    Angle = new DoubleRange(0.0, Math.PI / 2, 2)
                },
                new TOfRhoDetectorInput()
                {
                    Rho = new DoubleRange(0.0, 10.0, 101)
                },
                new TOfRhoAndAngleDetectorInput()
                {
                    Rho = new DoubleRange(0.0, 10.0, 101), Angle = new DoubleRange(0.0, Math.PI / 2, 2)
                },
                new AOfRhoAndZDetectorInput()
                {
                    Rho = new DoubleRange(0.0, 10.0, 101), Z = new DoubleRange(0.0, 10.0, 101)
                },
                new ATotalDetectorInput(),
                new FluenceOfRhoAndZDetectorInput()
                {
                    Rho = new DoubleRange(0.0, 10.0, 101), Z = new DoubleRange(0.0, 10.0, 101)
                },
                new RadianceOfRhoAndZAndAngleDetectorInput()
                {
                    Rho   = new DoubleRange(0.0, 10.0, 101),
                    Z     = new DoubleRange(0.0, 10.0, 101),
                    Angle = new DoubleRange(-Math.PI / 2, Math.PI / 2, 5)
                }
            };

            _inputOneRegionTissue = new SimulationInput(
                100,
                "",
                simulationOptions,
                source,
                new MultiLayerTissueInput(
                    new ITissueRegion[]
            {
                new LayerRegion(
                    new DoubleRange(double.NegativeInfinity, 0.0),
                    new OpticalProperties(0.0, 1e-10, 1.0, 1.0)),
                new LayerRegion(
                    new DoubleRange(0.0, 20.0),
                    new OpticalProperties(0.01, 1.0, 0.8, 1.4)),
                new LayerRegion(
                    new DoubleRange(20.0, double.PositiveInfinity),
                    new OpticalProperties(0.0, 1e-10, 1.0, 1.0))
            }
                    ),
                detectors);
            _outputOneRegionTissue = new MonteCarloSimulation(_inputOneRegionTissue).Run();

            _inputTwoRegionTissue = new SimulationInput(
                100,
                "",
                simulationOptions,
                source,
                new SingleEllipsoidTissueInput(
                    new EllipsoidRegion(
                        new Position(0, 0, 1),
                        0.5,
                        0.5,
                        0.5,
                        new OpticalProperties(0.01, 1.0, 0.8, 1.4) //debug with g=1
                        ),
                    new LayerRegion[]
            {
                new LayerRegion(
                    new DoubleRange(double.NegativeInfinity, 0.0),
                    new OpticalProperties(0.0, 1e-10, 1.0, 1.0)),
                new LayerRegion(
                    new DoubleRange(0.0, 20.0),                  // debug with thin slab d=2
                    new OpticalProperties(0.01, 1.0, 0.8, 1.4)), // debug with g=1
                new LayerRegion(
                    new DoubleRange(20.0, double.PositiveInfinity),
                    new OpticalProperties(0.0, 1e-10, 1.0, 1.0))
            }
                    ),
                detectors);
            _outputTwoRegionTissue = new MonteCarloSimulation(_inputTwoRegionTissue).Run();

            _factor = 1.0 - Optics.Specular(
                _inputOneRegionTissue.TissueInput.Regions[0].RegionOP.N,
                _inputOneRegionTissue.TissueInput.Regions[1].RegionOP.N);
        }