179 const G4Step* pStep = &aStep;
183 if (hStep) pStep = hStep;
234 std::vector<G4Navigator*>::iterator iNav =
236 GetActiveNavigatorsIterator();
238 (iNav[hNavId])->GetGlobalExitNormal(theGlobalPoint,&valid);
246 ed <<
" G4OpBoundaryProcess/PostStepDoIt(): "
247 <<
" The Navigator reports that it returned an invalid normal"
249 G4Exception(
"G4OpBoundaryProcess::PostStepDoIt",
"OpBoun01",
251 "Invalid Surface Normal - Geometry must return valid surface normal");
255 #ifdef G4OPTICAL_DEBUG
257 ed <<
" G4OpBoundaryProcess/PostStepDoIt(): "
258 <<
" theGlobalNormal points in a wrong direction. "
260 ed <<
" The momentum of the photon arriving at interface (oldMomentum)"
261 <<
" must exit the volume cross in the step. " <<
G4endl;
262 ed <<
" So it MUST have dot < 0 with the normal that Exits the new volume (globalNormal)." <<
G4endl;
267 G4Exception(
"G4OpBoundaryProcess::PostStepDoIt",
"OpBoun02",
270 "Invalid Surface Normal - Geometry must return valid surface normal pointing in the right direction");
280 if (aMaterialPropertiesTable) {
281 Rindex = aMaterialPropertiesTable->
GetProperty(
"RINDEX");
320 if (Surface == NULL){
349 GetMaterialPropertiesTable();
351 if (aMaterialPropertiesTable) {
355 Rindex = aMaterialPropertiesTable->
GetProperty(
"RINDEX");
369 aMaterialPropertiesTable->
GetProperty(
"REFLECTIVITY");
371 aMaterialPropertiesTable->
GetProperty(
"REALRINDEX");
373 aMaterialPropertiesTable->
GetProperty(
"IMAGINARYRINDEX");
390 aMaterialPropertiesTable->
GetProperty(
"EFFICIENCY");
397 aMaterialPropertiesTable->
GetProperty(
"TRANSMITTANCE");
403 if (aMaterialPropertiesTable->
404 ConstPropertyExists(
"SURFACEROUGHNESS"))
406 GetConstProperty(
"SURFACEROUGHNESS");
410 aMaterialPropertiesTable->
GetProperty(
"SPECULARLOBECONSTANT");
419 aMaterialPropertiesTable->
GetProperty(
"SPECULARSPIKECONSTANT");
428 aMaterialPropertiesTable->
GetProperty(
"BACKSCATTERCONSTANT");
453 aMaterialPropertiesTable =
455 if (aMaterialPropertiesTable)
456 Rindex = aMaterialPropertiesTable->
GetProperty(
"RINDEX");
518 G4cerr <<
" Error: G4BoundaryProcess: illegal boundary type " <<
G4endl;
558 G4cout <<
" *** TotalInternalReflection *** " <<
G4endl;
568 G4cout <<
" *** PolishedLumirrorAirReflection *** " <<
G4endl;
570 G4cout <<
" *** PolishedLumirrorGlueReflection *** " <<
G4endl;
574 G4cout <<
" *** PolishedTeflonAirReflection *** " <<
G4endl;
576 G4cout <<
" *** PolishedTiOAirReflection *** " <<
G4endl;
578 G4cout <<
" *** PolishedTyvekAirReflection *** " <<
G4endl;
580 G4cout <<
" *** PolishedVM2000AirReflection *** " <<
G4endl;
582 G4cout <<
" *** PolishedVM2000GlueReflection *** " <<
G4endl;
584 G4cout <<
" *** EtchedLumirrorAirReflection *** " <<
G4endl;
586 G4cout <<
" *** EtchedLumirrorGlueReflection *** " <<
G4endl;
590 G4cout <<
" *** EtchedTeflonAirReflection *** " <<
G4endl;
594 G4cout <<
" *** EtchedTyvekAirReflection *** " <<
G4endl;
596 G4cout <<
" *** EtchedVM2000AirReflection *** " <<
G4endl;
598 G4cout <<
" *** EtchedVM2000GlueReflection *** " <<
G4endl;
600 G4cout <<
" *** GroundLumirrorAirReflection *** " <<
G4endl;
602 G4cout <<
" *** GroundLumirrorGlueReflection *** " <<
G4endl;
606 G4cout <<
" *** GroundTeflonAirReflection *** " <<
G4endl;
610 G4cout <<
" *** GroundTyvekAirReflection *** " <<
G4endl;
612 G4cout <<
" *** GroundVM2000AirReflection *** " <<
G4endl;
614 G4cout <<
" *** GroundVM2000GlueReflection *** " <<
G4endl;
650 if (sigma_alpha == 0.0)
return FacetNormal = Normal;
654 G4double phi, SinAlpha, CosAlpha, SinPhi, CosPhi, unit_x, unit_y, unit_z;
665 SinAlpha = std::sin(alpha);
666 CosAlpha = std::cos(alpha);
667 SinPhi = std::sin(phi);
668 CosPhi = std::cos(phi);
670 unit_x = SinAlpha * CosPhi;
671 unit_y = SinAlpha * SinPhi;
674 FacetNormal.setX(unit_x);
675 FacetNormal.setY(unit_y);
676 FacetNormal.setZ(unit_z);
680 FacetNormal.rotateUz(tmpNormal);
682 }
while (Momentum * FacetNormal >= 0.0);
697 }
while (smear.mag()>1.0);
698 smear = (1.-polish) * smear;
699 FacetNormal = Normal + smear;
701 }
while (Momentum * FacetNormal >= 0.0);
702 FacetNormal = FacetNormal.unit();
705 FacetNormal = Normal;
775 A_trans = A_trans.unit();
780 A_paral = A_paral.unit();
806 G4int thetaIndex, phiIndex;
807 G4double AngularDistributionValue, thetaRad, phiRad, EdotN;
808 G4ThreeVector PerpendicularVectorTheta, PerpendicularVectorPhi;
835 G4int angleIncident =
G4int(std::floor(180/
pi*anglePhotonToNormal+0.5));
840 thetaIndex = G4RandFlat::shootInt(thetaIndexMax-1);
841 phiIndex = G4RandFlat::shootInt(phiIndexMax-1);
844 GetAngularDistributionValue(angleIncident,
850 thetaRad = (-90 + 4*thetaIndex)*
pi/180;
851 phiRad = (-90 + 5*phiIndex)*
pi/180;
857 PerpendicularVectorTheta =
NewMomentum.orthogonal();
860 PerpendicularVectorTheta);
861 PerpendicularVectorPhi =
880 G4double angleIncident = std::floor(180/
pi*anglePhotonToNormal+0.5);
898 ed <<
" G4OpBoundaryProcess/DielectricDichroic(): "
899 <<
" The dichroic surface has no G4Physics2DVector"
901 G4Exception(
"G4OpBoundaryProcess::DielectricDichroic",
"OpBoun03",
903 "A dichroic surface must have an associated G4Physics2DVector");
945 G4bool SurfaceRoughnessCriterionPass = 1;
948 G4double SurfaceRoughnessCriterion =
950 SurfaceRoughnessCriterionPass =
963 G4double s1, s2, E2_perp, E2_parl, E2_total, TransCoeff;
1002 if (Swap) Swap = !Swap;
1006 if ( !SurfaceRoughnessCriterionPass )
theStatus =
1028 else if (
sint2 < 1.0) {
1041 A_trans = A_trans.unit();
1043 E1pp = E1_perp * A_trans;
1045 E1_parl = E1pl.mag();
1059 E2_total = E2_perp*E2_perp + E2_parl*E2_parl;
1063 else if (cost1 != 0.0) TransCoeff = s2/s1;
1064 else TransCoeff = 0.0;
1070 if (Swap) Swap = !Swap;
1074 if ( !SurfaceRoughnessCriterionPass )
theStatus =
1095 E2_perp = E2_perp - E1_perp;
1096 E2_total = E2_perp*E2_perp + E2_parl*E2_parl;
1098 A_paral = A_paral.unit();
1099 E2_abs = std::sqrt(E2_total);
1100 C_parl = E2_parl/E2_abs;
1101 C_perp = E2_perp/E2_abs;
1131 NewMomentum = NewMomentum.unit();
1133 A_paral = NewMomentum.cross(A_trans);
1134 A_paral = A_paral.unit();
1135 E2_abs = std::sqrt(E2_total);
1136 C_parl = E2_parl/E2_abs;
1137 C_perp = E2_perp/E2_abs;
1164 if (Inside && !Swap) {
1217 G4double magN= theFacetNormal.mag();
1218 G4double incidentangle =
pi - std::acos(PdotN/(magP*magN));
1220 return incidentangle;
1229 G4complex Reflectivity, Reflectivity_TE, Reflectivity_TM;
1243 aMaterialPropertiesTable->
GetProperty(
"REALRINDEX");
1245 aMaterialPropertiesTable->
GetProperty(
"IMAGINARYRINDEX");
1246 if (aPropertyPointerR && aPropertyPointerI) {
1255 CosPhi=std::sqrt(u-((std::sin(incidentangle)*std::sin(incidentangle))*(N1*N1)/(N2*N2)));
1257 numeratorTE = N1*std::cos(incidentangle) - N2*CosPhi;
1258 denominatorTE = N1*std::cos(incidentangle) + N2*CosPhi;
1259 rTE = numeratorTE/denominatorTE;
1261 numeratorTM = N2*std::cos(incidentangle) - N1*CosPhi;
1262 denominatorTM = N2*std::cos(incidentangle) + N1*CosPhi;
1263 rTM = numeratorTM/denominatorTM;
1270 Reflectivity_TE = (rTE*conj(rTE))*(E1_perp*E1_perp)
1271 / (E1_perp*E1_perp + E1_parl*E1_parl);
1272 Reflectivity_TM = (rTM*conj(rTM))*(E1_parl*E1_parl)
1273 / (E1_perp*E1_perp + E1_parl*E1_parl);
1274 Reflectivity = Reflectivity_TE + Reflectivity_TM;
1277 if(
G4UniformRand()*real(Reflectivity) > real(Reflectivity_TE))
1278 {
iTE = -1;}
else{
iTE = 1;}
1279 if(
G4UniformRand()*real(Reflectivity) > real(Reflectivity_TM))
1280 {
iTM = -1;}
else{
iTM = 1;}
1284 return real(Reflectivity);
1317 A_trans = A_trans.unit();
1319 E1pp = E1_perp * A_trans;
1321 E1_parl = E1pl.mag();
1340 RealRindex, ImaginaryRindex);
1350 if (sd)
return sd->
Hit(&aStep);
G4double condition(const G4ErrorSymMatrix &m)
void DielectricDielectric()
G4double theSurfaceRoughness
ThreeVector shoot(const G4int Ap, const G4int Af)
void G4SwapObj(T *a, T *b)
G4OpticalSurfaceModel GetModel() const
G4double GetReflectivity(G4double E1_perp, G4double E1_parl, G4double incidentangle, G4double RealRindex, G4double ImaginaryRindex)
std::ostringstream G4ExceptionDescription
CLHEP::Hep3Vector G4ThreeVector
G4Physics2DVector * DichroicVector
G4double GetVelocity() const
const G4DynamicParticle * GetDynamicParticle() const
static constexpr double perCent
G4StepStatus GetStepStatus() const
G4Material * GetMaterial() const
G4OpticalSurface * OpticalSurface
G4double GetSurfaceTolerance() const
G4VParticleChange * PostStepDoIt(const G4Track &aTrack, const G4Step &aStep)
void ProposePolarization(G4double Px, G4double Py, G4double Pz)
const G4SurfaceType & GetType() const
G4OpBoundaryProcessStatus
G4OpBoundaryProcess(const G4String &processName="OpBoundary", G4ProcessType type=fOptical)
G4MaterialPropertyVector * PropertyPointer1
G4OpticalSurfaceFinish theFinish
void ProposeLocalEnergyDeposit(G4double anEnergyPart)
static constexpr double twopi
static G4LogicalBorderSurface * GetSurface(const G4VPhysicalVolume *vol1, const G4VPhysicalVolume *vol2)
G4double GetTotalMomentum() const
G4ThreeVector NewPolarization
G4StepPoint * GetPreStepPoint() const
static G4int GetHypNavigatorID()
G4OpBoundaryProcessStatus theStatus
std::complex< G4double > G4complex
G4ThreeVector OldMomentum
G4GLOB_DLL std::ostream G4cout
G4double Value(G4double x, G4double y, size_t &lastidx, size_t &lastidy) const
G4double GetPolish() const
G4VPhysicalVolume * GetPhysicalVolume() const
const G4String & GetName() const
const G4ThreeVector & GetPosition() const
G4ThreeVector OldPolarization
G4int GetPhiIndexMax(void) const
G4bool G4BooleanRand(const G4double prob) const
const G4ThreeVector & GetMomentumDirection() const
G4double thePhotonMomentum
G4bool Hit(G4Step *aStep)
void SetProcessSubType(G4int)
G4double GetMeanFreePath(const G4Track &, G4double, G4ForceCondition *condition)
G4double theTransmittance
void BoundaryProcessVerbose(void) const
G4LogicalVolume * GetMotherLogical() const
G4double Value(G4double theEnergy, size_t &lastidx) const
const G4String & GetProcessName() const
G4OpticalSurfaceFinish GetFinish() const
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
static G4TransportationManager * GetTransportationManager()
G4OpticalSurfaceModel theModel
G4bool InvokeSD(const G4Step *step)
virtual void Initialize(const G4Track &)
G4ThreeVector NewMomentum
G4LogicalVolume * GetLogicalVolume() const
G4MaterialPropertyVector * PropertyPointer
G4Physics2DVector * GetDichroicVector()
void G4SwapPtr(T *&a, T *&b)
static constexpr double nm
void DielectricDichroic()
G4MaterialPropertiesTable * GetMaterialPropertiesTable() const
G4StepPoint * GetPostStepPoint() const
void AddTotalEnergyDeposit(G4double value)
const G4ThreeVector & GetPolarization() const
G4ParticleChange aParticleChange
T min(const T t1, const T t2)
brief Return the smallest of the two arguments
G4double GetIncidentAngle()
G4ThreeVector theFacetNormal
G4SurfaceProperty * GetSurfaceProperty() const
static constexpr double pi
G4VSensitiveDetector * GetSensitiveDetector() const
static constexpr double halfpi
void ProposeMomentumDirection(G4double Px, G4double Py, G4double Pz)
G4MaterialPropertyVector * PropertyPointer2
G4ThreeVector theGlobalNormal
void ProposeTrackStatus(G4TrackStatus status)
G4double GetSigmaAlpha() const
static const G4double alpha
void ProposeVelocity(G4double finalVelocity)
void CalculateReflectivity(void)
G4int GetThetaIndexMax(void) const
virtual G4VParticleChange * PostStepDoIt(const G4Track &, const G4Step &)
G4MaterialPropertyVector * GetProperty(const char *key)
G4double GetStepLength() const
static G4GeometryTolerance * GetInstance()
static const G4Step * GetHyperStep()
G4GLOB_DLL std::ostream G4cerr
G4ThreeVector GetFacetNormal(const G4ThreeVector &Momentum, const G4ThreeVector &Normal) const
static G4LogicalSkinSurface * GetSurface(const G4LogicalVolume *vol)