43G4SPSPosDistribution::thread_data_t::thread_data_t()
53 SourcePosType =
"Point";
82 SourcePosType = PosType;
92 CentreCoords = coordsOfCentre;
100 if(verbosityLevel == 2)
104 GenerateRotationMatrices();
112 if(verbosityLevel == 2)
114 G4cout <<
"The vector in the x'-y' plane " << Roty <<
G4endl;
116 GenerateRotationMatrices();
177 return SourcePosType;
223 return SourcePosType;
228 return ThreadData.
Get().CParticlePos;
233 return ThreadData.
Get().CSideRefVec1;
238 return ThreadData.
Get().CSideRefVec2;
243 return ThreadData.
Get().CSideRefVec3;
246void G4SPSPosDistribution::GenerateRotationMatrices()
254 Rotz = Rotx.
cross(Roty);
256 Roty =Rotz.
cross(Rotx);
258 if(verbosityLevel == 2)
260 G4cout <<
"The new axes, x', y', z' "
261 << Rotx <<
" " << Roty <<
" " << Rotz <<
G4endl;
268 if(verbosityLevel == 2) {
G4cout << VolName <<
G4endl; }
272 if(verbosityLevel >= 1)
273 {
G4cout <<
"Volume confinement is set off." <<
G4endl; }
280 G4String theRequiredVolumeName = VolName;
284 if(verbosityLevel == 2) {
G4cout << PVStore->size() <<
G4endl; }
286 while (!found && i<
G4int(PVStore->size()))
288 tempPV = (*PVStore)[i];
289 found = tempPV->
GetName() == theRequiredVolumeName;
290 if(verbosityLevel == 2)
293 <<
" " << theRequiredVolumeName <<
" " << found <<
G4endl;
302 if(verbosityLevel >= 1)
310 G4cout <<
" **** Error: Volume <" << VolName <<
"> does not exist **** " <<
G4endl;
317void G4SPSPosDistribution::GeneratePointSource(
G4ThreeVector& pos)
321 if(SourcePosType ==
"Point")
327 if(verbosityLevel >= 1)
329 G4cerr <<
"Error SourcePosType is not set to Point" <<
G4endl;
334void G4SPSPosDistribution::GeneratePointsInBeam(
G4ThreeVector& pos)
344 if(Shape ==
"Circle")
348 while(std::sqrt((x*x) + (y*y)) > Radius)
353 x = (x*2.*Radius) - Radius;
354 y = (y*2.*Radius) - Radius;
356 x += G4RandGauss::shoot(0.0,SX) ;
357 y += G4RandGauss::shoot(0.0,SY) ;
365 x = (x*2.*halfx) - halfx;
366 y = (y*2.*halfy) - halfy;
367 x += G4RandGauss::shoot(0.0,SX);
368 y += G4RandGauss::shoot(0.0,SY);
374 if(verbosityLevel >= 2)
376 G4cout <<
"Raw position " << x <<
"," << y <<
"," << z <<
G4endl;
378 tempx = (x * Rotx.
x()) + (y * Roty.
x()) + (z * Rotz.
x());
379 tempy = (x * Rotx.
y()) + (y * Roty.
y()) + (z * Rotz.
y());
380 tempz = (x * Rotx.
z()) + (y * Roty.
z()) + (z * Rotz.
z());
388 pos = CentreCoords + RandPos;
389 if(verbosityLevel >= 1)
391 if(verbosityLevel >= 2)
399void G4SPSPosDistribution::GeneratePointsInPlane(
G4ThreeVector& pos)
406 thread_data_t& td = ThreadData.
Get();
408 if(SourcePosType !=
"Plane" && verbosityLevel >= 1)
410 G4cerr <<
"Error: SourcePosType is not Plane" <<
G4endl;
415 if(Shape ==
"Circle")
419 while(std::sqrt((x*x) + (y*y)) > Radius)
424 x = (x*2.*Radius) - Radius;
425 y = (y*2.*Radius) - Radius;
428 else if(Shape ==
"Annulus")
432 while(std::sqrt((x*x) + (y*y)) > Radius
433 || std::sqrt((x*x) + (y*y)) < Radius0 )
438 x = (x*2.*Radius) - Radius;
439 y = (y*2.*Radius) - Radius;
442 else if(Shape ==
"Ellipse")
445 while(expression > 1.)
450 x = (x*2.*halfx) - halfx;
451 y = (y*2.*halfy) - halfy;
453 expression = ((x*x)/(halfx*halfx)) + ((y*y)/(halfy*halfy));
456 else if(Shape ==
"Square")
460 x = (x*2.*halfx) - halfx;
461 y = (y*2.*halfy) - halfy;
463 else if(Shape ==
"Rectangle")
467 x = (x*2.*halfx) - halfx;
468 y = (y*2.*halfy) - halfy;
478 if(verbosityLevel == 2)
480 G4cout <<
"Raw position " << x <<
"," << y <<
"," << z <<
G4endl;
482 tempx = (x * Rotx.
x()) + (y * Roty.
x()) + (z * Rotz.
x());
483 tempy = (x * Rotx.
y()) + (y * Roty.
y()) + (z * Rotz.
y());
484 tempz = (x * Rotx.
z()) + (y * Roty.
z()) + (z * Rotz.
z());
492 pos = CentreCoords + RandPos;
493 if(verbosityLevel >= 1)
495 if(verbosityLevel == 2)
505 td.CSideRefVec1 = Rotx;
506 td.CSideRefVec2 = Roty;
507 td.CSideRefVec3 = Rotz;
512 if((CentreCoords.
x() > 0. && Rotz.
x() < 0.)
513 || (CentreCoords.
x() < 0. && Rotz.
x() > 0.)
514 || (CentreCoords.
y() > 0. && Rotz.
y() < 0.)
515 || (CentreCoords.
y() < 0. && Rotz.
y() > 0.)
516 || (CentreCoords.
z() > 0. && Rotz.
z() < 0.)
517 || (CentreCoords.
z() < 0. && Rotz.
z() > 0.))
521 td.CSideRefVec2 = - td.CSideRefVec2;
522 td.CSideRefVec3 = - td.CSideRefVec3;
524 if(verbosityLevel == 2)
526 G4cout <<
"Reference vectors for cosine-law "
527 << td.CSideRefVec1<<
" " << td.CSideRefVec2
528 <<
" " << td.CSideRefVec3 <<
G4endl;
532void G4SPSPosDistribution::GeneratePointsOnSurface(
G4ThreeVector& pos)
542 thread_data_t& td = ThreadData.
Get();
543 if(SourcePosType !=
"Surface" && verbosityLevel >= 1)
548 if(Shape ==
"Sphere")
552 theta = std::acos(1. - 2.*theta);
555 x = Radius * std::sin(theta) * std::cos(phi);
556 y = Radius * std::sin(theta) * std::sin(phi);
557 z = Radius * std::cos(theta);
566 zdash = zdash.unit();
569 td.CSideRefVec1 = xdash.
unit();
570 td.CSideRefVec2 = ydash.
unit();
571 td.CSideRefVec3 = zdash.
unit();
573 else if(Shape ==
"Ellipsoid")
578 constant =
pi/(halfx*halfx) + pi/(halfy*halfy) + twopi/(halfz*halfz);
585 theta = std::acos(1. - 2.*theta);
588 while(maxphi-minphi > 0.)
590 middlephi = (maxphi+minphi)/2.;
591 answer = (1./(halfx*halfx))*(middlephi/2. + std::sin(2*middlephi)/4.)
592 + (1./(halfy*halfy))*(middlephi/2. - std::sin(2*middlephi)/4.)
593 + middlephi/(halfz*halfz);
594 answer = answer/constant;
595 if(answer > phi) maxphi = middlephi;
596 if(answer < phi) minphi = middlephi;
597 if(std::fabs(answer-phi) <= 0.00001)
606 x = std::sin(theta)*std::cos(phi);
607 y = std::sin(theta)*std::sin(phi);
617 tempxvar = 1./(halfx*halfx)+(numYinX*numYinX)/(halfy*halfy)
618 + (numZinX*numZinX)/(halfz*halfz);
619 tempxvar = 1./tempxvar;
620 G4double coordx = std::sqrt(tempxvar);
627 tempyvar = (numXinY*numXinY)/(halfx*halfx)+1./(halfy*halfy)
628 + (numZinY*numZinY)/(halfz*halfz);
629 tempyvar = 1./tempyvar;
630 G4double coordy = std::sqrt(tempyvar);
637 tempzvar = (numXinZ*numXinZ)/(halfx*halfx)
638 + (numYinZ*numYinZ)/(halfy*halfy)+1./(halfz*halfz);
639 tempzvar = 1./tempzvar;
640 G4double coordz = std::sqrt(tempzvar);
642 lhs = std::sqrt((coordx*coordx)/(halfx*halfx) +
643 (coordy*coordy)/(halfy*halfy) +
644 (coordz*coordz)/(halfz*halfz));
646 if(std::fabs(lhs-1.) > 0.001 && verbosityLevel >= 1)
648 G4cout <<
"Error: theta, phi not really on ellipsoid" <<
G4endl;
654 if(TestRandVar > 0.5)
659 if(TestRandVar > 0.5)
664 if(TestRandVar > 0.5)
669 RandPos.
setX(coordx);
670 RandPos.
setY(coordy);
671 RandPos.
setZ(coordz);
676 zdash = zdash.unit();
679 td.CSideRefVec1 = xdash.
unit();
680 td.CSideRefVec2 = ydash.
unit();
681 td.CSideRefVec3 = zdash.
unit();
683 else if(Shape ==
"Cylinder")
686 G4double AreaTotal, prob1, prob2, prob3;
693 AreaTop =
pi * Radius * Radius;
695 AreaLat = 2. *
pi * Radius * 2. * halfz;
696 AreaTotal = AreaTop + AreaBot + AreaLat;
698 prob1 = AreaTop / AreaTotal;
699 prob2 = AreaBot / AreaTotal;
700 prob3 = 1.00 - prob1 - prob2;
701 if(std::fabs(prob3 - (AreaLat/AreaTotal)) >= 0.001)
703 if(verbosityLevel >= 1)
713 if(testrand <= prob1)
718 while(((x*x)+(y*y)) > (Radius*Radius))
730 td.CSideRefVec1 = Rotx;
731 td.CSideRefVec2 = Roty;
732 td.CSideRefVec3 = Rotz;
734 else if((testrand > prob1) && (testrand <= (prob1 + prob2)))
739 while(((x*x)+(y*y)) > (Radius*Radius))
751 td.CSideRefVec1 = Rotx;
752 td.CSideRefVec2 = -Roty;
753 td.CSideRefVec3 = -Rotz;
755 else if(testrand > (prob1+prob2))
760 rand = rand * 2. *
pi;
762 x = Radius * std::cos(rand);
763 y = Radius * std::sin(rand);
773 zdash = zdash.unit();
776 td.CSideRefVec1 = xdash.
unit();
777 td.CSideRefVec2 = ydash.
unit();
778 td.CSideRefVec3 = zdash.
unit();
789 else if(Shape ==
"EllipticCylinder")
791 G4double AreaTop, AreaBot, AreaLat, AreaTotal;
800 AreaTop =
pi * halfx * halfy;
808 h = ((halfx - halfy)*(halfx - halfy)) / ((halfx + halfy)*(halfx + halfy));
809 AreaLat = 2*halfz *
pi*(halfx + halfy)
810 * (1 + (3*h)/(10 + std::sqrt(4 - 3*h)));
811 AreaTotal = AreaTop + AreaBot + AreaLat;
813 prob1 = AreaTop / AreaTotal;
814 prob2 = AreaBot / AreaTotal;
815 prob3 = 1.00 - prob1 - prob2;
816 if(std::fabs(prob3 - (AreaLat/AreaTotal)) >= 0.001)
818 if(verbosityLevel >= 1)
828 if(testrand <= prob1)
832 while(expression > 1.)
837 x = (x * 2. * halfx) - halfx;
838 y = (y * 2. * halfy) - halfy;
840 expression = ((x*x)/(halfx*halfx)) + ((y*y)/(halfy*halfy));
843 else if((testrand > prob1) && (testrand <= (prob1 + prob2)))
847 while(expression > 1.)
852 x = (x * 2. * halfx) - halfx;
853 y = (y * 2. * halfy) - halfy;
855 expression = ((x*x)/(halfx*halfx)) + ((y*y)/(halfy*halfy));
858 else if(testrand > (prob1+prob2))
863 rand = rand * 2. *
pi;
865 x = halfx * std::cos(rand);
866 y = halfy * std::sin(rand);
870 z = (z * 2. * halfz) - halfz;
884 zdash = zdash.unit();
887 td.CSideRefVec1 = xdash.
unit();
888 td.CSideRefVec2 = ydash.
unit();
889 td.CSideRefVec3 = zdash.
unit();
891 else if(Shape ==
"Para")
900 G4double AreaX = halfy * halfz * 4.;
901 G4double AreaY = halfx * halfz * 4.;
902 G4double AreaZ = halfx * halfy * 4.;
903 G4double AreaTotal = 2*(AreaX + AreaY + AreaZ);
905 Probs[0] = AreaX/AreaTotal;
906 Probs[1] = Probs[0] + AreaX/AreaTotal;
907 Probs[2] = Probs[1] + AreaY/AreaTotal;
908 Probs[3] = Probs[2] + AreaY/AreaTotal;
909 Probs[4] = Probs[3] + AreaZ/AreaTotal;
910 Probs[5] = Probs[4] + AreaZ/AreaTotal;
925 if(testrand < Probs[0])
929 x = halfx + z*std::tan(ParTheta)*std::cos(ParPhi) + y*std::tan(ParAlpha);
930 y = y + z*std::tan(ParTheta)*std::sin(ParPhi);
935 G4ThreeVector xdash(halfz*std::tan(ParTheta)*std::cos(ParPhi),
936 halfz*std::tan(ParTheta)*std::sin(ParPhi),
937 halfz/std::cos(ParPhi));
939 xdash = xdash.
unit();
940 ydash = ydash.
unit();
942 td.CSideRefVec1 = xdash.
unit();
943 td.CSideRefVec2 = ydash.
unit();
944 td.CSideRefVec3 = zdash.
unit();
946 else if(testrand >= Probs[0] && testrand < Probs[1])
950 x = -halfx + z*std::tan(ParTheta)*std::cos(ParPhi) + y*std::tan(ParAlpha);
951 y = y + z*std::tan(ParTheta)*std::sin(ParPhi);
956 G4ThreeVector xdash(halfz*std::tan(ParTheta)*std::cos(ParPhi),
957 halfz*std::tan(ParTheta)*std::sin(ParPhi),
958 halfz/std::cos(ParPhi));
960 xdash = xdash.
unit();
961 ydash = ydash.
unit();
963 td.CSideRefVec1 = xdash.
unit();
964 td.CSideRefVec2 = ydash.
unit();
965 td.CSideRefVec3 = zdash.
unit();
967 else if(testrand >= Probs[1] && testrand < Probs[2])
971 x = x + z*std::tan(ParTheta)*std::cos(ParPhi) + halfy*std::tan(ParAlpha);
972 y = halfy + z*std::tan(ParTheta)*std::sin(ParPhi);
977 G4ThreeVector ydash(halfz*std::tan(ParTheta)*std::cos(ParPhi),
978 halfz*std::tan(ParTheta)*std::sin(ParPhi),
979 halfz/std::cos(ParPhi));
980 ydash = ydash.
unit();
983 td.CSideRefVec1 = xdash.
unit();
984 td.CSideRefVec2 = -ydash.
unit();
985 td.CSideRefVec3 = -zdash.
unit();
987 else if(testrand >= Probs[2] && testrand < Probs[3])
991 x = x + z*std::tan(ParTheta)*std::cos(ParPhi) - halfy*std::tan(ParAlpha);
992 y = -halfy + z*std::tan(ParTheta)*std::sin(ParPhi);
997 G4ThreeVector ydash(halfz*std::tan(ParTheta)*std::cos(ParPhi),
998 halfz*std::tan(ParTheta)*std::sin(ParPhi),
999 halfz/std::cos(ParPhi));
1000 ydash = ydash.
unit();
1003 td.CSideRefVec1 = xdash.
unit();
1004 td.CSideRefVec2 = ydash.
unit();
1005 td.CSideRefVec3 = zdash.
unit();
1007 else if(testrand >= Probs[3] && testrand < Probs[4])
1012 y = y + halfz*std::sin(ParPhi)*std::tan(ParTheta);
1013 x = x + halfz*std::cos(ParPhi)*std::tan(ParTheta) + y*std::tan(ParAlpha);
1017 td.CSideRefVec1 = Rotx;
1018 td.CSideRefVec2 = Roty;
1019 td.CSideRefVec3 = Rotz;
1021 else if(testrand >= Probs[4] && testrand < Probs[5])
1026 y = y - halfz*std::sin(ParPhi)*std::tan(ParTheta);
1027 x = x - halfz*std::cos(ParPhi)*std::tan(ParTheta) + y*std::tan(ParAlpha);
1031 td.CSideRefVec1 = Rotx;
1032 td.CSideRefVec2 = -Roty;
1033 td.CSideRefVec3 = -Rotz;
1038 if(verbosityLevel >= 1)
1040 G4cout <<
"testrand=" << testrand <<
" Probs[5]=" << Probs[5] <<
G4endl;
1052 if(verbosityLevel == 2)
1056 x=(RandPos.
x()*Rotx.
x())+(RandPos.
y()*Roty.
x())+(RandPos.
z()*Rotz.
x());
1057 y=(RandPos.
x()*Rotx.
y())+(RandPos.
y()*Roty.
y())+(RandPos.
z()*Rotz.
y());
1058 z=(RandPos.
x()*Rotx.
z())+(RandPos.
y()*Roty.
z())+(RandPos.
z()*Rotz.
z());
1066 pos = CentreCoords + RandPos;
1068 if(verbosityLevel >= 1)
1070 if(verbosityLevel == 2)
1076 if(verbosityLevel == 2)
1078 G4cout <<
"Reference vectors for cosine-law " << td.CSideRefVec1
1079 <<
" " << td.CSideRefVec2 <<
" " << td.CSideRefVec3 <<
G4endl;
1083void G4SPSPosDistribution::GeneratePointsInVolume(
G4ThreeVector& pos)
1091 if(SourcePosType !=
"Volume" && verbosityLevel >= 1)
1098 if(Shape ==
"Sphere")
1103 while(((x*x)+(y*y)+(z*z)) > (Radius*Radius))
1109 x = (x*2.*Radius) - Radius;
1110 y = (y*2.*Radius) - Radius;
1111 z = (z*2.*Radius) - Radius;
1114 else if(Shape ==
"Ellipsoid")
1124 x = (x*2.*halfx) - halfx;
1125 y = (y*2.*halfy) - halfy;
1126 z = (z*2.*halfz) - halfz;
1128 temp = ((x*x)/(halfx*halfx))+((y*y)/(halfy*halfy))+((z*z)/(halfz*halfz));
1131 else if(Shape ==
"Cylinder")
1135 while(((x*x)+(y*y)) > (Radius*Radius))
1141 x = (x*2.*Radius) - Radius;
1142 y = (y*2.*Radius) - Radius;
1143 z = (z*2.*halfz) - halfz;
1146 else if(Shape ==
"EllipticCylinder")
1149 while(expression > 1.)
1155 x = (x*2.*halfx) - halfx;
1156 y = (y*2.*halfy) - halfy;
1157 z = (z*2.*halfz) - halfz;
1159 expression = ((x*x)/(halfx*halfx)) + ((y*y)/(halfy*halfy));
1162 else if(Shape ==
"Para")
1167 x = (x*2.*halfx) - halfx;
1168 y = (y*2.*halfy) - halfy;
1169 z = (z*2.*halfz) - halfz;
1170 x = x + z*std::tan(ParTheta)*std::cos(ParPhi) + y*std::tan(ParAlpha);
1171 y = y + z*std::tan(ParTheta)*std::sin(ParPhi);
1176 G4cout <<
"Error: Volume Shape does not exist" <<
G4endl;
1186 tempx = (x * Rotx.
x()) + (y * Roty.
x()) + (z * Rotz.
x());
1187 tempy = (x * Rotx.
y()) + (y * Roty.
y()) + (z * Rotz.
y());
1188 tempz = (x * Rotx.
z()) + (y * Roty.
z()) + (z * Rotz.
z());
1190 RandPos.
setX(tempx);
1191 RandPos.
setY(tempy);
1192 RandPos.
setZ(tempz);
1196 pos = CentreCoords + RandPos;
1198 if(verbosityLevel == 2)
1200 G4cout <<
"Raw position " << x <<
"," << y <<
"," << z <<
G4endl;
1203 if(verbosityLevel >= 1)
1211 zdash = zdash.
unit();
1214 thread_data_t& td = ThreadData.
Get();
1215 td.CSideRefVec1 = xdash.
unit();
1216 td.CSideRefVec2 = ydash.
unit();
1217 td.CSideRefVec3 = zdash.
unit();
1218 if(verbosityLevel == 2)
1220 G4cout <<
"Reference vectors for cosine-law " << td.CSideRefVec1
1221 <<
" " << td.CSideRefVec2 <<
" " << td.CSideRefVec3 <<
G4endl;
1229 if(Confine ==
false)
1242 if(theVolume ==
nullptr) {
return false; }
1245 if(theVolName == VolName)
1247 if(verbosityLevel >= 1)
1249 G4cout <<
"Particle is in volume " << VolName <<
G4endl;
1263 G4int LoopCount = 0;
1264 while(srcconf ==
false)
1266 if(SourcePosType ==
"Point")
1267 GeneratePointSource(localP);
1268 else if(SourcePosType ==
"Beam")
1269 GeneratePointsInBeam(localP);
1270 else if(SourcePosType ==
"Plane")
1271 GeneratePointsInPlane(localP);
1272 else if(SourcePosType ==
"Surface")
1273 GeneratePointsOnSurface(localP);
1274 else if(SourcePosType ==
"Volume")
1275 GeneratePointsInVolume(localP);
1279 msg <<
"Error: SourcePosType undefined\n";
1280 msg <<
"Generating point source\n";
1281 G4Exception(
"G4SPSPosDistribution::GenerateOne()",
1283 GeneratePointSource(localP);
1287 srcconf = IsSourceConfined(localP);
1291 else if(Confine ==
false)
1296 if(LoopCount == 100000)
1299 msg <<
"LoopCount = 100000\n";
1300 msg <<
"Either the source distribution >> confinement\n";
1301 msg <<
"or any confining volume may not overlap with\n";
1302 msg <<
"the source distribution or any confining volumes\n";
1303 msg <<
"may not exist\n"<<
G4endl;
1304 msg <<
"If you have set confine then this will be ignored\n";
1305 msg <<
"for this event.\n" <<
G4endl;
1306 G4Exception(
"G4SPSPosDistribution::GenerateOne()",
1311 ThreadData.
Get().CParticlePos = localP;
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
std::ostringstream G4ExceptionDescription
#define G4MUTEXDESTROY(mutex)
#define G4MUTEXINIT(mutex)
CLHEP::Hep3Vector G4ThreeVector
G4GLOB_DLL std::ostream G4cerr
G4GLOB_DLL std::ostream G4cout
Hep3Vector cross(const Hep3Vector &) const
virtual G4VPhysicalVolume * LocateGlobalPointAndSetup(const G4ThreeVector &point, const G4ThreeVector *direction=nullptr, const G4bool pRelativeSearch=true, const G4bool ignoreDirection=true)
static G4PhysicalVolumeStore * GetInstance()
G4double GetRadius() const
const G4ThreeVector & GetCentreCoords() const
G4double GetHalfZ() const
void SetParAlpha(G4double)
void SetPosRot2(const G4ThreeVector &)
void SetBeamSigmaInX(G4double)
void ConfineSourceToVolume(const G4String &)
void SetBiasRndm(G4SPSRandomGenerator *a)
const G4String & GetPosDisType() const
void SetPosDisShape(const G4String &)
void SetVerbosity(G4int a)
const G4ThreeVector & GetParticlePos() const
void SetCentreCoords(const G4ThreeVector &)
G4ThreeVector GenerateOne()
void SetBeamSigmaInR(G4double)
const G4String & GetSourcePosType() const
void SetRadius0(G4double)
const G4ThreeVector & GetSideRefVec2() const
G4double GetHalfX() const
void SetParTheta(G4double)
const G4String & GetPosDisShape() const
const G4ThreeVector & GetSideRefVec3() const
const G4ThreeVector & GetSideRefVec1() const
void SetPosRot1(const G4ThreeVector &)
G4double GetHalfY() const
void SetPosDisType(const G4String &)
void SetBeamSigmaInY(G4double)
G4double GenRandPosTheta()
static G4TransportationManager * GetTransportationManager()
G4Navigator * GetNavigatorForTracking() const
const G4String & GetName() const
DLL_API const Hep3Vector HepZHat
DLL_API const Hep3Vector HepXHat
DLL_API const Hep3Vector HepYHat