11 #include <top/simulation/SensitivePMT.h>
13 #include <simulation/kernel/UserInfo.h>
16 #include <G4UnitsTable.hh>
17 #include <G4ParticleDefinition.hh>
18 #include <G4ParticleTypes.hh>
20 #include <framework/logging/Logger.h>
21 #include <framework/gearbox/Unit.h>
35 SensitivePMT::SensitivePMT():
36 Simulation::SensitiveDetectorBase(
"TOP",
Const::TOP)
54 G4Track& photon = *aStep->GetTrack();
57 if (photon.GetDefinition() != G4OpticalPhoton::OpticalPhotonDefinition())
return false;
67 G4ThreeVector localPosition = photon.GetTouchableHandle()->GetHistory()->GetTopTransform().TransformPoint(photon.GetPosition());
68 double xLocal = localPosition.x() *
Unit::mm;
69 double yLocal = localPosition.y() *
Unit::mm;
76 applyQE = info->getStatus() < 3;
77 fraction = info->getFraction();
81 if (qeffi == 0 or gRandom->Uniform() * fraction > qeffi) {
82 photon.SetTrackStatus(fStopAndKill);
86 info->setFraction(qeffi);
90 const G4ThreeVector& g_detPoint = photon.GetPosition();
91 const G4ThreeVector& g_detMomDir = photon.GetMomentumDirection();
92 TVector3 detPoint(g_detPoint.x(), g_detPoint.y(), g_detPoint.z());
93 TVector3 detMomDir(g_detMomDir.x(), g_detMomDir.y(), g_detMomDir.z());
94 double detTime = photon.GetGlobalTime();
95 double length = photon.GetTrackLength();
98 const G4ThreeVector& g_emiPoint = photon.GetVertexPosition();
99 const G4ThreeVector& g_emiMomDir = photon.GetVertexMomentumDirection();
100 TVector3 emiPoint(g_emiPoint.x(), g_emiPoint.y(), g_emiPoint.z());
101 TVector3 emiMomDir(g_emiMomDir.x(), g_emiMomDir.y(), g_emiMomDir.z());
102 double emiTime = photon.GetGlobalTime() - photon.GetLocalTime();
111 auto* simHit =
m_simHits.appendNew(moduleID, pmtID, xLocal, yLocal,
114 int parentID = photon.GetParentID();
115 if (parentID == 0) parentID = photon.GetTrackID();
119 if (geo->isModuleIDValid(moduleID)) {
121 const auto& module = geo->getModule(moduleID);
122 emiPoint = module.pointToLocal(emiPoint);
123 detPoint = module.pointToLocal(detPoint);
124 emiMomDir = module.momentumToLocal(emiMomDir);
125 detMomDir = module.momentumToLocal(detMomDir);
127 B2ERROR(
"TOP::SensitivePMT: undefined module ID."
128 <<
LogVar(
"moduleID", moduleID));
131 emiPoint, emiMomDir, emiTime,
132 detPoint, detMomDir, detTime,
135 simHit->addRelationTo(simPhoton);
138 photon.SetTrackStatus(fStopAndKill);