33 #include <fwk/RunController.h>
34 #include <fwk/CentralConfig.h>
35 #include <utl/Reader.h>
36 #include <utl/AugerException.h>
37 #include <utl/ErrorLogger.h>
38 #include <utl/MathConstants.h>
39 #include <utl/AugerException.h>
42 #include <G4PhysicalConstants.hh>
43 #include <G4SystemOfUnits.hh>
53 #define DOWN_IN_TANK 1
57 #define IN_INTERFACE_1 21
58 #define IN_INTERFACE_2 22
59 #define IN_INTERFACE_3 23
66 #define TARGET_FLOOR 4
70 namespace G4StationSimulatorOG {
72 double G4TankFastCerenkov::fTankHeight;
73 double G4TankFastCerenkov::fTankHalfHeight;
74 double G4TankFastCerenkov::fTankThickness;
75 double G4TankFastCerenkov::fTankRadius;
76 double G4TankFastCerenkov::fTankRadiusSq;
77 double G4TankFastCerenkov::fDomeRadius;
78 double G4TankFastCerenkov::fDomeRadiusz;
79 double G4TankFastCerenkov::fInterfaceRadius;
80 double G4TankFastCerenkov::fInterfaceRadiusz;
81 double G4TankFastCerenkov::fPMTRadius;
82 double G4TankFastCerenkov::fPMTRadiusz;
83 double G4TankFastCerenkov::fDomeRadiusSq;
84 double G4TankFastCerenkov::fDomeRadiuszSq;
85 double G4TankFastCerenkov::fInterfaceRadiusSq;
86 double G4TankFastCerenkov::fInterfaceRadiuszSq;
87 double G4TankFastCerenkov::fPMTRadiusSq;
88 double G4TankFastCerenkov::fPMTRadiuszSq;
89 double G4TankFastCerenkov::fHeightz;
91 double G4TankFastCerenkov::fSigmaAlpha;
106 G4ThreeVector G4TankFastCerenkov::fPMTPos[4];
108 double G4TankFastCerenkov::fRoofPos[4];
111 G4TankFastCerenkov::G4TankFastCerenkov(
const G4String& processName) :
112 G4VContinuousProcess(processName),
117 if (verboseLevel > 0)
118 G4cerr << GetProcessName() <<
" is created " << G4endl;
123 const G4double betat = 7.658e-23 *
m3 /
MeV;
125 const G4double kboltz = 8.61739e-11 *
MeV /
kelvin;
127 const G4double temp = 283.15 *
kelvin;
128 const G4double hc4 =
pow(h_Planck * c_light, 4);
176 const auto& pmt = dStation.
GetPMT(1);
177 fQE = pmt.GetQuantumEfficiency();
179 const double collectionEfficiency = pmt.GetCollectionEfficiency();
181 for (
auto& qe :
fQE.YRange())
182 qe *= collectionEfficiency;
184 for (
auto& en :
fQE.XRange())
188 for (
int i = 1; i <= 3; ++i) {
209 static_cast<G4PhysicsOrderedFreeVector*>((*
fPhysicsTable)[i])->DumpValues();
216 aParticleChange.Initialize(track);
217 const G4DynamicParticle*
particle = track.GetDynamicParticle();
218 const G4Material*
const material = track.GetMaterial();
219 G4StepPoint*
const preStepPoint = step.GetPreStepPoint();
220 G4StepPoint*
const postStepPoint = step.GetPostStepPoint();
222 const G4ThreeVector x0 = preStepPoint->GetPosition();
223 const G4ThreeVector p0 = step.GetDeltaPosition().unit();
224 const G4double t0 = preStepPoint->GetGlobalTime();
227 return G4VContinuousProcess::AlongStepDoIt(track, step);
229 G4ThreeVector primaryDirection = preStepPoint->GetMomentumDirection();
231 const G4double cosAlpha = primaryDirection.z();
232 const G4double sinAlpha =
sqrt(1 -
Sqr(cosAlpha));
233 const G4double cosBeta = primaryDirection.x() / sinAlpha;
234 const G4double sinBeta = primaryDirection.y() / sinAlpha;
236 G4MaterialPropertiesTable*
const materialPropertiesTable = material->GetMaterialPropertiesTable();
238 if (!materialPropertiesTable)
239 return G4VContinuousProcess::AlongStepDoIt(track, step);
241 G4MaterialPropertyVector*
const rIndex = materialPropertiesTable->GetProperty(
"RINDEX");
244 return G4VContinuousProcess::AlongStepDoIt(track, step);
247 if (meanNumPhotons <= 0) {
248 aParticleChange.SetNumberOfSecondaries(0);
249 return G4VContinuousProcess::AlongStepDoIt(track, step);
252 meanNumPhotons *= step.GetStepLength();
254 const G4int numPhotons =
static_cast<G4int
>(G4Poisson(meanNumPhotons));
258 aParticleChange.SetNumberOfSecondaries(0);
260 return G4VContinuousProcess::AlongStepDoIt(track, step);
262 const G4double pMin = rIndex->GetMinLowEdgeEnergy();
263 const G4double pMax = rIndex->GetMaxLowEdgeEnergy();
264 const G4double nMax = rIndex->GetMaxValue();
266 const G4double dp = pMax - pMin;
268 const G4double betaInverse = particle->GetTotalEnergy() / particle->GetTotalMomentum();
270 const G4double maxCos = betaInverse / nMax;
271 const G4double maxSin2 = 1 - maxCos * maxCos;
273 const double minQEMomentum =
fQE.
XFront();
274 const double maxQEMomentum =
fQE.
XBack();
279 for (G4int i = 0; i < numPhotons; ++i) {
281 G4double sin2Theta = 0;
282 G4double cosTheta = 0;
284 rand = G4UniformRand();
288 sin2Theta = 1 - cosTheta * cosTheta;
289 rand = G4UniformRand();
290 }
while (rand * maxSin2 > sin2Theta);
294 if (fSampledMomentum < minQEMomentum || fSampledMomentum > maxQEMomentum)
301 int iFirstValidBin_Wat = 0;
310 const G4double rIConst = (sampledRI_Sq + 2) * (sampledRI_Sq - 1);
315 const G4double invSumMFP = 1 / (absorptionMFP + rayleighMFP);
317 fInvMFP = 1 / absorptionMFP + 1 / rayleighMFP;
322 const G4double sinTheta =
sqrt(sin2Theta);
323 rand = G4UniformRand();
325 const G4double phi = 2 *
utl::kPi * rand;
326 const G4double sinThetaSinPhi = sin(phi) * sinTheta;
327 const G4double sinThetaCosPhi = cos(phi) * sinTheta;
329 const G4double px = cosAlpha * cosBeta * sinThetaCosPhi - sinBeta * sinThetaSinPhi + cosBeta * sinAlpha * cosTheta;
330 const G4double py = cosAlpha * sinBeta * sinThetaCosPhi + cosBeta * sinThetaSinPhi + sinBeta * sinAlpha * cosTheta;
331 const G4double pz = cosAlpha * cosTheta - sinAlpha * sinThetaCosPhi;
337 rand = G4UniformRand();
338 const G4double delta = rand * step.GetStepLength();
339 const G4double deltaTime = delta / (0.5 * (preStepPoint->GetVelocity() + postStepPoint->GetVelocity()));
346 if (radiusTest < 0 &&
352 if (verboseLevel > 0) {
353 G4cerr <<
"\n Exiting from G4Cerenkov::DoIt -- NumberOfSecondaries = "
354 << aParticleChange.GetNumberOfSecondaries() << G4endl;
357 return G4VContinuousProcess::AlongStepDoIt(track, step);
367 const G4MaterialTable*
const materialTable = G4Material::GetMaterialTable();
368 const G4int numOfMaterials = G4Material::GetNumberOfMaterials();
371 for (G4int i = 0; i < numOfMaterials; ++i) {
373 G4PhysicsOrderedFreeVector*
const physicsOrderedFreeVector =
new G4PhysicsOrderedFreeVector();
374 G4Material*
const material = (*materialTable)[i];
375 G4MaterialPropertiesTable*
const materialPropertiesTable = material->GetMaterialPropertiesTable();
377 if (materialPropertiesTable) {
379 G4MaterialPropertyVector*
const rIndexVector = materialPropertiesTable->GetProperty(
"RINDEX");
383 G4double currentRI = (*rIndexVector)[0];
387 G4double currentPM = rIndexVector->Energy(0);
389 G4double currentCAI = 0;
390 physicsOrderedFreeVector->InsertValues(currentPM , currentCAI);
391 G4double prevRI = currentRI;
392 G4double prevPM = currentPM;
393 G4double prevCAI = currentCAI;
395 for (
size_t ii = 1; ii < rIndexVector->GetVectorLength(); ++ii) {
397 currentRI = (*rIndexVector)[ii];
398 currentPM = rIndexVector->Energy(ii);
399 currentCAI = 0.5 * (1 / (prevRI * prevRI) + 1 / (currentRI * currentRI));
400 currentCAI = prevCAI + (currentPM - prevPM) * currentCAI;
401 physicsOrderedFreeVector->InsertValues(currentPM, currentCAI);
403 prevCAI = currentCAI;
426 const G4Material*
const material = track.GetMaterial();
427 G4MaterialPropertiesTable*
const materialPropertiesTable = material->GetMaterialPropertiesTable();
429 if (!materialPropertiesTable)
432 G4MaterialPropertyVector*
const rIndex = materialPropertiesTable->GetProperty(
"RINDEX");
437 const G4DynamicParticle*
const particle = track.GetDynamicParticle();
439 if (meanNumPhotons <= 0)
442 const G4double stepLimit =
fMaxPhotons / meanNumPhotons;
449 const G4Material*
const material,
450 G4MaterialPropertyVector*
const rIndex)
453 const G4double rFact = 369.81 / (
eV *
cm);
455 if (particle->GetTotalMomentum() <= 0)
458 const G4double betaInverse = particle->GetTotalEnergy() / particle->GetTotalMomentum();
460 const G4int materialIndex = material->GetIndex();
462 G4PhysicsOrderedFreeVector*
const cerenkovAngleIntegrals =
463 (G4PhysicsOrderedFreeVector*)((*
fPhysicsTable)(materialIndex));
465 if (!cerenkovAngleIntegrals->IsFilledVectorExist())
468 G4double pMin = rIndex->GetMinLowEdgeEnergy();
469 const G4double pMax = rIndex->GetMaxLowEdgeEnergy();
470 const G4double nMin = rIndex->GetMinValue();
471 const G4double nMax = rIndex->GetMaxValue();
473 const G4double cAImax = cerenkovAngleIntegrals->GetMaxValue();
477 if (nMax < betaInverse) {
482 }
else if (nMin > betaInverse) {
489 pMin = rIndex->GetEnergy(betaInverse);
491 G4bool isOutRange =
false;
492 const G4double cAImin = cerenkovAngleIntegrals->GetValue(pMin, isOutRange);
493 ge = cAImax - cAImin;
495 if (verboseLevel > 0) {
496 G4cerr <<
"CAImin = " << cAImin << G4endl;
497 G4cerr <<
"ge = " << ge << G4endl;
502 const G4double charge = particle->GetDefinition()->GetPDGCharge();
503 const G4double numPhotons = rFact *
pow(charge /
eplus, 2) * (dp - ge * betaInverse*betaInverse);
516 const G4double rand = 2 * G4UniformRand() - 1;
517 const G4double cosTheta = (rand < 0) ? -
pow(-rand, 1 / 3.) :
pow(rand, 1 / 3.);
518 const G4double sinTheta =
sqrt(1 - cosTheta * cosTheta);
519 const G4double phi = 2 *
utl::kPi * G4UniformRand();
520 const G4double cosPhi = cos(phi);
521 const G4double sinPhi = sin(phi);
525 const G4double k = 1 /
sqrt(1 - c * c);
526 const G4double R11 = k *
b;
527 const G4double R12 = k * a *
c;
528 const G4double R21 = -k *
a;
529 const G4double R22 = k * b *
c;
530 const G4double R32 = -1 / k;
536 if (G4UniformRand() < 0.5) {
538 x = sinTheta * cosPhi;
539 y = sinTheta * sinPhi;
542 (R21 * x + R22 * y + b * z),
544 x = cosTheta * cosPhi;
545 y = cosTheta * sinPhi;
548 (R21 * x + R22 * y + b * z),
553 x = sinTheta * cosPhi;
554 y = sinTheta * sinPhi;
557 (R21 * x + R22 * y + b * z),
559 x = -cosTheta * cosPhi;
560 y = -cosTheta * sinPhi;
564 (R21 * x + R22 * y + b * z),
594 G4double closest = 0;
595 G4ThreeVector displacement;
598 for (
unsigned int i = 1; i <= 3; ++i) {
605 if (closest < 1 && -displacement.z() >
fHeightz) {
627 dead = TransitionToDome<1>(flag);
631 dead = TransitionToDome<2>(flag);
635 dead = TransitionToDome<3>(flag);
645 G4double distanceToFloor, distanceToWall, distanceTravelled, distance;
646 G4double distanceToRoof, distanceToPMT1, distanceToPMT2, distanceToPMT3;
647 G4double alpha, beta, gamma;
650 G4double closest1, closest2, closest3;
651 G4ThreeVector closest, displacement1, displacement2, displacement3;
652 G4double dotProduct, rand, distanceToPMT;
653 G4int hitPMT, targetPMT = -1, target;
661 WARNING(
"The z component of the momentul is 0, skipping photon.");
671 const double distance =
Sqr(alpha) - beta;
673 WARNING(
"Distance to wall is not finite, skipping photon");
677 distanceToWall =
sqrt(distance) - alpha;
680 rand = G4UniformRand();
681 testVal = 1 - exp(-min(distanceToWall, distanceToFloor) *
fInvMFP);
683 if (rand < testVal) {
687 distanceTravelled = -log(1 - rand/fRayleighFrac) /
fInvMFP;
691 if (fPhotonMomentum.z() < 0 &&
702 if (distanceToWall < distanceToFloor) {
727 distanceToWall =
sqrt(
Sqr(alpha) - beta) - alpha;
737 dotProduct = displacement2.dot(fPhotonMomentum);
744 dotProduct = displacement3.dot(fPhotonMomentum);
752 distanceToPMT = 1e99;
765 if (distanceToPMT1 < distanceToPMT2) {
767 distanceToPMT = distanceToPMT1;
770 distanceToPMT = distanceToPMT2;
780 if (distanceToPMT1 < distanceToPMT3) {
782 distanceToPMT = distanceToPMT1;
785 distanceToPMT = distanceToPMT3;
791 if (distanceToPMT2 < distanceToPMT3) {
793 distanceToPMT = distanceToPMT2;
796 distanceToPMT = distanceToPMT3;
801 WARNING(
"Error determining next photon intersection in PropagateInTank()");
805 if (distanceToPMT < distanceToWall) {
806 if (distanceToPMT < distanceToRoof) {
808 distance = distanceToPMT;
811 distance = distanceToRoof;
814 if (distanceToRoof < distanceToWall) {
816 distance = distanceToRoof;
819 distance = distanceToWall;
823 rand = G4UniformRand();
824 testVal = 1 - exp(-distance *
fInvMFP);
825 if (rand < testVal) {
830 distanceTravelled = -log(1 - rand/fRayleighFrac) /
fInvMFP;
834 if (fPhotonMomentum.z() < 0 &&
850 if (fPhotonMomentum.z() < 0)
858 dead = TransitionToDome<1>(
INWARD);
863 dead = TransitionToDome<2>(
INWARD);
868 dead = TransitionToDome<3>(
INWARD);
873 WARNING(
"Error finding target in PropagateInTank");
890 const std::string err =
"Tank photon tracking ran into an impossible condition";
903 G4ThreeVector alpha, beta, delta, normal;
904 G4bool reflected, dead;
905 G4double n, n2, transmission, vDotN;
906 G4double paraComp, perpComp, paraMag, perpMag, x;
907 G4ThreeVector paraPolarization, perpPolarization;
915 dead = PropagateInDome<pmtId>(flag);
933 normal *= 1/normal.mag();
935 if (vDotN > 0.999999) {
936 transmission = 4 * n * n2 /
pow(n + n2, 2);
937 reflected = (G4UniformRand() > transmission);
946 dead = PropagateInDome<pmtId>(flag);
954 dead = PropagateInDome<pmtId>(flag);
960 alpha *= 1/alpha.mag();
965 x = (vDotN > 0) ? -
sqrt(x) :
sqrt(x);
969 perpComp = perpMag / (n * vDotN - x);
970 paraComp = paraMag / (n2 * vDotN - (n * x / n2));
971 transmission = -4 * n * vDotN * x * (
Sqr(perpComp) +
Sqr(paraComp));
972 reflected = (G4UniformRand() >= transmission);
994 dead = PropagateInDome<pmtId>(flag);
1007 dead = PropagateInDome<pmtId>(flag);
1036 dead = TransitionToInterface<pmtId>(flag);
1041 G4double distanceThis, distanceOther, distanceToRoof;
1045 if (distanceToRoof < 0)
1046 distanceToRoof = 1e99;
1050 if (distanceThis < distanceOther) {
1051 if (distanceToRoof < distanceThis)
1061 if (distanceToRoof < distanceOther)
1068 dead = TransitionToInterface<pmtId>(flag);
1074 if (distanceToRoof < distanceOther)
1092 G4ThreeVector alpha, beta, delta, normal;
1093 G4bool reflected, dead;
1094 G4double n, n2, transmission, vDotN;
1095 G4double paraComp, perpComp, paraMag, perpMag, x;
1096 G4ThreeVector paraPolarization, perpPolarization;
1101 dead = PropagateInInterface<pmtId>(flag);
1119 normal *= 1/normal.mag();
1121 if (vDotN > 0.999999) {
1122 transmission = 4 * n * n2 /
pow(n + n2, 2);
1123 reflected = (G4UniformRand() > transmission);
1132 dead = PropagateInInterface<pmtId>(flag);
1138 dead = PropagateInInterface<pmtId>(flag);
1144 alpha *= 1/alpha.mag();
1145 x =
Sqr(n2) -
Sqr(n) * (1 -
Sqr(vDotN));
1149 x = (vDotN > 0) ? -
sqrt(x) :
sqrt(x);
1153 perpComp = perpMag / (n * vDotN - x);
1154 paraComp = paraMag / (n2 * vDotN - n * x / n2);
1155 transmission = -4 * n * vDotN * x * (
Sqr(perpComp) +
Sqr(paraComp));
1156 reflected = (G4UniformRand() >= transmission);
1177 dead = PropagateInInterface<pmtId>(flag);
1190 dead = PropagateInInterface<pmtId>(flag);
1214 if (distanceToRoof < 0)
1215 distanceToRoof = 1e99;
1222 if (distanceThis < distanceOther) {
1223 if (distanceToRoof < distanceThis)
1233 if (distanceToRoof < distanceOther)
1252 const G4ThreeVector normal(0, 0, -1);
1254 G4double r = G4UniformRand();
1255 if (r > reflectivity)
1282 G4double r = G4UniformRand();
1283 if (r > reflectivity)
1288 const G4double w = 1 /
sqrt(
Sqr(x) +
Sqr(y));
1289 const G4ThreeVector normal(-x * w, -y * w, 0);
1313 const G4ThreeVector normal(0, 0, 1);
1315 G4double r = G4UniformRand();
1316 if (r > reflectivity)
1352 const G4double rand = G4UniformRand();
1353 const G4double cosTheta =
sqrt(1 - rand);
1354 const G4double sinTheta =
sqrt(rand);
1355 const G4double phi = 2 *
utl::kPi * G4UniformRand();
1356 const G4double sinThetaCosPhi = sinTheta * cos(phi);
1357 const G4double sinThetaSinPhi = sinTheta * sin(phi);
1358 const G4double x = normal.x();
1359 const G4double y = normal.y();
1361 const G4double vx = x * cosTheta - y * sinThetaSinPhi / w;
1362 const G4double vy = y * cosTheta + x * sinThetaSinPhi / w;
1363 const G4double vz = -w * sinThetaCosPhi;
1375 const G4double rand = G4UniformRand();
1376 const G4double cosTheta =
sqrt(1 - rand);
1377 const G4double sinTheta =
sqrt(rand);
1378 const G4double phi = 2 *
utl::kPi * G4UniformRand();
1379 const G4double vx = sinTheta * cos(phi);
1380 const G4double vy = sinTheta * sin(phi);
1381 const G4double vz = normal.z() * cosTheta;
1396 fPhotonMomentum /= fPhotonMomentum.mag();
1405 const G4double x = normal.x();
1406 const G4double y = normal.y();
1408 G4ThreeVector trialMomentum;
1410 G4ThreeVector facetNormal;
1411 G4double dotProduct;
1417 sinAlpha = sin(alpha);
1418 }
while (G4UniformRand()*fMax > sinAlpha || alpha >= 0.5*
utl::kPi);
1419 const G4double phi = 2*
utl::kPi * G4UniformRand();
1420 const G4double cosAlpha = cos(alpha);
1421 const G4double sinAlphaSinPhi = sinAlpha * sin(phi);
1422 const G4double sinAlphaCosPhi = sinAlpha * cos(phi);
1423 const G4double vx = x * cosAlpha - y * sinAlphaSinPhi / w;
1424 const G4double vy = y * cosAlpha + x * sinAlphaSinPhi / w;
1425 const G4double vz = -w * sinAlphaCosPhi;
1426 facetNormal.set(vx, vy, vz);
1428 }
while (dotProduct >= 0);
1430 }
while (trialMomentum.dot(normal) <= 0);
1435 fPhotonMomentum /= fPhotonMomentum.mag();
1444 G4ThreeVector trialMomentum;
1446 G4ThreeVector facetNormal;
1447 G4double dotProduct;
1453 sinAlpha = sin(alpha);
1454 }
while (G4UniformRand()*fMax > sinAlpha || alpha >= 0.5*
utl::kPi);
1455 const G4double phi = 2*
utl::kPi * G4UniformRand();
1456 const G4double cosAlpha = cos(alpha);
1457 const G4double vx = sinAlpha * cos(phi);
1458 const G4double vy = sinAlpha * sin(phi);
1459 const G4double vz = normal.z() * cosAlpha;
1460 facetNormal.set(vx, vy, vz);
1462 }
while (dotProduct >= 0);
1464 }
while (trialMomentum.dot(normal) <= 0);
1469 fPhotonMomentum /= fPhotonMomentum.mag();
1482 const G4double
c = pos.dot(pos) -
Sqr(r);
1483 G4double d =
Sqr(b) -
c;
1488 const G4double distA = b + d;
1489 const G4double distB = b - d;
1491 if (distB < distA) {
1508 const G4double r1,
const G4double r2)
1516 const double c[3] = {
Sqr(pos.x()),
Sqr(pos.y()),
Sqr(pos.z()) };
1519 const double r12 =
Sqr(r1);
1520 const double r22 =
Sqr(r2);
1521 const double e = (b[0] + b[1]) / r12 + b[2] / r22;
1522 const double f = 2*((d[0] + d[1]) / r12 + d[2] / r22);
1523 const double g = (c[0] + c[1]) / r12 + c[2] / r22 - 1;
1525 const double dis =
Sqr(f) - 4*e*
g;
1530 const double sq =
sqrt(dis);
1532 const double i2e = 1 / (2*e);
1533 const double a1 = i2e * (-f + sq);
1534 const double a2 = i2e * (-f - sq);
static double fTankHalfHeight
void AddPhoton(const int nPMT, const double peTime) const
peTime in Auger units!
static double fgTankHalfHeight
static utl::TabulatedFunction fInterfaceRIndex
unsigned int GetNPoints() const
constexpr T Sqr(const T &x)
void DiffuseScatterHorizontal(const G4ThreeVector &normal)
G4bool PropagateInInterface(G4int &flag)
static utl::TabulatedFunction fLinerReflectivity
Detector description interface for Station-related data.
G4ThreeVector fPhotonPosition
static double fgTankRadius
ArrayConstReference XBack() const
read-only reference to back of array of X
static double fDomeRadius
void PropagateInTank(G4int flag)
static double fTankHeight
Class to hold collection (x,y) points and provide interpolation between them.
static utl::TabulatedFunction fLinerBackscatter
static utl::TabulatedFunction fLinerSpecularSpike
static double fDomeRadiusz
static double fPMTRadiuszSq
G4double GetSphereIntersect(const G4ThreeVector &, const G4double) const
static utl::TabulatedFunction fgWaterABSORPTION
const PMT & GetPMT(const int id) const
Get specified PMT by id.
static double fPMTRadiusz
static utl::TabulatedFunction fgLinerSPECULARLOBECONSTANT
void SpikeScatter(const G4ThreeVector &normal)
double pow(const double x, const unsigned int i)
static double fTankRadius
void LobeScatterHorizontal(const G4ThreeVector &normal)
static utl::TabulatedFunction fWaterAbsLength
static double fInterfaceRadiusSq
static G4ThreeVector fPMTPos[4]
static void GetDataFromConstruction()
void DumpPhysicsTable() const
G4bool TransitionToDome(G4int flag)
Exception for reporting variable out of valid range.
static double fgInterfaceRmax
static double fSigmaAlpha
G4double fSampledMomentum
const sdet::Station & GetDetectorStation() const
static double fgTankThickness
static double fDomeRadiuszSq
static double fTankThickness
G4bool TransitionToInterface(G4int &flag)
ArrayConstReference XFront() const
read-only reference to front of array of X
static utl::TabulatedFunction fDomeRIndex
void BuildThePhysicsTable()
G4PhysicsTable * fPhysicsTable
static utl::TabulatedFunction fDomeAbsLength
const utl::Point & GetPosition() const
PMT position.
Auger Software Run Control.
utl::CoordinateSystemPtr GetLocalCoordinateSystem() const
Get the Auger reference system centered on the tank.
static double fInterfaceRadius
static utl::TabulatedFunction fLinerSpecularLobe
#define WARNING(message)
Macro for logging warning messages.
static double fTankRadiusSq
static double fgSIGMA_ALPHA
static utl::TabulatedFunction fInterfaceAbsLength
static utl::TabulatedFunction fgLinerBACKSCATTERCONSTANT
static utl::TabulatedFunction fgPmtdomeRINDEX
static double fgDomeRzmax
G4ThreeVector ToG4Vector(const V &v, const utl::CoordinateSystemPtr &cs, const double unitConversion)
static utl::TabulatedFunction fgLinerREFLECTIVITY
class that handles Geant4 SD Station simulation adopted from G4TankSimulator
G4double GetAverageNumberOfPhotons(const G4DynamicParticle *, const G4Material *, G4MaterialPropertyVector *) const
struct particle_info particle[80]
static G4double fRoofPos[4]
G4bool PropagateInDome(G4int &flag)
static utl::TabulatedFunction fgLinerSPECULARSPIKECONSTANT
static utl::TabulatedFunction fQE
void LobeScatterVertical(const G4ThreeVector &normal)
G4ThreeVector fPhotonPolarization
G4VParticleChange * AlongStepDoIt(const G4Track &track, const G4Step &step) override
static double fgInterfaceRzmax
double Y(const double x) const
Get or interpolate the Y value that corresponds to parameter x.
static utl::TabulatedFunction fgInterfaceRINDEX
static double fInterfaceRadiusz
#define ERROR(message)
Macro for logging error messages.
static utl::TabulatedFunction fgPmtdomeABSORPTION
G4ThreeVector fPhotonMomentum
static double fInterfaceRadiuszSq
static double fPMTRadiusSq
G4double GetContinuousStepLimit(const G4Track &, G4double, G4double, G4double &) override
static utl::TabulatedFunction fgInterfaceABSORPTION
virtual ~G4TankFastCerenkov()
void DiffuseScatterVertical(const G4ThreeVector &normal)
G4StationSimulator & fG4StationSimulator
G4double GetEllipsoidIntersect(const G4ThreeVector &, const G4double, const G4double) const
static double fDomeRadiusSq