11 #include <beast/fangs/simulation/SensitiveDetector.h>
12 #include <framework/gearbox/Unit.h>
26 std::array<float, 3> vecToFloat(
const G4ThreeVector& vec)
28 return std::array<float, 3> {{(float)vec.x(), (float)vec.y(), (float)vec.z()}};
33 Simulation::SensitiveDetectorBase(
"FANGSSensitiveDetector", Const::invalidDetector)
36 m_mcParticles.registerInDataStore();
37 m_simHits.registerInDataStore();
38 m_relMCSimHit.registerInDataStore();
50 const G4TouchableHistory* touchable =
dynamic_cast<const G4TouchableHistory*
>(
step->GetPreStepPoint()->GetTouchable());
51 int ladderID = touchable->GetVolume(2)->GetCopyNo();
52 int sensorID = touchable->GetVolume(1)->GetCopyNo();
55 const G4Track& track = *
step->GetTrack();
56 const int trackID = track.GetTrackID();
57 const int pdgCode =
step->GetTrack()->GetDefinition()->GetPDGEncoding();
59 double depEnergy =
step->GetTotalEnergyDeposit();
64 const G4StepPoint& preStep = *
step->GetPreStepPoint();
65 const G4StepPoint& postStep = *
step->GetPostStepPoint();
68 if (m_tracks.empty() || (!m_tracks.top().check(trackID, ladderID, sensorID))) {
78 const G4ThreeVector preStepPos = preStep.GetPosition() / CLHEP::mm *
Unit::mm;
79 const G4ThreeVector preStepMom = preStep.GetMomentum() / CLHEP::MeV *
Unit::MeV;
81 const G4AffineTransform& localToGlobalTransform = preStep.GetTouchableHandle()->GetHistory()->GetTopTransform();
82 const G4ThreeVector localpreStepPos = localToGlobalTransform.TransformPoint(preStep.GetPosition()) / CLHEP::mm *
Unit::mm;
83 const double time = preStep.GetGlobalTime() / CLHEP::ns *
Unit::ns;
84 traversal.
setInitial(trackID, ladderID, sensorID, pdgCode, isPrimary, preStepPos, localpreStepPos, preStepMom, time);
86 if (preStep.GetStepStatus() == fGeomBoundary) traversal.
hasEntered();
89 const G4ThreeVector postStepPos = postStep.GetPosition() / CLHEP::mm *
Unit::mm;
90 const double length =
step->GetStepLength() / CLHEP::cm *
Unit::cm;
91 traversal.
add(postStepPos, depEnergy, length);
94 bool isLeaving = (postStep.GetStepStatus() == fGeomBoundary);
95 if (isLeaving) traversal.
hasLeft();
98 if (isLeaving || track.GetTrackStatus() >= fStopAndKill) {
100 bool saved = finishTrack();
102 if (saved && !contained) {
111 bool SensitiveDetector::finishTrack()
113 SensorTraversal& traversal = m_tracks.top();
117 auto momEntry = vecToFloat(traversal.getEntryMomentum());
118 auto posEntry = vecToFloat(traversal.getEntryPosition());
119 auto localposEntry = vecToFloat(traversal.getLocalEntryPosition());
120 auto posExit = vecToFloat(traversal.getExitPosition());
121 int hitIndex = m_simHits.getEntries();
123 traversal.getTrackID(),
124 traversal.getLadderID(), traversal.getSensorID(),
125 traversal.getPDGCode(), traversal.getEntryTime(),
126 traversal.getDepEnergy(),
127 traversal.getLength(), posEntry.data(),
128 localposEntry.data(),
129 posExit.data(), momEntry.data()
131 m_relMCSimHit.add(traversal.getTrackID(), hitIndex, traversal.getDepEnergy());
134 if (m_tracks.size() == 1) {