public void validate_static_method_updatedirectionafterrotatingaroundyaxis()
        {
            var dir = _direction.Clone();

            SourceToolbox.UpdateDirectionAfterRotatingAroundYAxis(_angRot.YRotation, dir);

            Assert.Less(Math.Abs(dir.Ux - _tp[91]), ACCEPTABLE_PRECISION);
            Assert.Less(Math.Abs(dir.Uy - _tp[92]), ACCEPTABLE_PRECISION);
            Assert.Less(Math.Abs(dir.Uz - _tp[93]), ACCEPTABLE_PRECISION);
        }
        /// <summary>
        /// Implements Get next photon
        /// </summary>
        /// <param name="tissue">tissue</param>
        /// <returns>photon</returns>
        public Photon GetNextPhoton(ITissue tissue)
        {
            //Sample emitting side
            String cSide = SelectEmittingSurface(
                _cubeLengthX,
                _cubeWidthY,
                _cubeHeightZ,
                Rng);

            //sample angular distribution
            Direction finalDirection = SourceToolbox.GetDirectionForGivenPolarAzimuthalAngleRangeRandom(
                _polarAngleEmissionRange,
                SourceDefaults.DefaultAzimuthalAngleRange.Clone(),
                Rng);

            Position tempPosition  = null;
            Position finalPosition = null;

            switch (cSide)
            {
            case "xpos":
                tempPosition    = GetFinalPosition(_beamDiameterFWHM, _cubeHeightZ, _cubeWidthY, Rng);
                finalPosition.X = 0.5 * _cubeLengthX;
                finalPosition.Y = tempPosition.Y;
                finalPosition.Z = tempPosition.X;
                finalDirection  = SourceToolbox.UpdateDirectionAfterRotatingAroundXAxis(0.5 * Math.PI, finalDirection);
                break;

            case "xneg":
                tempPosition    = GetFinalPosition(_beamDiameterFWHM, _cubeHeightZ, _cubeWidthY, Rng);
                finalPosition.X = -0.5 * _cubeLengthX;
                finalPosition.Y = tempPosition.Y;
                finalPosition.Z = tempPosition.X;
                finalDirection  = SourceToolbox.UpdateDirectionAfterRotatingAroundXAxis(-0.5 * Math.PI, finalDirection);
                break;

            case "ypos":
                tempPosition    = GetFinalPosition(_beamDiameterFWHM, _cubeLengthX, _cubeHeightZ, Rng);
                finalPosition.X = tempPosition.X;
                finalPosition.Y = 0.5 * _cubeWidthY;
                finalPosition.Z = tempPosition.Y;
                finalDirection  = SourceToolbox.UpdateDirectionAfterRotatingAroundYAxis(0.5 * Math.PI, finalDirection);
                break;

            case "yneg":
                tempPosition    = GetFinalPosition(_beamDiameterFWHM, _cubeLengthX, _cubeHeightZ, Rng);
                finalPosition.X = tempPosition.X;
                finalPosition.Y = -0.5 * _cubeWidthY;
                finalPosition.Z = tempPosition.Y;
                finalDirection  = SourceToolbox.UpdateDirectionAfterRotatingAroundYAxis(-0.5 * Math.PI, finalDirection);
                break;

            case "zpos":
                tempPosition    = GetFinalPosition(_beamDiameterFWHM, _cubeLengthX, _cubeWidthY, Rng);
                finalPosition.X = tempPosition.X;
                finalPosition.Y = tempPosition.Y;
                finalPosition.Z = 0.5 * _cubeHeightZ;
                break;

            case "zneg":
                tempPosition    = GetFinalPosition(_beamDiameterFWHM, _cubeLengthX, _cubeWidthY, Rng);
                finalPosition.X = tempPosition.X;
                finalPosition.Y = tempPosition.Y;
                finalPosition.Z = -0.5 * _cubeHeightZ;
                //reverse signs
                finalDirection.Uz = -finalDirection.Uz;
                break;
            }

            //Find the relevent polar and azimuthal pair for the direction
            PolarAzimuthalAngles _rotationalAnglesOfPrincipalSourceAxis = SourceToolbox.GetPolarAzimuthalPairFromDirection(_newDirectionOfPrincipalSourceAxis);

            //Translation and source rotation
            SourceToolbox.UpdateDirectionPositionAfterGivenFlags(
                ref finalPosition,
                ref finalDirection,
                _rotationalAnglesOfPrincipalSourceAxis,
                _translationFromOrigin,
                _rotationAndTranslationFlags);

            var photon = new Photon(finalPosition, finalDirection, tissue, _initialTissueRegionIndex, Rng);

            return(photon);
        }