Ejemplo n.º 1
0
        /// <summary>
        /// generic volume virtual boundary, used to capture all internal volume detectors e.g. FluenceOfRhoAndZ
        /// </summary>
        /// <param name="tissue">ITissue</param>
        /// <param name="detectorController">IDetectorController</param>
        /// <param name="name">string name</param>
        public GenericVolumeVirtualBoundary(ITissue tissue, IDetectorController detectorController, string name)
        {
            VirtualBoundaryType = VirtualBoundaryType.GenericVolumeBoundary;
            PhotonStateType     = PhotonStateType.PseudoGenericVolumeVirtualBoundary;

            _detectorController = detectorController;

            Name = name;
        }
Ejemplo n.º 2
0
        //    /// <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);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// class for perturbation Monte Carlo (pMC) diffuse reflectance virtual boundary
        /// </summary>
        /// <param name="tissue">ITissue</param>
        /// <param name="detectorController">IDetectorController</param>
        /// <param name="name">string name</param>
        public pMCDiffuseReflectanceVirtualBoundary(ITissue tissue, IDetectorController detectorController, string name)
        {
            _zPlanePosition = ((LayerTissueRegion)tissue.Regions[0]).ZRange.Stop;

            WillHitBoundary = dp =>
                              dp.StateFlag.HasFlag(PhotonStateType.PseudoReflectedTissueBoundary) &&
                              dp.Direction.Uz < 0 &&
                              Math.Abs(dp.Position.Z - _zPlanePosition) < 10E-16;

            VirtualBoundaryType = VirtualBoundaryType.pMCDiffuseReflectance;
            PhotonStateType     = PhotonStateType.PseudoDiffuseReflectanceVirtualBoundary;

            _detectorController = detectorController;

            Name = name;
        }
 /// <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;
 }
Ejemplo n.º 5
0
        /// <summary>
        /// generic volume virtual boundary, used to capture all internal volume detectors
        /// </summary>
        /// <param name="tissue">ITissue</param>
        /// <param name="detectorController">IDetectorController</param>
        /// <param name="name">string name</param>
        public GenericVolumeVirtualBoundary(ITissue tissue, IDetectorController detectorController, string name)
        {
            //_zPlanePosition = ((LayerTissueRegion)tissue.Regions[0]).ZRange.Stop;

            //WillHitBoundary = dp =>
            //            dp.StateFlag.Has(PhotonStateType.Transmitted) &&
            //            dp.Direction.Uz < 0 &&
            //            Math.Abs(dp.Position.Z - _zPlanePosition) < 10E-16;

            VirtualBoundaryType = VirtualBoundaryType.GenericVolumeBoundary;
            PhotonStateType     = PhotonStateType.PseudoGenericVolumeVirtualBoundary;

            _detectorController = detectorController;

            Name = name;
        }
        /// <summary>
        /// diffuse transmittance VB
        /// </summary>
        /// <param name="tissue">ITissue</param>
        /// <param name="detectorController">IDetectorController</param>
        /// <param name="name">string name</param>
        public DiffuseTransmittanceVirtualBoundary(ITissue tissue, IDetectorController detectorController, string name)
        {
            _zPlanePosition = ((LayerTissueRegion)tissue.Regions.Where(r => r is LayerTissueRegion).Last()).ZRange.Start;

            WillHitBoundary = dp =>
                              dp.StateFlag.HasFlag(PhotonStateType.PseudoTransmittedTissueBoundary) &&
                              dp.Direction.Uz > 0 &&
                              Math.Abs(dp.Position.Z - _zPlanePosition) < 10E-16;

            VirtualBoundaryType = VirtualBoundaryType.DiffuseTransmittance;
            PhotonStateType     = PhotonStateType.PseudoDiffuseTransmittanceVirtualBoundary;

            _detectorController = detectorController;

            Name = name;
        }
Ejemplo n.º 7
0
        /// <summary>
        /// diffuse reflectance VB
        /// </summary>
        /// <param name="tissue">ITissue</param>
        /// <param name="detectorController">IDetectorController</param>
        /// <param name="name">string name</param>
        public BoundingCylinderVirtualBoundary(ITissue tissue, IDetectorController detectorController, string name)
        {
            _boundingTissueRegion = tissue.Regions[tissue.Regions.Count - 1]; // bounding region always last by convention
            _center = _boundingTissueRegion.Center;
            _radius = ((CaplessCylinderTissueRegion)_boundingTissueRegion).Radius;

            WillHitBoundary = dp =>
                              dp.StateFlag.HasFlag(PhotonStateType.PseudoBoundingVolumeTissueBoundary) &&
                              _boundingTissueRegion.ContainsPosition(dp.Position);

            VirtualBoundaryType = VirtualBoundaryType.BoundingCylinderVolume;
            PhotonStateType     = PhotonStateType.PseudoBoundingCylinderVolumeVirtualBoundary;

            _detectorController = detectorController;

            Name = name;
        }
        /// <summary>
        /// Radiance virtual boundary
        /// </summary>
        /// <param name="detectorController">IDetectorController</param>
        /// <param name="name">string name</param>
        public RadianceVirtualBoundary(IDetectorController detectorController, string name)
        {
            _detectorController = detectorController;

            // not sure following is best design
            // todo: revisit design (dc 6/10/12)
            IDetector dosimetryDetector = DetectorController.Detectors.Where(d => d.TallyDetails.IsInternalSurfaceTally).FirstOrDefault();

            if (dosimetryDetector != null)
            {
                _zPlanePosition = ((dynamic)dosimetryDetector).ZDepth;

                WillHitBoundary = dp =>
                                  dp.StateFlag.HasFlag(PhotonStateType.PseudoReflectedTissueBoundary) &&
                                  dp.Direction.Uz > 0 &&
                                  Math.Abs(dp.Position.Z - _zPlanePosition) < 10E-16;

                VirtualBoundaryType = VirtualBoundaryType.Dosimetry;
                PhotonStateType     = PhotonStateType.PseudoSurfaceRadianceVirtualBoundary;

                Name = name;
            }
        }