47 std::map<ldmx::TrigScintID, int> cell_pes, cell_min_p_es;
48 std::map<ldmx::TrigScintID, float> xpos, ypos, zpos, edep, time, beam_frac;
49 std::set<ldmx::TrigScintID> noise_hit_i_ds;
55 input_collection_, input_pass_name_)};
57 "SimParticles", sim_particles_passname_)};
60 for (
const auto &sim_hit : sim_hits) {
67 std::vector<float> position = sim_hit.getPosition();
68 ldmx_log(trace) <<
" Module ID = " <<
id.raw();
71 for (
int i = 0; i < sim_hit.getNumberOfContribs(); i++) {
72 auto contrib = sim_hit.getContrib(i);
74 ldmx_log(trace) <<
"contrib " << i <<
" trackID: " << contrib.track_id_
75 <<
" pdgID: " << contrib.pdg_code_
76 <<
" edep: " << contrib.edep_;
77 ldmx_log(trace) <<
"\t particle id: "
78 << particle_map[contrib.track_id_].getPdgID()
79 <<
" particle status: "
80 << particle_map[contrib.track_id_].getGenStatus();
82 if (particle_map[contrib.track_id_].getPdgID() == 11 &&
83 particle_map[contrib.track_id_].getGenStatus() == 1) {
84 if (beam_frac.find(
id) == beam_frac.end()) {
85 beam_frac[id] = contrib.edep_;
87 beam_frac[id] += contrib.edep_;
96 if (edep.find(
id) == edep.end()) {
98 edep[id] = sim_hit.getEdep();
99 time[id] = sim_hit.getTime() * sim_hit.getEdep();
100 xpos[id] = position[0] * sim_hit.getEdep();
101 ypos[id] = position[1] * sim_hit.getEdep();
102 zpos[id] = position[2] * sim_hit.getEdep();
107 xpos[id] += position[0] * sim_hit.getEdep();
108 ypos[id] += position[1] * sim_hit.getEdep();
109 zpos[id] += position[2] * sim_hit.getEdep();
110 edep[id] += sim_hit.getEdep();
112 time[id] += sim_hit.getTime() * sim_hit.getEdep();
117 std::vector<ldmx::TrigScintHit> trig_scint_hits;
120 for (std::map<ldmx::TrigScintID, float>::iterator it = edep.begin();
121 it != edep.end(); ++it) {
124 double dep_energy = edep[id];
125 time[id] = time[id] / edep[id];
126 xpos[id] = xpos[id] / edep[id];
127 ypos[id] = ypos[id] / edep[id];
128 zpos[id] = zpos[id] / edep[id];
130 double mean_pe = dep_energy / mev_per_mip_ * pe_per_mip_;
131 std::poisson_distribution<int> poisson_dist(mean_pe + mean_noise_);
132 cell_pes[id] = poisson_dist(rng_);
135 double energy_per_pe = mev_per_mip_ / pe_per_mip_;
136 double cell_energy = energy_per_pe * cell_pes[id];
142 if (cell_pes[
id] >= 1) {
145 hit.
setPE(cell_pes[
id]);
158 trig_scint_hits.push_back(hit);
161 ldmx_log(debug) <<
" ID = " <<
id.raw() <<
" Edep: " << edep[id]
162 <<
" numPEs: " << cell_pes[id] <<
" time: " << time[id]
163 <<
" z: " << zpos[id] <<
"\t X: " << xpos[id]
164 <<
" Y: " << ypos[id] <<
" Z: " << zpos[id];
171 int num_empty_cells = strips_per_array_ - num_rec_hits;
172 std::vector<double> noise_hits_pe =
173 noise_generator_->generateNoiseHits(num_empty_cells);
177 for (
auto &noise_hit_pe : noise_hits_pe) {
181 temp_id = generateRandomID(module);
182 }
while (edep.find(temp_id) != edep.end() ||
183 noise_hit_i_ds.find(temp_id) != noise_hit_i_ds.end());
187 noise_hit_i_ds.insert(noise_id);
189 hit.
setPE(noise_hit_pe);
202 trig_scint_hits.push_back(hit);
207 event.add(output_collection_, trig_scint_hits);
Class representing a simulated particle.