File indexing completed on 2024-04-06 12:20:18
0001 #include "L1Trigger/L1TCalorimeter/plugins/L1TPhysicalEtAdder.h"
0002 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0003
0004 #include "DataFormats/L1CaloTrigger/interface/L1CaloEmCand.h"
0005 #include "DataFormats/L1CaloTrigger/interface/L1CaloRegion.h"
0006 #include "DataFormats/L1CaloTrigger/interface/L1CaloCollections.h"
0007
0008 #include "DataFormats/L1Trigger/interface/BXVector.h"
0009 #include "DataFormats/L1Trigger/interface/EtSum.h"
0010
0011 #include "DataFormats/L1TCalorimeter/interface/CaloEmCand.h"
0012 #include "DataFormats/L1TCalorimeter/interface/CaloRegion.h"
0013
0014 #include "FWCore/Framework/interface/ESHandle.h"
0015 #include <vector>
0016
0017 namespace {
0018
0019 int getRegionEta(int gtEta, bool forward) {
0020
0021
0022
0023 int centralGtEta[] = {11, 12, 13, 14, 15, 16, 17, -100, 10, 9, 8, 7, 6, 5, 4};
0024 int forwardGtEta[] = {18, 19, 20, 21, -100, -100, -100, -100, 3, 2, 1, 0};
0025
0026
0027
0028 int regionEta;
0029
0030 if (!forward) {
0031 regionEta = centralGtEta[gtEta];
0032 } else
0033 regionEta = forwardGtEta[gtEta];
0034
0035 if (regionEta == -100)
0036 edm::LogError("EtaIndexError") << "Bad eta index passed to L1TPhysicalEtAdder::getRegionEta, " << gtEta
0037 << std::endl;
0038
0039 return regionEta;
0040 }
0041
0042
0043 double getPhysicalEta(int gtEta, bool forward = false) {
0044 int etaIndex = getRegionEta(gtEta, forward);
0045
0046 const double rgnEtaValues[11] = {0.174,
0047 0.522,
0048 0.870,
0049 1.218,
0050 1.566,
0051 1.956,
0052 2.586,
0053 3.250,
0054 3.750,
0055 4.250,
0056 4.750};
0057 if (etaIndex < 11) {
0058 return -rgnEtaValues[-(etaIndex - 10)];
0059 } else if (etaIndex < 22) {
0060 return rgnEtaValues[etaIndex - 11];
0061 }
0062 return -9;
0063 }
0064
0065 double getPhysicalPhi(int phiIndex) {
0066 if (phiIndex < 10)
0067 return 2. * M_PI * phiIndex / 18.;
0068 if (phiIndex < 18)
0069 return -M_PI + 2. * M_PI * (phiIndex - 9) / 18.;
0070 return -9;
0071 }
0072
0073 }
0074
0075 using namespace l1t;
0076
0077 L1TPhysicalEtAdder::L1TPhysicalEtAdder(const edm::ParameterSet& ps) {
0078 produces<EGammaBxCollection>();
0079 produces<TauBxCollection>("rlxTaus");
0080 produces<TauBxCollection>("isoTaus");
0081 produces<JetBxCollection>();
0082 produces<JetBxCollection>("preGtJets");
0083 produces<EtSumBxCollection>();
0084 produces<CaloSpareBxCollection>("HFRingSums");
0085 produces<CaloSpareBxCollection>("HFBitCounts");
0086
0087 EGammaToken_ = consumes<EGammaBxCollection>(ps.getParameter<edm::InputTag>("InputCollection"));
0088 RlxTauToken_ = consumes<TauBxCollection>(ps.getParameter<edm::InputTag>("InputRlxTauCollection"));
0089 IsoTauToken_ = consumes<TauBxCollection>(ps.getParameter<edm::InputTag>("InputIsoTauCollection"));
0090 JetToken_ = consumes<JetBxCollection>(ps.getParameter<edm::InputTag>("InputCollection"));
0091 preGtJetToken_ = consumes<JetBxCollection>(ps.getParameter<edm::InputTag>("InputPreGtJetCollection"));
0092 EtSumToken_ = consumes<EtSumBxCollection>(ps.getParameter<edm::InputTag>("InputCollection"));
0093 HfSumsToken_ = consumes<CaloSpareBxCollection>(ps.getParameter<edm::InputTag>("InputHFSumsCollection"));
0094 HfCountsToken_ = consumes<CaloSpareBxCollection>(ps.getParameter<edm::InputTag>("InputHFCountsCollection"));
0095 emScaleToken_ = esConsumes<L1CaloEtScale, L1EmEtScaleRcd>();
0096 jetScaleToken_ = esConsumes<L1CaloEtScale, L1JetEtScaleRcd>();
0097 htMissScaleToken_ = esConsumes<L1CaloEtScale, L1HtMissScaleRcd>();
0098 }
0099
0100 L1TPhysicalEtAdder::~L1TPhysicalEtAdder() {}
0101
0102
0103 void L1TPhysicalEtAdder::produce(edm::StreamID, edm::Event& iEvent, const edm::EventSetup& iSetup) const {
0104
0105 std::unique_ptr<EGammaBxCollection> new_egammas(new EGammaBxCollection);
0106 std::unique_ptr<TauBxCollection> new_rlxtaus(new TauBxCollection);
0107 std::unique_ptr<TauBxCollection> new_isotaus(new TauBxCollection);
0108 std::unique_ptr<JetBxCollection> new_jets(new JetBxCollection);
0109 std::unique_ptr<JetBxCollection> new_preGtJets(new JetBxCollection);
0110 std::unique_ptr<EtSumBxCollection> new_etsums(new EtSumBxCollection);
0111 std::unique_ptr<CaloSpareBxCollection> new_hfsums(new CaloSpareBxCollection);
0112 std::unique_ptr<CaloSpareBxCollection> new_hfcounts(new CaloSpareBxCollection);
0113
0114 edm::Handle<EGammaBxCollection> old_egammas;
0115 edm::Handle<TauBxCollection> old_rlxtaus;
0116 edm::Handle<TauBxCollection> old_isotaus;
0117 edm::Handle<JetBxCollection> old_jets;
0118 edm::Handle<JetBxCollection> old_preGtJets;
0119 edm::Handle<EtSumBxCollection> old_etsums;
0120 edm::Handle<CaloSpareBxCollection> old_hfsums;
0121 edm::Handle<CaloSpareBxCollection> old_hfcounts;
0122
0123 iEvent.getByToken(EGammaToken_, old_egammas);
0124 iEvent.getByToken(RlxTauToken_, old_rlxtaus);
0125 iEvent.getByToken(IsoTauToken_, old_isotaus);
0126 iEvent.getByToken(JetToken_, old_jets);
0127 iEvent.getByToken(preGtJetToken_, old_preGtJets);
0128 iEvent.getByToken(EtSumToken_, old_etsums);
0129 iEvent.getByToken(HfSumsToken_, old_hfsums);
0130 iEvent.getByToken(HfCountsToken_, old_hfcounts);
0131
0132
0133 edm::ESHandle<L1CaloEtScale> emScale = iSetup.getHandle(emScaleToken_);
0134
0135 edm::ESHandle<L1CaloEtScale> jetScale = iSetup.getHandle(jetScaleToken_);
0136
0137 edm::ESHandle<L1CaloEtScale> htMissScale = iSetup.getHandle(htMissScaleToken_);
0138
0139 int firstBX = old_egammas->getFirstBX();
0140 int lastBX = old_egammas->getLastBX();
0141
0142 new_egammas->setBXRange(firstBX, lastBX);
0143 new_rlxtaus->setBXRange(firstBX, lastBX);
0144 new_isotaus->setBXRange(firstBX, lastBX);
0145 new_jets->setBXRange(firstBX, lastBX);
0146 new_preGtJets->setBXRange(firstBX, lastBX);
0147 new_etsums->setBXRange(firstBX, lastBX);
0148 new_hfsums->setBXRange(firstBX, lastBX);
0149 new_hfcounts->setBXRange(firstBX, lastBX);
0150
0151 for (int bx = firstBX; bx <= lastBX; ++bx) {
0152 for (EGammaBxCollection::const_iterator itEGamma = old_egammas->begin(bx); itEGamma != old_egammas->end(bx);
0153 ++itEGamma) {
0154
0155 const double et = emScale->et(itEGamma->hwPt());
0156 const double eta = getPhysicalEta(itEGamma->hwEta());
0157 const double phi = getPhysicalPhi(itEGamma->hwPhi());
0158 math::PtEtaPhiMLorentzVector p4(et, eta, phi, 0);
0159
0160 EGamma eg(*&p4, itEGamma->hwPt(), itEGamma->hwEta(), itEGamma->hwPhi(), itEGamma->hwQual(), itEGamma->hwIso());
0161 new_egammas->push_back(bx, *&eg);
0162 }
0163
0164 for (TauBxCollection::const_iterator itTau = old_rlxtaus->begin(bx); itTau != old_rlxtaus->end(bx); ++itTau) {
0165
0166
0167
0168
0169
0170
0171
0172
0173 const double et = jetScale->et(itTau->hwPt());
0174
0175 const double eta = getPhysicalEta(itTau->hwEta());
0176 const double phi = getPhysicalPhi(itTau->hwPhi());
0177 math::PtEtaPhiMLorentzVector p4(et, eta, phi, 0);
0178
0179 Tau tau(*&p4, itTau->hwPt(), itTau->hwEta(), itTau->hwPhi(), itTau->hwQual(), itTau->hwIso());
0180 new_rlxtaus->push_back(bx, *&tau);
0181 }
0182
0183 for (TauBxCollection::const_iterator itTau = old_isotaus->begin(bx); itTau != old_isotaus->end(bx); ++itTau) {
0184
0185
0186
0187
0188
0189
0190
0191
0192 const double et = jetScale->et(itTau->hwPt());
0193
0194 const double eta = getPhysicalEta(itTau->hwEta());
0195 const double phi = getPhysicalPhi(itTau->hwPhi());
0196 math::PtEtaPhiMLorentzVector p4(et, eta, phi, 0);
0197
0198 Tau tau(*&p4, itTau->hwPt(), itTau->hwEta(), itTau->hwPhi(), itTau->hwQual(), itTau->hwIso());
0199 new_isotaus->push_back(bx, *&tau);
0200 }
0201
0202 for (JetBxCollection::const_iterator itJet = old_jets->begin(bx); itJet != old_jets->end(bx); ++itJet) {
0203
0204
0205
0206
0207
0208
0209
0210
0211 const double et = jetScale->et(itJet->hwPt());
0212
0213 const bool forward = ((itJet->hwQual() & 0x2) != 0);
0214 const double eta = getPhysicalEta(itJet->hwEta(), forward);
0215 const double phi = getPhysicalPhi(itJet->hwPhi());
0216 math::PtEtaPhiMLorentzVector p4(et, eta, phi, 0);
0217
0218 Jet jet(*&p4, itJet->hwPt(), itJet->hwEta(), itJet->hwPhi(), itJet->hwQual());
0219 new_jets->push_back(bx, *&jet);
0220 }
0221
0222 for (JetBxCollection::const_iterator itJet = old_preGtJets->begin(bx); itJet != old_preGtJets->end(bx); ++itJet) {
0223
0224
0225
0226
0227
0228 const double et = itJet->hwPt() * emScale->linearLsb();
0229
0230
0231
0232
0233 const bool forward = ((itJet->hwQual() & 0x2) != 0);
0234 const double eta = getPhysicalEta(itJet->hwEta(), forward);
0235 const double phi = getPhysicalPhi(itJet->hwPhi());
0236 math::PtEtaPhiMLorentzVector p4(et, eta, phi, 0);
0237
0238 Jet jet(*&p4, itJet->hwPt(), itJet->hwEta(), itJet->hwPhi(), itJet->hwQual());
0239 new_preGtJets->push_back(bx, *&jet);
0240 }
0241
0242 for (EtSumBxCollection::const_iterator itEtSum = old_etsums->begin(bx); itEtSum != old_etsums->end(bx); ++itEtSum) {
0243 double et = itEtSum->hwPt() * emScale->linearLsb();
0244
0245
0246 const EtSum::EtSumType sumType = itEtSum->getType();
0247
0248 const double eta = getPhysicalEta(itEtSum->hwEta());
0249 double phi = getPhysicalPhi(itEtSum->hwPhi());
0250 if (sumType == EtSum::EtSumType::kMissingHt) {
0251 et = htMissScale->et(itEtSum->hwPt());
0252 double regionPhiWidth = 2. * 3.1415927 / L1CaloRegionDetId::N_PHI;
0253 phi = phi + (regionPhiWidth / 2.);
0254 }
0255
0256 math::PtEtaPhiMLorentzVector p4(et, eta, phi, 0);
0257
0258 EtSum eg(*&p4, sumType, itEtSum->hwPt(), itEtSum->hwEta(), itEtSum->hwPhi(), itEtSum->hwQual());
0259 new_etsums->push_back(bx, *&eg);
0260 }
0261
0262 for (CaloSpareBxCollection::const_iterator itCaloSpare = old_hfsums->begin(bx); itCaloSpare != old_hfsums->end(bx);
0263 ++itCaloSpare) {
0264
0265
0266 new_hfsums->push_back(bx, *itCaloSpare);
0267 }
0268
0269 for (CaloSpareBxCollection::const_iterator itCaloSpare = old_hfcounts->begin(bx);
0270 itCaloSpare != old_hfcounts->end(bx);
0271 ++itCaloSpare) {
0272
0273
0274 new_hfcounts->push_back(bx, *itCaloSpare);
0275 }
0276 }
0277
0278 iEvent.put(std::move(new_egammas));
0279 iEvent.put(std::move(new_rlxtaus), "rlxTaus");
0280 iEvent.put(std::move(new_isotaus), "isoTaus");
0281 iEvent.put(std::move(new_jets));
0282 iEvent.put(std::move(new_preGtJets), "preGtJets");
0283 iEvent.put(std::move(new_etsums));
0284 iEvent.put(std::move(new_hfsums), "HFRingSums");
0285 iEvent.put(std::move(new_hfcounts), "HFBitCounts");
0286 }
0287
0288
0289 void L1TPhysicalEtAdder::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0290
0291
0292 edm::ParameterSetDescription desc;
0293 desc.setUnknown();
0294 descriptions.addDefault(desc);
0295 }
0296
0297
0298 DEFINE_FWK_MODULE(L1TPhysicalEtAdder);