/// <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");
        }
Example #2
0
 /// <summary>
 /// Creates an instance of PhotonDatabasePostProcessor for pMC database processing
 /// </summary>
 /// <param name="virtualBoundaryType">virtual boundary type</param>
 /// <param name="detectorInputs">List of IDetectorInputs designating binning</param>
 /// <param name="database">pMCDatabase</param>
 /// <param name="databaseInput">Database information needed for post-processing</param>
 public PhotonDatabasePostProcessor(
     VirtualBoundaryType virtualBoundaryType,
     IList <IDetectorInput> detectorInputs,
     pMCDatabase database,
     SimulationInput databaseInput)
     : this(virtualBoundaryType, detectorInputs, databaseInput)
 {
     _pMCDatabase        = database;
     _ispMCPostProcessor = true;
 }
Example #3
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");
        }
Example #4
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();
        }