11 #include <beast/qcsmonitor/simulation/SensitiveDetector.h>
12 #include <beast/qcsmonitor/dataobjects/QcsmonitorSimHit.h>
14 #include <framework/datastore/StoreArray.h>
15 #include <framework/datastore/RelationArray.h>
19 #include <G4Version.hh>
27 namespace qcsmonitor {
30 Simulation::SensitiveDetectorBase(
"QcsmonitorSensitiveDetector", Const::invalidDetector)
57 mcParticles.registerInDataStore();
58 simHits.registerInDataStore();
59 relMCSimHit.registerInDataStore();
66 #if G4VERSION_NUMBER < 1010
67 saturationEngine =
new G4EmSaturation();
69 saturationEngine =
new G4EmSaturation(1);
81 const G4StepPoint& preStep = *
step->GetPreStepPoint();
82 const G4StepPoint& postStep = *
step->GetPostStepPoint();
84 G4Track& track = *
step->GetTrack();
85 if (m_trackID != track.GetTrackID()) {
87 m_trackID = track.GetTrackID();
89 m_momentum = preStep.GetMomentum() ;
91 m_startEnergy = preStep.GetKineticEnergy() ;
97 m_WightedPos.SetXYZ(0, 0, 0);
101 const double depEnergy =
step->GetTotalEnergyDeposit() ;
102 m_energyDeposit += saturationEngine->VisibleEnergyDeposition(track.GetDefinition(), track.GetMaterialCutsCouple(),
103 step->GetStepLength(), depEnergy, 0.);
106 m_startTime = preStep.GetGlobalTime();
107 m_endTime = postStep.GetGlobalTime();
108 m_WightedTime += (m_startTime + m_endTime) / 2 * (
step->GetTotalEnergyDeposit());
110 m_startPos = preStep.GetPosition();
111 m_endPos = postStep.GetPosition();
112 TVector3 position((m_startPos.getX() + m_endPos.getX()) / 2 / CLHEP::cm, (m_startPos.getY() + m_endPos.getY()) / 2 / CLHEP::cm,
113 (m_startPos.getZ() + m_endPos.getZ()) / 2 / CLHEP::cm);
114 m_WightedPos += position * (
step->GetTotalEnergyDeposit());
117 if (track.GetNextVolume() != track.GetVolume() || track.GetTrackStatus() >= fStopAndKill) {
118 int pdgCode = track.GetDefinition()->GetPDGEncoding();
120 const G4VPhysicalVolume& v = * track.GetVolume();
121 G4ThreeVector posCell = v.GetTranslation();
126 m_cellID = track.GetVolume()->GetCopyNo();
128 double dTotalEnergy = 1 / m_energyDeposit;
129 if (m_energyDeposit > 0.) {
130 saveSimHit(m_cellID, m_trackID, pdgCode, m_WightedTime / m_energyDeposit,
131 m_energyDeposit, m_momentum, m_WightedPos * dTotalEnergy);
142 int SensitiveDetector::saveSimHit(
158 RelationArray qcsmonitorSimHitRel(mcParticles, QcsmonitorHits);
159 TVector3 momentum(mom.getX() / CLHEP::GeV, mom.getY() / CLHEP::GeV, mom.getZ() / CLHEP::GeV);
160 QcsmonitorHits.
appendNew(cellId, trackID, pid, tof / CLHEP::ns, edep / CLHEP::GeV, momentum, posAve);
161 int simhitNumber = QcsmonitorHits.
getEntries() - 1;
162 B2DEBUG(150,
"HitNumber: " << simhitNumber);
163 qcsmonitorSimHitRel.
add(trackID, simhitNumber);
164 return (simhitNumber);