11 #include <beast/claws/simulation/SensitiveDetector.h>
12 #include <framework/gearbox/Unit.h>
15 #include <G4Version.hh>
27 std::array<float, 3> vecToFloat(
const G4ThreeVector& vec)
29 return std::array<float, 3> {{(float)vec.x(), (float)vec.y(), (float)vec.z()}};
34 Simulation::SensitiveDetectorBase(
"CLAWSSensitiveDetector", Const::invalidDetector)
37 m_mcParticles.registerInDataStore();
38 m_simHits.registerInDataStore();
39 m_relMCSimHit.registerInDataStore();
47 #if G4VERSION_NUMBER < 1010
48 m_saturationEngine =
new G4EmSaturation();
50 m_saturationEngine =
new G4EmSaturation(1);
57 const G4TouchableHistory* touchable =
dynamic_cast<const G4TouchableHistory*
>(
step->GetPreStepPoint()->GetTouchable());
58 int ladderID = touchable->GetVolume(2)->GetCopyNo();
59 int sensorID = touchable->GetVolume(1)->GetCopyNo();
62 const G4Track& track = *
step->GetTrack();
63 const int trackID = track.GetTrackID();
64 const int pdgCode =
step->GetTrack()->GetDefinition()->GetPDGEncoding();
66 double depEnergy =
step->GetTotalEnergyDeposit();
68 double visibleEnergy = m_saturationEngine->VisibleEnergyDeposition(
69 track.GetDefinition(),
70 track.GetMaterialCutsCouple(),
71 step->GetStepLength(),
79 const G4StepPoint& preStep = *
step->GetPreStepPoint();
80 const G4StepPoint& postStep = *
step->GetPostStepPoint();
83 if (m_tracks.empty() || (!m_tracks.top().check(trackID, ladderID, sensorID))) {
93 const G4ThreeVector preStepPos = preStep.GetPosition() / CLHEP::mm *
Unit::mm;
94 const G4ThreeVector preStepMom = preStep.GetMomentum() / CLHEP::MeV *
Unit::MeV;
95 const double time = preStep.GetGlobalTime() / CLHEP::ns *
Unit::ns;
96 traversal.
setInitial(trackID, ladderID, sensorID, pdgCode, isPrimary, preStepPos, preStepMom, time);
98 if (preStep.GetStepStatus() == fGeomBoundary) traversal.
hasEntered();
102 const G4ThreeVector postStepPos = postStep.GetPosition() / CLHEP::mm *
Unit::mm;
103 const double length =
step->GetStepLength() / CLHEP::cm *
Unit::cm;
104 traversal.
add(postStepPos, depEnergy, visibleEnergy, length);
107 bool isLeaving = (postStep.GetStepStatus() == fGeomBoundary);
108 if (isLeaving) traversal.
hasLeft();
111 if (isLeaving || track.GetTrackStatus() >= fStopAndKill) {
113 bool saved = finishTrack();
115 if (saved && !contained) {
124 bool SensitiveDetector::finishTrack()
126 SensorTraversal& traversal = m_tracks.top();
130 auto momEntry = vecToFloat(traversal.getEntryMomentum());
131 auto posEntry = vecToFloat(traversal.getEntryPosition());
132 auto posExit = vecToFloat(traversal.getExitPosition());
133 int hitIndex = m_simHits.getEntries();
135 traversal.getLadderID(), traversal.getSensorID(),
136 traversal.getPDGCode(), traversal.getEntryTime(),
137 traversal.getDepEnergy(), traversal.getVisibleEnergy(),
138 traversal.getLength(), posEntry.data(), posExit.data(),
141 m_relMCSimHit.add(traversal.getTrackID(), hitIndex, traversal.getDepEnergy());
144 if (m_tracks.size() == 1) {