15 return cl1->
pt() > cl2->
pt();
20 static float constexpr eta_min = 1.;
21 static float constexpr eta_max = 4.;
23 int eta_bin = floor((
std::abs(cl->
eta()) - eta_min) / ((eta_max - eta_min) / n_eta_bins));
30 static constexpr
float phi_min = -
M_PI;
31 static constexpr
float phi_max =
M_PI;
32 static constexpr
unsigned n_phi_bins = 63;
50 : multiclusters_token_(
52 calibrator_(iConfig.getParameter<edm::
ParameterSet>(
"calibrationConfig")) {
53 produces<BXVector<l1t::EGamma>>(
"L1EGammaCollectionBXVWithCuts");
66 std::vector<const l1t::HGCalMulticluster *> selected_multiclusters;
67 std::map<std::pair<int, int>, std::vector<const l1t::HGCalMulticluster *>> etaphi_bins;
70 for (
auto cl3d = multiclusters.
begin(0); cl3d != multiclusters.
end(0); cl3d++) {
72 if (cl3d->et() > minEt_) {
84 l1EgammaBxCollection->push_back(0, eg);
85 if (hw_quality == 2) {
88 cl3d->iPt(l1t::HGCalMulticluster::EnergyInterpretation::EM), cl3d->eta(), cl3d->phi(), 0.));
92 l1EgammaBxCollection->push_back(0, eg_emint);
94 selected_multiclusters.push_back(&(*cl3d));
96 auto bucket = etaphi_bins.find(eta_phi_bin);
97 if (bucket == etaphi_bins.end()) {
98 std::vector<const l1t::HGCalMulticluster *> vec;
99 vec.push_back(&(*cl3d));
100 etaphi_bins[eta_phi_bin] = vec;
102 bucket->second.push_back(&(*cl3d));
110 std::set<const l1t::HGCalMulticluster *> used_clusters;
111 for (
const auto &cl3d : selected_multiclusters) {
112 if (used_clusters.find(cl3d) == used_clusters.end()) {
113 float pt = cl3d->pt();
115 if (cl3d->hOverE() != -1)
116 pt = cl3d->pt() / (1 + cl3d->hOverE());
119 cl3d->iPt(l1t::HGCalMulticluster::EnergyInterpretation::EM), cl3d->eta(), cl3d->phi(), 0.);
122 used_clusters.insert(cl3d);
125 for (
int eta_bin : {eta_phi_bin.first - 1, eta_phi_bin.first, eta_phi_bin.first + 1}) {
126 for (
int phi_bin : {eta_phi_bin.second - 1, eta_phi_bin.second, eta_phi_bin.second + 1}) {
127 auto bucket = etaphi_bins.find(std::make_pair(eta_bin, phi_bin));
128 if (bucket != etaphi_bins.end()) {
130 for (
const auto &other_cl_ptr : bucket->second) {
131 if (used_clusters.find(other_cl_ptr) == used_clusters.end()) {
132 if (
std::abs(other_cl_ptr->eta() - cl3d->eta()) < 0.02) {
134 float pt_other = other_cl_ptr->pt();
135 if (other_cl_ptr->hOverE() != -1)
136 pt_other = other_cl_ptr->pt() / (1 + other_cl_ptr->hOverE());
139 other_cl_ptr->iPt(l1t::HGCalMulticluster::EnergyInterpretation::EM),
143 used_clusters.insert(other_cl_ptr);
156 l1EgammaBxCollection->push_back(0, eg);
162 l1EgammaBxCollection->push_back(0, eg_emint_brec);
166 iEvent.
put(
std::move(l1EgammaBxCollection),
"L1EGammaCollectionBXVWithCuts");
constexpr double deltaPhi(double phi1, double phi2)
const_iterator end(int bx) const
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
float calibrationFactor(const float &pt, const float &eta) const
double pt() const final
transverse momentum
bool getByToken(EDGetToken token, Handle< PROD > &result) const
#define DEFINE_FWK_MODULE(type)
void produce(edm::Event &, const edm::EventSetup &) override
static constexpr int n_eta_bins
edm::EDGetToken multiclusters_token_
L1EGammaEECalibrator calibrator_
pair< int, int > get_eta_phi_bin(const l1t::HGCalMulticluster *cl)
int get_phi_bin(const l1t::HGCalMulticluster *cl)
L1EGammaEEProducer(const edm::ParameterSet &)
BXVector< HGCalMulticluster > HGCalMulticlusterBxCollection
Abs< T >::type abs(const T &t)
bool compare_cluster_pt(const l1t::HGCalMulticluster *cl1, const l1t::HGCalMulticluster *cl2)
void setIsoEt(short int iso)
double phi() const final
momentum azimuthal angle
const_iterator begin(int bx) const
int etaBin(const l1t::HGCalMulticluster *cl)
math::PtEtaPhiMLorentzVector PolarLorentzVector
Lorentz vector.
double eta() const final
momentum pseudorapidity