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.")); }
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)) } ); }
/// <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; }
/// <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(); } }
// 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); }
/// <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; }
/// <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); }
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)); } }
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(); }