private static ValidationResult ValidateTissueInput(ITissueInput tissueInput)
        {
            // for all types of tissues, check that OPs are non-negative (g could be neg)
            if (tissueInput.Regions.Any(r => r.RegionOP.Mua < 0.0) ||
                tissueInput.Regions.Any(r => r.RegionOP.Musp < 0.0) ||
                tissueInput.Regions.Any(r => r.RegionOP.N < 0.0))
            {
                return(new ValidationResult(
                           false,
                           "Tissue optical properties mua, mus', n need to be non-negative",
                           "Please check optical properties"));
            }
            if (tissueInput is MultiLayerTissueInput)
            {
                return(MultiLayerTissueInputValidation.ValidateInput(tissueInput));
            }
            if (tissueInput is SingleEllipsoidTissueInput)
            {
                return(SingleEllipsoidTissueInputValidation.ValidateInput(tissueInput));
            }
            if (tissueInput is SingleVoxelTissueInput)
            {
                return(SingleVoxelTissueInputValidation.ValidateInput(tissueInput));
            }
            if (tissueInput is BoundingCylinderTissueInput)
            {
                return(BoundingCylinderTissueInputValidation.ValidateInput(tissueInput));
            }

            return(new ValidationResult(
                       true,
                       "Tissue input must be valid",
                       "Validation skipped for tissue input " + tissueInput + ". No matching validation rules were found."));
        }
Esempio n. 2
0
        public void setup_simulation_input_components()
        {
            // delete previously generated files
            clear_folders_and_files();

            _detectorInputs = new List <IDetectorInput>()
            {
                new ROfRhoAndTimeDetectorInput()
                {
                    Rho  = new DoubleRange(0.0, 10.0, 101),
                    Time = new DoubleRange(0.0, 1, 101)
                }
            };
            _sourceInput = new DirectionalPointSourceInput(
                new Position(0.0, 0.0, 0.0),
                new Direction(0.0, 0.0, 1.0),
                1);
            _tissueInput = new MultiLayerTissueInput(
                new ITissueRegion[]
            {
                new LayerTissueRegion(
                    new DoubleRange(double.NegativeInfinity, 0.0),
                    new OpticalProperties(0.0, 1e-10, 0.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, 0.0, 1.0))
            }
                );
        }
Esempio n. 3
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="input"></param>
        public FemMultiRegionTissueViewModel(ITissueInput input)
        {
            _input = input;

            switch (input.TissueType)
            {
            case "MultiEllipsoid":
                var multiEllipsoidTissueInput = ((MultiEllipsoidTissueInput)_input);
                _tissueRegionsVM = new ObservableCollection <object>(
                    multiEllipsoidTissueInput.LayerRegions.Select((r, i) => (object)new LayerRegionViewModel(
                                                                      (LayerTissueRegion)r,
                                                                      "Layer " + i + (r.IsAir() ? " (Air)" : " (Tissue)"))));
                _inclusionRegionsVM = new ObservableCollection <object>(
                    multiEllipsoidTissueInput.EllipsoidRegions.Select((r, i) => (object)new EllipsoidRegionViewModel(
                                                                          (EllipsoidTissueRegion)r,
                                                                          "Inclusion " + i + (r.IsAir() ? " (Air)" : " (Tissue)"))));
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            _currentTissueRegionIndex    = 0;
            _currentInclusionRegionIndex = 0;
        }
        public MultiRegionTissueViewModel(ITissueInput input)
        {
            _input = input;

            switch (input.TissueType)
            {
            case "MultiLayer":
                var multiLayerTissueInput = ((MultiLayerTissueInput)_input);
                _regionsVM = new ObservableCollection <object>(
                    multiLayerTissueInput.Regions.Select((r, i) => (object)new LayerRegionViewModel(
                                                             (LayerTissueRegion)r,
                                                             "Layer " + i)));
                break;

            case "SingleEllipsoid":
                var singleEllipsoidTissueInput = ((SingleEllipsoidTissueInput)_input);
                _regionsVM = new ObservableCollection <object>(
                    singleEllipsoidTissueInput.LayerRegions
                    .Select((r, i) => (object)new LayerRegionViewModel(
                                (LayerTissueRegion)r,
                                "Layer " + i))
                    .Concat(new EllipsoidRegionViewModel((EllipsoidTissueRegion)singleEllipsoidTissueInput.EllipsoidRegion,
                                                         "Ellipsoid Region")));
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            _currentRegionIndex = 0;
        }
Esempio n. 5
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="tissueInput"></param>
        private void UpdateTissueInputVM(ITissueInput tissueInput)
        {
            switch (tissueInput.TissueType)
            {
            case "MultiEllipsoid":
                TissueInputVM = new FemMultiRegionTissueViewModel(tissueInput);
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
Esempio n. 6
0
        // todo: revisit to make signatures here and in Tissue/TissueInput class signatures strongly typed
        /// <summary>
        /// Method to return ITissue given inputs
        /// </summary>
        /// <param name="ti">ITissueInput</param>
        /// <param name="awt">AbsorptionWeightingType enum</param>
        /// <param name="pft">PhaseFunctionType enum</param>
        /// <param name="russianRouletteWeightThreshold">Russian Roulette weight threshold</param>
        /// <returns>ITissue</returns>
        public static ITissue GetTissue(ITissueInput ti, AbsorptionWeightingType awt, PhaseFunctionType pft, double russianRouletteWeightThreshold)
        {
            ITissue t = ti.CreateTissue(awt, pft, russianRouletteWeightThreshold);

            if (t == null)
            {
                throw new ArgumentException(
                          "Problem generating ITissue instance. Check that TissueInput, ti, has a matching ITissue definition.");
            }

            return(t);
        }
Esempio n. 7
0
        /// <summary>
        /// Method to validate that the tissue layers are contiguous and don't overlap
        /// </summary>
        /// <param name="input">tissue input in SimulationInput</param>
        /// <returns></returns>
        public static ValidationResult ValidateInput(ITissueInput input)
        {
            var layers = input.Regions.Select(region => (LayerTissueRegion)region).ToArray();

            // other stuff could go here...
            var tempResult = ValidateLayers(layers);

            if (tempResult.IsValid)
            {
                tempResult = ValidateTopAndBottomLayersAreAir(layers);
            }
            return(tempResult);
        }
 /// <summary>
 /// General constructor for simulation inputs
 /// </summary>
 /// <param name="meshDataInput">Input data for spatial and angular mesh</param>
 /// <param name="simulationOptionsInput">Mesh simulation options input</param>
 /// <param name="extSourceInput">Specifying external source</param>
 /// <param name="intSourceInput">Specifying internal source</param>
 /// <param name="tissueInput">Specifying tissue definition</param>
 public SimulationInput(
     SquareMeshDataInput meshDataInput,
     MeshSimulationOptions simulationOptionsInput,
     IExtFemSourceInput extSourceInput,
     IIntFemSourceInput intSourceInput,
     ITissueInput tissueInput
     )
 {
     MeshDataInput          = meshDataInput;
     SimulationOptionsInput = simulationOptionsInput;
     ExtSourceInput         = extSourceInput;
     IntSourceInput         = intSourceInput;
     TissueInput            = tissueInput;
 }
Esempio n. 9
0
 /// <summary>
 /// Monte Carlo simulation input data
 /// </summary>
 /// <param name="numberOfPhotons">long number indicating number of photons launched from source</param>
 /// <param name="outputName">string indicating output name</param>
 /// <param name="simulationOptions">options to execute simulation</param>
 /// <param name="sourceInput">ISourceInput specifying source of light</param>
 /// <param name="tissueInput">ITissueInput specifying tissue definition</param>
 /// <param name="detectorInputs">IDetectorInput specifying which detectors to tally</param>
 public SimulationInput(
     long numberOfPhotons,
     string outputName,
     SimulationOptions simulationOptions,
     ISourceInput sourceInput,
     ITissueInput tissueInput,
     IList <IDetectorInput> detectorInputs)
 {
     N              = numberOfPhotons;
     OutputName     = outputName;
     Options        = simulationOptions;
     SourceInput    = sourceInput;
     TissueInput    = tissueInput;
     DetectorInputs = detectorInputs ?? new List <IDetectorInput>();
 }
        public MultiRegionTissueViewModel(ITissueInput input)
        {
            _currentRegionIndex = 0;
            _input = input;

            switch (input.TissueType)
            {
            case "MultiLayer":
                var multiLayerTissueInput = (MultiLayerTissueInput)_input;
                _regionsVM = new ObservableCollection <object>(
                    multiLayerTissueInput.Regions.Select((r, i) => (object)new LayerRegionViewModel(
                                                             (LayerTissueRegion)r,
                                                             StringLookup.GetLocalizedString("Label_Layer") + i)));
                break;

            case "SingleEllipsoid":
                var singleEllipsoidTissueInput = (SingleEllipsoidTissueInput)_input;
                _regionsVM = new ObservableCollection <object>(
                    singleEllipsoidTissueInput.LayerRegions
                    .Select((r, i) => (object)new LayerRegionViewModel(
                                (LayerTissueRegion)r,
                                StringLookup.GetLocalizedString("Label_Layer") + i))
                    .Concat(
                        new EllipsoidRegionViewModel(
                            (EllipsoidTissueRegion)singleEllipsoidTissueInput.EllipsoidRegion,
                            StringLookup.GetLocalizedString("Label_EllipsoidRegion"))));
                break;

            case "SingleVoxel":
                var singleVoxelTissueInput = (SingleVoxelTissueInput)_input;
                _regionsVM = new ObservableCollection <object>(
                    singleVoxelTissueInput.LayerRegions
                    .Select((r, i) => (object)new LayerRegionViewModel(
                                (LayerTissueRegion)r,
                                StringLookup.GetLocalizedString("Label_Layer") + i))
                    .Concat(
                        new VoxelRegionViewModel(
                            (VoxelTissueRegion)singleVoxelTissueInput.VoxelRegion,
                            StringLookup.GetLocalizedString("Label_VoxelRegion"))));
                break;

            default:
                throw new InvalidEnumArgumentException(StringLookup.GetLocalizedString("Error_NoTissueTypeExists"));
            }
        }
        /// <summary>
        /// Main validation method for SingleVoxelTissueInput.
        /// </summary>
        /// <param name="input">tissue input defined in SimulationInput</param>
        /// <returns>ValidationResult</returns>
        public static ValidationResult ValidateInput(ITissueInput input)
        {
            var layers = ((SingleVoxelTissueInput)input).LayerRegions.Select(region => (LayerTissueRegion)region).ToArray();
            var voxel  = (VoxelTissueRegion)((SingleVoxelTissueInput)input).VoxelRegion;
            ValidationResult tempResult;

            tempResult = ValidateGeometry(layers, voxel);
            if (!tempResult.IsValid)
            {
                return(tempResult);
            }
            tempResult = ValidateRefractiveIndexMatch(layers, voxel);
            if (!tempResult.IsValid)
            {
                return(tempResult);
            }
            return(tempResult);
        }
        /// <summary>
        /// Main validation method for BoundingCylinderTissueInput.
        /// </summary>
        /// <param name="input">tissue input defined in SimulationInput</param>
        /// <returns>ValidationResult</returns>
        public static ValidationResult ValidateInput(ITissueInput input)
        {
            var layers           = ((BoundingCylinderTissueInput)input).LayerRegions.Select(region => (LayerTissueRegion)region).ToArray();
            var boundingCylinder = (CaplessCylinderTissueRegion)((BoundingCylinderTissueInput)input).CylinderRegion;
            ValidationResult tempResult;

            tempResult = ValidateGeometry(layers, boundingCylinder);
            if (!tempResult.IsValid)
            {
                return(tempResult);
            }
            tempResult = ValidateRefractiveIndexMatch(layers, boundingCylinder);
            if (!tempResult.IsValid)
            {
                return(tempResult);
            }
            return(tempResult);
        }
Esempio n. 13
0
        private static ValidationResult ValidateTissueInput(ITissueInput tissueInput)
        {
            if (tissueInput is MultiLayerTissueInput)
            {
                return(MultiLayerTissueInputValidation.ValidateInput(tissueInput));
            }
            if (tissueInput is SingleEllipsoidTissueInput)
            {
                return(SingleEllipsoidTissueInputValidation.ValidateInput(tissueInput));
            }
            if (tissueInput is SingleVoxelTissueInput)
            {
                return(SingleVoxelTissueInputValidation.ValidateInput(tissueInput));
            }

            return(new ValidationResult(
                       true,
                       "Tissue input must be valid",
                       "Validation skipped for tissue input " + tissueInput + ". No matching validation rules were found."));
        }
 /// <summary>
 /// Monte Carlo simulation input data
 /// </summary>
 /// <param name="numberOfPhotons">long number indicating number of photons launched from source</param>
 /// <param name="outputName">string indicating output name</param>
 /// <param name="simulationOptions">options to execute simulation</param>
 /// <param name="sourceInput">ISourceInput specifying source of light</param>
 /// <param name="tissueInput">ITissueInput specifying tissue definition</param>
 /// <param name="detectorInputs">IDetectorInput specifying which detectors to tally</param>
 public SimulationInput(
     long numberOfPhotons,
     string outputName,
     SimulationOptions simulationOptions,
     ISourceInput sourceInput,
     ITissueInput tissueInput,
     IList <IDetectorInput> detectorInputs)
 {
     N              = numberOfPhotons;
     OutputName     = outputName;
     Options        = simulationOptions;
     SourceInput    = sourceInput;
     TissueInput    = tissueInput;
     DetectorInputs = detectorInputs;
     // check if detectorInputs list is null and if so make empty
     if (DetectorInputs == null)
     {
         DetectorInputs = new List <IDetectorInput>()
         {
         };
     }
 }
 private static ValidationResult ValidateSourceInput(ISourceInput sourceInput, ITissueInput tissueInput)
 {
     if ((sourceInput.InitialTissueRegionIndex < 0) ||
         (sourceInput.InitialTissueRegionIndex > tissueInput.Regions.Length - 1))
     {
         return(new ValidationResult(
                    false,
                    "Source input not valid given tissue definition",
                    "Alter sourceInput.InitialTissueRegionIndex to be consistent with tissue definition"));
     }
     else
     {
         return(new ValidationResult(
                    true,
                    "Starting photons in region " + sourceInput.InitialTissueRegionIndex));
     }
 }
Esempio n. 16
0
        public void execute_Monte_Carlo()
        {
            // instantiate common classes
            _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);
            _source = new DirectionalPointSourceInput(
                new Position(0.0, 0.0, 0.0),
                new Direction(0.0, 0.0, 1.0),
                1);

            _tissue =
                new MultiLayerWithSurfaceFiberTissueInput(
                    new SurfaceFiberTissueRegion(
                        new Position(0, 0, 0),
                        _detectorRadius, // needs to match SurfaceFiberDetectorInput
                        new OpticalProperties(0.01, 1.0, 0.8, 1.4)
                        ),
                    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, 100.0),
                    new OpticalProperties(0.01, 1.0, 0.8, 1.4)),
                new LayerTissueRegion(
                    new DoubleRange(100.0, double.PositiveInfinity),
                    new OpticalProperties(0.0, 1e-10, 1.0, 1.0))
            }
                    );
            // tissue specification to verify MultiLayerWithSurfaceFiberTissue
            // increases reflectance.  If use this tissue need to change FinalTissueRegion
            // for ALL detectors to 0
            //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, 100.0),
            //            new OpticalProperties(0.01, 1.0, 0.8, 1.4)),
            //        new LayerTissueRegion(
            //            new DoubleRange(100.0, double.PositiveInfinity),
            //            new OpticalProperties(0.0, 1e-10, 1.0, 1.0))
            //    }
            //);

            _detectorOpen = new List <IDetectorInput>
            {
                new SurfaceFiberDetectorInput()
                {
                    Center            = new Position(0, 0, 0),
                    Radius            = _detectorRadius,
                    TallySecondMoment = true,
                    N  = 1.4,
                    NA = 1.4,
                    FinalTissueRegionIndex = 3
                },
                new ROfRhoDetectorInput() // 1mm wide ring to match fiber and 2 because beyond goes into 2nd
                {
                    Rho = new DoubleRange(0.0, 2 * _detectorRadius, 3),
                    // since tissue w fiber specified -> photon will be in 3 upon exit
                    FinalTissueRegionIndex = 3,
                    NA = 1.4,
                    TallySecondMoment = true
                },
            };
            _detectorNA = new List <IDetectorInput>
            {
                new SurfaceFiberDetectorInput()
                {
                    Center            = new Position(0, 0, 0),
                    Radius            = _detectorRadius,
                    TallySecondMoment = true,
                    N = 1.4,
                    FinalTissueRegionIndex = 3,
                    NA = 0.39
                },
                new ROfRhoDetectorInput() // ring to match fiber detector
                {
                    Rho = new DoubleRange(0.0, 2 * _detectorRadius, 3),
                    // since tissue w fiber specified -> photon will be in 3 upon exit
                    FinalTissueRegionIndex = 3,
                    NA = 0.39,
                    TallySecondMoment = true
                },
            };
            _detectorNAOffCenter = new List <IDetectorInput>
            {
                new SurfaceFiberDetectorInput()
                {
                    Center            = new Position(_detectorRadius, 0, 0), // diam = [0, 2*radius]
                    Radius            = _detectorRadius,
                    TallySecondMoment = true,
                    N = 1.4,
                    FinalTissueRegionIndex = 3,
                    NA = 1.4
                },
                new ROfRhoDetectorInput() // ring to match fiber detector
                {
                    // place 1st rho bin center at _detectorRadius with width = 2*radius
                    Rho = new DoubleRange(_detectorRadius / 2, 2 * _detectorRadius + _detectorRadius / 2, 3),
                    // since tissue w fiber specified -> photon will be in 3 upon exit
                    FinalTissueRegionIndex = 3,
                    NA = 1.4,
                    TallySecondMoment = true
                },
            };
            var _inputOpen = new SimulationInput(
                100,
                "",
                _simulationOptions,
                _source,
                _tissue,
                _detectorOpen);

            _outputOpen = new MonteCarloSimulation(_inputOpen).Run();

            var _inputNA = new SimulationInput(
                100,
                "",
                _simulationOptions,
                _source,
                _tissue,
                _detectorNA);

            _outputNA = new MonteCarloSimulation(_inputNA).Run();

            var _inputNAOffCenter = new SimulationInput(
                100,
                "",
                _simulationOptions,
                _source,
                _tissue,
                _detectorNAOffCenter);

            _outputNAOffCenter = new MonteCarloSimulation(_inputNAOffCenter).Run();
        }