39 const auto& particle_map{
42 for (
const auto& [track_id, particle] : particle_map) {
43 if (track_id == 1) beam = &particle;
44 if (particle.getProcessType() ==
45 ldmx::SimParticle::ProcessType::eDarkBrem) {
46 if (particle.getPdgID() == 622) {
47 if (aprime !=
nullptr) {
48 EXCEPTION_RAISE(
"BadEvent",
"Found multiple A' in event.");
57 if (recoil ==
nullptr and aprime ==
nullptr) {
64 ldmx_log(error) <<
" No dark brem occured in this event";
68 if (recoil ==
nullptr or aprime ==
nullptr or beam ==
nullptr) {
72 <<
"Unable to find all necessary particles for DarkBrem interaction."
73 <<
" Missing: [ " << (recoil ==
nullptr ?
" recoil " :
"")
74 << (aprime ==
nullptr ?
" aprime " :
"")
75 << (beam ==
nullptr ?
" beam " :
"") <<
"]";
78 "Unable to find all necessary particles for DarkBrem interaction.");
83 const auto& aprime_p = aprime->getMomentum();
84 ROOT::Math::XYZVector recoil_pvec(recoil_p[0], recoil_p[1], recoil_p[2]);
85 ROOT::Math::XYZVector aprime_pvec(aprime_p[0], aprime_p[1], aprime_p[2]);
87 std::vector<double> incident_p = recoil_p;
88 for (std::size_t i{0}; i < recoil_p.size(); ++i)
89 incident_p[i] += aprime_p.at(i);
91 double incident_energy = energy(incident_p, recoil->getMass());
92 double recoil_energy = energy(recoil_p, recoil->getMass());
94 std::vector<double> ap_vertex{aprime->getVertex()};
95 std::string ap_vertex_volume{aprime->getVertexVolume()};
96 auto ap_vertex_material_it = std::find_if(
98 [&](
const auto& mat_pair) {
99 return ap_vertex_volume.find(mat_pair.first) != std::string::npos;
102 ? ap_vertex_material_it->second
105 if (ap_vertex_material == 0) {
106 ldmx_log(warn) <<
"Dark brem interaction occurred in an unknown material: "
110 int ap_parent_id{-1};
111 if (aprime->getParents().size() > 0) {
112 ap_parent_id = aprime->getParents().at(0);
114 ldmx_log(error) <<
"Found A' without a parent ID!";
117 float aprime_energy = energy(aprime_p, aprime->getMass());
118 int aprime_genstatus = aprime->getGenStatus();
119 double aprime_px{aprime_p.at(0)}, aprime_py{aprime_p.at(1)},
120 aprime_pz{aprime_p.at(2)};
121 event.add(
"APrimeEnergy", aprime_energy);
122 event.add(
"APrimePx", aprime_px);
123 event.add(
"APrimePy", aprime_py);
124 event.add(
"APrimePz", aprime_pz);
125 event.add(
"APrimeParentID", ap_parent_id);
126 event.add(
"APrimeGenStatus", aprime_genstatus);
130 histograms_.
fill(
"aprime_theta", aprime_pvec.Theta() * (180 / 3.14159));
132 int recoil_genstatus = recoil->getGenStatus();
133 double recoil_px{recoil_p.at(0)}, recoil_py{recoil_p.at(1)},
134 recoil_pz{recoil_p.at(2)};
135 event.add(
"RecoilEnergy", recoil_energy);
136 event.add(
"RecoilPx", recoil_px);
137 event.add(
"RecoilPy", recoil_py);
138 event.add(
"RecoilPz", recoil_pz);
139 event.add(
"RecoilGenStatus", recoil_genstatus);
143 histograms_.
fill(
"recoil_theta", recoil_pvec.Theta() * (180 / 3.14159));
145 event.add(
"IncidentEnergy", incident_energy);
146 double incident_px{incident_p.at(0)}, incident_py{incident_p.at(1)},
147 incident_pz{incident_p.at(2)};
148 event.add(
"IncidentPx", incident_px);
149 event.add(
"IncidentPy", incident_py);
150 event.add(
"IncidentPz", incident_pz);
155 double vtx_x{aprime->getVertex().at(0)}, vtx_y{aprime->getVertex().at(1)},
156 vtx_z{aprime->getVertex().at(2)};
157 event.add(
"DarkBremX", vtx_x);
158 event.add(
"DarkBremY", vtx_y);
159 event.add(
"DarkBremZ", vtx_z);
160 event.add(
"DarkBremVertexMaterial", ap_vertex_material);
161 float db_material_z =
162 event.getEventHeader().getFloatParameter(
"db_material_z");
163 event.add(
"DarkBremVertexMaterialZ", db_material_z);
168 if (db_material_z > 0) {
173 <<
"Dark brem interaction occurred in an unknown element with Z = "
174 << db_material_z <<
". Using index " << i_element
175 <<
" for this element.";
Class representing a simulated particle.
std::vector< double > getMomentum() const
Get a vector containing the momentum of this particle [MeV].