13 output_collection_ = ps.
get<std::string>(
"output_collection");
14 input_collection_ = ps.
get<std::string>(
"input_collection");
15 input_pass_name_ = ps.
get<std::string>(
"input_pass_name");
18 n_channels_ = ps.
get<
int>(
"number_channels");
19 n_samples_ = ps.
get<
int>(
"number_time_samples");
20 is_real_data_ = ps.
get<
bool>(
"is_real_data");
24 ldmx_log(debug) <<
"In configure, got parameters:" <<
"\noutput_collection = "
26 <<
"\ninput_collection = " << input_collection_
27 <<
"\ninput_pass_name = " << input_pass_name_
30 <<
"\nnumber_channels = " << n_channels_
31 <<
"\nnumber_time_samples = " << n_samples_
32 <<
"\nis_real_data = " << is_real_data_;
35 if (!channel_map_file_.is_open()) {
36 EXCEPTION_RAISE(
"BadMapFile",
"The channel mapping file cannot be opened.");
39 int n_chan_from_map = -1;
41 while (!channel_map_file_.eof()) {
42 channel_map_file_ >> el_id >> ch_id;
51 channel_map_.insert(std::pair<int, int>(el_id, ch_id));
52 ldmx_log(debug) << el_id <<
" chID " << ch_id;
55 channel_map_file_.close();
56 if (n_chan_from_map != n_channels_)
57 ldmx_log(fatal) <<
"The set number of channels: " << n_channels_
58 <<
" does not match the number obtained from the map :"
64 if (!module_map_file_.is_open()) {
65 ldmx_log(fatal) <<
"The module mapping file cannot be opened.";
68 int module_id, lane_id;
69 while (!module_map_file_.eof()) {
70 module_map_file_ >> lane_id >> module_id;
73 module_map_.insert(std::pair<int, int>(lane_id, module_id));
74 ldmx_log(debug) <<
"lane " << lane_id <<
" --> module ID " << module_id;
75 modules_used_[module_id] = 1;
77 module_map_file_.close();
78 int n_lanes = n_channels_ / ZCCMOutput::NUM_CHAN_PER_LANE;
79 if (lane_id != n_lanes - 1)
80 ldmx_log(fatal) <<
"The set number of lanes " << n_lanes
81 <<
" seems not to match the number obtained from the map :"
88 ldmx_log(debug) <<
"ZCCMDecoder: produce() starts! Event number: "
89 <<
event.getEventHeader().getEventNumber();
92 int n_samp = n_samples_;
93 ldmx_log(debug) <<
"num samples = " << n_samp;
95 ldmx_log(debug) <<
"Looking up input collection " << input_collection_ <<
"_"
97 const auto event_output{
98 event.getCollection<uint8_t>(input_collection_, input_pass_name_)};
99 ldmx_log(debug) <<
"Got input collection " << input_collection_ <<
"_"
103 uint32_t time_stamp = 0;
104 for (
int i_w = 0; i_w < ZCCMOutput::TIMESTAMP_LEN_BYTES; i_w++) {
106 uint8_t time_word = event_output.at(pos);
107 ldmx_log(debug) <<
"time stamp word at position " << pos
108 <<
" (with iW = " << i_w
109 <<
") = " << std::bitset<8>(time_word);
110 time_stamp |= (time_word << i_w * 8);
113 event.getEventHeader().setIntParameter(
"TS Timestamp", time_stamp);
130 std::map<int, std::vector<int>> adc_map;
131 std::map<int, std::vector<int>> tdc_map;
132 std::map<int, std::vector<int>> cid_map;
133 std::map<int, std::vector<int>> bc0_map;
134 std::map<int, std::vector<int>> ce_map;
136 std::vector<std::vector<trigscint::TrigScintQIEDigis>> out_digis;
137 std::size_t n_modules =
138 std::ranges::count_if(modules_used_, [](
int x) {
return x != 0; });
140 out_digis.resize(n_modules);
144 int word_length = ZCCMOutput::SAMPLE_WORD_LEN_BYTES;
146 ((int)event_output.size() - ZCCMOutput::EVENTDATA_POS) / word_length;
150 int n_lanes = n_channels_ / ZCCMOutput::NUM_CHAN_PER_LANE;
151 int num_expected_messages = n_samp * n_lanes;
152 if (num_messages != num_expected_messages)
153 ldmx_log(warn) <<
"Unexpected stream length! Num messages is "
154 << num_messages <<
", expect " << num_expected_messages;
162 while (i_word < num_messages) {
163 uint word_pos = ZCCMOutput::EVENTDATA_POS + i_word * word_length;
166 event_output.at(word_pos + ZCCMOutput::EMPTY_WORD_SAMPLE_WORD_POS);
167 uint8_t lane = event_output.at(word_pos + ZCCMOutput::LANE_SAMPLE_WORD_POS);
169 event_output.at(word_pos + ZCCMOutput::FLAGS_SAMPLE_WORD_POS);
171 ldmx_log(debug) <<
"Start of message " << i_word <<
".\n\tEmpty word is "
172 << std::bitset<16>(empty) <<
", read at position "
173 << word_pos + ZCCMOutput::EMPTY_WORD_SAMPLE_WORD_POS
174 <<
". \n\tFlag word is " << std::bitset<8>(flag)
175 <<
", read at position "
176 << word_pos + ZCCMOutput::FLAGS_SAMPLE_WORD_POS
177 <<
". \n\tLane is " << std::bitset<8>(lane)
178 <<
", read at position "
179 << word_pos + ZCCMOutput::LANE_SAMPLE_WORD_POS <<
".";
181 if (start_lane == -1) {
183 ldmx_log(debug) <<
"Set time sample start lane to " << start_lane;
186 int cid{(flag >> ZCCMOutput::CAPID_POS_IN_FLAG) &
188 ldmx_log(trace) <<
"Got Cap ID " << cid;
189 bool bc0{
static_cast<bool>((flag >> ZCCMOutput::BC0_POS_IN_FLAG) &
191 ldmx_log(trace) <<
"Got BC0 flag " << bc0;
192 bool ce{
static_cast<bool>((flag >> ZCCMOutput::CE_POS_IN_FLAG) &
194 ldmx_log(trace) <<
"Got CE flag " << ce;
195 int empty_bits{(flag >> ZCCMOutput::EMPTY_FLAG_WORD_POS_IN_FLAG) &
198 ldmx_log(fatal) <<
"Empty bits of flag not empty: " << empty_bits;
212 if (lane == start_lane)
215 uint8_t cid_val = cid;
218 for (
int i_c = 0; i_c < ZCCMOutput::NUM_CHAN_PER_LANE; i_c++) {
219 if (i_word >= num_expected_messages) {
221 <<
"More words than expected! Breaking event data loop in sample "
222 << sample_nb <<
" at lane = " << int(lane) <<
", channel nb "
227 event_output.at(word_pos + ZCCMOutput::ADC_SAMPLE_WORD_POS + i_c);
229 event_output.at(word_pos + ZCCMOutput::TDC_SAMPLE_WORD_POS + i_c);
232 int module = module_map_[lane];
233 int elec_id = 100 * lane + 10 * module + i_c;
235 ldmx_log(trace) <<
"got ADC value " << (unsigned)adc_val
236 <<
" and TDC value " << (
unsigned)tdc_val
237 <<
" at channel idx " << i_c <<
" with elec id "
239 if (adc_map.find(elec_id) == adc_map.end()) {
240 std::vector<int> adcs(n_samp, 0);
241 adc_map.insert(std::pair<
int, std::vector<int>>(elec_id, adcs));
243 adc_map[elec_id].at(sample_nb) = adc_val;
246 if (tdc_map.find(elec_id) == tdc_map.end()) {
247 std::vector<int> tdcs(n_samp, 0);
248 tdc_map.insert(std::pair<
int, std::vector<int>>(elec_id, tdcs));
250 tdc_map[elec_id].at(sample_nb) = tdc_val;
251 if (cid_map.find(elec_id) == cid_map.end()) {
252 std::vector<int> cids(n_samp, 0);
253 cid_map.insert(std::pair<
int, std::vector<int>>(elec_id, cids));
254 std::vector<int> bc0s(n_samp, 0);
255 bc0_map.insert(std::pair<
int, std::vector<int>>(elec_id, bc0s));
256 std::vector<int> ces(n_samp, 0);
257 ce_map.insert(std::pair<
int, std::vector<int>>(elec_id, ces));
259 cid_map[elec_id].at(sample_nb) = cid_val;
260 bc0_map[elec_id].at(sample_nb) = bc0;
261 ce_map[elec_id].at(sample_nb) = ce;
263 ldmx_log(debug) <<
"Done with lane " << int(lane) <<
" which we think is "
264 << i_word % n_lanes <<
" in sample " << sample_nb;
266 if (
int(lane) != i_word % n_lanes)
267 ldmx_log(fatal) <<
"Lane ordering has been messed up! Expect lane "
268 << i_word % n_lanes <<
", but we got lane " << int(lane)
269 <<
" in sample " << sample_nb;
274 ldmx_log(debug) <<
"Done reading in header, ADC and TDC for event "
275 <<
event.getEventNumber();
279 for (std::map<
int, std::vector<int>>::iterator itr = adc_map.begin();
280 itr != adc_map.end(); ++itr) {
283 if (channel_map_.find(itr->first) == channel_map_.end()) {
285 <<
"Couldn't find the bar ID corresponding to electronics ID "
286 << itr->first <<
"!! Skipping.";
289 int bar = channel_map_[itr->first];
292 int module = itr->first / 10 % 10;
294 int lane = itr->first / 100;
296 digi.
setTDC(tdc_map[itr->first]);
297 digi.
setCID(cid_map[itr->first]);
298 digi.
setBC0(bc0_map[itr->first]);
299 digi.
setCE(ce_map[itr->first]);
301 ldmx_log(debug) <<
"for bar 0, got time since spill "
303 out_digis[module].push_back(digi);
304 ldmx_log(debug) <<
"Iterator points to key " << itr->first
305 <<
" and mapped channel supposedly is " << bar;
306 ldmx_log(debug) <<
"Made digi with elecID = " << digi.
getElecID()
307 <<
", barID = " << digi.
getChanID() <<
", third adc value "
308 << digi.
getADC().at(2) <<
" and third tdc "
313 for (uint i = 0; i < n_modules; i++)
314 event.
add(output_collection_ + Form(
"%i", i + 1), out_digis[i]);