File indexing completed on 2023-10-25 09:54:47
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021 #include <memory>
0022
0023
0024 #include "FWCore/Framework/interface/Frameworkfwd.h"
0025 #include "FWCore/Framework/interface/one/EDAnalyzer.h"
0026
0027 #include "FWCore/Framework/interface/Event.h"
0028 #include "FWCore/Framework/interface/MakerMacros.h"
0029
0030 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0031
0032 #include "DataFormats/L1TCalorimeter/interface/CaloTower.h"
0033 #include "DataFormats/L1CaloTrigger/interface/L1CaloCollections.h"
0034 #include "DataFormats/L1CaloTrigger/interface/L1CaloRegion.h"
0035
0036 #include "L1Trigger/L1TCaloLayer1/src/UCTGeometry.hh"
0037
0038 #include "L1Trigger/L1TCaloLayer1/src/UCTLogging.hh"
0039
0040 using namespace l1t;
0041
0042
0043
0044
0045
0046 class L1TCaloLayer1Validator : public edm::one::EDAnalyzer<> {
0047 public:
0048 explicit L1TCaloLayer1Validator(const edm::ParameterSet&);
0049 ~L1TCaloLayer1Validator() override;
0050
0051 static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0052
0053 private:
0054 void beginJob() override;
0055 void analyze(const edm::Event&, const edm::EventSetup&) override;
0056 void endJob() override;
0057
0058
0059
0060
0061
0062
0063
0064
0065 edm::EDGetTokenT<CaloTowerBxCollection> testTowerToken;
0066 edm::EDGetTokenT<CaloTowerBxCollection> emulTowerToken;
0067
0068 edm::EDGetTokenT<L1CaloRegionCollection> testRegionToken;
0069 edm::EDGetTokenT<L1CaloRegionCollection> emulRegionToken;
0070
0071 uint32_t eventCount;
0072 uint32_t badEventCount;
0073 uint32_t towerCount;
0074 uint32_t badTowerCount;
0075 uint32_t nonZeroTowerCount;
0076 uint32_t badNonZeroTowerCount;
0077 uint32_t regionCount;
0078 uint32_t badRegionCount;
0079 uint32_t nonZeroRegionCount;
0080 uint32_t badNonZeroRegionCount;
0081
0082 uint32_t ngRegion[22];
0083 uint32_t nbRegion[22];
0084 uint32_t zgRegion[22];
0085 uint32_t zbRegion[22];
0086
0087 uint32_t ngCard[18];
0088 uint32_t nbCard[18];
0089 uint32_t zgCard[18];
0090 uint32_t zbCard[18];
0091
0092 uint32_t tLrEmulTotET;
0093 uint32_t tErEmulTotET;
0094 uint32_t tGrEmulTotET;
0095
0096 uint32_t tLeTotET;
0097 uint32_t tEeTotET;
0098 uint32_t tGeTotET;
0099
0100 bool validateTowers;
0101 bool validateRegions;
0102
0103 bool verbose;
0104 };
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117 L1TCaloLayer1Validator::L1TCaloLayer1Validator(const edm::ParameterSet& iConfig)
0118 : testTowerToken(consumes<CaloTowerBxCollection>(iConfig.getParameter<edm::InputTag>("testTowerToken"))),
0119 emulTowerToken(consumes<CaloTowerBxCollection>(iConfig.getParameter<edm::InputTag>("emulTowerToken"))),
0120 testRegionToken(consumes<L1CaloRegionCollection>(iConfig.getParameter<edm::InputTag>("testRegionToken"))),
0121 emulRegionToken(consumes<L1CaloRegionCollection>(iConfig.getParameter<edm::InputTag>("emulRegionToken"))),
0122 eventCount(0),
0123 badEventCount(0),
0124 towerCount(0),
0125 badTowerCount(0),
0126 nonZeroTowerCount(0),
0127 badNonZeroTowerCount(0),
0128 regionCount(0),
0129 badRegionCount(0),
0130 nonZeroRegionCount(0),
0131 badNonZeroRegionCount(0),
0132 tLrEmulTotET(0),
0133 tErEmulTotET(0),
0134 tGrEmulTotET(0),
0135 tLeTotET(0),
0136 tEeTotET(0),
0137 tGeTotET(0),
0138 validateTowers(iConfig.getParameter<bool>("validateTowers")),
0139 validateRegions(iConfig.getParameter<bool>("validateRegions")),
0140 verbose(iConfig.getParameter<bool>("verbose")) {
0141 for (uint32_t r = 0; r < 22; r++)
0142 ngRegion[r] = nbRegion[r] = zgRegion[r] = zbRegion[r] = 0;
0143 for (uint32_t c = 0; c < 18; c++)
0144 ngCard[c] = nbCard[c] = zgCard[c] = zbCard[c] = 0;
0145 }
0146
0147 L1TCaloLayer1Validator::~L1TCaloLayer1Validator() {}
0148
0149
0150
0151
0152
0153
0154 void L1TCaloLayer1Validator::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup) {
0155 using namespace edm;
0156 bool badEvent = false;
0157 int theBX = 0;
0158
0159
0160
0161
0162 edm::Handle<CaloTowerBxCollection> emulTowers;
0163 iEvent.getByToken(emulTowerToken, emulTowers);
0164 edm::Handle<L1CaloRegionCollection> testRegions;
0165 iEvent.getByToken(testRegionToken, testRegions);
0166 edm::Handle<L1CaloRegionCollection> emulRegions;
0167 iEvent.getByToken(emulRegionToken, emulRegions);
0168
0169 if (validateTowers) {
0170
0171 edm::Handle<CaloTowerBxCollection> testTowers;
0172 iEvent.getByToken(testTowerToken, testTowers);
0173 for (std::vector<CaloTower>::const_iterator testTower = testTowers->begin(theBX);
0174 testTower != testTowers->end(theBX);
0175 ++testTower) {
0176 int test_iEta = testTower->hwEta();
0177 int test_iPhi = testTower->hwPhi();
0178 int test_et = testTower->hwPt();
0179 int test_er = testTower->hwEtRatio();
0180 int test_fb = testTower->hwQual();
0181 for (std::vector<CaloTower>::const_iterator emulTower = emulTowers->begin(theBX);
0182 emulTower != emulTowers->end(theBX);
0183 ++emulTower) {
0184 int emul_iEta = emulTower->hwEta();
0185 int emul_iPhi = emulTower->hwPhi();
0186 int emul_et = emulTower->hwPt();
0187 int emul_er = emulTower->hwEtRatio();
0188 int emul_fb = emulTower->hwQual();
0189 bool success = true;
0190 if (test_iEta == emul_iEta && test_iPhi == emul_iPhi) {
0191 if (test_et != emul_et) {
0192 success = false;
0193 }
0194 if (test_er != emul_er) {
0195 success = false;
0196 }
0197 if (test_fb != emul_fb) {
0198 success = false;
0199 }
0200 if (!success) {
0201 if (test_et != emul_et) {
0202 if (verbose)
0203 LOG_ERROR << "ET ";
0204 }
0205 if (test_er != emul_er) {
0206 if (verbose)
0207 LOG_ERROR << "ER ";
0208 }
0209 if (test_fb != emul_fb) {
0210 if (verbose)
0211 LOG_ERROR << "FB ";
0212 }
0213 if (verbose)
0214 LOG_ERROR << "Checks failed for tower (" << std::dec << test_iEta << ", " << test_iPhi << ") : ("
0215 << test_et << ", " << test_er << ", " << test_fb << ") != (" << emul_et << ", " << emul_er
0216 << ", " << emul_fb << ")" << std::endl;
0217 badEvent = true;
0218 badTowerCount++;
0219 if (test_et > 0)
0220 badNonZeroTowerCount++;
0221 }
0222 towerCount++;
0223 if (test_et > 0)
0224 nonZeroTowerCount++;
0225 }
0226 if (!success && test_et == emul_et && test_iPhi == emul_iPhi) {
0227 if (verbose)
0228 LOG_ERROR << "Incidental match for tower (" << std::dec << test_iEta << ", " << test_iPhi << ") : ("
0229 << test_et << ", " << test_er << ", " << test_fb << ") != (" << emul_iEta << "," << emul_iPhi
0230 << ") :(" << emul_et << ", " << emul_er << ", " << emul_fb << ")" << std::endl;
0231 }
0232 }
0233 }
0234 }
0235
0236
0237
0238 if (validateRegions) {
0239 UCTGeometry g;
0240 uint32_t testRegionTotET = 0;
0241 uint32_t emulRegionTotET = 0;
0242 for (std::vector<L1CaloRegion>::const_iterator testRegion = testRegions->begin(); testRegion != testRegions->end();
0243 ++testRegion) {
0244
0245 uint32_t test_et = testRegion->et();
0246 testRegionTotET += test_et;
0247 uint32_t test_rEta = testRegion->id().ieta();
0248 uint32_t test_rPhi = testRegion->id().iphi();
0249
0250
0251 bool test_negativeEta = false;
0252 int test_cEta = (test_rEta - 11) * 4 + 1;
0253 if (test_rEta < 11) {
0254 test_negativeEta = true;
0255 test_cEta = -((10 - test_rEta) * 4 + 1);
0256 }
0257 int test_cPhi = test_rPhi * 4 + 1;
0258 uint32_t test_crate = g.getCrate(test_cEta, test_cPhi);
0259 uint32_t test_card = g.getCard(test_cEta, test_cPhi);
0260 uint32_t test_region = g.getRegion(test_cEta, test_cPhi);
0261 for (std::vector<L1CaloRegion>::const_iterator emulRegion = emulRegions->begin();
0262 emulRegion != emulRegions->end();
0263 ++emulRegion) {
0264
0265 uint32_t emul_et = emulRegion->et();
0266 if (testRegion == testRegions->begin())
0267 emulRegionTotET += emul_et;
0268 uint32_t emul_rEta = emulRegion->id().ieta();
0269 uint32_t emul_rPhi = emulRegion->id().iphi();
0270
0271
0272 bool emul_negativeEta = false;
0273 int emul_cEta = (emul_rEta - 11) * 4 + 1;
0274 if (emul_rEta < 11) {
0275 emul_negativeEta = true;
0276 emul_cEta = -((10 - emul_rEta) * 4 + 1);
0277 }
0278 int emul_cPhi = emul_rPhi * 4 + 1;
0279 uint32_t emul_crate = g.getCrate(emul_cEta, emul_cPhi);
0280 uint32_t emul_card = g.getCard(emul_cEta, emul_cPhi);
0281 uint32_t emul_region = g.getRegion(emul_cEta, emul_cPhi);
0282 bool success = true;
0283 if (test_rEta == emul_rEta && test_rPhi == emul_rPhi) {
0284 if (test_et != emul_et)
0285 success = false;
0286
0287
0288 if (!success) {
0289 if (verbose)
0290 LOG_ERROR << "Checks failed for region (" << std::dec << test_rEta << ", " << test_rPhi << ") ("
0291 << test_negativeEta << ", " << test_crate << ", " << test_card << ", " << test_region
0292 << ", "
0293
0294
0295 << test_et << ") != (" << emul_negativeEta << ", " << emul_crate << ", " << emul_card << ", "
0296 << emul_region
0297 << ", "
0298
0299
0300 << emul_et << ")" << std::endl;
0301 badEvent = true;
0302 badRegionCount++;
0303 if (test_et > 0) {
0304 badNonZeroRegionCount++;
0305 nbRegion[test_rEta]++;
0306 nbCard[test_rPhi]++;
0307 } else {
0308 zbRegion[test_rEta]++;
0309 zbCard[test_rPhi]++;
0310 }
0311 } else {
0312 if (test_et > 0) {
0313 ngRegion[test_rEta]++;
0314 ngCard[test_rPhi]++;
0315 if (verbose)
0316 LOG_ERROR << "Checks passed for region (" << std::dec << test_rEta << ", " << test_rPhi << ") ("
0317 << test_negativeEta << ", " << test_crate << ", " << test_card << ", " << test_region
0318 << ", "
0319
0320
0321 << test_et << ") == (" << emul_negativeEta << ", " << emul_crate << ", " << emul_card << ", "
0322 << emul_region
0323 << ", "
0324
0325
0326 << emul_et << ")" << std::endl;
0327 } else {
0328 zgRegion[test_rEta]++;
0329 zgCard[test_rPhi]++;
0330 }
0331 }
0332 regionCount++;
0333 if (test_et > 0)
0334 nonZeroRegionCount++;
0335 }
0336 if (!success && test_et == emul_et) {
0337 if (verbose)
0338 LOG_ERROR << "Incidental match for region (" << std::dec << test_rEta << ", " << test_rPhi
0339 << ", "
0340
0341
0342 << test_et << ") != (" << emul_rEta << ", " << emul_rPhi
0343 << ", "
0344
0345
0346 << emul_et << ")" << std::endl;
0347 }
0348 }
0349 }
0350 uint32_t emulTowerTotET = 0;
0351 for (std::vector<CaloTower>::const_iterator emulTower = emulTowers->begin(theBX);
0352 emulTower != emulTowers->end(theBX);
0353 ++emulTower) {
0354 int twr_et = emulTower->hwPt();
0355 int twr_cEta = emulTower->hwEta();
0356 int twr_cPhi = emulTower->hwPhi();
0357 uint32_t twr_region = g.getRegion(twr_cEta, twr_cPhi);
0358 uint32_t twr_gEta = 10 - twr_region;
0359 if (twr_cEta > 0)
0360 twr_gEta = twr_region + 11;
0361 uint32_t twr_gPhi = g.getUCTRegionPhiIndex(twr_cPhi);
0362 if (badEvent && twr_et > 0) {
0363 if (verbose)
0364 LOG_ERROR << "Non-zero tower in region (" << twr_gEta << ", " << twr_gPhi << ") "
0365 << "(cEta, cPhi, et) = (" << twr_cEta << ", " << twr_cPhi << ", " << twr_et << ")" << std::endl;
0366 }
0367 if (std::abs(twr_cEta) <= 28)
0368 emulTowerTotET += twr_et;
0369 }
0370
0371 if (emulTowerTotET < emulRegionTotET)
0372 tLrEmulTotET++;
0373 else if (emulTowerTotET > emulRegionTotET)
0374 tGrEmulTotET++;
0375 else
0376 tErEmulTotET++;
0377
0378 if (testRegionTotET < emulRegionTotET)
0379 tLeTotET++;
0380 else if (testRegionTotET > emulRegionTotET)
0381 tGeTotET++;
0382 else
0383 tEeTotET++;
0384 }
0385
0386
0387
0388 if (badEvent)
0389 badEventCount++;
0390 eventCount++;
0391 }
0392
0393
0394 void L1TCaloLayer1Validator::beginJob() {}
0395
0396
0397 void L1TCaloLayer1Validator::endJob() {
0398 if (validateTowers)
0399 LOG_ERROR << "L1TCaloLayer1Validator: Summary is Non-Zero Bad Tower / Bad Tower / Event Count = ("
0400 << badNonZeroTowerCount << " of " << nonZeroTowerCount << ") / (" << badTowerCount << " of " << towerCount
0401 << ") / (" << badEventCount << " of " << eventCount << ")" << std::endl;
0402 if (validateRegions) {
0403 LOG_ERROR << "L1TCaloLayer1Validator: Summary is Non-Zero Bad Region / Bad Region / Event Count = ("
0404 << badNonZeroRegionCount << " of " << nonZeroRegionCount << ") / (" << badRegionCount << " of "
0405 << regionCount << ") / (" << badEventCount << " of " << eventCount << ")" << std::endl;
0406 LOG_ERROR << "L1TCaloLayer1Validator reTa, non-zero-good / non-zero-bad / zero-good / zero-bad region[rEta] = "
0407 << std::endl;
0408 for (uint32_t r = 0; r < 22; r++)
0409 LOG_ERROR << r << ", " << ngRegion[r] << " / " << nbRegion[r] << " / " << zgRegion[r] << " / " << zbRegion[r]
0410 << std::endl;
0411 LOG_ERROR << "L1TCaloLayer1Validator rPhi, non-zero-good / non-zero-bad / zero-good / zero-bad region[rPhi] = "
0412 << std::endl;
0413 for (uint32_t r = 0; r < 18; r++)
0414 LOG_ERROR << r << ", " << ngCard[r] << " / " << nbCard[r] << " / " << zgCard[r] << " / " << zbCard[r]
0415 << std::endl;
0416 LOG_ERROR << "L1TCaloLayer1Validator : Total ET emulator tower vs region; less / equal / greater counts: "
0417 << tLrEmulTotET << " / " << tErEmulTotET << " / " << tGrEmulTotET << std::endl;
0418 LOG_ERROR << "L1TCaloLayer1Validator : Total ET region test vs emulator; less / equal / greater counts: "
0419 << tLeTotET << " / " << tEeTotET << " / " << tGeTotET << std::endl;
0420 }
0421 }
0422
0423
0424
0425
0426
0427
0428
0429
0430
0431
0432
0433
0434
0435
0436
0437
0438
0439
0440
0441
0442
0443
0444
0445
0446
0447
0448
0449
0450
0451
0452
0453
0454
0455
0456 void L1TCaloLayer1Validator::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0457
0458
0459 edm::ParameterSetDescription desc;
0460 desc.setUnknown();
0461 descriptions.addDefault(desc);
0462 }
0463
0464
0465 DEFINE_FWK_MODULE(L1TCaloLayer1Validator);