116 theReflectivity = 1.;
118 theTransmittance = 0.;
120 theSurfaceRoughness = 0.;
126 PropertyPointer = NULL;
127 PropertyPointer1 = NULL;
128 PropertyPointer2 = NULL;
133 OpticalSurface = NULL;
139 thePhotonMomentum = 0.;
140 Rindex1 = Rindex2 = 1.;
141 cost1 = cost2 = sint1 = sint2 = 0.;
144 DichroicVector = NULL;
179 const G4Step* pStep = &aStep;
183 if (hStep) pStep = hStep;
221 G4cout <<
" Old Momentum Direction: " << OldMomentum <<
G4endl;
222 G4cout <<
" Old Polarization: " << OldPolarization <<
G4endl;
234 std::vector<G4Navigator*>::iterator iNav =
236 GetActiveNavigatorsIterator();
238 (iNav[hNavId])->GetGlobalExitNormal(theGlobalPoint,&valid);
241 theGlobalNormal = -theGlobalNormal;
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");
254 if (OldMomentum * theGlobalNormal > 0.0) {
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;
263 ed <<
" >> The dot product of oldMomentum and global Normal is " << OldMomentum*theGlobalNormal <<
G4endl;
264 ed <<
" Old Momentum (during step) = " << OldMomentum <<
G4endl;
265 ed <<
" Global Normal (Exiting New Vol) = " << theGlobalNormal <<
G4endl;
267 G4Exception(
"G4OpBoundaryProcess::PostStepDoIt",
"OpBoun02",
270 "Invalid Surface Normal - Geometry must return valid surface normal pointing in the right direction");
272 theGlobalNormal = -theGlobalNormal;
280 if (aMaterialPropertiesTable) {
281 Rindex = aMaterialPropertiesTable->
GetProperty(
"RINDEX");
292 Rindex1 = Rindex->
Value(thePhotonMomentum);
302 theReflectivity = 1.;
304 theTransmittance = 0.;
306 theSurfaceRoughness = 0.;
314 OpticalSurface = NULL;
320 if (Surface == NULL){
339 if (Surface) OpticalSurface =
342 if (OpticalSurface) {
344 type = OpticalSurface->
GetType();
345 theModel = OpticalSurface->
GetModel();
348 aMaterialPropertiesTable = OpticalSurface->
349 GetMaterialPropertiesTable();
351 if (aMaterialPropertiesTable) {
355 Rindex = aMaterialPropertiesTable->
GetProperty(
"RINDEX");
357 Rindex2 = Rindex->
Value(thePhotonMomentum);
369 aMaterialPropertiesTable->
GetProperty(
"REFLECTIVITY");
371 aMaterialPropertiesTable->
GetProperty(
"REALRINDEX");
373 aMaterialPropertiesTable->
GetProperty(
"IMAGINARYRINDEX");
378 if (PropertyPointer) {
381 PropertyPointer->
Value(thePhotonMomentum);
383 }
else if (PropertyPointer1 && PropertyPointer2) {
385 CalculateReflectivity();
390 aMaterialPropertiesTable->
GetProperty(
"EFFICIENCY");
391 if (PropertyPointer) {
393 PropertyPointer->
Value(thePhotonMomentum);
397 aMaterialPropertiesTable->
GetProperty(
"TRANSMITTANCE");
398 if (PropertyPointer) {
400 PropertyPointer->
Value(thePhotonMomentum);
403 if (aMaterialPropertiesTable->
404 ConstPropertyExists(
"SURFACEROUGHNESS"))
405 theSurfaceRoughness = aMaterialPropertiesTable->
406 GetConstProperty(
"SURFACEROUGHNESS");
410 aMaterialPropertiesTable->
GetProperty(
"SPECULARLOBECONSTANT");
411 if (PropertyPointer) {
413 PropertyPointer->
Value(thePhotonMomentum);
419 aMaterialPropertiesTable->
GetProperty(
"SPECULARSPIKECONSTANT");
420 if (PropertyPointer) {
422 PropertyPointer->
Value(thePhotonMomentum);
428 aMaterialPropertiesTable->
GetProperty(
"BACKSCATTERCONSTANT");
429 if (PropertyPointer) {
431 PropertyPointer->
Value(thePhotonMomentum);
448 if (Material1 == Material2){
453 aMaterialPropertiesTable =
455 if (aMaterialPropertiesTable)
456 Rindex = aMaterialPropertiesTable->
GetProperty(
"RINDEX");
458 Rindex2 = Rindex->
Value(thePhotonMomentum);
482 DielectricDichroic();
489 DielectricDielectric();
493 if ( rand > theReflectivity ) {
494 if (rand > theReflectivity + theTransmittance) {
498 NewMomentum = OldMomentum;
499 NewPolarization = OldPolarization;
511 DielectricDielectric();
518 G4cerr <<
" Error: G4BoundaryProcess: illegal boundary type " <<
G4endl;
523 NewMomentum = NewMomentum.
unit();
524 NewPolarization = NewPolarization.
unit();
527 G4cout <<
" New Momentum Direction: " << NewMomentum <<
G4endl;
528 G4cout <<
" New Polarization: " << NewPolarization <<
G4endl;
529 BoundaryProcessVerbose();
542 if ( theStatus ==
Detection && fInvokeSD ) InvokeSD(pStep);
547 void G4OpBoundaryProcess::BoundaryProcessVerbose()
const
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;
632 G4OpBoundaryProcess::GetFacetNormal(
const G4ThreeVector& Momentum,
648 if (OpticalSurface) sigma_alpha = OpticalSurface->
GetSigmaAlpha();
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);
682 }
while (Momentum * FacetNormal >= 0.0);
687 if (OpticalSurface) polish = OpticalSurface->
GetPolish();
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;
711 void G4OpBoundaryProcess::DielectricMetal()
722 if ( rand > theReflectivity && n == 1 ) {
723 if (rand > theReflectivity + theTransmittance) {
727 NewMomentum = OldMomentum;
728 NewPolarization = OldPolarization;
734 if (PropertyPointer1 && PropertyPointer2) {
736 CalculateReflectivity();
737 if ( !G4BooleanRand(theReflectivity) ) {
750 if ( n == 1 ) ChooseReflection();
756 NewMomentum = -OldMomentum;
757 NewPolarization = -OldPolarization;
762 if ( PropertyPointer1 && PropertyPointer2 ){
765 GetFacetNormal(OldMomentum,theGlobalNormal);
769 PdotN = OldMomentum * theFacetNormal;
770 NewMomentum = OldMomentum - (2.*PdotN)*theFacetNormal;
771 EdotN = OldPolarization * theFacetNormal;
774 A_trans = OldMomentum.
cross(theFacetNormal);
775 A_trans = A_trans.
unit();
777 A_trans = OldPolarization;
779 A_paral = NewMomentum.
cross(A_trans);
780 A_paral = A_paral.
unit();
784 -OldPolarization + (2.*EdotN)*theFacetNormal;
786 NewPolarization = -A_trans;
788 NewPolarization = -A_paral;
795 OldMomentum = NewMomentum;
796 OldPolarization = NewPolarization;
801 }
while (NewMomentum * theGlobalNormal < 0.0);
804 void G4OpBoundaryProcess::DielectricLUT()
806 G4int thetaIndex, phiIndex;
807 G4double AngularDistributionValue, thetaRad, phiRad, EdotN;
808 G4ThreeVector PerpendicularVectorTheta, PerpendicularVectorPhi;
820 if ( rand > theReflectivity ) {
821 if (rand > theReflectivity + theTransmittance) {
825 NewMomentum = OldMomentum;
826 NewPolarization = OldPolarization;
833 OldMomentum.
angle(-theGlobalNormal);
835 G4int angleIncident =
G4int(std::floor(180/
pi*anglePhotonToNormal+0.5));
840 thetaIndex = G4RandFlat::shootInt(thetaIndexMax-1);
841 phiIndex = G4RandFlat::shootInt(phiIndexMax-1);
843 AngularDistributionValue = OpticalSurface ->
844 GetAngularDistributionValue(angleIncident,
848 }
while ( !G4BooleanRand(AngularDistributionValue) );
850 thetaRad = (-90 + 4*thetaIndex)*
pi/180;
851 phiRad = (-90 + 5*phiIndex)*
pi/180;
853 NewMomentum = -OldMomentum;
855 PerpendicularVectorTheta = NewMomentum.
cross(theGlobalNormal);
856 if (PerpendicularVectorTheta.
mag() < kCarTolerance )
857 PerpendicularVectorTheta = NewMomentum.
orthogonal();
859 NewMomentum.
rotate(anglePhotonToNormal-thetaRad,
860 PerpendicularVectorTheta);
861 PerpendicularVectorPhi =
862 PerpendicularVectorTheta.
cross(NewMomentum);
863 NewMomentum = NewMomentum.
rotate(-phiRad,PerpendicularVectorPhi);
866 theFacetNormal = (NewMomentum - OldMomentum).unit();
867 EdotN = OldPolarization * theFacetNormal;
868 NewPolarization = -OldPolarization + (2.*EdotN)*theFacetNormal;
871 }
while (NewMomentum * theGlobalNormal <= 0.0);
874 void G4OpBoundaryProcess::DielectricDichroic()
877 G4double anglePhotonToNormal = OldMomentum.
angle(-theGlobalNormal);
880 G4double angleIncident = std::floor(180/
pi*anglePhotonToNormal+0.5);
882 if (!DichroicVector) {
887 if (DichroicVector) {
890 DichroicVector->
Value(wavelength/
nm,angleIncident,idx,idy)*
perCent;
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");
906 if ( !G4BooleanRand(theTransmittance) ) {
915 NewMomentum = -OldMomentum;
916 NewPolarization = -OldPolarization;
921 theFacetNormal = GetFacetNormal(OldMomentum,theGlobalNormal);
922 PdotN = OldMomentum * theFacetNormal;
923 NewMomentum = OldMomentum - (2.*PdotN)*theFacetNormal;
925 }
while (NewMomentum * theGlobalNormal <= 0.0);
926 EdotN = OldPolarization * theFacetNormal;
927 NewPolarization = -OldPolarization + (2.*EdotN)*theFacetNormal;
934 NewMomentum = OldMomentum;
935 NewPolarization = OldPolarization;
940 void G4OpBoundaryProcess::DielectricDielectric()
945 G4bool SurfaceRoughnessCriterionPass = 1;
946 if (theSurfaceRoughness != 0. && Rindex1 > Rindex2) {
948 G4double SurfaceRoughnessCriterion =
949 std::exp(-std::pow((4*
pi*theSurfaceRoughness*Rindex1*cost1/wavelength),2));
950 SurfaceRoughnessCriterionPass =
951 G4BooleanRand(SurfaceRoughnessCriterion);
963 G4double s1, s2, E2_perp, E2_parl, E2_total, TransCoeff;
972 theGlobalNormal = -theGlobalNormal;
978 theFacetNormal = theGlobalNormal;
982 GetFacetNormal(OldMomentum,theGlobalNormal);
985 PdotN = OldMomentum * theFacetNormal;
986 EdotN = OldPolarization * theFacetNormal;
989 if (std::abs(cost1) < 1.0-kCarTolerance){
990 sint1 = std::sqrt(1.-cost1*cost1);
991 sint2 = sint1*Rindex1/Rindex2;
1002 if (Swap) Swap = !Swap;
1006 if ( !SurfaceRoughnessCriterionPass ) theStatus =
1016 NewMomentum = -OldMomentum;
1017 NewPolarization = -OldPolarization;
1021 PdotN = OldMomentum * theFacetNormal;
1022 NewMomentum = OldMomentum - (2.*PdotN)*theFacetNormal;
1023 EdotN = OldPolarization * theFacetNormal;
1024 NewPolarization = -OldPolarization + (2.*EdotN)*theFacetNormal;
1028 else if (sint2 < 1.0) {
1033 cost2 = std::sqrt(1.-sint2*sint2);
1036 cost2 = -std::sqrt(1.-sint2*sint2);
1040 A_trans = OldMomentum.
cross(theFacetNormal);
1041 A_trans = A_trans.
unit();
1042 E1_perp = OldPolarization * A_trans;
1043 E1pp = E1_perp * A_trans;
1044 E1pl = OldPolarization - E1pp;
1045 E1_parl = E1pl.
mag();
1048 A_trans = OldPolarization;
1057 E2_perp = 2.*s1*E1_perp/(Rindex1*cost1+Rindex2*cost2);
1058 E2_parl = 2.*s1*E1_parl/(Rindex2*cost1+Rindex1*cost2);
1059 E2_total = E2_perp*E2_perp + E2_parl*E2_parl;
1060 s2 = Rindex2*cost2*E2_total;
1062 if (theTransmittance > 0) TransCoeff = theTransmittance;
1063 else if (cost1 != 0.0) TransCoeff = s2/s1;
1064 else TransCoeff = 0.0;
1066 if ( !G4BooleanRand(TransCoeff) ) {
1070 if (Swap) Swap = !Swap;
1074 if ( !SurfaceRoughnessCriterionPass ) theStatus =
1084 NewMomentum = -OldMomentum;
1085 NewPolarization = -OldPolarization;
1089 PdotN = OldMomentum * theFacetNormal;
1090 NewMomentum = OldMomentum - (2.*PdotN)*theFacetNormal;
1094 E2_parl = Rindex2*E2_parl/Rindex1 - E1_parl;
1095 E2_perp = E2_perp - E1_perp;
1096 E2_total = E2_perp*E2_perp + E2_parl*E2_parl;
1097 A_paral = NewMomentum.
cross(A_trans);
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;
1103 NewPolarization = C_parl*A_paral + C_perp*A_trans;
1109 if (Rindex2 > Rindex1) {
1110 NewPolarization = - OldPolarization;
1113 NewPolarization = OldPolarization;
1129 alpha = cost1 - cost2*(Rindex2/Rindex1);
1130 NewMomentum = OldMomentum + alpha*theFacetNormal;
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;
1139 NewPolarization = C_parl*A_paral + C_perp*A_trans;
1144 NewMomentum = OldMomentum;
1145 NewPolarization = OldPolarization;
1151 OldMomentum = NewMomentum.
unit();
1152 OldPolarization = NewPolarization.
unit();
1155 Done = (NewMomentum * theGlobalNormal <= 0.0);
1158 Done = (NewMomentum * theGlobalNormal >= -kCarTolerance);
1164 if (Inside && !Swap) {
1169 if ( rand > theReflectivity ) {
1170 if (rand > theReflectivity + theTransmittance) {
1174 NewMomentum = OldMomentum;
1175 NewPolarization = OldPolarization;
1180 theGlobalNormal = -theGlobalNormal;
1192 theGlobalNormal = -theGlobalNormal;
1193 OldMomentum = NewMomentum;
1213 G4double G4OpBoundaryProcess::GetIncidentAngle()
1215 G4double PdotN = OldMomentum * theFacetNormal;
1217 G4double magN= theFacetNormal.mag();
1218 G4double incidentangle =
pi - std::acos(PdotN/(magP*magN));
1220 return incidentangle;
1229 G4complex Reflectivity, Reflectivity_TE, Reflectivity_TM;
1230 G4complex N1(Rindex1, 0), N2(RealRindex, ImaginaryRindex);
1243 aMaterialPropertiesTable->
GetProperty(
"REALRINDEX");
1245 aMaterialPropertiesTable->
GetProperty(
"IMAGINARYRINDEX");
1246 if (aPropertyPointerR && aPropertyPointerI) {
1247 G4double RRindex = aPropertyPointerR->
Value(thePhotonMomentum);
1248 G4double IRindex = aPropertyPointerI->
Value(thePhotonMomentum);
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;}
1282 }
while(iTE<0&&iTM<0);
1284 return real(Reflectivity);
1288 void G4OpBoundaryProcess::CalculateReflectivity()
1291 PropertyPointer1->
Value(thePhotonMomentum);
1293 PropertyPointer2->
Value(thePhotonMomentum);
1296 if ( theFinish ==
ground ) {
1298 GetFacetNormal(OldMomentum, theGlobalNormal);
1300 theFacetNormal = theGlobalNormal;
1303 G4double PdotN = OldMomentum * theFacetNormal;
1306 if (std::abs(cost1) < 1.0 - kCarTolerance) {
1307 sint1 = std::sqrt(1. - cost1*cost1);
1316 A_trans = OldMomentum.
cross(theFacetNormal);
1317 A_trans = A_trans.
unit();
1318 E1_perp = OldPolarization * A_trans;
1319 E1pp = E1_perp * A_trans;
1320 E1pl = OldPolarization - E1pp;
1321 E1_parl = E1pl.
mag();
1324 A_trans = OldPolarization;
1333 G4double incidentangle = GetIncidentAngle();
1339 GetReflectivity(E1_perp, E1_parl, incidentangle,
1340 RealRindex, ImaginaryRindex);
1343 G4bool G4OpBoundaryProcess::InvokeSD(
const G4Step* pStep)
1350 if (sd)
return sd->
Hit(&aStep);
G4double condition(const G4ErrorSymMatrix &m)
ThreeVector shoot(const G4int Ap, const G4int Af)
static constexpr double h_Planck
void G4SwapObj(T *a, T *b)
G4OpticalSurfaceModel GetModel() const
double angle(const Hep3Vector &) const
std::ostringstream G4ExceptionDescription
G4double GetVelocity() const
const G4DynamicParticle * GetDynamicParticle() const
static constexpr double perCent
G4StepStatus GetStepStatus() const
G4Material * GetMaterial() const
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)
void ProposeLocalEnergyDeposit(G4double anEnergyPart)
static constexpr double twopi
static G4LogicalBorderSurface * GetSurface(const G4VPhysicalVolume *vol1, const G4VPhysicalVolume *vol2)
G4double GetTotalMomentum() const
G4StepPoint * GetPreStepPoint() const
static G4int GetHypNavigatorID()
std::complex< G4double > G4complex
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
G4int GetPhiIndexMax(void) const
const G4ThreeVector & GetMomentumDirection() const
Hep3Vector & rotateUz(const Hep3Vector &)
G4bool Hit(G4Step *aStep)
void SetProcessSubType(G4int)
G4double GetMeanFreePath(const G4Track &, G4double, G4ForceCondition *condition)
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()
virtual void Initialize(const G4Track &)
G4LogicalVolume * GetLogicalVolume() const
G4Physics2DVector * GetDichroicVector()
void G4SwapPtr(T *&a, T *&b)
static constexpr double nm
G4MaterialPropertiesTable * GetMaterialPropertiesTable() const
G4StepPoint * GetPostStepPoint() const
void AddTotalEnergyDeposit(G4double value)
static constexpr double c_light
Hep3Vector orthogonal() const
const G4ThreeVector & GetPolarization() const
G4ParticleChange aParticleChange
T min(const T t1, const T t2)
brief Return the smallest of the two arguments
G4SurfaceProperty * GetSurfaceProperty() const
static constexpr double pi
Hep3Vector cross(const Hep3Vector &) const
G4VSensitiveDetector * GetSensitiveDetector() const
static constexpr double halfpi
void ProposeMomentumDirection(G4double Px, G4double Py, G4double Pz)
void ProposeTrackStatus(G4TrackStatus status)
G4double GetSigmaAlpha() const
static const G4double alpha
void ProposeVelocity(G4double finalVelocity)
G4int GetThetaIndexMax(void) const
Hep3Vector & rotate(double, const Hep3Vector &)
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
static G4LogicalSkinSurface * GetSurface(const G4LogicalVolume *vol)