68 double last_dral = -1;
69 double last_theta = -1;
71 auto track{step->GetTrack()};
74 if (track->GetParentID() != 0)
return;
78 if (
auto pdg_id{track->GetParticleDefinition()->GetPDGEncoding()};
84 static auto target_region =
85 simcore::g4user::ptrretrieval::getRegion(
"target");
87 ldmx_log(warn) <<
"Region 'target' not found in Geant4 region store";
89 auto phy_vol{track->GetVolume()};
90 auto log_vol{phy_vol ? phy_vol->GetLogicalVolume() :
nullptr};
91 auto track_region{log_vol ? log_vol->GetRegion() :
nullptr};
92 if (track_region != target_region)
return;
113 auto recoil_physical_volume =
114 simcore::g4user::ptrretrieval::getPhysicalVolume(
"recoil_PV");
115 auto world_physical_volume =
116 simcore::g4user::ptrretrieval::getPhysicalVolume(
"World_PV");
117 if (!recoil_physical_volume) {
118 ldmx_log(warn) <<
"Volume 'recoil_PV' not found in Geant4 volume store";
120 if (!world_physical_volume) {
121 ldmx_log(warn) <<
"Volume 'World_PV' not found in Geant4 volume store";
123 auto track_volume = track->GetNextVolume();
124 if (track_volume == recoil_physical_volume or
125 track_volume == world_physical_volume) {
128 ldmx_log(trace) <<
"Abort: recoil p=" << track->GetMomentum().mag()
130 track->SetTrackStatus(fKillTrackAndSecondaries);
131 G4RunManager::GetRunManager()->AbortEvent();
136 bool has_brem_candidate =
false;
137 if (
auto secondaries = step->GetSecondary(); secondaries->size() == 0) {
138 ldmx_log(trace) <<
"Abort: no secondaries produced";
139 track->SetTrackStatus(fKillTrackAndSecondaries);
140 G4RunManager::GetRunManager()->AbortEvent();
143 ldmx_log(trace) <<
"Exiting target: recoil p ="
144 << track->GetMomentum().mag() <<
" MeV, "
145 << secondaries->size() <<
" secondaries";
147 for (
auto& secondary_track : *secondaries) {
148 auto electron = G4Electron::Definition();
150 simcore::g4user::ptrretrieval::getProcess(electron,
"eBrem");
151 if (!ebrem_process) {
152 ldmx_log(warn) <<
"Process 'eBrem' not found in Geant4 process store";
158 auto secondary_pdg_id =
159 secondary_track->GetParticleDefinition()->GetPDGEncoding();
160 if (secondary_pdg_id != 22)
continue;
163 auto momentum = secondary_track->GetMomentum();
164 double theta = std::atan2(std::sqrt(momentum.x() * momentum.x() +
165 momentum.y() * momentum.y()),
167 bool pass_brem_theta =
172 auto gamma_mom = secondary_track->GetMomentum();
173 auto electron_mom = track->GetMomentum();
174 double gamma_eta = gamma_mom.eta();
175 double gamma_phi = gamma_mom.phi();
176 double electron_eta = electron_mom.eta();
177 double electron_phi = electron_mom.phi();
179 double dphi = std::atan2(std::sin(electron_phi - gamma_phi),
180 std::cos(electron_phi - gamma_phi));
181 double dral = std::sqrt((electron_eta - gamma_eta) *
182 (electron_eta - gamma_eta) +
184 bool pass_dral = dral >=
dral_min_ && dral <= dral_max_;
189 ldmx_log(trace) <<
" photon E="
190 << secondary_track->GetKineticEnergy()
191 <<
" MeV, theta=" << theta
192 <<
" (pass=" << pass_brem_theta <<
")"
193 <<
", dR=" << dral <<
" (pass=" << pass_dral <<
")";
195 if (pass_brem_theta && pass_dral) {
198 track_info->tagBremCandidate();
202 has_brem_candidate =
true;
208 if (!has_brem_candidate) {
209 ldmx_log(trace) <<
"Abort: no brem candidate passed cuts";
210 track->SetTrackStatus(fKillTrackAndSecondaries);
211 G4RunManager::GetRunManager()->AbortEvent();
215 ldmx_log(info) <<
"ACCEPTED: brem candidate with theta=" << last_theta
216 <<
", dR=" << last_dral;
221 track->SetTrackStatus(fStopAndKill);
223 track->SetTrackStatus(fSuspend);
225 }
else if (step->GetPostStepPoint()->GetKineticEnergy() == 0) {
226 track->SetTrackStatus(fKillTrackAndSecondaries);
227 G4RunManager::GetRunManager()->AbortEvent();