/// <summary> /// Method to read photon database from file /// </summary> /// <param name="virtualBoundaryType">VB type</param> /// <param name="filePath">path to database file</param> /// <returns>PhotonDatabase read</returns> public static PhotonDatabase GetPhotonDatabase( VirtualBoundaryType virtualBoundaryType, string filePath) { string dbFilename; switch (virtualBoundaryType) { case VirtualBoundaryType.DiffuseReflectance: dbFilename = Path.Combine(filePath, "DiffuseReflectanceDatabase"); break; case VirtualBoundaryType.DiffuseTransmittance: dbFilename = Path.Combine(filePath, "DiffuseTransmittanceDatabase"); break; case VirtualBoundaryType.SpecularReflectance: dbFilename = Path.Combine(filePath, "SpecularReflectanceDatabase"); break; case VirtualBoundaryType.pMCDiffuseReflectance: //pMC uses same exit db as regular post-processing dbFilename = Path.Combine(filePath, "DiffuseReflectanceDatabase"); break; default: return(null); } if (!File.Exists(dbFilename)) { throw new FileNotFoundException("\nThe database file could not be found: " + dbFilename); } return(PhotonDatabase.FromFile(dbFilename)); }
/// <summary> /// Creates an instance of PhotonDatabasePostProcessor for standard (photon) database processing /// </summary> /// <param name="virtualBoundaryType">virtual boundary type</param> /// <param name="detectorInputs">List of IDetectorInputs designating binning</param> /// <param name="photonDatabase">PhotonTerminationDatabase</param> /// <param name="databaseInput">Database information needed for post-processing</param> public PhotonDatabasePostProcessor( VirtualBoundaryType virtualBoundaryType, IList <IDetectorInput> detectorInputs, PhotonDatabase photonDatabase, SimulationInput databaseInput) : this(virtualBoundaryType, detectorInputs, databaseInput) { _photonDatabase = photonDatabase; _ispMCPostProcessor = false; }
/// <summary> /// Method to determine if specular surface VB or not /// </summary> /// <param name="virtualBoundaryType">VB type</param> /// <returns></returns> public static bool IsSpecularSurfaceVirtualBoundary(this VirtualBoundaryType virtualBoundaryType) { switch (virtualBoundaryType) { case VirtualBoundaryType.SpecularReflectance: return(true); default: return(false); } }
/// <summary> /// Method to determine if transmittance surface VB or not /// </summary> /// <param name="virtualBoundaryType">VB type</param> /// <returns>true if transmittance surface VB, false if not</returns> public static bool IsTransmittanceSurfaceVirtualBoundary(this VirtualBoundaryType virtualBoundaryType) { switch (virtualBoundaryType) { case VirtualBoundaryType.DiffuseTransmittance: return(true); default: return(false); } }
/// <summary> /// Method to determine if generic volume VB or not /// </summary> /// <param name="virtualBoundaryType">VB type</param> /// <returns>true if generic volume VB, false if not</returns> public static bool IsGenericVolumeVirtualBoundary(this VirtualBoundaryType virtualBoundaryType) { switch (virtualBoundaryType) { case VirtualBoundaryType.GenericVolumeBoundary: return(true); default: return(false); } }
/// <summary> /// Method to determine if internal surface VB or not /// </summary> /// <param name="virtualBoundaryType">VB type </param> /// <returns>true if internal surface VB, false if not</returns> public static bool IsInternalSurfaceVirtualBoundary(this VirtualBoundaryType virtualBoundaryType) { switch (virtualBoundaryType) { case VirtualBoundaryType.SurfaceRadiance: return(true); default: return(false); } }
/// <summary> /// Method to determine if dosimetry VB or not /// </summary> /// <param name="virtualBoundaryType">VB type </param> /// <returns>true if internal surface VB, false if not</returns> public static bool IsDosimetryVirtualBoundary(this VirtualBoundaryType virtualBoundaryType) { switch (virtualBoundaryType) { case VirtualBoundaryType.Dosimetry: return(true); default: return(false); } }
/// <summary> /// Method to determine if VB is surface reflectance VB or not /// </summary> /// <param name="virtualBoundaryType">VB type</param> /// <returns>true of surface reflectance VB, false if not</returns> public static bool IsReflectanceSurfaceVirtualBoundary(this VirtualBoundaryType virtualBoundaryType) { switch (virtualBoundaryType) { case VirtualBoundaryType.DiffuseReflectance: case VirtualBoundaryType.pMCDiffuseReflectance: return(true); default: return(false); } }
/// <summary> /// Method to read perturbation Monte Carlo (pMC) photon database from file /// </summary> /// <param name="virtualBoundaryType">VB type</param> /// <param name="filePath">path to database file</param> /// <returns>PhotonDatabase read</returns> public static pMCDatabase GetpMCDatabase( VirtualBoundaryType virtualBoundaryType, string filePath) { switch (virtualBoundaryType) { case VirtualBoundaryType.pMCDiffuseReflectance: return(pMCDatabase.FromFile(Path.Combine(filePath, "DiffuseReflectanceDatabase"), Path.Combine(filePath, "CollisionInfoDatabase"))); default: return(null); } }
// /// <summary> // /// This static method instantiates a list of virtual boundaries // /// and the appropriate detectors are deposited into it. // /// </summary> // /// <param name="detectors"></param> // /// <returns></returns> // public static IList<IVirtualBoundary> GetVirtualBoundaries( // IList<IVirtualBoundaryInput> virtualBoundaryGroups, ITissue tissue, bool tallySecondMoment) // { // // this sql returns all VBs even when only RSpecularDetector in detectors // //var virtualBoundaries = // // from vb in EnumHelper.GetValues<VirtualBoundaryType>() // for each virtual boundary type // // where detectors.Select(d => d.TallyType.AppliesToBoundary(vb)).First() // where any detectors apply // // let vbDetectors = detectors.Where(d => d.TallyType.AppliesToBoundary(vb)).ToList() // gather the appropriate detectors // // select GetVirtualBoundary(vb, tissue, vbDetectors); // and instantiate the vb with the appropriate detectors // var virtualBoundaries = new List<IVirtualBoundary>(); // foreach (var vbg in virtualBoundaryGroups) // { // var detectors = DetectorFactory.GetDetectors( // vbg.DetectorInputs, tissue, tallySecondMoment); // var detectorController = DetectorControllerFactory.GetDetectorController( // vbg.VirtualBoundaryType, detectors); // if (detectors.Count > 0) // { // var vb = GetVirtualBoundary(vbg.VirtualBoundaryType, tissue, detectorController); // if (vb != null) // virtualBoundaries.Add(vb); // } // } // return virtualBoundaries.ToList(); // } /// <summary> /// method that gets appropriate VB /// </summary> /// <param name="vbType">VirtualBoundaryType</param> /// <param name="tissue">ITissue</param> /// <param name="detectorController">IDetectorController</param> /// <returns>IVirtualBoundary</returns> public static IVirtualBoundary GetVirtualBoundary( VirtualBoundaryType vbType, ITissue tissue, IDetectorController detectorController) { IVirtualBoundary vb = null; // todo: predicate defines switch (vbType) { case VirtualBoundaryType.DiffuseReflectance: vb = new DiffuseReflectanceVirtualBoundary( tissue, detectorController, VirtualBoundaryType.DiffuseReflectance.ToString()); break; case VirtualBoundaryType.DiffuseTransmittance: vb = new DiffuseTransmittanceVirtualBoundary( tissue, detectorController, VirtualBoundaryType.DiffuseTransmittance.ToString()); break; case VirtualBoundaryType.SpecularReflectance: // reflecting off first layer without transporting in medium vb = new SpecularReflectanceVirtualBoundary( tissue, detectorController, VirtualBoundaryType.SpecularReflectance.ToString()); break; case VirtualBoundaryType.SurfaceRadiance: vb = new RadianceVirtualBoundary( detectorController, VirtualBoundaryType.SurfaceRadiance.ToString()); break; case VirtualBoundaryType.GenericVolumeBoundary: vb = new GenericVolumeVirtualBoundary( tissue, detectorController, VirtualBoundaryType.GenericVolumeBoundary.ToString()); break; case VirtualBoundaryType.pMCDiffuseReflectance: vb = new pMCDiffuseReflectanceVirtualBoundary( tissue, detectorController, VirtualBoundaryType.DiffuseReflectance.ToString()); break; case VirtualBoundaryType.BoundingCylinderVolume: vb = new BoundingCylinderVirtualBoundary( tissue, detectorController, VirtualBoundaryType.BoundingCylinderVolume.ToString()); break; default: throw new ArgumentOutOfRangeException("Virtual boundary type not recognized: " + vbType); } return(vb); }
/// <summary> /// Method to determine if perturbation Monte Carlo (pMC) VB or not /// </summary> /// <param name="virtualBoundaryType">VB type</param> /// <returns>true if pMC VB, false if not</returns> public static bool IspMCVirtualBoundary(this VirtualBoundaryType virtualBoundaryType) { switch (virtualBoundaryType) { case VirtualBoundaryType.pMCDiffuseReflectance: return(true); default: case VirtualBoundaryType.DiffuseReflectance: case VirtualBoundaryType.DiffuseTransmittance: case VirtualBoundaryType.SpecularReflectance: case VirtualBoundaryType.SurfaceRadiance: return(false); } }
/// <summary> /// Creates an instance of a plane tranmission virtual boundary in direction given /// </summary> public PlanarReflectionVirtualBoundary( Predicate <PhotonDataPoint> willHitBoundary, VirtualBoundaryAxisType axis, VirtualBoundaryDirectionType direction, double planeValue, VirtualBoundaryType type, string name) { WillHitBoundary = willHitBoundary; _axis = axis; _direction = direction; _planeValue = planeValue; _detectorController = new DetectorController(new List <IDetector>()); Name = name; VirtualBoundaryType = type; }
/// <summary> /// method that returns an IDetectorController given the VBType, list of detectors and tissue /// </summary> /// <param name="virtualBoundaryType">virtual boundary type</param> /// <param name="detectors">IEnumerable of IDetector</param> /// <param name="tissue">ITissue</param> /// <returns>IDetectorController</returns> public static IDetectorController GetDetectorController(VirtualBoundaryType virtualBoundaryType, IEnumerable <IDetector> detectors, ITissue tissue) { switch (virtualBoundaryType) { case VirtualBoundaryType.DiffuseReflectance: case VirtualBoundaryType.DiffuseTransmittance: case VirtualBoundaryType.SpecularReflectance: case VirtualBoundaryType.SurfaceRadiance: case VirtualBoundaryType.pMCDiffuseReflectance: return(new DetectorController(detectors)); case VirtualBoundaryType.GenericVolumeBoundary: return(new HistoryDetectorController((from d in detectors where d is IHistoryDetector select(IHistoryDetector) d).ToList(), tissue)); default: throw new ArgumentOutOfRangeException("virtualBoundaryType"); } }
/// <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> /// constructor for the collision info database writer /// </summary> /// <param name="virtualBoundaryType">virtual boundary type</param> /// <param name="filename">name of database filename</param> /// <param name="numberOfSubRegions">number of subregions in tissue</param> public CollisionInfoDatabaseWriter(VirtualBoundaryType virtualBoundaryType, string filename, int numberOfSubRegions) : base(filename, new CollisionInfoDatabase(numberOfSubRegions), new CollisionInfoSerializer(numberOfSubRegions)) { VirtualBoundaryType = virtualBoundaryType; }
/// <summary> /// constructor for photon database writer /// </summary> /// <param name="virtualBoundaryType">virtual boundary type</param> /// <param name="filename">database filename</param> public PhotonDatabaseWriter(VirtualBoundaryType virtualBoundaryType, string filename) : base(filename, new PhotonDatabase(), new PhotonDataPointSerializer()) { VirtualBoundaryType = virtualBoundaryType; }