55 {
56
57
58
59 G4Track* aTrack = aStep->GetTrack();
60 G4ParticleDefinition* particle = aTrack->GetDefinition();
61
62
63
64 if (particle == G4OpticalPhoton::OpticalPhotonDefinition()) {
65 auto* info = dynamic_cast<Simulation::TrackInfo*>(aTrack->GetUserInformation());
66 if (!info) return false;
67 if (info->getStatus() < 2) {
68 double energy = aTrack->GetKineticEnergy() * Unit::MeV / Unit::eV;
69 double qeffi = m_topgp->getPMTEfficiencyEnvelope(energy);
70 double fraction = info->getFraction();
71 if (qeffi == 0 or gRandom->Uniform() * fraction > qeffi) {
72 aTrack->SetTrackStatus(fStopAndKill);
73 return false;
74 }
75 info->setStatus(2);
76 info->setFraction(qeffi);
77 }
78 return false;
79 }
80
81
82
83 G4StepPoint* PrePosition = aStep->GetPreStepPoint();
84 if (PrePosition->GetStepStatus() != fGeomBoundary) return false;
85
86 if (m_barHits.getEntries() == 0) {
87 for (auto& trackID : m_trackIDs) trackID = -1;
88 }
89
90 int moduleID = PrePosition->GetTouchableHandle()->GetReplicaNumber(m_replicaDepth);
91 const auto* geo = m_topgp->getGeometry();
92 if (!geo->isModuleIDValid(moduleID)) {
93 B2ERROR("TOP::SensitiveBar: undefined module ID."
94 << LogVar("moduleID", moduleID));
95 return false;
96 }
97
98 int trackID = aTrack->GetTrackID();
99 if (trackID == m_trackIDs[moduleID - 1]) return false;
100 m_trackIDs[moduleID - 1] = trackID;
101
102
103
104
105 G4ThreeVector worldPosition = PrePosition->GetPosition();
106 double tracklength = aTrack->GetTrackLength() - aStep->GetStepLength();
107 double globalTime = PrePosition->GetGlobalTime();
108 G4ThreeVector momentum = PrePosition->GetMomentum();
109
110 ROOT::Math::XYZPoint TPosition(worldPosition.x(), worldPosition.y(), worldPosition.z());
111 ROOT::Math::XYZVector TMomentum(momentum.x(), momentum.y(), momentum.z());
112 ROOT::Math::XYZPoint TOrigin(aTrack->GetVertexPosition().x(),
113 aTrack->GetVertexPosition().y(),
114 aTrack->GetVertexPosition().z());
115
116
117 TPosition = TPosition * Unit::mm;
118 TMomentum = TMomentum * Unit::MeV;
119 TOrigin = TOrigin * Unit::mm;
120 tracklength = tracklength * Unit::mm;
121
122 const auto& module = geo->getModule(moduleID);
123 auto locPosition = module.pointToLocal(TPosition);
124 auto locMomentum = module.momentumToLocal(TMomentum);
125 double theta = locMomentum.Theta();
126 double phi = locMomentum.Phi();
127
128 int PDG = (int)(particle->GetPDGEncoding());
129
130
131 auto* hit = m_barHits.appendNew(moduleID, PDG, TOrigin, TPosition, TMomentum,
132 globalTime, tracklength, locPosition,
133 theta, phi);
134
135
136 m_relParticleHit.add(trackID, hit->getArrayIndex());
137
138 return true;
139 }