Skip to content

Commit c0ddb32

Browse files
author
Benjamin Huber
committed
Add qualityScore sum cut
1 parent 24690bd commit c0ddb32

File tree

4 files changed

+77
-0
lines changed

4 files changed

+77
-0
lines changed

L1Trigger/Phase2L1GT/README.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,15 @@ The following 3-body correlational cuts are available:
170170
| `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))` |
171171
| `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))` |
172172

173+
The following N-body correlational cuts are available (N = 2 for DoubleObjectCondition, N = 3 for TripleObjectCondition and N = 4 for the QuadObjectCondition):
174+
175+
| Name | Expression | Datatype | Hardware conversion |
176+
|:-----|:----------:|:-------------:|:--------:|
177+
| `minQualityScoreSum`* | $\sum^N_{i=1} \mathrm{qualityScore} > X$ | `cms.unit32` | `X` |
178+
| `maxQualityScoreSum`* | $\sum^N_{i=1} \mathrm{qualityScore} < X$ | `cms.unit32` | `X` |
179+
180+
\*: For N=4 the 4 objects should be from the same input collection to guarantee timing closure of the FPGA firmware.
181+
173182
## Algorithms
174183

175184
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:

L1Trigger/Phase2L1GT/plugins/L1GTDoubleObjectCond.cc

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "L1GTSingleCollectionCut.h"
1919
#include "L1GTCorrelationalCut.h"
2020
#include "L1GTSingleInOutLUT.h"
21+
#include "L1GTOptionalParam.h"
2122

2223
#include <cinttypes>
2324
#include <memory>
@@ -48,6 +49,9 @@ class L1GTDoubleObjectCond : public edm::global::EDFilter<> {
4849

4950
const L1GTCorrelationalCut deltaCuts_;
5051

52+
const std::optional<unsigned int> minQualityScoreSum_;
53+
const std::optional<unsigned int> maxQualityScoreSum_;
54+
5155
const edm::EDGetTokenT<P2GTCandidateCollection> token1_;
5256
const edm::EDGetTokenT<P2GTCandidateCollection> token2_;
5357
const edm::EDGetTokenT<P2GTCandidateCollection> primVertToken_;
@@ -60,6 +64,8 @@ L1GTDoubleObjectCond::L1GTDoubleObjectCond(const edm::ParameterSet& config)
6064
enable_sanity_checks_(config.getUntrackedParameter<bool>("sanity_checks")),
6165
inv_mass_checks_(config.getUntrackedParameter<bool>("inv_mass_checks")),
6266
deltaCuts_(config, config, scales_, enable_sanity_checks_, inv_mass_checks_),
67+
minQualityScoreSum_(getOptionalParam<unsigned int>("minQualityScoreSum", config)),
68+
maxQualityScoreSum_(getOptionalParam<unsigned int>("maxQualityScoreSum", config)),
6369
token1_(consumes<P2GTCandidateCollection>(collection1Cuts_.tag())),
6470
token2_(collection1Cuts_.tag() == collection2Cuts_.tag()
6571
? token1_
@@ -74,6 +80,10 @@ L1GTDoubleObjectCond::L1GTDoubleObjectCond(const edm::ParameterSet& config)
7480
if (inv_mass_checks_) {
7581
produces<InvariantMassErrorCollection>();
7682
}
83+
84+
if ((minQualityScoreSum_ || maxQualityScoreSum_) && !(collection1Cuts_.tag() == collection2Cuts_.tag())) {
85+
throw cms::Exception("Configuration") << "A qualityScore sum can only be calculated within one collection.";
86+
}
7787
}
7888

7989
void L1GTDoubleObjectCond::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
@@ -95,6 +105,9 @@ void L1GTDoubleObjectCond::fillDescriptions(edm::ConfigurationDescriptions& desc
95105
L1GTCorrelationalCut::fillPSetDescription(desc);
96106
L1GTCorrelationalCut::fillLUTDescriptions(desc);
97107

108+
desc.addOptional<unsigned int>("minQualityScoreSum");
109+
desc.addOptional<unsigned int>("maxQualityScoreSum");
110+
98111
edm::ParameterSetDescription scalesDesc;
99112
L1GTScales::fillPSetDescription(scalesDesc);
100113
desc.add<edm::ParameterSetDescription>("scales", scalesDesc);
@@ -129,6 +142,14 @@ bool L1GTDoubleObjectCond::filter(edm::StreamID, edm::Event& event, const edm::E
129142
pass &= collection2Cuts_.checkPrimaryVertices(col2->at(idx2), *primVertCol);
130143
pass &= deltaCuts_.checkObjects(col1->at(idx1), col2->at(idx2), massErrors);
131144

145+
if (minQualityScoreSum_ || maxQualityScoreSum_) {
146+
unsigned int qualityScoreSum =
147+
col1->at(idx1).hwQualityScore().to_uint() + col2->at(idx2).hwQualityScore().to_uint();
148+
149+
pass &= minQualityScoreSum_ ? qualityScoreSum > minQualityScoreSum_ : true;
150+
pass &= maxQualityScoreSum_ ? qualityScoreSum < maxQualityScoreSum_ : true;
151+
}
152+
132153
condition_result |= pass;
133154

134155
if (pass) {

L1Trigger/Phase2L1GT/plugins/L1GTQuadObjectCond.cc

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include "L1GTCorrelationalCut.h"
1616
#include "L1GT3BodyCut.h"
1717
#include "L1GTSingleInOutLUT.h"
18+
#include "L1GTOptionalParam.h"
1819

1920
#include <cinttypes>
2021
#include <memory>
@@ -57,6 +58,9 @@ class L1GTQuadObjectCond : public edm::global::EDFilter<> {
5758
const L1GT3BodyCut correl134Cuts_;
5859
const L1GT3BodyCut correl234Cuts_;
5960

61+
const std::optional<unsigned int> minQualityScoreSum_;
62+
const std::optional<unsigned int> maxQualityScoreSum_;
63+
6064
const edm::EDGetTokenT<P2GTCandidateCollection> token1_;
6165
const edm::EDGetTokenT<P2GTCandidateCollection> token2_;
6266
const edm::EDGetTokenT<P2GTCandidateCollection> token3_;
@@ -88,6 +92,8 @@ L1GTQuadObjectCond::L1GTQuadObjectCond(const edm::ParameterSet& config)
8892
correl124Cuts_(config.getParameter<edm::ParameterSet>("correl124"), config, scales_, inv_mass_checks_),
8993
correl134Cuts_(config.getParameter<edm::ParameterSet>("correl134"), config, scales_, inv_mass_checks_),
9094
correl234Cuts_(config.getParameter<edm::ParameterSet>("correl234"), config, scales_, inv_mass_checks_),
95+
minQualityScoreSum_(getOptionalParam<unsigned int>("minQualityScoreSum", config)),
96+
maxQualityScoreSum_(getOptionalParam<unsigned int>("maxQualityScoreSum", config)),
9197
token1_(consumes<P2GTCandidateCollection>(collection1Cuts_.tag())),
9298
token2_(collection1Cuts_.tag() == collection2Cuts_.tag()
9399
? token1_
@@ -123,6 +129,12 @@ L1GTQuadObjectCond::L1GTQuadObjectCond(const edm::ParameterSet& config)
123129
if (inv_mass_checks_) {
124130
produces<InvariantMassErrorCollection>();
125131
}
132+
133+
if ((minQualityScoreSum_ || maxQualityScoreSum_) &&
134+
!(collection1Cuts_.tag() == collection2Cuts_.tag() && collection2Cuts_.tag() == collection3Cuts_.tag() &&
135+
collection3Cuts_.tag() == collection4Cuts_.tag())) {
136+
throw cms::Exception("Configuration") << "A qualityScore sum can only be calculated within one collection.";
137+
}
126138
}
127139

128140
void L1GTQuadObjectCond::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
@@ -193,6 +205,9 @@ void L1GTQuadObjectCond::fillDescriptions(edm::ConfigurationDescriptions& descri
193205
L1GT3BodyCut::fillPSetDescription(correl234Desc);
194206
desc.add<edm::ParameterSetDescription>("correl234", correl234Desc);
195207

208+
desc.addOptional<unsigned int>("minQualityScoreSum");
209+
desc.addOptional<unsigned int>("maxQualityScoreSum");
210+
196211
L1GTCorrelationalCut::fillLUTDescriptions(desc);
197212

198213
descriptions.addWithDefaultLabel(desc);
@@ -267,6 +282,15 @@ bool L1GTQuadObjectCond::filter(edm::StreamID, edm::Event& event, const edm::Eve
267282
pass &= correl134Cuts_.checkObjects(col1->at(idx1), col3->at(idx3), col4->at(idx4), massErrors);
268283
pass &= correl234Cuts_.checkObjects(col2->at(idx2), col3->at(idx3), col4->at(idx4), massErrors);
269284

285+
if (minQualityScoreSum_ || maxQualityScoreSum_) {
286+
unsigned int qualityScoreSum =
287+
col1->at(idx1).hwQualityScore().to_uint() + col2->at(idx2).hwQualityScore().to_uint() +
288+
col3->at(idx3).hwQualityScore().to_uint() + col4->at(idx4).hwQualityScore().to_uint();
289+
290+
pass &= minQualityScoreSum_ ? qualityScoreSum > minQualityScoreSum_ : true;
291+
pass &= maxQualityScoreSum_ ? qualityScoreSum < maxQualityScoreSum_ : true;
292+
}
293+
270294
condition_result |= pass;
271295

272296
if (pass) {

L1Trigger/Phase2L1GT/plugins/L1GTTripleObjectCond.cc

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include "L1GTCorrelationalCut.h"
1717
#include "L1GT3BodyCut.h"
1818
#include "L1GTSingleInOutLUT.h"
19+
#include "L1GTOptionalParam.h"
1920

2021
#include <set>
2122

@@ -48,6 +49,9 @@ class L1GTTripleObjectCond : public edm::global::EDFilter<> {
4849

4950
const L1GT3BodyCut correl123Cuts_;
5051

52+
const std::optional<unsigned int> minQualityScoreSum_;
53+
const std::optional<unsigned int> maxQualityScoreSum_;
54+
5155
const edm::EDGetTokenT<P2GTCandidateCollection> token1_;
5256
const edm::EDGetTokenT<P2GTCandidateCollection> token2_;
5357
const edm::EDGetTokenT<P2GTCandidateCollection> token3_;
@@ -68,6 +72,8 @@ L1GTTripleObjectCond::L1GTTripleObjectCond(const edm::ParameterSet& config)
6872
correl23Cuts_(
6973
config.getParameter<edm::ParameterSet>("correl23"), config, scales_, enable_sanity_checks_, inv_mass_checks_),
7074
correl123Cuts_(config, config, scales_, inv_mass_checks_),
75+
minQualityScoreSum_(getOptionalParam<unsigned int>("minQualityScoreSum", config)),
76+
maxQualityScoreSum_(getOptionalParam<unsigned int>("maxQualityScoreSum", config)),
7177
token1_(consumes<P2GTCandidateCollection>(collection1Cuts_.tag())),
7278
token2_(collection1Cuts_.tag() == collection2Cuts_.tag()
7379
? token1_
@@ -91,6 +97,11 @@ L1GTTripleObjectCond::L1GTTripleObjectCond(const edm::ParameterSet& config)
9197
if (inv_mass_checks_) {
9298
produces<InvariantMassErrorCollection>();
9399
}
100+
101+
if ((minQualityScoreSum_ || maxQualityScoreSum_) &&
102+
!(collection1Cuts_.tag() == collection2Cuts_.tag() && collection2Cuts_.tag() == collection3Cuts_.tag())) {
103+
throw cms::Exception("Configuration") << "A qualityScore sum can only be calculated within one collection.";
104+
}
94105
}
95106

96107
void L1GTTripleObjectCond::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
@@ -131,6 +142,9 @@ void L1GTTripleObjectCond::fillDescriptions(edm::ConfigurationDescriptions& desc
131142

132143
L1GT3BodyCut::fillPSetDescription(desc);
133144

145+
desc.addOptional<unsigned int>("minQualityScoreSum");
146+
desc.addOptional<unsigned int>("maxQualityScoreSum");
147+
134148
L1GTCorrelationalCut::fillLUTDescriptions(desc);
135149

136150
descriptions.addWithDefaultLabel(desc);
@@ -181,6 +195,15 @@ bool L1GTTripleObjectCond::filter(edm::StreamID, edm::Event& event, const edm::E
181195
pass &= correl23Cuts_.checkObjects(col2->at(idx2), col3->at(idx3), massErrors);
182196
pass &= correl123Cuts_.checkObjects(col1->at(idx1), col2->at(idx2), col3->at(idx3), massErrors);
183197

198+
if (minQualityScoreSum_ || maxQualityScoreSum_) {
199+
unsigned int qualityScoreSum = col1->at(idx1).hwQualityScore().to_uint() +
200+
col2->at(idx2).hwQualityScore().to_uint() +
201+
col3->at(idx3).hwQualityScore().to_uint();
202+
203+
pass &= minQualityScoreSum_ ? qualityScoreSum > minQualityScoreSum_ : true;
204+
pass &= maxQualityScoreSum_ ? qualityScoreSum < maxQualityScoreSum_ : true;
205+
}
206+
184207
condition_result |= pass;
185208

186209
if (pass) {

0 commit comments

Comments
 (0)