15void EventReadoutProducer::configure(
18 input_collection_ = parameters.
get<std::string>(
"input_collection");
19 input_pass_name_ = parameters.
get<std::string>(
"input_pass_name");
20 output_collection_ = parameters.
get<std::string>(
"output_collection");
21 n_ped_samples_ = parameters.
get<
int>(
"number_pedestal_samples");
22 time_shift_ = parameters.
get<
int>(
"time_shift");
23 fiber_to_shift_ = parameters.
get<
int>(
"fiber_to_shift");
24 verbose_ = parameters.
get<
bool>(
"verbose");
26 ldmx_log(debug) <<
"In configure, got parameters:" <<
"\noutput_collection = "
28 <<
"\ninput_collection = " << input_collection_
29 <<
"\ninput_pass_name = " << input_pass_name_
30 <<
"\nnumber_pedestal_samples = " << n_ped_samples_
31 <<
"\ntime_shift = " << time_shift_
32 <<
"\nfiber_to_shift = " << fiber_to_shift_
33 <<
"\nverbose = " << verbose_;
41 input_collection_, input_pass_name_)};
43 std::vector<trigscint::EventReadout> channel_readout_events;
44 for (
const auto& digi : digis) {
46 auto adc{digi.getADC()};
47 auto tdc{digi.getTDC()};
60 std::vector<float> charge;
61 std::vector<float> charge_err;
66 [[maybe_unused]]
int n_pos = 0;
68 for (
auto& val : adc) {
69 float q = qie.
adc2Q(val);
71 charge_err.push_back(qie.
qErr(q));
78 ldmx_log(debug) <<
"got adc value " << val <<
" and charge "
80 if (i_s < n_ped_samples_) early_ped += q;
83 out_event.
setQ(charge);
85 early_ped /= n_ped_samples_;
94 std::vector<float> charge_check = {NULL};
95 float min_charge = 10;
99 int ped_length = (int)charge.size() / 5;
105 if (charge.size() > 8) {
106 if (verbose_) ldmx_log(debug) <<
"going into oscillations check ";
107 for (
int i = 3; i < charge.size() - 4; i++) {
108 float max_samp = min_charge;
109 for (
int i_q = 0; i_q < 4;
112 if (charge[i + i_q] > max_samp) max_samp = charge[i + i_q];
114 if (verbose_) ldmx_log(debug) <<
"got max charge " << max_samp;
115 for (
int i_q = 0; i_q < 4; i_q++)
118 charge_check.push_back(charge[i + i_q] / max_samp);
122 if (ped_length > 4) {
125 std::sort(charge.begin(), charge.end());
126 for (
int i = ped_offset; i < 2 * ped_length + ped_offset;
130 ped /= 2 * ped_length;
133 float med_q = charge[(int)charge.size() / 2];
134 float min_q = charge[0];
135 float max_q = charge[charge.size() - 1];
155 if (charge.size() > 8) {
156 for (
int i = ped_offset; i < 2 * ped_length + ped_offset; i++) {
157 diff_sq += (charge[i] - ped) * (charge[i] - ped);
159 diff_sq /= 2 * ped_length;
164 uint flag_oscillation = 0;
165 if (charge.size() > 8) {
167 if (max_q > min_charge) {
170 for (
int i = 0; i < charge_check.size() - 4; i++) {
171 if (charge_check[i] ==
179 int last_match_sample = 0;
181 bool do_break =
false;
182 for (
int i = max_id; i < charge_check.size() - 4; i++) {
185 <<
"Checking how many matching groups of four we can "
186 "find, starting at index "
189 for (
int i_q = 0; i_q < 4; i_q++) {
193 <<
"Comparing " << charge_check[i + i_q] <<
" (sample "
194 << i + i_q <<
") to " << charge_check[i + 4 + i_q]
195 <<
" (sample " << i + 4 + i_q <<
"), ratio is "
196 << charge_check[i + i_q] / charge_check[i + 4 + i_q];
199 if (fabs(charge_check[i + i_q] / charge_check[i + 4 + i_q] - 1) <
202 (charge_check[i + 4 + i_q] < 0.01 &&
203 fabs(charge_check[i + i_q] / charge_check[i + 4 + i_q]) <
206 last_match_sample = i + i_q;
210 <<
"Oscillation check for channel " << digi.getChanID()
211 <<
" breaking at time sample " << i + i_q;
220 ldmx_log(debug) <<
"Current lastMatchSample " << last_match_sample;
221 if (last_match_sample - max_id >= 2 * 4) {
224 flag_oscillation = 1;
236 int quart_length = (int)charge.size() / 4;
237 for (
int i = 4 * quart_length - 2; i >= 3 * quart_length; i--) {
239 if (charge[i] / max_q > 0.66) n_high++;
245 uint flag_spike = (max_q / out_event.
getTotQ() > 0.95) ||
246 (charge[charge.size() - 2] / max_q < 0.05);
249 uint flag_plateau = (ped > 15 || n_high >= 5);
252 uint flag_long_pulse = 0;
255 uint flag_noise = (out_event.
getNoise() > 3.5 || out_event.
getNoise() == 0);
273 uint flag = flag_spike + 2 * flag_plateau + 4 * flag_long_pulse +
274 8 * flag_oscillation + 16 * flag_noise;
276 <<
"Got quality flag " << flag
277 <<
" made up of (spike/plateau/long pulse/oscillation/noise) "
278 << flag_spike <<
"+" << flag_plateau <<
"+" << flag_long_pulse <<
"+"
279 << flag_oscillation <<
"+" << flag_noise;
284 ldmx_log(debug) <<
"In event " <<
event.getEventHeader().getEventNumber()
287 " fC, noise = " << out_event.
getNoise() <<
" fC for channel "
290 channel_readout_events.push_back(out_event);
295 event.add(output_collection_, channel_readout_events);
296 ldmx_log(debug) <<
"\n";