forked from cms-sw/cmssw
-
Notifications
You must be signed in to change notification settings - Fork 2
/
HGCalTriggerDigiProducer.cc
143 lines (122 loc) · 6.12 KB
/
HGCalTriggerDigiProducer.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#include "FWCore/Framework/interface/Frameworkfwd.h"
#include "FWCore/Framework/interface/stream/EDProducer.h"
#include "FWCore/Framework/interface/Event.h"
#include "FWCore/Framework/interface/MakerMacros.h"
#include "FWCore/Framework/interface/ConsumesCollector.h"
#include "DataFormats/L1THGCal/interface/HGCFETriggerDigi.h"
#include "DataFormats/L1THGCal/interface/HGCFETriggerDigiDefs.h"
#include "DataFormats/HGCDigi/interface/HGCDigiCollections.h"
#include "Geometry/Records/interface/CaloGeometryRecord.h"
#include "L1Trigger/L1THGCal/interface/HGCalTriggerGeometryBase.h"
#include "L1Trigger/L1THGCal/interface/HGCalTriggerFECodecBase.h"
#include "L1Trigger/L1THGCal/interface/HGCalTriggerBackendProcessor.h"
#include <memory>
class HGCalTriggerDigiProducer : public edm::stream::EDProducer<> {
public:
HGCalTriggerDigiProducer(const edm::ParameterSet&);
~HGCalTriggerDigiProducer() override { }
void beginRun(const edm::Run&,
const edm::EventSetup&) override;
void produce(edm::Event&, const edm::EventSetup&) override;
private:
// inputs
edm::EDGetToken inputee_, inputfh_, inputbh_;
edm::ESHandle<HGCalTriggerGeometryBase> triggerGeometry_;
// algorithm containers
std::unique_ptr<HGCalTriggerFECodecBase> codec_;
std::unique_ptr<HGCalTriggerBackendProcessor> backEndProcessor_;
};
DEFINE_FWK_MODULE(HGCalTriggerDigiProducer);
HGCalTriggerDigiProducer::
HGCalTriggerDigiProducer(const edm::ParameterSet& conf):
inputee_(consumes<HGCalDigiCollection>(conf.getParameter<edm::InputTag>("eeDigis"))),
inputfh_(consumes<HGCalDigiCollection>(conf.getParameter<edm::InputTag>("fhDigis"))),
inputbh_(consumes<HGCalDigiCollection>(conf.getParameter<edm::InputTag>("bhDigis"))),
backEndProcessor_(new HGCalTriggerBackendProcessor(conf.getParameterSet("BEConfiguration"),consumesCollector()) )
{
//setup FE codec
const edm::ParameterSet& feCodecConfig = conf.getParameterSet("FECodec");
const std::string& feCodecName = feCodecConfig.getParameter<std::string>("CodecName");
HGCalTriggerFECodecBase* codec = HGCalTriggerFECodecFactory::get()->create(feCodecName,feCodecConfig);
codec_.reset(codec);
codec_->unSetDataPayload();
produces<l1t::HGCFETriggerDigiCollection>();
// register backend processor products
backEndProcessor_->setProduces(*this);
}
void HGCalTriggerDigiProducer::beginRun(const edm::Run& /*run*/,
const edm::EventSetup& es) {
es.get<CaloGeometryRecord>().get(triggerGeometry_);
codec_->setGeometry(triggerGeometry_.product());
backEndProcessor_->setGeometry(triggerGeometry_.product());
}
void HGCalTriggerDigiProducer::produce(edm::Event& e, const edm::EventSetup& es) {
std::unique_ptr<l1t::HGCFETriggerDigiCollection>
fe_output( new l1t::HGCFETriggerDigiCollection );
edm::Handle<HGCalDigiCollection> ee_digis_h;
edm::Handle<HGCalDigiCollection> fh_digis_h;
edm::Handle<HGCalDigiCollection> bh_digis_h;
e.getByToken(inputee_,ee_digis_h);
e.getByToken(inputfh_,fh_digis_h);
e.getByToken(inputbh_,bh_digis_h);
const HGCalDigiCollection& ee_digis = *ee_digis_h;
const HGCalDigiCollection& fh_digis = *fh_digis_h;
const HGCalDigiCollection& bh_digis = *bh_digis_h;
// First find modules containing hits and prepare list of hits for each module
std::unordered_map<uint32_t, HGCalDigiCollection> hit_modules_ee;
for(const auto& eedata : ee_digis) {
uint32_t module = triggerGeometry_->getModuleFromCell(eedata.id());
if(triggerGeometry_->disconnectedModule(module)) continue;
auto itr_insert = hit_modules_ee.emplace(module,HGCalDigiCollection());
itr_insert.first->second.push_back(eedata);
}
std::unordered_map<uint32_t,HGCalDigiCollection> hit_modules_fh;
for(const auto& fhdata : fh_digis) {
uint32_t module = triggerGeometry_->getModuleFromCell(fhdata.id());
if(triggerGeometry_->disconnectedModule(module)) continue;
auto itr_insert = hit_modules_fh.emplace(module, HGCalDigiCollection());
itr_insert.first->second.push_back(fhdata);
}
std::unordered_map<uint32_t,HGCalDigiCollection> hit_modules_bh;
for(const auto& bhdata : bh_digis) {
if(DetId(bhdata.id()).det()!=DetId::HGCalHSc && HcalDetId(bhdata.id()).subdetId()!=HcalEndcap) continue;
uint32_t module = triggerGeometry_->getModuleFromCell(bhdata.id());
if(triggerGeometry_->disconnectedModule(module)) continue;
auto itr_insert = hit_modules_bh.emplace(module, HGCalDigiCollection());
itr_insert.first->second.push_back(bhdata);
}
// loop on modules containing hits and call front-end processing
// we produce one output trigger digi per module in the FE
fe_output->reserve(hit_modules_ee.size() + hit_modules_fh.size() + hit_modules_bh.size());
for( const auto& module_hits : hit_modules_ee ) {
fe_output->push_back(l1t::HGCFETriggerDigi());
l1t::HGCFETriggerDigi& digi = fe_output->back();
codec_->setDataPayload(module_hits.second,HGCalDigiCollection(),HGCalDigiCollection());
codec_->encode(digi);
digi.setDetId( DetId(module_hits.first) );
codec_->unSetDataPayload();
} //end loop on EE modules
for( const auto& module_hits : hit_modules_fh ) {
fe_output->push_back(l1t::HGCFETriggerDigi());
l1t::HGCFETriggerDigi& digi = fe_output->back();
codec_->setDataPayload(HGCalDigiCollection(),module_hits.second,HGCalDigiCollection());
codec_->encode(digi);
digi.setDetId( DetId(module_hits.first) );
codec_->unSetDataPayload();
} //end loop on FH modules
for( const auto& module_hits : hit_modules_bh ) {
fe_output->push_back(l1t::HGCFETriggerDigi());
l1t::HGCFETriggerDigi& digi = fe_output->back();
codec_->setDataPayload(HGCalDigiCollection(),HGCalDigiCollection(),module_hits.second);
codec_->encode(digi);
digi.setDetId( DetId(module_hits.first) );
codec_->unSetDataPayload();
} //end loop on BH modules
// get the orphan handle and fe digi collection
auto fe_digis_handle = e.put(std::move(fe_output));
auto fe_digis_coll = *fe_digis_handle;
//now we run the emulation of the back-end processor
backEndProcessor_->reset();
backEndProcessor_->run(fe_digis_coll,es,e);
backEndProcessor_->putInEvent(e);
}