12 #include <unordered_set>
15 : unpacker_(conf.getUntrackedParameter<
int>(
"HcalFirstFED",
int(
FEDNumbering::MINHCALFEDID)),
16 conf.getParameter<
int>(
"firstSample"),
17 conf.getParameter<
int>(
"lastSample")),
19 conf.getParameter<
bool>(
"FilterDataQuality"), conf.getParameter<
bool>(
"FilterDataQuality"),
false, 0, 0, -1),
20 fedUnpackList_(conf.getUntrackedParameter<
std::vector<
int>>(
"FEDs",
std::vector<
int>())),
21 firstFED_(conf.getUntrackedParameter<
int>(
"HcalFirstFED",
FEDNumbering::MINHCALFEDID)),
22 unpackCalib_(conf.getUntrackedParameter<
bool>(
"UnpackCalib",
false)),
23 unpackZDC_(conf.getUntrackedParameter<
bool>(
"UnpackZDC",
false)),
24 unpackTTP_(conf.getUntrackedParameter<
bool>(
"UnpackTTP",
false)),
25 unpackUMNio_(conf.getUntrackedParameter<
bool>(
"UnpackUMNio",
false)),
26 saveQIE10DataNSamples_(conf.getUntrackedParameter<
std::vector<
int>>(
"saveQIE10DataNSamples",
std::vector<
int>())),
29 saveQIE11DataNSamples_(conf.getUntrackedParameter<
std::vector<
int>>(
"saveQIE11DataNSamples",
std::vector<
int>())),
32 silent_(conf.getUntrackedParameter<
bool>(
"silent",
true)),
33 complainEmptyData_(conf.getUntrackedParameter<
bool>(
"ComplainEmptyData",
false)),
34 unpackerMode_(conf.getUntrackedParameter<
int>(
"UnpackerMode", 0)),
35 expectedOrbitMessageTime_(conf.getUntrackedParameter<
int>(
"ExpectedOrbitMessageTime", -1)) {
51 std::ostringstream
ss;
54 edm::LogInfo(
"HCAL") <<
"HcalRawToDigi will unpack FEDs ( " <<
ss.str() <<
")";
57 produces<HBHEDigiCollection>();
58 produces<HFDigiCollection>();
59 produces<HODigiCollection>();
60 produces<HcalTrigPrimDigiCollection>();
61 produces<HOTrigPrimDigiCollection>();
62 produces<HcalUnpackerReport>();
64 produces<HcalCalibDigiCollection>();
66 produces<ZDCDigiCollection>();
68 produces<HcalTTPDigiCollection>();
70 produces<HcalUMNioDigi>();
71 produces<QIE10DigiCollection>();
72 produces<QIE11DigiCollection>();
74 produces<QIE10DigiCollection>(
"ZDC");
75 produces<QIE10DigiCollection>(
"LASERMON");
81 <<
"Cannot create an additional QIE10 sample with name ZDC, it is already created! It must be removed along "
82 "with the corresponding entry in saveQIE10DataNSamples"
91 <<
"Cannot create an additional QIE10 sample with name LASERMON, it is already created! It must be removed "
92 "along with the corresponding entry in saveQIE10DataNSamples"
103 <<
"The saveQIE10DataTags and saveQIE10DataNSamples inputs must be the same length! These will be ignored"
110 <<
"The saveQIE11DataTags and saveQIE11DataNSamples inputs must be the same length! These will be ignored"
124 produces<QIE10DigiCollection>(
tag);
137 produces<QIE11DigiCollection>(
tag);
151 desc.
add<
int>(
"firstSample", 0);
152 desc.
add<
int>(
"lastSample", 9);
153 desc.
add<
bool>(
"FilterDataQuality",
true);
154 desc.
addUntracked<std::vector<int>>(
"FEDs", std::vector<int>());
160 desc.
addUntracked<std::vector<int>>(
"saveQIE10DataNSamples", std::vector<int>());
161 desc.
addUntracked<std::vector<std::string>>(
"saveQIE10DataTags", std::vector<std::string>());
162 desc.
addUntracked<std::vector<int>>(
"saveQIE11DataNSamples", std::vector<int>());
163 desc.
addUntracked<std::vector<std::string>>(
"saveQIE11DataTags", std::vector<std::string>());
169 descriptions.
add(
"hcalRawToDigi", desc);
186 std::vector<HBHEDataFrame>
hbhe;
187 std::vector<HODataFrame>
ho;
188 std::vector<HFDataFrame>
hf;
189 std::vector<HcalTriggerPrimitiveDigi> htp;
190 std::vector<HcalCalibDataFrame> hc;
191 std::vector<ZDCDataFrame>
zdc;
192 std::vector<HcalTTPDigi> ttp;
193 std::vector<HOTriggerPrimitiveDigi> hotp;
195 auto report = std::make_unique<HcalUnpackerReport>();
222 colls.
umnio = &umnio;
239 if (fed.
size() == 0) {
245 }
else if (fed.
size() < 8 * 3) {
282 std::unordered_set<uint32_t> cacheForHFdup;
283 unsigned int cntHFdup = 0;
284 for (
auto& hf_digi :
hf) {
285 if (!cacheForHFdup.insert(hf_digi.id().rawId()).
second)
289 edm::LogError(
"HcalRawToDigi") <<
"Duplicated HF digis found for " << cntHFdup <<
" times" << std::endl;
294 if (addtl.second->samples() == colls.
qie10->
samples()) {
296 edm::LogWarning(
"HcalRawToDigi") <<
"QIE10 data requested to be stored in tag " <<
tag
297 <<
" is already stored in the default QIE10 collection. "
298 <<
"To avoid duplicating, remove the tag " <<
tag
299 <<
" from the saveQIE10DataTags and the value of " << addtl.second->samples()
300 <<
" from the saveQIE10DataNSamples "
301 <<
"configurables to HcalRawToDigi" << std::endl;
305 if (addtl.second->samples() == colls.
qie11->
samples()) {
307 edm::LogWarning(
"HcalRawToDigi") <<
"QIE11 data requested to be stored in tag " <<
tag
308 <<
" is already stored in the default QIE11 collection. "
309 <<
"To avoid duplicating, remove the tag " <<
tag
310 <<
" from the saveQIE11DataTags and the value of " << addtl.second->samples()
311 <<
" from the saveQIE11DataNSamples "
312 <<
"configurables to HcalRawToDigi" << std::endl;
317 auto hbhe_prod = std::make_unique<HBHEDigiCollection>();
318 auto hf_prod = std::make_unique<HFDigiCollection>();
319 auto ho_prod = std::make_unique<HODigiCollection>();
320 auto htp_prod = std::make_unique<HcalTrigPrimDigiCollection>();
321 auto hotp_prod = std::make_unique<HOTrigPrimDigiCollection>();
323 if (colls.
qie10 ==
nullptr) {
326 std::unique_ptr<QIE10DigiCollection> qie10_prod(colls.
qie10);
332 std::unique_ptr<QIE10DigiCollection> qie10ZDC_prod(colls.
qie10ZDC);
338 std::unique_ptr<QIE10DigiCollection> qie10Lasermon_prod(colls.
qie10Lasermon);
340 if (colls.
qie11 ==
nullptr) {
343 std::unique_ptr<QIE11DigiCollection> qie11_prod(colls.
qie11);
347 std::unordered_map<int, std::unique_ptr<QIE10DigiCollection>> qie10_prodAddtl;
348 std::unordered_map<int, std::unique_ptr<QIE11DigiCollection>> qie11_prodAddtl;
350 qie10_prodAddtl[orig.first] = std::unique_ptr<QIE10DigiCollection>(orig.second);
353 qie11_prodAddtl[orig.first] = std::unique_ptr<QIE11DigiCollection>(orig.second);
356 hbhe_prod->swap_contents(
hbhe);
358 hf_prod->swap_contents(
hf);
359 ho_prod->swap_contents(
ho);
360 htp_prod->swap_contents(htp);
361 hotp_prod->swap_contents(hotp);
371 hbhe_prod->
swap(filtered_hbhe);
372 ho_prod->swap(filtered_ho);
373 hf_prod->swap(filtered_hf);
374 qie10_prod->swap(filtered_qie10);
375 qie11_prod->swap(filtered_qie11);
378 for (
auto&
prod : qie10_prodAddtl) {
380 prod.second->swap(filtered_qie10);
383 for (
auto&
prod : qie11_prodAddtl) {
385 prod.second->swap(filtered_qie11);
397 qie10ZDC_prod->sort();
398 qie10Lasermon_prod->sort();
402 for (
auto&
prod : qie10_prodAddtl) {
405 for (
auto&
prod : qie11_prodAddtl) {
416 e.put(
std::move(qie10Lasermon_prod),
"LASERMON");
420 for (
auto&
prod : qie10_prodAddtl) {
425 for (
auto&
prod : qie11_prodAddtl) {
432 auto hc_prod = std::make_unique<HcalCalibDigiCollection>();
433 hc_prod->swap_contents(hc);
437 hc_prod->
swap(filtered_calib);
446 auto prod = std::make_unique<ZDCDigiCollection>();
451 prod->swap(filtered_zdc);
459 auto prod = std::make_unique<HcalTTPDigiCollection>();
460 prod->swap_contents(ttp);
468 if (colls.
umnio !=
nullptr) {
469 e.put(std::make_unique<HcalUMNioDigi>(umnio));