174 const G4Step* pStep = &aStep;
178 if (hStep) pStep = hStep;
229 std::vector<G4Navigator*>::iterator iNav =
231 GetActiveNavigatorsIterator();
233 (iNav[hNavId])->GetGlobalExitNormal(theGlobalPoint,&valid);
241 ed <<
" G4OpBoundaryProcess/PostStepDoIt(): "
242 <<
" The Navigator reports that it returned an invalid normal"
244 G4Exception(
"G4OpBoundaryProcess::PostStepDoIt",
"OpBoun01",
246 "Invalid Surface Normal - Geometry must return valid surface normal");
250 #ifdef G4OPTICAL_DEBUG
252 ed <<
" G4OpBoundaryProcess/PostStepDoIt(): "
253 <<
" theGlobalNormal points in a wrong direction. "
255 ed <<
" The momentum of the photon arriving at interface (oldMomentum)"
256 <<
" must exit the volume cross in the step. " <<
G4endl;
257 ed <<
" So it MUST have dot < 0 with the normal that Exits the new volume (globalNormal)." <<
G4endl;
262 G4Exception(
"G4OpBoundaryProcess::PostStepDoIt",
"OpBoun02",
265 "Invalid Surface Normal - Geometry must return valid surface normal pointing in the right direction");
275 if (aMaterialPropertiesTable) {
276 Rindex = aMaterialPropertiesTable->
GetProperty(
"RINDEX");
313 if (Surface == NULL){
342 GetMaterialPropertiesTable();
344 if (aMaterialPropertiesTable) {
348 Rindex = aMaterialPropertiesTable->
GetProperty(
"RINDEX");
362 aMaterialPropertiesTable->
GetProperty(
"REFLECTIVITY");
364 aMaterialPropertiesTable->
GetProperty(
"REALRINDEX");
366 aMaterialPropertiesTable->
GetProperty(
"IMAGINARYRINDEX");
383 aMaterialPropertiesTable->
GetProperty(
"EFFICIENCY");
390 aMaterialPropertiesTable->
GetProperty(
"TRANSMITTANCE");
398 aMaterialPropertiesTable->
GetProperty(
"SPECULARLOBECONSTANT");
407 aMaterialPropertiesTable->
GetProperty(
"SPECULARSPIKECONSTANT");
416 aMaterialPropertiesTable->
GetProperty(
"BACKSCATTERCONSTANT");
441 aMaterialPropertiesTable =
443 if (aMaterialPropertiesTable)
444 Rindex = aMaterialPropertiesTable->
GetProperty(
"RINDEX");
505 G4cerr <<
" Error: G4BoundaryProcess: illegal boundary type " <<
G4endl;
543 G4cout <<
" *** TotalInternalReflection *** " <<
G4endl;
553 G4cout <<
" *** PolishedLumirrorAirReflection *** " <<
G4endl;
555 G4cout <<
" *** PolishedLumirrorGlueReflection *** " <<
G4endl;
559 G4cout <<
" *** PolishedTeflonAirReflection *** " <<
G4endl;
561 G4cout <<
" *** PolishedTiOAirReflection *** " <<
G4endl;
563 G4cout <<
" *** PolishedTyvekAirReflection *** " <<
G4endl;
565 G4cout <<
" *** PolishedVM2000AirReflection *** " <<
G4endl;
567 G4cout <<
" *** PolishedVM2000GlueReflection *** " <<
G4endl;
569 G4cout <<
" *** EtchedLumirrorAirReflection *** " <<
G4endl;
571 G4cout <<
" *** EtchedLumirrorGlueReflection *** " <<
G4endl;
575 G4cout <<
" *** EtchedTeflonAirReflection *** " <<
G4endl;
579 G4cout <<
" *** EtchedTyvekAirReflection *** " <<
G4endl;
581 G4cout <<
" *** EtchedVM2000AirReflection *** " <<
G4endl;
583 G4cout <<
" *** EtchedVM2000GlueReflection *** " <<
G4endl;
585 G4cout <<
" *** GroundLumirrorAirReflection *** " <<
G4endl;
587 G4cout <<
" *** GroundLumirrorGlueReflection *** " <<
G4endl;
591 G4cout <<
" *** GroundTeflonAirReflection *** " <<
G4endl;
595 G4cout <<
" *** GroundTyvekAirReflection *** " <<
G4endl;
597 G4cout <<
" *** GroundVM2000AirReflection *** " <<
G4endl;
599 G4cout <<
" *** GroundVM2000GlueReflection *** " <<
G4endl;
635 if (sigma_alpha == 0.0)
return FacetNormal = Normal;
642 }
while (
G4UniformRand()*f_max > std::sin(alpha) || alpha >= halfpi );
646 G4double SinAlpha = std::sin(alpha);
647 G4double CosAlpha = std::cos(alpha);
651 G4double unit_x = SinAlpha * CosPhi;
652 G4double unit_y = SinAlpha * SinPhi;
655 FacetNormal.setX(unit_x);
656 FacetNormal.setY(unit_y);
657 FacetNormal.setZ(unit_z);
661 FacetNormal.rotateUz(tmpNormal);
662 }
while (Momentum * FacetNormal >= 0.0);
676 }
while (smear.mag()>1.0);
677 smear = (1.-polish) * smear;
678 FacetNormal = Normal + smear;
679 }
while (Momentum * FacetNormal >= 0.0);
680 FacetNormal = FacetNormal.unit();
683 FacetNormal = Normal;
752 A_trans = A_trans.unit();
757 A_paral = A_paral.unit();
782 G4int thetaIndex, phiIndex;
783 G4double AngularDistributionValue, thetaRad, phiRad, EdotN;
784 G4ThreeVector PerpendicularVectorTheta, PerpendicularVectorPhi;
800 G4int angleIncident =
G4int(std::floor(180/
pi*anglePhotonToNormal+0.5));
805 thetaIndex = G4RandFlat::shootInt(thetaIndexMax-1);
806 phiIndex = G4RandFlat::shootInt(phiIndexMax-1);
809 GetAngularDistributionValue(angleIncident,
814 thetaRad = (-90 + 4*thetaIndex)*
pi/180;
815 phiRad = (-90 + 5*phiIndex)*
pi/180;
820 PerpendicularVectorPhi =
824 PerpendicularVectorTheta =
NewMomentum.orthogonal();
825 PerpendicularVectorPhi =
830 PerpendicularVectorTheta);
846 G4double angleIncident = std::floor(180/
pi*anglePhotonToNormal+0.5);
864 ed <<
" G4OpBoundaryProcess/DielectricDichroic(): "
865 <<
" The dichroic surface has no G4Physics2DVector"
867 G4Exception(
"G4OpBoundaryProcess::DielectricDichroic",
"OpBoun03",
869 "A dichroic surface must have an associated G4Physics2DVector");
926 if (Swap) Swap = !Swap;
949 else if (
sint2 < 1.0) {
965 A_trans = A_trans.unit();
967 E1pp = E1_perp * A_trans;
969 E1_parl = E1pl.mag();
983 G4double E2_total = E2_perp*E2_perp + E2_parl*E2_parl;
989 else if (cost1 != 0.0) TransCoeff = s2/s1;
990 else TransCoeff = 0.0;
998 if (Swap) Swap = !Swap;
1020 E2_perp = E2_perp - E1_perp;
1021 E2_total = E2_perp*E2_perp + E2_parl*E2_parl;
1023 A_paral = A_paral.unit();
1024 E2_abs = std::sqrt(E2_total);
1025 C_parl = E2_parl/E2_abs;
1026 C_perp = E2_perp/E2_abs;
1056 NewMomentum = NewMomentum.unit();
1058 A_paral = NewMomentum.cross(A_trans);
1059 A_paral = A_paral.unit();
1060 E2_abs = std::sqrt(E2_total);
1061 C_parl = E2_parl/E2_abs;
1062 C_perp = E2_perp/E2_abs;
1088 if (Inside && !Swap) {
1134 G4double magN= theFacetNormal.mag();
1135 G4double incidentangle =
pi - std::acos(PdotN/(magP*magN));
1137 return incidentangle;
1147 G4complex Reflectivity, Reflectivity_TE, Reflectivity_TM;
1148 G4complex N(RealRindex, ImaginaryRindex);
1161 CosPhi=std::sqrt(u-((std::sin(incidentangle)*std::sin(incidentangle))/(N*N)));
1163 numeratorTE = std::cos(incidentangle) - N*CosPhi;
1164 denominatorTE = std::cos(incidentangle) + N*CosPhi;
1165 rTE = numeratorTE/denominatorTE;
1167 numeratorTM = N*std::cos(incidentangle) - CosPhi;
1168 denominatorTM = N*std::cos(incidentangle) + CosPhi;
1169 rTM = numeratorTM/denominatorTM;
1176 Reflectivity_TE = (rTE*conj(rTE))*(E1_perp*E1_perp)
1177 / (E1_perp*E1_perp + E1_parl*E1_parl);
1178 Reflectivity_TM = (rTM*conj(rTM))*(E1_parl*E1_parl)
1179 / (E1_perp*E1_perp + E1_parl*E1_parl);
1180 Reflectivity = Reflectivity_TE + Reflectivity_TM;
1183 if(
G4UniformRand()*real(Reflectivity) > real(Reflectivity_TE))
1184 {
iTE = -1;}
else{
iTE = 1;}
1185 if(
G4UniformRand()*real(Reflectivity) > real(Reflectivity_TM))
1186 {
iTM = -1;}
else{
iTM = 1;}
1189 return real(Reflectivity);
1222 A_trans = A_trans.unit();
1224 E1pp = E1_perp * A_trans;
1226 E1_parl = E1pl.mag();
1245 RealRindex, ImaginaryRindex);
1255 if (sd)
return sd->
Hit(&aStep);
G4double condition(const G4ErrorSymMatrix &m)
void DielectricDielectric()
ThreeVector shoot(const G4int Ap, const G4int Af)
void G4SwapObj(T *a, T *b)
G4MaterialPropertyVector * GetProperty(const char *key)
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
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 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)
static const double perCent
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)
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
G4VSensitiveDetector * GetSensitiveDetector() const
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 &)
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)