/// <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; }