/// <summary> /// default constructor for Photon /// </summary> public Photon() : this( new Position(0, 0, 0), new Direction(0, 0, 1), new MultiLayerTissue(), 0, RandomNumberGeneratorFactory.GetRandomNumberGenerator(RandomNumberGeneratorType.MersenneTwister) ) { }
public void validate_IsWithinNA_returns_correct_eta_c_value_per_Bargo() { Random rng; rng = RandomNumberGeneratorFactory.GetRandomNumberGenerator( RandomNumberGeneratorType.MersenneTwister, 0); double NA0p22 = 0.22; double NA0p39 = 0.39; double NAOpen = Double.PositiveInfinity; double NA0p22_count = 0; double NA0p39_count = 0; double NAOpen_count = 0; double detectorRegionN = 1.4; for (int i = 0; i < 1000000; i++) { double randomUz = -rng.NextDouble(); var direction = new Direction(0, 0, randomUz); var DP = new PhotonDataPoint( new Position(0, 0, 0), direction, 1.0, // weight: not used 1.0, // photon time of flight: note used PhotonStateType.Alive); if (DP.IsWithinNA(NA0p22, Direction.AlongNegativeZAxis, detectorRegionN)) { NA0p22_count = NA0p22_count + randomUz; } if (DP.IsWithinNA(NA0p39, Direction.AlongNegativeZAxis, detectorRegionN)) { NA0p39_count = NA0p39_count + randomUz; } if (DP.IsWithinNA(NAOpen, Direction.AlongNegativeZAxis, detectorRegionN)) { NAOpen_count = NAOpen_count + randomUz; } } double eta_c = NA0p22_count / NAOpen_count; Assert.Less(Math.Abs(eta_c - (NA0p22 / detectorRegionN) * (NA0p22 / detectorRegionN)), 0.001); eta_c = NA0p39_count / NAOpen_count; Assert.Less(Math.Abs(eta_c - (NA0p39 / detectorRegionN) * (NA0p39 / detectorRegionN)), 0.001); }
/// <summary> /// Shared constructor for both pMC and standard (photon) databases /// </summary> /// <param name="virtualBoundaryType"></param> /// <param name="detectorInputs">List of IDetectorInputs designating binning</param> /// <param name="databaseInput">Database information needed for post-processing</param> private PhotonDatabasePostProcessor( VirtualBoundaryType virtualBoundaryType, IList <IDetectorInput> detectorInputs, SimulationInput databaseInput) { _rng = RandomNumberGeneratorFactory.GetRandomNumberGenerator( RandomNumberGeneratorType.MersenneTwister, -1); // -1 = random seed _virtualBoundaryType = virtualBoundaryType; _databaseInput = databaseInput; _tissue = Factories.TissueFactory.GetTissue( databaseInput.TissueInput, databaseInput.Options.AbsorptionWeightingType, databaseInput.Options.PhaseFunctionType, databaseInput.Options.RussianRouletteWeightThreshold); _detectors = DetectorFactory.GetDetectors(detectorInputs, _tissue, _rng); _detectorController = new DetectorController(_detectors); }
/// <summary> /// Class that takes in SimulationInput and methods to initialize and execute Monte Carlo simulation /// </summary> /// <param name="input">SimulationInput</param> public MonteCarloSimulation(SimulationInput input) { _outputPath = ""; // all field/property defaults should be set here _input = input; var result = SimulationInputValidation.ValidateInput(_input); if (result.IsValid == false) { throw new ArgumentException(result.ValidationRule + (!string.IsNullOrEmpty(result.Remarks) ? "; " + result.Remarks : "")); } _numberOfPhotons = input.N; AbsorptionWeightingType = input.Options.AbsorptionWeightingType; // CKH add 12/14/09 TrackStatistics = input.Options.TrackStatistics; if (TrackStatistics) { _simulationStatistics = new SimulationStatistics(); } _rng = RandomNumberGeneratorFactory.GetRandomNumberGenerator( input.Options.RandomNumberGeneratorType, input.Options.Seed); this.SimulationIndex = input.Options.SimulationIndex; _tissue = TissueFactory.GetTissue(input.TissueInput, input.Options.AbsorptionWeightingType, input.Options.PhaseFunctionType, input.Options.RussianRouletteWeightThreshold); _source = SourceFactory.GetSource(input.SourceInput, _rng); // instantiate vb (and associated detectors) for each vb group _virtualBoundaryController = new VirtualBoundaryController(new List <IVirtualBoundary>()); List <VirtualBoundaryType> dbVirtualBoundaries = input.Options.Databases.Select(db => db.GetCorrespondingVirtualBoundaryType()).ToList(); foreach (var vbType in EnumHelper.GetValues <VirtualBoundaryType>()) { IEnumerable <IDetectorInput> detectorInputs = null; switch (vbType) { case VirtualBoundaryType.DiffuseReflectance: default: detectorInputs = input.DetectorInputs.Where(d => d.TallyDetails.IsReflectanceTally).ToList(); break; case VirtualBoundaryType.DiffuseTransmittance: detectorInputs = input.DetectorInputs.Where(d => d.TallyDetails.IsTransmittanceTally).ToList(); break; case VirtualBoundaryType.SpecularReflectance: detectorInputs = input.DetectorInputs.Where(d => d.TallyDetails.IsSpecularReflectanceTally).ToList(); break; case VirtualBoundaryType.GenericVolumeBoundary: detectorInputs = input.DetectorInputs.Where(d => d.TallyDetails.IsVolumeTally).ToList(); break; case VirtualBoundaryType.SurfaceRadiance: detectorInputs = input.DetectorInputs.Where(d => d.TallyDetails.IsInternalSurfaceTally).ToList(); break; case VirtualBoundaryType.pMCDiffuseReflectance: detectorInputs = input.DetectorInputs.Where(d => d.TallyDetails.IspMCReflectanceTally).ToList(); break; case VirtualBoundaryType.BoundingCylinderVolume: detectorInputs = input.DetectorInputs.Where(d => d.TallyDetails.IsBoundingVolumeTally).ToList(); break; } // make sure VB Controller has at least diffuse reflectance and diffuse transmittance // may change this in future if tissue OnDomainBoundary changes if ((detectorInputs.Count() > 0) || (vbType == VirtualBoundaryType.DiffuseReflectance) || (vbType == VirtualBoundaryType.DiffuseTransmittance) || (dbVirtualBoundaries.Any(vb => vb == vbType))) { var detectors = DetectorFactory.GetDetectors(detectorInputs, _tissue, _rng); var detectorController = DetectorControllerFactory.GetDetectorController(vbType, detectors, _tissue); // var detectorController = new DetectorController(detectors); var virtualBoundary = VirtualBoundaryFactory.GetVirtualBoundary(vbType, _tissue, detectorController); _virtualBoundaryController.VirtualBoundaries.Add(virtualBoundary); } } // needed? //_detectorControllers = _virtualBoundaryController.VirtualBoundaries.Select(vb=>vb.DetectorController).ToList(); // set doPMC flag if (input.Options.Databases.Any(d => d.IspMCDatabase())) { doPMC = true; } _isCancelled = false; _isRunning = false; _resultsAvailable = false; }