12 #include <beast/csi/simulation/SensitiveDetector.h>
13 #include <beast/csi/dataobjects/CsiSimHit.h>
14 #include <beast/csi/dataobjects/CsiHit.h>
15 #include <framework/dataobjects/EventMetaData.h>
16 #include <beast/csi/geometry/CsiGeometryPar.h>
17 #include <framework/datastore/StoreArray.h>
18 #include <framework/datastore/RelationArray.h>
19 #include <framework/datastore/StoreObjPtr.h>
33 Simulation::SensitiveDetectorBase(
"CsiSensitiveDetector", Const::invalidDetector)
56 for (
int i = 0; i < 18; i++) {
for (
int j = 0; j < 80; j++) { CsiHitIndex[i][j] = 0;}}
67 mcParticles.registerInDataStore();
68 simHits.registerInDataStore();
69 csiHits.registerInDataStore();
70 simHitRel.registerInDataStore();
71 csiHitRel.registerInDataStore();
81 SensitiveDetector::~SensitiveDetector()
91 const G4StepPoint& preStep = *aStep->GetPreStepPoint();
92 const G4StepPoint& postStep = * aStep->GetPostStepPoint();
94 G4Track& track = * aStep->GetTrack();
95 if (m_trackID != track.GetTrackID()) {
97 m_trackID = track.GetTrackID();
99 m_momentum = preStep.GetMomentum() ;
101 m_startEnergy = preStep.GetKineticEnergy() ;
107 m_WightedPos.set(0, 0, 0);
111 m_energyDeposit += aStep->GetTotalEnergyDeposit() ;
113 m_startTime = preStep.GetGlobalTime();
114 m_endTime = postStep.GetGlobalTime();
115 m_WightedTime += (m_startTime + m_endTime) / 2 * (aStep->GetTotalEnergyDeposit());
117 m_startPos = preStep.GetPosition();
118 m_endPos = postStep.GetPosition();
120 G4ThreeVector position(0.5 * (m_startPos + m_endPos));
121 m_WightedPos += position * (aStep->GetTotalEnergyDeposit());
124 if (track.GetNextVolume() != track.GetVolume() || track.GetTrackStatus() >= fStopAndKill) {
125 int pdgCode = track.GetDefinition()->GetPDGEncoding();
127 const G4VPhysicalVolume& v = * track.GetVolume();
131 G4RotationMatrix rotCell = * v.GetObjectRotation();
133 G4ThreeVector vecCell = rotCell.colZ();
134 G4ThreeVector posCell = v.GetTranslation();
137 if (v.GetName().find(
"Crystal") != std::string::npos) {
141 double dTotalEnergy = 1.0 / m_energyDeposit;
142 if (m_energyDeposit > 0.) {
143 saveSimHit(m_cellID, m_trackID, pdgCode, m_WightedTime * dTotalEnergy,
144 m_energyDeposit, m_momentum, m_WightedPos * dTotalEnergy,
156 int SensitiveDetector::saveSimHit(
164 G4ThreeVector PosCell,
165 G4ThreeVector VecCell)
175 TVector3 momentum(mom.getX() , mom.getY() , mom.getZ());
176 TVector3 position(pos.getX() , pos.getY() , pos.getZ());
179 simHits.
appendNew(cellId, trackID, pid, tof / CLHEP::ns, edep / CLHEP::GeV,
180 momentum * (1.0 / CLHEP::GeV), position * (1.0 / CLHEP::cm));
183 simHitRel.
add(trackID, simhitNumber);
184 B2DEBUG(150,
"Saving CsiSimHit Number: " << simhitNumber);
202 int m_currentEvnetNumber = eventMetaDataPtr->getEvent();
205 if (firstcall == 0 || m_currentEvnetNumber != m_oldEvnetNumber) {
206 m_oldEvnetNumber = m_currentEvnetNumber;
207 for (
int iCSICell = 0; iCSICell < 18; iCSICell++) {
208 for (
int TimeInd = 0; TimeInd < 80; TimeInd++) {
209 CsiHitIndex[iCSICell][TimeInd] = -1;
216 if (m_currentEvnetNumber == m_oldEvnetNumber) {
217 if ((tof / CLHEP::ns) < 8000) {
218 TimeIndex = (int)((tof / CLHEP::ns) / 100);
221 local_pos = (15. - (pos - PosCell) * VecCell);
228 T_ave = 0.0600 * local_pos + (tof / CLHEP::ns) ;
231 double E_cell = (edep / CLHEP::GeV);
232 if (CsiHitIndex[cellId][TimeIndex] == -1) {
237 CsiHitIndex[cellId][TimeIndex] = m_hitNum;
238 csiHits[m_hitNum]->setCellId(cellId);
239 csiHits[m_hitNum]->setEnergyDep(E_cell);
240 csiHits[m_hitNum]->setTimeAve(T_ave);
241 csiHits[m_hitNum]->setTimeVar(0);
242 csiHitRel.
add(trackID, m_hitNum);
245 m_hitNum = CsiHitIndex[cellId][TimeIndex];
246 double old_edep = csiHits[m_hitNum]->getEnergyDep();
247 double old_TimeAve = csiHits[m_hitNum]->getTimeAve();
248 double old_TimeVar = csiHits[m_hitNum]->getTimeVar();
253 double temp = E_cell + old_edep;
254 double delta = T_ave - old_TimeAve;
255 double R = delta * E_cell / temp;
256 double new_TimeAve = old_TimeAve + R;
257 double new_TimeVar = old_TimeVar + old_edep * delta * R;
258 double new_edep = temp;
273 csiHits[m_hitNum]->setEnergyDep(new_edep);
274 csiHits[m_hitNum]->setTimeAve(new_TimeAve);
275 csiHits[m_hitNum]->setTimeVar(new_TimeVar);
276 csiHitRel.
add(trackID, m_hitNum);
280 }
else { B2ERROR(
"m_currentEvnetNumber ERROR: m_oldEvnetNumber==m_oldEvnetNumber"); }
282 return (simhitNumber);