53 std::map<ldmx::TrigScintID, int> cell_pes, cell_min_p_es;
54 std::map<ldmx::TrigScintID, float> xpos, ypos, zpos, edep, time, beam_frac;
55 std::set<ldmx::TrigScintID> noise_hit_i_ds;
61 input_collection_, input_pass_name_)};
63 sim_particles_coll_name_, sim_particles_passname_)};
66 for (
const auto& sim_hit : sim_hits) {
73 std::vector<float> position = sim_hit.getPosition();
74 ldmx_log(trace) <<
" Module ID = " <<
id.raw();
77 for (
int i = 0; i < sim_hit.getNumberOfContribs(); i++) {
78 auto contrib = sim_hit.getContrib(i);
80 ldmx_log(trace) <<
"contrib " << i <<
" trackID: " << contrib.track_id_
81 <<
" pdgID: " << contrib.pdg_code_
82 <<
" edep: " << contrib.edep_;
83 ldmx_log(trace) <<
"\t particle id: "
84 << particle_map[contrib.track_id_].getPdgID()
85 <<
" particle status: "
86 << particle_map[contrib.track_id_].getGenStatus();
88 if (particle_map[contrib.track_id_].getPdgID() == 11 &&
89 particle_map[contrib.track_id_].getGenStatus() == 1) {
90 if (beam_frac.find(
id) == beam_frac.end()) {
91 beam_frac[id] = contrib.edep_;
93 beam_frac[id] += contrib.edep_;
102 if (edep.find(
id) == edep.end()) {
104 edep[id] = sim_hit.getEdep();
105 time[id] = sim_hit.getTime() * sim_hit.getEdep();
106 xpos[id] = position[0] * sim_hit.getEdep();
107 ypos[id] = position[1] * sim_hit.getEdep();
108 zpos[id] = position[2] * sim_hit.getEdep();
113 xpos[id] += position[0] * sim_hit.getEdep();
114 ypos[id] += position[1] * sim_hit.getEdep();
115 zpos[id] += position[2] * sim_hit.getEdep();
116 edep[id] += sim_hit.getEdep();
118 time[id] += sim_hit.getTime() * sim_hit.getEdep();
123 std::vector<ldmx::TrigScintHit> trig_scint_hits;
126 for (std::map<ldmx::TrigScintID, float>::iterator it = edep.begin();
127 it != edep.end(); ++it) {
130 double dep_energy = edep[id];
131 time[id] = time[id] / edep[id];
132 xpos[id] = xpos[id] / edep[id];
133 ypos[id] = ypos[id] / edep[id];
134 zpos[id] = zpos[id] / edep[id];
136 double mean_pe = dep_energy / mev_per_mip_ * pe_per_mip_;
137 std::poisson_distribution<int> poisson_dist(mean_pe + mean_noise_);
138 cell_pes[id] = poisson_dist(rng_);
141 double energy_per_pe = mev_per_mip_ / pe_per_mip_;
142 double cell_energy = energy_per_pe * cell_pes[id];
148 if (cell_pes[
id] >= 1) {
151 hit.
setPE(cell_pes[
id]);
164 trig_scint_hits.push_back(hit);
167 ldmx_log(debug) <<
" ID = " <<
id.raw() <<
" Edep: " << edep[id]
168 <<
" numPEs: " << cell_pes[id] <<
" time: " << time[id]
169 <<
" z: " << zpos[id] <<
"\t X: " << xpos[id]
170 <<
" Y: " << ypos[id] <<
" Z: " << zpos[id];
177 int num_empty_cells = strips_per_array_ - num_rec_hits;
178 std::vector<double> noise_hits_pe =
179 noise_generator_->generateNoiseHits(num_empty_cells);
183 for (
auto& noise_hit_pe : noise_hits_pe) {
187 temp_id = generateRandomID(module);
188 }
while (edep.find(temp_id) != edep.end() ||
189 noise_hit_i_ds.find(temp_id) != noise_hit_i_ds.end());
193 noise_hit_i_ds.insert(noise_id);
195 hit.
setPE(noise_hit_pe);
208 trig_scint_hits.push_back(hit);
213 event.add(output_collection_, trig_scint_hits);
Class representing a simulated particle.