80 static constexpr
float b0 = 0.38,
b1 = 1.9,
b2 = 0.05;
82 static constexpr
float d0 = 0.96,
d1 = 0.0003;
163 float phi = (
id * size_cell) -
M_PI + 0.5 * size_cell;
295 inline float pt()
const {
return pt_; };
317 static constexpr
int PI = 180;
345 produces<l1tp2::CaloCrystalClusterCollection>();
346 produces<BXVector<l1t::EGamma> >();
347 produces<l1tp2::CaloTowerCollection>(
"L1CaloTowerCollection");
373 std::vector<SimpleCaloHit> ecalhits;
375 for (
const auto&
hit : *pcalohits.
product()) {
376 if (
hit.encodedEt() > 0)
379 float et =
hit.encodedEt() / 8.;
390 ecalhits.push_back(ehit);
395 std::vector<SimpleCaloHit> hcalhits;
399 float et = decoder.hcaletValue(
hit.
id(),
hit.t0());
403 LogError(
"L1EGCrystalClusterEmulatorProducer")
404 <<
" -- Hcal hit DetID not present in HCAL Geom: " <<
hit.
id() << std::endl;
408 const std::vector<HcalDetId>& hcId = theTrigTowerGeometry.
detIds(
hit.
id());
410 LogError(
"L1EGCrystalClusterEmulatorProducer")
411 <<
"Cannot find any HCalDetId corresponding to " <<
hit.
id() << std::endl;
415 if (hcId[0].subdetId() > 1)
418 for (
const auto& hcId_i : hcId) {
419 if (hcId_i.subdetId() > 1)
425 hcal_tp_position = tmpVector;
434 hcalhits.push_back(hhit);
460 ECAL_tower_L1Card[
ii][
jj][ll] = 0;
461 HCAL_tower_L1Card[
ii][
jj][ll] = 0;
462 iPhi_tower_L1Card[
ii][
jj][ll] = -999;
463 iEta_tower_L1Card[
ii][
jj][ll] = -999;
470 energy_cluster_L1Card[
ii][
jj][ll] = 0;
471 brem_cluster_L1Card[
ii][
jj][ll] = 0;
472 towerID_cluster_L1Card[
ii][
jj][ll] = 0;
473 crystalID_cluster_L1Card[
ii][
jj][ll] = 0;
487 bool build_cluster =
true;
491 build_cluster =
false;
494 for (
const auto&
hit : ecalhits) {
502 !
hit.used() &&
hit.pt() >= 1.0 &&
hit.pt() > centerhit.
pt())
506 build_cluster =
true;
513 if (build_cluster && nclusters > 0 && nclusters <=
n_clusters_max) {
534 for (
auto&
hit : ecalhits) {
541 if (
abs(
hit.dieta(centerhit)) <= 1 &&
hit.diphi(centerhit) > 2 &&
hit.diphi(centerhit) <= 7) {
542 rightlobe +=
hit.pt();
544 if (
abs(
hit.dieta(centerhit)) <= 1 &&
hit.diphi(centerhit) < -2 &&
hit.diphi(centerhit) >= -7) {
545 leftlobe +=
hit.pt();
547 if (
abs(
hit.dieta(centerhit)) <= 2 &&
abs(
hit.diphi(centerhit)) <= 2) {
548 e5x5 +=
hit.energy();
551 if ((
hit.dieta(centerhit) == 1
or hit.dieta(centerhit) == 0) &&
552 (
hit.diphi(centerhit) == 1
or hit.diphi(centerhit) == 0)) {
553 e2x2_1 +=
hit.energy();
556 if ((
hit.dieta(centerhit) == 0
or hit.dieta(centerhit) == -1) &&
557 (
hit.diphi(centerhit) == 0
or hit.diphi(centerhit) == 1)) {
558 e2x2_2 +=
hit.energy();
561 if ((
hit.dieta(centerhit) == 0
or hit.dieta(centerhit) == 1) &&
562 (
hit.diphi(centerhit) == 0
or hit.diphi(centerhit) == -1)) {
563 e2x2_3 +=
hit.energy();
566 if ((
hit.dieta(centerhit) == 0
or hit.dieta(centerhit) == -1) &&
567 (
hit.diphi(centerhit) == 0
or hit.diphi(centerhit) == -1)) {
568 e2x2_4 +=
hit.energy();
571 if ((
hit.dieta(centerhit) == 0
or hit.dieta(centerhit) == 1) &&
abs(
hit.diphi(centerhit)) <= 2) {
572 e2x5_1 +=
hit.energy();
575 if ((
hit.dieta(centerhit) == 0
or hit.dieta(centerhit) == -1) &&
abs(
hit.diphi(centerhit)) <= 2) {
576 e2x5_2 +=
hit.energy();
584 abs(
hit.dieta(centerhit)) <= 1 &&
abs(
hit.diphi(centerhit)) <= 2 &&
594 if (
do_brem && (rightlobe > 0.10 * mc1.
cpt or leftlobe > 0.10 * mc1.
cpt)) {
595 for (
auto&
hit : ecalhits) {
603 if (rightlobe > 0.10 * mc1.
cpt && (leftlobe < 0.10 * mc1.cpt or rightlobe > leftlobe) &&
604 abs(
hit.dieta(centerhit)) <= 1 &&
hit.diphi(centerhit) > 2 &&
hit.diphi(centerhit) <= 7) {
609 if (leftlobe > 0.10 * mc1.
cpt && (rightlobe < 0.10 * mc1.cpt or leftlobe >= rightlobe) &&
610 abs(
hit.dieta(centerhit)) <= 1 &&
hit.diphi(centerhit) < -2 &&
hit.diphi(centerhit) >= -7) {
621 if (e2x2_2 > mc1.
c2x2_)
623 if (e2x2_3 > mc1.
c2x2_)
625 if (e2x2_4 > mc1.
c2x2_)
633 cluster_list[cc].push_back(mc1);
640 for (
unsigned int jj = 0;
jj < unsigned(cluster_list[cc].
size()); ++
jj) {
641 for (
unsigned int kk =
jj + 1;
kk < unsigned(cluster_list[cc].
size()); ++
kk) {
642 if (
std::abs(cluster_list[cc][
jj].ceta_ - cluster_list[cc][
kk].ceta_) < 2 &&
643 std::abs(cluster_list[cc][
jj].cphi_ - cluster_list[cc][
kk].cphi_) < 2) {
644 if (cluster_list[cc][
kk].cpt > cluster_list[cc][
jj].cpt) {
645 cluster_list[cc][
kk].cpt += cluster_list[cc][
jj].cpt;
646 cluster_list[cc][
kk].c5x5_ += cluster_list[cc][
jj].c5x5_;
647 cluster_list[cc][
kk].c2x5_ += cluster_list[cc][
jj].c2x5_;
648 cluster_list[cc][
jj].cpt = 0;
649 cluster_list[cc][
jj].c5x5_ = 0;
650 cluster_list[cc][
jj].c2x5_ = 0;
651 cluster_list[cc][
jj].c2x2_ = 0;
653 cluster_list[cc][
jj].cpt += cluster_list[cc][
kk].cpt;
654 cluster_list[cc][
jj].c5x5_ += cluster_list[cc][
kk].c5x5_;
655 cluster_list[cc][
jj].c2x5_ += cluster_list[cc][
kk].c2x5_;
656 cluster_list[cc][
kk].cpt = 0;
657 cluster_list[cc][
kk].c2x2_ = 0;
658 cluster_list[cc][
kk].c2x5_ = 0;
659 cluster_list[cc][
kk].c5x5_ = 0;
663 if (cluster_list[cc][
jj].cpt > 0) {
664 cluster_list[cc][
jj].cpt =
665 cluster_list[cc][
jj].cpt *
668 cluster_list_merged[cc].push_back(cluster_list[cc][
jj]);
672 return a.cpt >
b.cpt;
680 getTowerID(cluster_list_merged[cc][
jj].ceta_, cluster_list_merged[cc][
jj].cphi_);
684 cluster_list_merged[cc][
jj].c2x5_ / cluster_list_merged[cc][
jj].c5x5_))
689 cluster_list_merged[cc][
jj].c2x5_ / cluster_list_merged[cc][
jj].c5x5_))
694 cluster_list_merged[cc][
jj].c2x2_ / cluster_list_merged[cc][
jj].c2x5_))
701 for (
const auto&
hit : ecalhits) {
720 static constexpr
float tower_width = 0.0873;
725 (
ii + 0.5) * tower_width;
735 for (
const auto&
hit : hcalhits) {
744 HCAL_tower_L1Card[
jj][
ii][cc] +=
hit.pt();
756 if (cluster_list_merged[cc][
kk].cpt > 0) {
758 [
getTower_etaID(cluster_list_merged[cc][
kk].ceta_)][cc] += cluster_list_merged[cc][
kk].cpt;
787 HCAL_tower_L2Card[
ii][
jj][ll] = 0;
788 ECAL_tower_L2Card[
ii][
jj][ll] = 0;
789 iEta_tower_L2Card[
ii][
jj][ll] = 0;
790 iPhi_tower_L2Card[
ii][
jj][ll] = 0;
797 energy_cluster_L2Card[
ii][
jj][ll] = 0;
798 brem_cluster_L2Card[
ii][
jj][ll] = 0;
799 towerID_cluster_L2Card[
ii][
jj][ll] = 0;
800 crystalID_cluster_L2Card[
ii][
jj][ll] = 0;
801 isolation_cluster_L2Card[
ii][
jj][ll] = 0;
802 HE_cluster_L2Card[
ii][
jj][ll] = 0;
803 photonShowerShape_cluster_L2Card[
ii][
jj][ll] = 0;
804 showerShape_cluster_L2Card[
ii][
jj][ll] = 0;
805 showerShapeLooseTk_cluster_L2Card[
ii][
jj][ll] = 0;
816 int card_left = 2 *
ii +
jj;
817 int card_right = 2 *
ii +
jj + 2;
854 int card_left = 2 *
ii +
jj;
855 int card_right = 2 *
ii +
jj + 2;
906 int card_bottom = 2 *
ii;
907 int card_top = 2 *
ii + 1;
947 cluster_list_L2[
ii].push_back(mc1);
957 if (cluster_list_L2[
ii][
jj].cpt > 0) {
960 cluster_list_L2[
ii][
jj].cpt = 0;
961 cluster_list_L2[
ii][
jj].ctowerid_ = 0;
962 cluster_list_L2[
ii][
jj].ccrystalid_ = 0;
972 float hcal_nrj = 0.0;
976 for (
unsigned int jjj = 0; jjj <
n_clusters_per_L1card && jjj < cluster_list_L2[iii].size(); ++jjj) {
977 if (!(iii ==
ii && jjj ==
jj)) {
980 if (
abs(cluster2_eta - cluster_etaOfTower_fullDetector) <= 2 &&
981 (
abs(cluster2_phi - cluster_phiOfTower_fullDetector) <= 2
or 982 abs(cluster2_phi -
n_towers_Phi - cluster_phiOfTower_fullDetector) <= 2)) {
983 isolation += cluster_list_L2[iii][jjj].cpt;
995 if (
abs(etaOftower_fullDetector - cluster_etaOfTower_fullDetector) <= 2 &&
996 (
abs(phiOftower_fullDetector - cluster_phiOfTower_fullDetector) <= 2
or 997 abs(phiOftower_fullDetector -
n_towers_Phi - cluster_phiOfTower_fullDetector) <= 2)) {
999 if (!((cluster_phiOfTower_fullDetector == 0 && phiOftower_fullDetector == 71)
or 1000 (cluster_phiOfTower_fullDetector == 23 && phiOftower_fullDetector == 26)
or 1001 (cluster_phiOfTower_fullDetector == 24 && phiOftower_fullDetector == 21)
or 1002 (cluster_phiOfTower_fullDetector == 47 && phiOftower_fullDetector == 50)
or 1003 (cluster_phiOfTower_fullDetector == 48 && phiOftower_fullDetector == 45)
or 1004 (cluster_phiOfTower_fullDetector == 71 && phiOftower_fullDetector == 2))) {
1011 if (
abs(etaOftower_fullDetector - cluster_etaOfTower_fullDetector) <= 2 &&
1012 (
abs(phiOftower_fullDetector - cluster_phiOfTower_fullDetector) <= 2
or 1013 abs(phiOftower_fullDetector -
n_towers_Phi - cluster_phiOfTower_fullDetector) <= 2)) {
1014 hcal_nrj += HCAL_tower_L1Card[ll][mm][
kk];
1019 cluster_list_L2[
ii][
jj].ciso_ = ((
isolation) * (25.0 / ntowers)) / cluster_list_L2[
ii][
jj].cpt;
1020 cluster_list_L2[
ii][
jj].chovere_ = hcal_nrj / cluster_list_L2[
ii][
jj].cpt;
1028 for (
int ll = 0; ll < 3; ++ll) {
1029 ECAL_tower_L2Card[
ii][
jj][ll] =
1031 HCAL_tower_L2Card[
ii][
jj][ll] =
1033 iEta_tower_L2Card[
ii][
jj][ll] =
1035 iPhi_tower_L2Card[
ii][
jj][ll] =
1065 auto L1EGXtalClusters = std::make_unique<l1tp2::CaloCrystalClusterCollection>();
1066 auto L1EGammas = std::make_unique<l1t::EGammaBxCollection>();
1067 auto L1CaloTowers = std::make_unique<l1tp2::CaloTowerCollection>();
1073 for (
int jj = 0;
jj < 2; ++
jj) {
1074 if (energy_cluster_L2Card[
ii][
jj][ll] > 0.45) {
1076 energy_cluster_L2Card[
ii][
jj][ll],
1078 ii, ll, towerID_cluster_L2Card[
ii][
jj][ll], crystalID_cluster_L2Card[
ii][
jj][ll]),
1080 ii, ll, towerID_cluster_L2Card[
ii][
jj][ll], crystalID_cluster_L2Card[
ii][
jj][ll]),
1083 bool is_iso =
passes_iso(energy_cluster_L2Card[
ii][
jj][ll], isolation_cluster_L2Card[
ii][
jj][ll]);
1084 bool is_looseTkiso =
1086 bool is_ss = (showerShape_cluster_L2Card[
ii][
jj][ll] == 1);
1087 bool is_photon = (photonShowerShape_cluster_L2Card[
ii][
jj][ll] == 1) && is_ss && is_iso;
1088 bool is_looseTkss = (showerShapeLooseTk_cluster_L2Card[
ii][
jj][ll] == 1);
1091 energy_cluster_L2Card[
ii][
jj][ll],
1092 HE_cluster_L2Card[
ii][
jj][ll],
1093 isolation_cluster_L2Card[
ii][
jj][ll],
1099 energy_cluster_L2Card[
ii][
jj][ll],
1105 is_looseTkiso&& is_looseTkss,
1108 std::map<std::string, float>
params;
1109 params[
"standaloneWP_showerShape"] = is_ss;
1110 params[
"standaloneWP_isolation"] = is_iso;
1111 params[
"trkMatchWP_showerShape"] = is_looseTkss;
1112 params[
"trkMatchWP_isolation"] = is_looseTkiso;
1115 cluster.setExperimentalParams(
params);
1116 L1EGXtalClusters->push_back(cluster);
1118 int standaloneWP = (
int)(is_iso && is_ss);
1119 int looseL1TkMatchWP = (
int)(is_looseTkiso && is_looseTkss);
1120 int photonWP = (
int)(is_photon);
1123 L1EGammas->push_back(
1124 0,
l1t::EGamma(p4calibrated, p4calibrated.pt(), p4calibrated.eta(), p4calibrated.phi(),
quality, 1));
1142 static float constexpr towerEtaUpperUnitialized = -80;
1143 static float constexpr towerPhiUpperUnitialized = -90;
1144 if (l1CaloTower.
towerEta() < towerEtaUpperUnitialized && l1CaloTower.
towerPhi() < towerPhiUpperUnitialized) {
1152 for (
const auto& l1eg : *L1EGXtalClusters) {
1153 if (l1eg.experimentalParam(
"TTiEta") != l1CaloTower.
towerIEta())
1155 if (l1eg.experimentalParam(
"TTiPhi") != l1CaloTower.
towerIPhi())
1158 int n_L1eg = l1CaloTower.
nL1eg();
1162 if (l1CaloTower.
nL1eg() > 1)
1164 l1CaloTower.
setL1egTrkSS(l1eg.experimentalParam(
"trkMatchWP_showerShape"));
1165 l1CaloTower.
setL1egTrkIso(l1eg.experimentalParam(
"trkMatchWP_isolation"));
1170 L1CaloTowers->push_back(l1CaloTower);
void setId(const EBDetId &id)
static constexpr int n_links_GCTcard
constexpr double deltaPhi(double phi1, double phi2)
bool validHT(const HcalTrigTowerDetId &id) const
int getCrystal_etaID(float eta)
static constexpr float e2_looseTkss
l1tp2::ParametricCalibration calib_
edm::EDGetTokenT< edm::SortedCollection< HcalTriggerPrimitiveDigi > > hcalTPToken_
int getCrystal_phiID(float phi)
bool passes_looseTkiso(float pt, float iso)
int getTower_phiID(int cluster_phiID)
std::pair< ALIstring, ALIstring > pss
static constexpr int toweriEta_fromAbsoluteID_shift
static constexpr int toweriPhi_fromAbsoluteID_shift_upperHalf
static constexpr int n_towers_halfPhi
static constexpr float cut_500_MeV
int getPhiMin_card(int card)
int dieta(SimpleCaloHit &other) const
edm::ESGetToken< CaloGeometry, CaloGeometryRecord > caloGeometryTag_
void setEcalTowerEt(float et)
#define DEFINE_FWK_MODULE(type)
int iphi() const
get the crystal iphi
Geom::Phi< T > phi() const
Sin< T >::type sin(const T &t)
static constexpr float ECAL_eta_range
bool passes_iso(float pt, float iso)
static constexpr float c2_ss
void setTowerIPhi(int iPhi)
void setIsEndcapHit(bool isEC)
T const * product() const
void setL1egStandaloneIso(int staIso)
int get_towerEta_fromCardTowerInCard(int card, int towerincard)
int getPhiMax_card(int card)
int getTowerID(int etaID, int phiID)
int get_towerPhi_fromCardLinkTower(int card, int link, int tower)
float get_calibrate(float uncorr)
static constexpr int n_eta_bins
const HcalTopology * hcTopology_
Log< level::Error, false > LogError
int convert_L2toL1_card(int card, int link)
static constexpr int n_borders_eta
static constexpr float a1_80
int getEtaMin_card(int card)
void setL1egTrkIso(int trkIso)
void produce(edm::Event &, const edm::EventSetup &) override
static constexpr int toweriPhi_fromAbsoluteID_shift_lowerHalf
static constexpr int n_clusters_max
float getTowerEta_fromAbsoluteID(int id)
static constexpr int n_crystals_towerPhi
int ieta() const
get the crystal ieta
void setHcalTowerEt(float et)
static constexpr int n_clusters_4link
void setTowerIEta(int iEta)
edm::ESGetToken< HcalTopology, HcalRecNumberingRecord > hbTopologyTag_
int get_towerEta_fromCardLinkTower(int card, int link, int tower)
L1EGCrystalClusterEmulatorProducer(const edm::ParameterSet &)
std::vector< HcalDetId > detIds(const HcalTrigTowerDetId &) const
int getTower_absolutePhiID(float phi)
void setTowerPhi(float phi)
int getTower_absoluteEtaID(float eta)
int getToweriPhi_fromAbsoluteID(int id)
static constexpr int n_clusters_per_link
float distanceTo(SimpleCaloHit &other) const
int diphi(SimpleCaloHit &other) const
static constexpr float a0_80
bool passes_ss(float pt, float ss)
static constexpr bool do_brem
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e< void, edm::EventID const &, edm::Timestamp const & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
void setPosition(const GlobalVector &pos)
float getTowerPhi_fromAbsoluteID(int id)
const GlobalVector & position() const
bool passes_photon(float pt, float pss)
Abs< T >::type abs(const T &t)
const EBDetId & id() const
static constexpr int n_towers_per_link
void setL1egTrkSS(int trkSS)
bool getData(T &iHolder) const
edm::EDGetTokenT< EcalEBTrigPrimDigiCollection > ecalTPEBToken_
static constexpr float plateau_ss
static constexpr int n_clusters_link
void setIsBarrel(bool isBarrel)
static constexpr float half_crystal_size
virtual std::shared_ptr< const CaloCellGeometry > getGeometry(const DetId &id) const
Get the cell geometry of a given detector id. Should return false if not found.
int convert_L2toL1_tower(int tower)
void setTowerEta(float eta)
static constexpr float c1_ss
int get_towerPhi_fromCardTowerInCard(int card, int towerincard)
float getEta_fromL2LinkCardTowerCrystal(int link, int card, int tower, int crystal)
int getToweriEta_fromAbsoluteID(int id)
static constexpr int n_crystals_3towers
int getEtaMax_card(int card)
static constexpr int n_links_card
static constexpr float d0
int getTower_etaID(int cluster_etaID)
T mag() const
The vector magnitude. Equivalent to sqrt(vec.mag2())
int convert_L2toL1_link(int link)
static constexpr float slideIsoPtThreshold
static constexpr float a0
static constexpr float e0_looseTkss
void setL1egTowerEt(float et)
static constexpr int n_clusters_per_L1card
float l1egTowerEt() const
static constexpr int n_borders_phi
static constexpr int n_crystals_towerEta
float deta(SimpleCaloHit &other) const
bool operator==(SimpleCaloHit &other) const
const CaloSubdetectorGeometry * ebGeometry
bool passes_looseTkss(float pt, float ss)
static constexpr int n_GCTcards
static constexpr int n_towers_Phi
float dphi(SimpleCaloHit &other) const
static constexpr float b2
static constexpr float b0
float getPhi_fromL2LinkCardTowerCrystal(int link, int card, int tower, int crystal)
void setIdHcal(const HcalDetId &idhcal)
~L1EGCrystalClusterEmulatorProducer() override
static constexpr float d1
int getCrystalIDInTower(int etaID, int phiID)
static constexpr int n_towers_Eta
static constexpr float c0_ss
void setL1egStandaloneSS(int staSS)
void setUsed(bool isUsed)
Power< A, B >::type pow(const A &a, const B &b)
const CaloSubdetectorGeometry * hbGeometry
static constexpr float b1
Global3DVector GlobalVector
static constexpr float e1_looseTkss
Geom::Theta< T > theta() const
edm::ESGetToken< CaloTPGTranscoder, CaloTPGRecord > decoderTag_
math::PtEtaPhiMLorentzVector PolarLorentzVector
Lorentz vector.