13void EventReadoutProducer::configure(
16 input_collection_ = parameters.
get<std::string>(
"input_collection");
17 input_pass_name_ = parameters.
get<std::string>(
"input_pass_name");
18 output_collection_ = parameters.
get<std::string>(
"output_collection");
19 n_ped_samples_ = parameters.
get<
int>(
"number_pedestal_samples");
20 time_shift_ = parameters.
get<
int>(
"time_shift");
21 fiber_to_shift_ = parameters.
get<
int>(
"fiber_to_shift");
22 verbose_ = parameters.
get<
bool>(
"verbose");
24 ldmx_log(debug) <<
"In configure, got parameters:" <<
"\noutput_collection = "
26 <<
"\ninput_collection = " << input_collection_
27 <<
"\ninput_pass_name = " << input_pass_name_
28 <<
"\nnumber_pedestal_samples = " << n_ped_samples_
29 <<
"\ntime_shift = " << time_shift_
30 <<
"\nfiber_to_shift = " << fiber_to_shift_
31 <<
"\nverbose = " << verbose_;
39 input_collection_, input_pass_name_)};
41 std::vector<trigscint::EventReadout> channel_readout_events;
42 for (
const auto &digi : digis) {
44 auto adc{digi.getADC()};
45 auto tdc{digi.getTDC()};
58 std::vector<float> charge;
59 std::vector<float> charge_err;
64 [[maybe_unused]]
int n_pos = 0;
66 for (
auto &val : adc) {
67 float q = qie.
adc2Q(val);
69 charge_err.push_back(qie.
qErr(q));
76 ldmx_log(debug) <<
"got adc value " << val <<
" and charge "
78 if (i_s < n_ped_samples_) early_ped += q;
81 out_event.
setQ(charge);
83 early_ped /= n_ped_samples_;
92 std::vector<float> charge_check = {NULL};
93 float min_charge = 10;
97 int ped_length = (int)charge.size() / 5;
103 if (charge.size() > 8) {
104 if (verbose_) ldmx_log(debug) <<
"going into oscillations check ";
105 for (
int i = 3; i < charge.size() - 4; i++) {
106 float max_samp = min_charge;
107 for (
int i_q = 0; i_q < 4;
110 if (charge[i + i_q] > max_samp) max_samp = charge[i + i_q];
112 if (verbose_) ldmx_log(debug) <<
"got max charge " << max_samp;
113 for (
int i_q = 0; i_q < 4; i_q++)
116 charge_check.push_back(charge[i + i_q] / max_samp);
120 if (ped_length > 4) {
123 std::sort(charge.begin(), charge.end());
124 for (
int i = ped_offset; i < 2 * ped_length + ped_offset;
128 ped /= 2 * ped_length;
131 float med_q = charge[(int)charge.size() / 2];
132 float min_q = charge[0];
133 float max_q = charge[charge.size() - 1];
153 if (charge.size() > 8) {
154 for (
int i = ped_offset; i < 2 * ped_length + ped_offset; i++) {
155 diff_sq += (charge[i] - ped) * (charge[i] - ped);
157 diff_sq /= 2 * ped_length;
162 uint flag_oscillation = 0;
163 if (charge.size() > 8) {
165 if (max_q > min_charge) {
168 for (
int i = 0; i < charge_check.size() - 4; i++) {
169 if (charge_check[i] ==
177 int last_match_sample = 0;
179 bool do_break =
false;
180 for (
int i = max_id; i < charge_check.size() - 4; i++) {
183 <<
"Checking how many matching groups of four we can "
184 "find, starting at index "
187 for (
int i_q = 0; i_q < 4; i_q++) {
191 <<
"Comparing " << charge_check[i + i_q] <<
" (sample "
192 << i + i_q <<
") to " << charge_check[i + 4 + i_q]
193 <<
" (sample " << i + 4 + i_q <<
"), ratio is "
194 << charge_check[i + i_q] / charge_check[i + 4 + i_q];
197 if (fabs(charge_check[i + i_q] / charge_check[i + 4 + i_q] - 1) <
200 (charge_check[i + 4 + i_q] < 0.01 &&
201 fabs(charge_check[i + i_q] / charge_check[i + 4 + i_q]) <
204 last_match_sample = i + i_q;
208 <<
"Oscillation check for channel " << digi.getChanID()
209 <<
" breaking at time sample " << i + i_q;
218 ldmx_log(debug) <<
"Current lastMatchSample " << last_match_sample;
219 if (last_match_sample - max_id >= 2 * 4) {
222 flag_oscillation = 1;
234 int quart_length = (int)charge.size() / 4;
235 for (
int i = 4 * quart_length - 2; i >= 3 * quart_length; i--) {
237 if (charge[i] / max_q > 0.66) n_high++;
243 uint flag_spike = (max_q / out_event.
getTotQ() > 0.95) ||
244 (charge[charge.size() - 2] / max_q < 0.05);
247 uint flag_plateau = (ped > 15 || n_high >= 5);
250 uint flag_long_pulse = 0;
253 uint flag_noise = (out_event.
getNoise() > 3.5 || out_event.
getNoise() == 0);
271 uint flag = flag_spike + 2 * flag_plateau + 4 * flag_long_pulse +
272 8 * flag_oscillation + 16 * flag_noise;
274 <<
"Got quality flag " << flag
275 <<
" made up of (spike/plateau/long pulse/oscillation/noise) "
276 << flag_spike <<
"+" << flag_plateau <<
"+" << flag_long_pulse <<
"+"
277 << flag_oscillation <<
"+" << flag_noise;
282 ldmx_log(debug) <<
"In event " <<
event.getEventHeader().getEventNumber()
285 " fC, noise = " << out_event.
getNoise() <<
" fC for channel "
288 channel_readout_events.push_back(out_event);
293 event.add(output_collection_, channel_readout_events);
294 ldmx_log(debug) <<
"\n";