11 output_collection_ = ps.
get<std::string>(
"output_collection");
12 input_collection_ = ps.
get<std::string>(
"input_collection");
13 input_pass_name_ = ps.
get<std::string>(
"input_pass_name");
16 n_channels_ = ps.
get<
int>(
"number_channels");
17 n_samples_ = ps.
get<
int>(
"number_time_samples");
18 is_real_data_ = ps.
get<
bool>(
"is_real_data");
22 ldmx_log(debug) <<
"In configure, got parameters:" <<
"\noutput_collection = "
24 <<
"\ninput_collection = " << input_collection_
25 <<
"\ninput_pass_name = " << input_pass_name_
28 <<
"\nnumber_channels = " << n_channels_
29 <<
"\nnumber_time_samples = " << n_samples_
30 <<
"\nis_real_data = " << is_real_data_;
33 if (!channel_map_file_.is_open()) {
34 EXCEPTION_RAISE(
"BadMapFile",
"The channel mapping file cannot be opened.");
37 int n_chan_from_map = -1;
39 while (!channel_map_file_.eof()) {
40 channel_map_file_ >> el_id >> ch_id;
49 channel_map_.insert(std::pair<int, int>(el_id, ch_id));
50 ldmx_log(debug) << el_id <<
" chID " << ch_id;
53 channel_map_file_.close();
54 if (n_chan_from_map != n_channels_)
55 ldmx_log(fatal) <<
"The set number of channels: " << n_channels_
56 <<
" does not match the number obtained from the map :"
62 if (!module_map_file_.is_open()) {
63 ldmx_log(fatal) <<
"The module mapping file cannot be opened.";
66 int module_id, lane_id;
67 while (!module_map_file_.eof()) {
68 module_map_file_ >> lane_id >> module_id;
71 module_map_.insert(std::pair<int, int>(lane_id, module_id));
72 ldmx_log(debug) <<
"lane " << lane_id <<
" --> module ID " << module_id;
73 modules_used_[module_id] = 1;
75 module_map_file_.close();
76 int n_lanes = n_channels_ / ZCCMOutput::NUM_CHAN_PER_LANE;
77 if (lane_id != n_lanes - 1)
78 ldmx_log(fatal) <<
"The set number of lanes " << n_lanes
79 <<
" seems not to match the number obtained from the map :"
86 ldmx_log(debug) <<
"ZCCMDecoder: produce() starts! Event number: "
87 <<
event.getEventHeader().getEventNumber();
90 int n_samp = n_samples_;
91 ldmx_log(debug) <<
"num samples = " << n_samp;
93 ldmx_log(debug) <<
"Looking up input collection " << input_collection_ <<
"_"
95 const auto event_output{
96 event.getCollection<uint8_t>(input_collection_, input_pass_name_)};
97 ldmx_log(debug) <<
"Got input collection " << input_collection_ <<
"_"
102 uint32_t time_stamp = 0;
103 for (
int i_w = 0; i_w < ZCCMOutput::TIMESTAMP_LEN_BYTES; i_w++) {
104 int pos = ZCCMOutput::TIMESTAMP_POS + i_w;
105 uint8_t time_word = event_output.at(pos);
106 ldmx_log(debug) <<
"time stamp word at position " << pos
107 <<
" (with iW = " << i_w
108 <<
") = " << std::bitset<8>(time_word);
109 time_stamp |= (time_word << i_w * 8);
127 event.getEventHeader().setIntParameter(
"time_stamp_", time_stamp);
128 TTimeStamp *ttime_stamp =
new TTimeStamp(time_stamp);
129 event.getEventHeader().setTimestamp(
147 std::map<int, std::vector<int>> adc_map;
148 std::map<int, std::vector<int>> tdc_map;
149 std::map<int, std::vector<int>> cid_map;
150 std::map<int, std::vector<int>> bc0_map;
151 std::map<int, std::vector<int>> ce_map;
153 std::vector<std::vector<trigscint::TrigScintQIEDigis>> out_digis;
154 std::size_t n_modules =
155 std::ranges::count_if(modules_used_, [](
int x) {
return x != 0; });
157 out_digis.resize(n_modules);
161 int word_length = ZCCMOutput::SAMPLE_WORD_LEN_BYTES;
163 ((int)event_output.size() - ZCCMOutput::EVENTDATA_POS) / word_length;
167 int n_lanes = n_channels_ / ZCCMOutput::NUM_CHAN_PER_LANE;
168 int num_expected_messages = n_samp * n_lanes;
169 if (num_messages != num_expected_messages)
170 ldmx_log(warn) <<
"Unexpected stream length! Num messages is "
171 << num_messages <<
", expect " << num_expected_messages;
179 while (i_word < num_messages) {
180 uint word_pos = ZCCMOutput::EVENTDATA_POS + i_word * word_length;
183 event_output.at(word_pos + ZCCMOutput::EMPTY_WORD_SAMPLE_WORD_POS);
184 uint8_t lane = event_output.at(word_pos + ZCCMOutput::LANE_SAMPLE_WORD_POS);
186 event_output.at(word_pos + ZCCMOutput::FLAGS_SAMPLE_WORD_POS);
188 ldmx_log(debug) <<
"Start of message " << i_word <<
".\n\tEmpty word is "
189 << std::bitset<16>(empty) <<
", read at position "
190 << word_pos + ZCCMOutput::EMPTY_WORD_SAMPLE_WORD_POS
191 <<
". \n\tFlag word is " << std::bitset<8>(flag)
192 <<
", read at position "
193 << word_pos + ZCCMOutput::FLAGS_SAMPLE_WORD_POS
194 <<
". \n\tLane is " << std::bitset<8>(lane)
195 <<
", read at position "
196 << word_pos + ZCCMOutput::LANE_SAMPLE_WORD_POS <<
".";
198 if (start_lane == -1) {
200 ldmx_log(debug) <<
"Set time sample start lane to " << start_lane;
203 int cid{(flag >> ZCCMOutput::CAPID_POS_IN_FLAG) &
205 ldmx_log(trace) <<
"Got Cap ID " << cid;
206 bool bc0{
static_cast<bool>((flag >> ZCCMOutput::BC0_POS_IN_FLAG) &
208 ldmx_log(trace) <<
"Got BC0 flag " << bc0;
209 bool ce{
static_cast<bool>((flag >> ZCCMOutput::CE_POS_IN_FLAG) &
211 ldmx_log(trace) <<
"Got CE flag " << ce;
212 int empty_bits{(flag >> ZCCMOutput::EMPTY_FLAG_WORD_POS_IN_FLAG) &
215 ldmx_log(fatal) <<
"Empty bits of flag not empty: " << empty_bits;
229 if (lane == start_lane)
232 uint8_t cid_val = cid;
235 for (
int i_c = 0; i_c < ZCCMOutput::NUM_CHAN_PER_LANE; i_c++) {
236 if (i_word >= num_expected_messages) {
238 <<
"More words than expected! Breaking event data loop in sample "
239 << sample_nb <<
" at lane = " << lane <<
", channel nb " << i_c;
243 event_output.at(word_pos + ZCCMOutput::ADC_SAMPLE_WORD_POS + i_c);
245 event_output.at(word_pos + ZCCMOutput::TDC_SAMPLE_WORD_POS + i_c);
248 int module = module_map_[lane];
249 int elec_id = 100 * lane + 10 * module + i_c;
251 ldmx_log(trace) <<
"got ADC value " << (unsigned)adc_val
252 <<
" and TDC value " << (
unsigned)tdc_val
253 <<
" at channel idx " << i_c <<
" with elec id "
255 if (adc_map.find(elec_id) == adc_map.end()) {
256 std::vector<int> adcs(n_samp, 0);
257 adc_map.insert(std::pair<
int, std::vector<int>>(elec_id, adcs));
259 adc_map[elec_id].at(sample_nb) = adc_val;
262 if (tdc_map.find(elec_id) == tdc_map.end()) {
263 std::vector<int> tdcs(n_samp, 0);
264 tdc_map.insert(std::pair<
int, std::vector<int>>(elec_id, tdcs));
266 tdc_map[elec_id].at(sample_nb) = tdc_val;
267 if (cid_map.find(elec_id) == cid_map.end()) {
268 std::vector<int> cids(n_samp, 0);
269 cid_map.insert(std::pair<
int, std::vector<int>>(elec_id, cids));
270 std::vector<int> bc0s(n_samp, 0);
271 bc0_map.insert(std::pair<
int, std::vector<int>>(elec_id, bc0s));
272 std::vector<int> ces(n_samp, 0);
273 ce_map.insert(std::pair<
int, std::vector<int>>(elec_id, ces));
275 cid_map[elec_id].at(sample_nb) = cid_val;
276 bc0_map[elec_id].at(sample_nb) = bc0;
277 ce_map[elec_id].at(sample_nb) = ce;
279 ldmx_log(debug) <<
"Done with lane " << int(lane) <<
" which we think is "
280 << i_word % n_lanes <<
" in sample " << sample_nb;
282 if (
int(lane) != i_word % n_lanes)
283 ldmx_log(fatal) <<
"Lane ordering has been messed up! Expect lane "
284 << i_word % n_lanes <<
", but we got lane " << int(lane);
289 ldmx_log(debug) <<
"Done reading in header, ADC and TDC for event "
290 <<
event.getEventNumber();
294 for (std::map<
int, std::vector<int>>::iterator itr = adc_map.begin();
295 itr != adc_map.end(); ++itr) {
298 if (channel_map_.find(itr->first) == channel_map_.end()) {
300 <<
"Couldn't find the bar ID corresponding to electronics ID "
301 << itr->first <<
"!! Skipping.";
304 int bar = channel_map_[itr->first];
307 int module = itr->first / 10 % 10;
309 int lane = itr->first / 100;
311 digi.
setTDC(tdc_map[itr->first]);
312 digi.
setCID(cid_map[itr->first]);
313 digi.
setBC0(bc0_map[itr->first]);
314 digi.
setCE(ce_map[itr->first]);
316 ldmx_log(debug) <<
"for bar 0, got time since spill "
318 out_digis[module].push_back(digi);
319 ldmx_log(debug) <<
"Iterator points to key " << itr->first
320 <<
" and mapped channel supposedly is " << bar;
321 ldmx_log(debug) <<
"Made digi with elecID = " << digi.
getElecID()
322 <<
", barID = " << digi.
getChanID() <<
", third adc value "
323 << digi.
getADC().at(2) <<
" and third tdc "
328 for (uint i = 0; i < n_modules; i++)
329 event.
add(output_collection_ + Form(
"%i", i + 1), out_digis[i]);