From c0ddb3241e4d375d17aec6b9d96d6d3c6615a1c1 Mon Sep 17 00:00:00 2001 From: Benjamin Huber Date: Thu, 19 Sep 2024 17:39:14 +0200 Subject: [PATCH 1/6] Add qualityScore sum cut --- L1Trigger/Phase2L1GT/README.md | 9 +++++++ .../plugins/L1GTDoubleObjectCond.cc | 21 ++++++++++++++++ .../Phase2L1GT/plugins/L1GTQuadObjectCond.cc | 24 +++++++++++++++++++ .../plugins/L1GTTripleObjectCond.cc | 23 ++++++++++++++++++ 4 files changed, 77 insertions(+) diff --git a/L1Trigger/Phase2L1GT/README.md b/L1Trigger/Phase2L1GT/README.md index f32fa240a0ac6..f1d460ba65d37 100644 --- a/L1Trigger/Phase2L1GT/README.md +++ b/L1Trigger/Phase2L1GT/README.md @@ -170,6 +170,15 @@ The following 3-body correlational cuts are available: | `minTransMass` | $\frac{m_{T,1,2}^2}{2} + \frac{m_{T,1,3}^2}{2} + \frac{m_{T,2,3}^2}{2} > \frac{X^2}{2}$ | `cms.double` | `floor(X**2 * LUT_Scale / (2 * pT_lsb**2))` | | `maxTransMass` | $\frac{m_{T,1,2}^2}{2} + \frac{m_{T,1,3}^2}{2} + \frac{m_{T,2,3}^2}{2} < \frac{X^2}{2}$ | `cms.double` | `ceil(X**2 * LUT_Scale / (2 * pT_lsb**2))` | +The following N-body correlational cuts are available (N = 2 for DoubleObjectCondition, N = 3 for TripleObjectCondition and N = 4 for the QuadObjectCondition): + +| Name | Expression | Datatype | Hardware conversion | +|:-----|:----------:|:-------------:|:--------:| +| `minQualityScoreSum`* | $\sum^N_{i=1} \mathrm{qualityScore} > X$ | `cms.unit32` | `X` | +| `maxQualityScoreSum`* | $\sum^N_{i=1} \mathrm{qualityScore} < X$ | `cms.unit32` | `X` | + +\*: For N=4 the 4 objects should be from the same input collection to guarantee timing closure of the FPGA firmware. + ## Algorithms Conditions are combined to algorithms via the [`L1GTAlgoBlockProducer`](plugins/L1GTAlgoBlockProducer.cc). To configure this behavior, a `cms.PSet` algorithm configuration should be added to the `algorithms` `cms.VPset`, included via: diff --git a/L1Trigger/Phase2L1GT/plugins/L1GTDoubleObjectCond.cc b/L1Trigger/Phase2L1GT/plugins/L1GTDoubleObjectCond.cc index d759334aa4e09..009f4322b1adf 100644 --- a/L1Trigger/Phase2L1GT/plugins/L1GTDoubleObjectCond.cc +++ b/L1Trigger/Phase2L1GT/plugins/L1GTDoubleObjectCond.cc @@ -18,6 +18,7 @@ #include "L1GTSingleCollectionCut.h" #include "L1GTCorrelationalCut.h" #include "L1GTSingleInOutLUT.h" +#include "L1GTOptionalParam.h" #include #include @@ -48,6 +49,9 @@ class L1GTDoubleObjectCond : public edm::global::EDFilter<> { const L1GTCorrelationalCut deltaCuts_; + const std::optional minQualityScoreSum_; + const std::optional maxQualityScoreSum_; + const edm::EDGetTokenT token1_; const edm::EDGetTokenT token2_; const edm::EDGetTokenT primVertToken_; @@ -60,6 +64,8 @@ L1GTDoubleObjectCond::L1GTDoubleObjectCond(const edm::ParameterSet& config) enable_sanity_checks_(config.getUntrackedParameter("sanity_checks")), inv_mass_checks_(config.getUntrackedParameter("inv_mass_checks")), deltaCuts_(config, config, scales_, enable_sanity_checks_, inv_mass_checks_), + minQualityScoreSum_(getOptionalParam("minQualityScoreSum", config)), + maxQualityScoreSum_(getOptionalParam("maxQualityScoreSum", config)), token1_(consumes(collection1Cuts_.tag())), token2_(collection1Cuts_.tag() == collection2Cuts_.tag() ? token1_ @@ -74,6 +80,10 @@ L1GTDoubleObjectCond::L1GTDoubleObjectCond(const edm::ParameterSet& config) if (inv_mass_checks_) { produces(); } + + if ((minQualityScoreSum_ || maxQualityScoreSum_) && !(collection1Cuts_.tag() == collection2Cuts_.tag())) { + throw cms::Exception("Configuration") << "A qualityScore sum can only be calculated within one collection."; + } } void L1GTDoubleObjectCond::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { @@ -95,6 +105,9 @@ void L1GTDoubleObjectCond::fillDescriptions(edm::ConfigurationDescriptions& desc L1GTCorrelationalCut::fillPSetDescription(desc); L1GTCorrelationalCut::fillLUTDescriptions(desc); + desc.addOptional("minQualityScoreSum"); + desc.addOptional("maxQualityScoreSum"); + edm::ParameterSetDescription scalesDesc; L1GTScales::fillPSetDescription(scalesDesc); desc.add("scales", scalesDesc); @@ -129,6 +142,14 @@ bool L1GTDoubleObjectCond::filter(edm::StreamID, edm::Event& event, const edm::E pass &= collection2Cuts_.checkPrimaryVertices(col2->at(idx2), *primVertCol); pass &= deltaCuts_.checkObjects(col1->at(idx1), col2->at(idx2), massErrors); + if (minQualityScoreSum_ || maxQualityScoreSum_) { + unsigned int qualityScoreSum = + col1->at(idx1).hwQualityScore().to_uint() + col2->at(idx2).hwQualityScore().to_uint(); + + pass &= minQualityScoreSum_ ? qualityScoreSum > minQualityScoreSum_ : true; + pass &= maxQualityScoreSum_ ? qualityScoreSum < maxQualityScoreSum_ : true; + } + condition_result |= pass; if (pass) { diff --git a/L1Trigger/Phase2L1GT/plugins/L1GTQuadObjectCond.cc b/L1Trigger/Phase2L1GT/plugins/L1GTQuadObjectCond.cc index 8aaa210c3540d..3160004a5e301 100644 --- a/L1Trigger/Phase2L1GT/plugins/L1GTQuadObjectCond.cc +++ b/L1Trigger/Phase2L1GT/plugins/L1GTQuadObjectCond.cc @@ -15,6 +15,7 @@ #include "L1GTCorrelationalCut.h" #include "L1GT3BodyCut.h" #include "L1GTSingleInOutLUT.h" +#include "L1GTOptionalParam.h" #include #include @@ -57,6 +58,9 @@ class L1GTQuadObjectCond : public edm::global::EDFilter<> { const L1GT3BodyCut correl134Cuts_; const L1GT3BodyCut correl234Cuts_; + const std::optional minQualityScoreSum_; + const std::optional maxQualityScoreSum_; + const edm::EDGetTokenT token1_; const edm::EDGetTokenT token2_; const edm::EDGetTokenT token3_; @@ -88,6 +92,8 @@ L1GTQuadObjectCond::L1GTQuadObjectCond(const edm::ParameterSet& config) correl124Cuts_(config.getParameter("correl124"), config, scales_, inv_mass_checks_), correl134Cuts_(config.getParameter("correl134"), config, scales_, inv_mass_checks_), correl234Cuts_(config.getParameter("correl234"), config, scales_, inv_mass_checks_), + minQualityScoreSum_(getOptionalParam("minQualityScoreSum", config)), + maxQualityScoreSum_(getOptionalParam("maxQualityScoreSum", config)), token1_(consumes(collection1Cuts_.tag())), token2_(collection1Cuts_.tag() == collection2Cuts_.tag() ? token1_ @@ -123,6 +129,12 @@ L1GTQuadObjectCond::L1GTQuadObjectCond(const edm::ParameterSet& config) if (inv_mass_checks_) { produces(); } + + if ((minQualityScoreSum_ || maxQualityScoreSum_) && + !(collection1Cuts_.tag() == collection2Cuts_.tag() && collection2Cuts_.tag() == collection3Cuts_.tag() && + collection3Cuts_.tag() == collection4Cuts_.tag())) { + throw cms::Exception("Configuration") << "A qualityScore sum can only be calculated within one collection."; + } } void L1GTQuadObjectCond::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { @@ -193,6 +205,9 @@ void L1GTQuadObjectCond::fillDescriptions(edm::ConfigurationDescriptions& descri L1GT3BodyCut::fillPSetDescription(correl234Desc); desc.add("correl234", correl234Desc); + desc.addOptional("minQualityScoreSum"); + desc.addOptional("maxQualityScoreSum"); + L1GTCorrelationalCut::fillLUTDescriptions(desc); descriptions.addWithDefaultLabel(desc); @@ -267,6 +282,15 @@ bool L1GTQuadObjectCond::filter(edm::StreamID, edm::Event& event, const edm::Eve pass &= correl134Cuts_.checkObjects(col1->at(idx1), col3->at(idx3), col4->at(idx4), massErrors); pass &= correl234Cuts_.checkObjects(col2->at(idx2), col3->at(idx3), col4->at(idx4), massErrors); + if (minQualityScoreSum_ || maxQualityScoreSum_) { + unsigned int qualityScoreSum = + col1->at(idx1).hwQualityScore().to_uint() + col2->at(idx2).hwQualityScore().to_uint() + + col3->at(idx3).hwQualityScore().to_uint() + col4->at(idx4).hwQualityScore().to_uint(); + + pass &= minQualityScoreSum_ ? qualityScoreSum > minQualityScoreSum_ : true; + pass &= maxQualityScoreSum_ ? qualityScoreSum < maxQualityScoreSum_ : true; + } + condition_result |= pass; if (pass) { diff --git a/L1Trigger/Phase2L1GT/plugins/L1GTTripleObjectCond.cc b/L1Trigger/Phase2L1GT/plugins/L1GTTripleObjectCond.cc index 24872e47d6a21..f7d97f0f3ff30 100644 --- a/L1Trigger/Phase2L1GT/plugins/L1GTTripleObjectCond.cc +++ b/L1Trigger/Phase2L1GT/plugins/L1GTTripleObjectCond.cc @@ -16,6 +16,7 @@ #include "L1GTCorrelationalCut.h" #include "L1GT3BodyCut.h" #include "L1GTSingleInOutLUT.h" +#include "L1GTOptionalParam.h" #include @@ -48,6 +49,9 @@ class L1GTTripleObjectCond : public edm::global::EDFilter<> { const L1GT3BodyCut correl123Cuts_; + const std::optional minQualityScoreSum_; + const std::optional maxQualityScoreSum_; + const edm::EDGetTokenT token1_; const edm::EDGetTokenT token2_; const edm::EDGetTokenT token3_; @@ -68,6 +72,8 @@ L1GTTripleObjectCond::L1GTTripleObjectCond(const edm::ParameterSet& config) correl23Cuts_( config.getParameter("correl23"), config, scales_, enable_sanity_checks_, inv_mass_checks_), correl123Cuts_(config, config, scales_, inv_mass_checks_), + minQualityScoreSum_(getOptionalParam("minQualityScoreSum", config)), + maxQualityScoreSum_(getOptionalParam("maxQualityScoreSum", config)), token1_(consumes(collection1Cuts_.tag())), token2_(collection1Cuts_.tag() == collection2Cuts_.tag() ? token1_ @@ -91,6 +97,11 @@ L1GTTripleObjectCond::L1GTTripleObjectCond(const edm::ParameterSet& config) if (inv_mass_checks_) { produces(); } + + if ((minQualityScoreSum_ || maxQualityScoreSum_) && + !(collection1Cuts_.tag() == collection2Cuts_.tag() && collection2Cuts_.tag() == collection3Cuts_.tag())) { + throw cms::Exception("Configuration") << "A qualityScore sum can only be calculated within one collection."; + } } void L1GTTripleObjectCond::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { @@ -131,6 +142,9 @@ void L1GTTripleObjectCond::fillDescriptions(edm::ConfigurationDescriptions& desc L1GT3BodyCut::fillPSetDescription(desc); + desc.addOptional("minQualityScoreSum"); + desc.addOptional("maxQualityScoreSum"); + L1GTCorrelationalCut::fillLUTDescriptions(desc); descriptions.addWithDefaultLabel(desc); @@ -181,6 +195,15 @@ bool L1GTTripleObjectCond::filter(edm::StreamID, edm::Event& event, const edm::E pass &= correl23Cuts_.checkObjects(col2->at(idx2), col3->at(idx3), massErrors); pass &= correl123Cuts_.checkObjects(col1->at(idx1), col2->at(idx2), col3->at(idx3), massErrors); + if (minQualityScoreSum_ || maxQualityScoreSum_) { + unsigned int qualityScoreSum = col1->at(idx1).hwQualityScore().to_uint() + + col2->at(idx2).hwQualityScore().to_uint() + + col3->at(idx3).hwQualityScore().to_uint(); + + pass &= minQualityScoreSum_ ? qualityScoreSum > minQualityScoreSum_ : true; + pass &= maxQualityScoreSum_ ? qualityScoreSum < maxQualityScoreSum_ : true; + } + condition_result |= pass; if (pass) { From a2f4025a7878daefb42cbd1ab533a770576377b1 Mon Sep 17 00:00:00 2001 From: Benjamin Huber Date: Tue, 4 Feb 2025 11:48:00 +0100 Subject: [PATCH 2/6] Fix test config --- .../Phase2L1GT/test/gt_firmware_evaluation.py | 4 +-- L1Trigger/Phase2L1GT/test/test_GT.py | 25 +++++++++++++------ 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/L1Trigger/Phase2L1GT/test/gt_firmware_evaluation.py b/L1Trigger/Phase2L1GT/test/gt_firmware_evaluation.py index f37d67bcdefe9..f2e3540629113 100644 --- a/L1Trigger/Phase2L1GT/test/gt_firmware_evaluation.py +++ b/L1Trigger/Phase2L1GT/test/gt_firmware_evaluation.py @@ -800,10 +800,10 @@ process.pl1tGTAlgoBlockProducer = cms.Path(process.l1tGTAlgoBlockProducer) if options.platform == "VU13P": - from L1Trigger.Phase2L1GT.l1tGTBoardWriterVU13P_cff import BoardDataInput, BoardDataOutputObjects + from L1Trigger.Phase2L1GT.l1tGTBoardWriterVU13P_cff import BoardDataInputVU13P as BoardDataInput, BoardDataOutputObjectsVU13P as BoardDataOutputObjects channels = cms.untracked.vuint32(46, 47) else: - from L1Trigger.Phase2L1GT.l1tGTBoardWriterVU9P_cff import BoardDataInput, BoardDataOutputObjects + from L1Trigger.Phase2L1GT.l1tGTBoardWriterVU9P_cff import BoardDataInputVU9P as BoardDataInput, BoardDataOutputObjectsVU9P as BoardDataOutputObjects channels = cms.untracked.vuint32(32, 33) diff --git a/L1Trigger/Phase2L1GT/test/test_GT.py b/L1Trigger/Phase2L1GT/test/test_GT.py index 85b402c536a1b..9aa3735cfcdbc 100644 --- a/L1Trigger/Phase2L1GT/test/test_GT.py +++ b/L1Trigger/Phase2L1GT/test/test_GT.py @@ -15,7 +15,7 @@ process.load('FWCore.MessageService.MessageLogger_cfi') process.load('Configuration.EventContent.EventContent_cff') process.load('SimGeneral.MixingModule.mixNoPU_cfi') -process.load('Configuration.Geometry.GeometryExtended2026D88Reco_cff') +process.load('Configuration.Geometry.GeometryExtendedRun4D110Reco_cff') process.load('Configuration.StandardSequences.MagneticField_cff') process.load('Configuration.StandardSequences.RawToDigi_cff') process.load('Configuration.StandardSequences.L1TrackTrigger_cff') @@ -25,13 +25,22 @@ process.source = cms.Source("PoolSource", fileNames=cms.untracked.vstring( -"/store/mc/Phase2Spring23DIGIRECOMiniAOD/TT_TuneCP5_14TeV-powheg-pythia8/GEN-SIM-DIGI-RAW-MINIAOD/PU200_L1TFix_Trk1GeV_131X_mcRun4_realistic_v9-v1/50000/005bc30b-cf79-4b3b-9ec1-a80e13072afd.root", - "/store/mc/Phase2Spring23DIGIRECOMiniAOD/TT_TuneCP5_14TeV-powheg-pythia8/GEN-SIM-DIGI-RAW-MINIAOD/PU200_L1TFix_Trk1GeV_131X_mcRun4_realistic_v9-v1/50000/009bd7ba-4295-46ef-a5bc-9eb3d2cd3cf7.root", - "/store/mc/Phase2Spring23DIGIRECOMiniAOD/TT_TuneCP5_14TeV-powheg-pythia8/GEN-SIM-DIGI-RAW-MINIAOD/PU200_L1TFix_Trk1GeV_131X_mcRun4_realistic_v9-v1/50000/017a99d2-4636-4584-97d0-d5499c3b453c.root", - "/store/mc/Phase2Spring23DIGIRECOMiniAOD/TT_TuneCP5_14TeV-powheg-pythia8/GEN-SIM-DIGI-RAW-MINIAOD/PU200_L1TFix_Trk1GeV_131X_mcRun4_realistic_v9-v1/50000/02020287-a16f-41db-8021-f9bcd272f6c9.root", - "/store/mc/Phase2Spring23DIGIRECOMiniAOD/TT_TuneCP5_14TeV-powheg-pythia8/GEN-SIM-DIGI-RAW-MINIAOD/PU200_L1TFix_Trk1GeV_131X_mcRun4_realistic_v9-v1/50000/02ca41cb-9638-4703-88b7-799c30fd2656.root", - "/store/mc/Phase2Spring23DIGIRECOMiniAOD/TT_TuneCP5_14TeV-powheg-pythia8/GEN-SIM-DIGI-RAW-MINIAOD/PU200_L1TFix_Trk1GeV_131X_mcRun4_realistic_v9-v1/50000/03171e00-8880-4c09-807a-0c1d5bac2797.root", - "/store/mc/Phase2Spring23DIGIRECOMiniAOD/TT_TuneCP5_14TeV-powheg-pythia8/GEN-SIM-DIGI-RAW-MINIAOD/PU200_L1TFix_Trk1GeV_131X_mcRun4_realistic_v9-v1/50000/04c836c3-66f4-44d5-a8fd-2faf5e4aa623.root", ), +"/store/mc/Phase2Spring24DIGIRECOMiniAOD/TT_TuneCP5_14TeV-powheg-pythia8/GEN-SIM-DIGI-RAW-MINIAOD/PU200_Trk1GeV_140X_mcRun4_realistic_v4-v2/130000/00c7f40e-b44e-4eea-a86b-def8f7d82b0e.root", +"/store/mc/Phase2Spring24DIGIRECOMiniAOD/TT_TuneCP5_14TeV-powheg-pythia8/GEN-SIM-DIGI-RAW-MINIAOD/PU200_Trk1GeV_140X_mcRun4_realistic_v4-v2/130000/02504470-83bc-49bf-adc4-b74306efbd0d.root", +"/store/mc/Phase2Spring24DIGIRECOMiniAOD/TT_TuneCP5_14TeV-powheg-pythia8/GEN-SIM-DIGI-RAW-MINIAOD/PU200_Trk1GeV_140X_mcRun4_realistic_v4-v2/130000/033d49d4-2f2d-44d4-9b27-9f3edd36cef3.root", +"/store/mc/Phase2Spring24DIGIRECOMiniAOD/TT_TuneCP5_14TeV-powheg-pythia8/GEN-SIM-DIGI-RAW-MINIAOD/PU200_Trk1GeV_140X_mcRun4_realistic_v4-v2/130000/039e692f-3423-4290-b9ce-5c55d00de1f1.root", +"/store/mc/Phase2Spring24DIGIRECOMiniAOD/TT_TuneCP5_14TeV-powheg-pythia8/GEN-SIM-DIGI-RAW-MINIAOD/PU200_Trk1GeV_140X_mcRun4_realistic_v4-v2/130000/04c30a1a-dc16-4711-bde4-bdbd1d919b8c.root", +"/store/mc/Phase2Spring24DIGIRECOMiniAOD/TT_TuneCP5_14TeV-powheg-pythia8/GEN-SIM-DIGI-RAW-MINIAOD/PU200_Trk1GeV_140X_mcRun4_realistic_v4-v2/130000/0e1e8cf8-d4ac-4402-aed3-dc3464acfaaf.root", +"/store/mc/Phase2Spring24DIGIRECOMiniAOD/TT_TuneCP5_14TeV-powheg-pythia8/GEN-SIM-DIGI-RAW-MINIAOD/PU200_Trk1GeV_140X_mcRun4_realistic_v4-v2/130000/0f1f8047-b0c9-4360-9b83-2f74b9ce4acf.root", +"/store/mc/Phase2Spring24DIGIRECOMiniAOD/TT_TuneCP5_14TeV-powheg-pythia8/GEN-SIM-DIGI-RAW-MINIAOD/PU200_Trk1GeV_140X_mcRun4_realistic_v4-v2/130000/11d0767a-8328-427b-ba64-87e63b2f76e7.root", +"/store/mc/Phase2Spring24DIGIRECOMiniAOD/TT_TuneCP5_14TeV-powheg-pythia8/GEN-SIM-DIGI-RAW-MINIAOD/PU200_Trk1GeV_140X_mcRun4_realistic_v4-v2/130000/16a7dad1-a5ab-41a3-8689-f2adae908172.root", +"/store/mc/Phase2Spring24DIGIRECOMiniAOD/TT_TuneCP5_14TeV-powheg-pythia8/GEN-SIM-DIGI-RAW-MINIAOD/PU200_Trk1GeV_140X_mcRun4_realistic_v4-v2/130000/19fb47dd-a610-49f9-9b8f-369c5519a6d4.root", +"/store/mc/Phase2Spring24DIGIRECOMiniAOD/TT_TuneCP5_14TeV-powheg-pythia8/GEN-SIM-DIGI-RAW-MINIAOD/PU200_Trk1GeV_140X_mcRun4_realistic_v4-v2/130000/1b03b34d-1807-4aaf-818a-0bf548de10ef.root", +"/store/mc/Phase2Spring24DIGIRECOMiniAOD/TT_TuneCP5_14TeV-powheg-pythia8/GEN-SIM-DIGI-RAW-MINIAOD/PU200_Trk1GeV_140X_mcRun4_realistic_v4-v2/130000/23c66f66-4daa-411b-958e-41ec2111d927.root", +"/store/mc/Phase2Spring24DIGIRECOMiniAOD/TT_TuneCP5_14TeV-powheg-pythia8/GEN-SIM-DIGI-RAW-MINIAOD/PU200_Trk1GeV_140X_mcRun4_realistic_v4-v2/130000/27437ae0-e9b6-40ee-9dca-a6bb81a2d133.root", +"/store/mc/Phase2Spring24DIGIRECOMiniAOD/TT_TuneCP5_14TeV-powheg-pythia8/GEN-SIM-DIGI-RAW-MINIAOD/PU200_Trk1GeV_140X_mcRun4_realistic_v4-v2/130000/27718d3a-01f6-41f1-a0f4-09f39e3461c5.root", +"/store/mc/Phase2Spring24DIGIRECOMiniAOD/TT_TuneCP5_14TeV-powheg-pythia8/GEN-SIM-DIGI-RAW-MINIAOD/PU200_Trk1GeV_140X_mcRun4_realistic_v4-v2/130000/2910f2cc-44a6-489d-b913-b98fe4577678.root", +), ) process.maxEvents = cms.untracked.PSet(input=cms.untracked.int32(94)) From b930e94da7f49c53c7c766e9a8b41ab2ff9114cc Mon Sep 17 00:00:00 2001 From: Benjamin Huber Date: Tue, 11 Feb 2025 13:39:08 +0100 Subject: [PATCH 3/6] EvaluationInterface: Remove unused functions --- .../plugins/L1GTEvaluationInterface.h | 122 ------------------ 1 file changed, 122 deletions(-) diff --git a/L1Trigger/Phase2L1GT/plugins/L1GTEvaluationInterface.h b/L1Trigger/Phase2L1GT/plugins/L1GTEvaluationInterface.h index a757fbc8c154e..1e216df463c39 100644 --- a/L1Trigger/Phase2L1GT/plugins/L1GTEvaluationInterface.h +++ b/L1Trigger/Phase2L1GT/plugins/L1GTEvaluationInterface.h @@ -57,10 +57,6 @@ namespace l1t { ap_uint pack() const override { return pack_common(); } - static L1TGT_Common3Vector from_GTObject(const P2GTCandidate& gtObject) { - return L1TGT_Common3Vector(1, gtObject.hwPT(), gtObject.hwPhi(), gtObject.hwEta()); - } - P2GTCandidate to_GTObject() const override { P2GTCandidate gt_object; gt_object.setHwPT(pT); @@ -84,10 +80,6 @@ namespace l1t { ap_uint<64> pack() const override { return pack_common(); } - static L1TGT_CommonSum from_GTObject(const P2GTCandidate& gtObject) { - return L1TGT_CommonSum(1, gtObject.hwPT(), gtObject.hwPhi(), gtObject.hwScalarSumPT()); - } - P2GTCandidate to_GTObject() const override { P2GTCandidate gt_object; gt_object.setHwPT(pT); @@ -122,10 +114,6 @@ namespace l1t { return l1t_pack_int>(L1TGT_Common3Vector::pack_common(), seed_pT); } - static L1TGT_GCT_tau6p6 from_GTObject(const P2GTCandidate& gtObject) { - return L1TGT_GCT_tau6p6(1, gtObject.hwPT(), gtObject.hwPhi(), gtObject.hwEta(), gtObject.hwSeed_pT()); - } - P2GTCandidate to_GTObject() const override { P2GTCandidate gt_object(L1TGT_Common3Vector::to_GTObject()); gt_object.setHwSeed_pT(seed_pT); @@ -160,17 +148,6 @@ namespace l1t { return l1t_pack_int>(L1TGT_Common3Vector::pack_common(), z0, d0, charge, qualityScore); } - static L1TGT_GMT_PromptDisplacedMuon from_GTObject(const P2GTCandidate& gtObject) { - return L1TGT_GMT_PromptDisplacedMuon(1, - gtObject.hwPT(), - gtObject.hwPhi(), - gtObject.hwEta(), - gtObject.hwZ0() >> 12, - gtObject.hwD0() >> 5, - gtObject.hwCharge(), - gtObject.hwQualityScore()); - } - P2GTCandidate to_GTObject() const override { P2GTCandidate gt_object(L1TGT_Common3Vector::to_GTObject()); gt_object.setHwZ0(static_cast(z0) << 12); @@ -213,19 +190,6 @@ namespace l1t { L1TGT_Common3Vector::pack_common(), z0, d0, charge, qualityFlags, isolationPT, beta); } - static L1TGT_GMT_TrackMatchedmuon from_GTObject(const P2GTCandidate& gtObject) { - return L1TGT_GMT_TrackMatchedmuon(1, - gtObject.hwPT(), - gtObject.hwPhi(), - gtObject.hwEta(), - gtObject.hwZ0() >> 7, - gtObject.hwD0() >> 2, - gtObject.hwCharge(), - gtObject.hwQualityFlags(), - gtObject.hwIsolationPT(), - gtObject.hwBeta()); - } - P2GTCandidate to_GTObject() const override { P2GTCandidate gt_object(L1TGT_Common3Vector::to_GTObject()); gt_object.setHwZ0(static_cast(z0) << 7); @@ -256,15 +220,6 @@ namespace l1t { return l1t_pack_int>(valid, pT, eta, phi, mass, qualityFlags); } - static L1TGT_GMT_TopoObject from_GTObject(const P2GTCandidate& gtObject) { - return L1TGT_GMT_TopoObject(1, - gtObject.hwPT() / 5, - gtObject.hwPhi() >> 5, - gtObject.hwEta() >> 5, - gtObject.hwMass(), - gtObject.hwQualityFlags()); - } - P2GTCandidate to_GTObject() const override { P2GTCandidate gt_object; gt_object.setHwPT(static_cast(pT) * 5); // TODO @@ -301,16 +256,6 @@ namespace l1t { L1TGT_Common3Vector::pack_common(), z0, number_of_tracks, number_of_displaced_tracks); } - static L1TGT_GTT_PromptJet from_GTObject(const P2GTCandidate& gtObject) { - return L1TGT_GTT_PromptJet(1, - gtObject.hwPT(), - gtObject.hwPhi(), - gtObject.hwEta(), - gtObject.hwZ0() >> 7, - gtObject.hwNumber_of_tracks(), - gtObject.hwNumber_of_displaced_tracks()); - } - P2GTCandidate to_GTObject() const override { P2GTCandidate gt_object(L1TGT_Common3Vector::to_GTObject()); gt_object.setHwZ0(static_cast(z0) << 7); @@ -343,16 +288,6 @@ namespace l1t { L1TGT_Common3Vector::pack_common(), z0, number_of_tracks, number_of_displaced_tracks); } - static L1TGT_GTT_DisplacedJet from_GTObject(const P2GTCandidate& gtObject) { - return L1TGT_GTT_DisplacedJet(1, - gtObject.hwPT(), - gtObject.hwPhi(), - gtObject.hwEta(), - gtObject.hwZ0() >> 7, - gtObject.hwNumber_of_tracks(), - gtObject.hwNumber_of_displaced_tracks()); - } - P2GTCandidate to_GTObject() const override { P2GTCandidate gt_object(L1TGT_Common3Vector::to_GTObject()); gt_object.setHwZ0(static_cast(z0) << 7); @@ -387,17 +322,6 @@ namespace l1t { return l1t_pack_int>(L1TGT_Common3Vector::pack_common(), seed_pT, seed_z0, charge, type); } - static L1TGT_GTT_HadronicTau from_GTObject(const P2GTCandidate& gtObject) { - return L1TGT_GTT_HadronicTau(1, - gtObject.hwPT(), - gtObject.hwPhi(), - gtObject.hwEta(), - gtObject.hwSeed_pT(), - gtObject.hwSeed_z0(), - gtObject.hwCharge(), - gtObject.hwType()); - } - P2GTCandidate to_GTObject() const override { P2GTCandidate gt_object(L1TGT_Common3Vector::to_GTObject()); gt_object.setHwSeed_pT(seed_pT); @@ -422,10 +346,6 @@ namespace l1t { return l1t_pack_int>(L1TGT_Common3Vector::pack_common(), z0); } - static L1TGT_GTT_LightMeson from_GTObject(const P2GTCandidate& gtObject) { - return L1TGT_GTT_LightMeson(1, gtObject.hwPT(), gtObject.hwPhi(), gtObject.hwEta(), gtObject.hwZ0() >> 7); - } - P2GTCandidate to_GTObject() const override { P2GTCandidate gt_object(L1TGT_Common3Vector::to_GTObject()); gt_object.setHwZ0(static_cast(z0) << 7); @@ -441,8 +361,6 @@ namespace l1t { ap_uint pack() const override { return ap_uint(0); } - static L1TGT_GTT_Track from_GTObject(const P2GTCandidate& gtObject) { return L1TGT_GTT_Track(); } - P2GTCandidate to_GTObject() const override { return P2GTCandidate(); } }; @@ -473,15 +391,6 @@ namespace l1t { valid, z0, number_of_tracks_in_pv, sum_pT_pv, qualityScore, number_of_tracks_not_in_pv); } - static L1TGT_GTT_PrimaryVert from_GTObject(const P2GTCandidate& gtObject) { - return L1TGT_GTT_PrimaryVert(1, - gtObject.hwZ0() / 5, - gtObject.hwNumber_of_tracks_in_pv(), - gtObject.hwSum_pT_pv(), - gtObject.hwQualityScore(), - gtObject.hwNumber_of_tracks_not_in_pv()); - } - P2GTCandidate to_GTObject() const override { P2GTCandidate gt_object; gt_object.setHwZ0(static_cast(z0) * 5); @@ -506,10 +415,6 @@ namespace l1t { return l1t_pack_int>(L1TGT_Common3Vector::pack_common(), z0); } - static L1TGT_CL2_Jet from_GTObject(const P2GTCandidate& gtObject) { - return L1TGT_CL2_Jet(1, gtObject.hwPT(), gtObject.hwPhi(), gtObject.hwEta(), gtObject.hwZ0() >> 7); - } - P2GTCandidate to_GTObject() const override { P2GTCandidate gt_object(L1TGT_Common3Vector::to_GTObject()); gt_object.setHwZ0(static_cast(z0) << 7); @@ -545,17 +450,6 @@ namespace l1t { return l1t_pack_int>(L1TGT_Common3Vector::pack_common(), seed_pT, seed_z0, charge, type); } - static L1TGT_CL2_Tau from_GTObject(const P2GTCandidate& gtObject) { - return L1TGT_CL2_Tau(1, - gtObject.hwPT(), - gtObject.hwPhi(), - gtObject.hwEta(), - gtObject.hwSeed_pT(), - gtObject.hwSeed_z0(), - gtObject.hwCharge(), - gtObject.hwType()); - } - P2GTCandidate to_GTObject() const override { P2GTCandidate gt_object(L1TGT_Common3Vector::to_GTObject()); gt_object.setHwSeed_pT(seed_pT); @@ -591,17 +485,6 @@ namespace l1t { return l1t_pack_int>(L1TGT_Common3Vector::pack_common(), qualityFlags, isolationPT, charge, z0); } - static L1TGT_CL2_Electron from_GTObject(const P2GTCandidate& gtObject) { - return L1TGT_CL2_Electron(1, - gtObject.hwPT(), - gtObject.hwPhi(), - gtObject.hwEta(), - gtObject.hwQualityFlags(), - gtObject.hwIsolationPT(), - gtObject.hwCharge(), - gtObject.hwZ0() >> 7); - } - P2GTCandidate to_GTObject() const override { P2GTCandidate gt_object(L1TGT_Common3Vector::to_GTObject()); gt_object.setHwQualityFlags(qualityFlags); @@ -624,11 +507,6 @@ namespace l1t { return l1t_pack_int>(L1TGT_Common3Vector::pack_common(), qualityFlags, isolationPT); } - static L1TGT_CL2_Photon from_GTObject(const P2GTCandidate& gtObject) { - return L1TGT_CL2_Photon( - 1, gtObject.hwPT(), gtObject.hwPhi(), gtObject.hwEta(), gtObject.hwQualityFlags(), gtObject.hwIsolationPT()); - } - P2GTCandidate to_GTObject() const override { P2GTCandidate gt_object(L1TGT_Common3Vector::to_GTObject()); gt_object.setHwQualityFlags(qualityFlags); From 81afad48c5b8ba5eae9fba04c720a7325c70698f Mon Sep 17 00:00:00 2001 From: Benjamin Huber Date: Thu, 13 Feb 2025 11:55:04 +0100 Subject: [PATCH 4/6] EvaluationInterface: Fix SA muon signed z0 --- L1Trigger/Phase2L1GT/plugins/L1GTEvaluationInterface.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/L1Trigger/Phase2L1GT/plugins/L1GTEvaluationInterface.h b/L1Trigger/Phase2L1GT/plugins/L1GTEvaluationInterface.h index 1e216df463c39..d3c4516a01fd5 100644 --- a/L1Trigger/Phase2L1GT/plugins/L1GTEvaluationInterface.h +++ b/L1Trigger/Phase2L1GT/plugins/L1GTEvaluationInterface.h @@ -129,7 +129,7 @@ namespace l1t { // Global Muon Trigger struct L1TGT_GMT_PromptDisplacedMuon : public L1TGT_Common3Vector<64> { - ap_uint<5> z0; + ap_int<5> z0; ap_int<7> d0; ap_uint<1> charge; ap_uint<4> qualityScore; From 6fc759d3451f28b7877bf77aa5ed37d0efb38173 Mon Sep 17 00:00:00 2001 From: Benjamin Huber Date: Mon, 17 Feb 2025 15:16:35 +0100 Subject: [PATCH 5/6] Validate that `regionsAbsEtaLowerBounds` is sorted --- L1Trigger/Phase2L1GT/plugins/L1GTSingleCollectionCut.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/L1Trigger/Phase2L1GT/plugins/L1GTSingleCollectionCut.h b/L1Trigger/Phase2L1GT/plugins/L1GTSingleCollectionCut.h index dd94fe0dbb909..905a1d6cf1899 100644 --- a/L1Trigger/Phase2L1GT/plugins/L1GTSingleCollectionCut.h +++ b/L1Trigger/Phase2L1GT/plugins/L1GTSingleCollectionCut.h @@ -91,6 +91,9 @@ namespace l1t { minPtMultiplicityN_(config.getParameter("minPtMultiplicityN")), minPtMultiplicityCut_(getOptionalParam( "minPtMultiplicityCut", config, [&scales](double value) { return scales.to_hw_pT_floor(value); })) { + if (!std::is_sorted(regionsAbsEtaLowerBounds_.begin(), regionsAbsEtaLowerBounds_.end())) { + throw cms::Exception("Configuration") << "\'regionsAbsEtaLowerBounds\' is not sorted."; + } if (!regionsMinPt_.empty() && regionsAbsEtaLowerBounds_.size() != regionsMinPt_.size()) { throw cms::Exception("Configuration") << "\'regionsMinPt\' has " << regionsMinPt_.size() << " entries, but requires " From 8be99812463d3767187cfed9c623464887815f9e Mon Sep 17 00:00:00 2001 From: Benjamin Huber Date: Wed, 26 Feb 2025 13:40:18 +0100 Subject: [PATCH 6/6] Add L1GTAcceptFilter --- .../Phase2L1GT/plugins/L1GTAcceptFilter.cc | 62 +++++++++++++++++++ .../Phase2L1GT/python/l1GTAcceptFilter_cff.py | 6 ++ 2 files changed, 68 insertions(+) create mode 100644 L1Trigger/Phase2L1GT/plugins/L1GTAcceptFilter.cc create mode 100644 L1Trigger/Phase2L1GT/python/l1GTAcceptFilter_cff.py diff --git a/L1Trigger/Phase2L1GT/plugins/L1GTAcceptFilter.cc b/L1Trigger/Phase2L1GT/plugins/L1GTAcceptFilter.cc new file mode 100644 index 0000000000000..8e012ccf9d44f --- /dev/null +++ b/L1Trigger/Phase2L1GT/plugins/L1GTAcceptFilter.cc @@ -0,0 +1,62 @@ +#include "FWCore/Framework/interface/Event.h" +#include "FWCore/Framework/interface/global/EDFilter.h" +#include "FWCore/ParameterSet/interface/ParameterSet.h" +#include "DataFormats/L1Trigger/interface/P2GTAlgoBlock.h" +#include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h" + +#include "FWCore/ParameterSet/interface/ParameterSetDescription.h" +#include "FWCore/ParameterSet/interface/allowedValues.h" +#include "FWCore/Framework/interface/MakerMacros.h" +#include "DataFormats/Common/interface/Handle.h" +#include "FWCore/Utilities/interface/EDGetToken.h" + +using namespace l1t; + +class L1GTAcceptFilter : public edm::global::EDFilter<> { +public: + explicit L1GTAcceptFilter(const edm::ParameterSet&); + ~L1GTAcceptFilter() override = default; + + static void fillDescriptions(edm::ConfigurationDescriptions&); + + enum DecisionType { beforeBxMaskAndPrescale, beforePrescale, final }; + +private: + bool filter(edm::StreamID, edm::Event&, edm::EventSetup const&) const override; + + const edm::EDGetTokenT algoBlocksToken_; + const DecisionType decisionEnum_; +}; + +L1GTAcceptFilter::L1GTAcceptFilter(const edm::ParameterSet& config) + : algoBlocksToken_(consumes(config.getParameter("algoBlocksTag"))), + decisionEnum_(config.getParameter("decision") == "beforeBxMaskAndPrescale" ? beforeBxMaskAndPrescale + : config.getParameter("decision") == "beforePrescale" ? beforePrescale + : final) {} + +bool L1GTAcceptFilter::filter(edm::StreamID, edm::Event& event, const edm::EventSetup& setup) const { + const P2GTAlgoBlockMap& algoMap = event.get(algoBlocksToken_); + bool decision = false; + for (const auto& [name, algoBlock] : algoMap) { + if (decisionEnum_ == beforeBxMaskAndPrescale) { + decision |= algoBlock.decisionBeforeBxMaskAndPrescale(); + } else if (decisionEnum_ == beforePrescale) { + decision |= algoBlock.decisionBeforePrescale(); + } else { + decision |= algoBlock.decisionFinal(); + } + } + + return decision; +} + +void L1GTAcceptFilter::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { + edm::ParameterSetDescription desc; + desc.add("algoBlocksTag"); + desc.ifValue(edm::ParameterDescription("decision", "final", true), + edm::allowedValues("beforeBxMaskAndPrescale", "beforePrescale", "final")); + + descriptions.addWithDefaultLabel(desc); +} + +DEFINE_FWK_MODULE(L1GTAcceptFilter); diff --git a/L1Trigger/Phase2L1GT/python/l1GTAcceptFilter_cff.py b/L1Trigger/Phase2L1GT/python/l1GTAcceptFilter_cff.py new file mode 100644 index 0000000000000..b8c0f8dfb1c73 --- /dev/null +++ b/L1Trigger/Phase2L1GT/python/l1GTAcceptFilter_cff.py @@ -0,0 +1,6 @@ +import FWCore.ParameterSet.Config as cms + +l1tGTAcceptFilter = cms.EDFilter( + "L1GTAcceptFilter", + algoBlocksTag = cms.InputTag("l1tGTAlgoBlockProducer"), +)