Skip to content

Commit eca5a3a

Browse files
authored
TrackQuality Code Review (#65)
* TrackQuality Code Review * Fix to FileInPath error * Revert FileInPath, set quality default to true
1 parent 07d074a commit eca5a3a

File tree

5 files changed

+70
-61
lines changed

5 files changed

+70
-61
lines changed

L1Trigger/TrackFindingTracklet/plugins/L1FPGATrackProducer.cc

+3-5
Original file line numberDiff line numberDiff line change
@@ -172,8 +172,7 @@ class L1FPGATrackProducer : public edm::one::EDProducer<edm::one::WatchRuns> {
172172
bool extended_;
173173

174174
bool trackQuality_;
175-
edm::ParameterSet trackQualityParams;
176-
std::unique_ptr<TrackQuality> trackQualityModel;
175+
std::unique_ptr<TrackQuality> trackQualityModel_;
177176

178177
std::map<string, vector<int>> dtclayerdisk;
179178

@@ -294,8 +293,7 @@ L1FPGATrackProducer::L1FPGATrackProducer(edm::ParameterSet const& iConfig)
294293

295294
trackQuality_ = iConfig.getParameter<bool>("TrackQuality");
296295
if (trackQuality_) {
297-
trackQualityParams = iConfig.getParameter<edm::ParameterSet>("TrackQualityPSet");
298-
trackQualityModel = std::make_unique<TrackQuality>(trackQualityParams);
296+
trackQualityModel_ = std::make_unique<TrackQuality>(iConfig.getParameter<edm::ParameterSet>("TrackQualityPSet"));
299297
}
300298
}
301299

@@ -701,7 +699,7 @@ void L1FPGATrackProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSe
701699
aTrack.setTrackWordBits();
702700

703701
if (trackQuality_) {
704-
trackQualityModel->setTrackQuality(aTrack);
702+
trackQualityModel_->setTrackQuality(aTrack);
705703
}
706704

707705
// test track word

L1Trigger/TrackFindingTracklet/python/Tracklet_cfi.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
DTCLinkLayerDiskFile = cms.FileInPath('L1Trigger/TrackFindingTracklet/data/dtclinklayerdisk.dat'),
2222
moduleCablingFile = cms.FileInPath('L1Trigger/TrackFindingTracklet/data/modules_T5v3_27SP_nonant_tracklet.dat'),
2323
# Quality Flag and Quality params
24-
TrackQuality =cms.bool(False),
24+
TrackQuality =cms.bool(True),
2525
TrackQualityPSet = cms.PSet(TrackQualityParams)
2626
)
2727

L1Trigger/TrackTrigger/interface/TrackQuality.h

+8-6
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,18 @@ C.Brown 28/07/20
2323

2424
#include "FWCore/ParameterSet/interface/ParameterSet.h"
2525

26-
#include "PhysicsTools/ONNXRuntime/interface/ONNXRuntime.h"
27-
2826
#include "DataFormats/L1TrackTrigger/interface/TTTrack.h"
2927
#include "DataFormats/L1TrackTrigger/interface/TTTypes.h"
3028

3129
class TrackQuality {
3230
public:
31+
// Enum class used for determining prediction behaviour in setTrackQuality
32+
enum class QualityAlgorithm { Cut, GBDT, NN, None };
33+
3334
//Default Constructor
3435
TrackQuality();
3536

36-
TrackQuality(edm::ParameterSet& qualityParams);
37+
TrackQuality(const edm::ParameterSet& qualityParams);
3738

3839
//Default Destructor
3940
~TrackQuality() = default;
@@ -46,22 +47,22 @@ class TrackQuality {
4647
void setTrackQuality(TTTrack<Ref_Phase2TrackerDigi_>& aTrack);
4748

4849
// To set private member data
49-
void setCutParameters(std::string const& qualityAlgorithm,
50+
void setCutParameters(std::string const& AlgorithmString,
5051
float maxZ0,
5152
float maxEta,
5253
float chi2dofMax,
5354
float bendchi2Max,
5455
float minPt,
5556
int nStubmin);
5657

57-
void setONNXModel(std::string const& qualityAlgorithm,
58+
void setONNXModel(std::string const& AlgorithmString,
5859
edm::FileInPath const& ONNXmodel,
5960
std::string const& ONNXInputName,
6061
std::vector<std::string> const& featureNames);
6162

6263
private:
6364
// Private Member Data
64-
std::string qualityAlgorithm_ = "None";
65+
QualityAlgorithm qualityAlgorithm_ = QualityAlgorithm::None;
6566
edm::FileInPath ONNXmodel_;
6667
std::string ONNXInputName_;
6768
std::vector<std::string> featureNames_;
@@ -71,5 +72,6 @@ class TrackQuality {
7172
float bendchi2Max_;
7273
float minPt_;
7374
int nStubsmin_;
75+
float ONNXInvRScaling_;
7476
};
7577
#endif
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
import FWCore.ParameterSet.Config as cms
22

33
TrackQualityParams = cms.PSet(qualityAlgorithm = cms.string("GBDT"), #None, Cut, NN, GBDT
4-
ONNXmodel = cms.string("L1Trigger/TrackTrigger/data/TrackQualityModels/GBDT_default.onnx"),
5-
# !! TO BE UPDATED !!
4+
ONNXmodel = cms.FileInPath("L1Trigger/TrackTrigger/data/GBDT_default.onnx"),
65
# The ONNX model should be found at this path, if you want a local version of the model:
7-
# git clone https://github.com/Chriisbrown/L1Trigger-TrackTrigger.git L1Trigger/TrackTrigger/data
6+
# git clone https://github.com/cms-data/L1Trigger-TrackTrigger.git L1Trigger/TrackTrigger/data
87
ONNXInputName = cms.string("feature_input"),
98
#Vector of strings of training features, in the order that the model was trained with
109
featureNames = cms.vstring(["phi", "eta", "z0", "bendchi2_bin", "nstub",
@@ -16,4 +15,7 @@
1615
chi2dofMax = cms.double( 40. ),
1716
bendchi2Max = cms.double( 2.4 ),
1817
minPt = cms.double( 2. ), # in GeV
19-
nStubsmin = cms.int32( 4 ))
18+
nStubsmin = cms.int32( 4 ),
19+
20+
ONNXInvRScale = cms.double(500) # Scaling InvR to same order of magnitude as other variables for ML models
21+
)

L1Trigger/TrackTrigger/src/TrackQuality.cc

+52-45
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,17 @@ C.Brown & C.Savard 07/2020
55
*/
66

77
#include "L1Trigger/TrackTrigger/interface/TrackQuality.h"
8+
#include "PhysicsTools/ONNXRuntime/interface/ONNXRuntime.h"
89

910
//Constructors
1011

1112
TrackQuality::TrackQuality() {}
1213

13-
TrackQuality::TrackQuality(edm::ParameterSet& qualityParams) {
14-
std::string qualityAlgorithm = qualityParams.getParameter<std::string>("qualityAlgorithm");
14+
TrackQuality::TrackQuality(const edm::ParameterSet& qualityParams) {
15+
std::string AlgorithmString = qualityParams.getParameter<std::string>("qualityAlgorithm");
1516
// Unpacks EDM parameter set itself to save unecessary processing within TrackProducers
16-
if (qualityAlgorithm == "Cut") {
17-
setCutParameters(qualityAlgorithm,
17+
if (AlgorithmString == "Cut") {
18+
setCutParameters(AlgorithmString,
1819
(float)qualityParams.getParameter<double>("maxZ0"),
1920
(float)qualityParams.getParameter<double>("maxEta"),
2021
(float)qualityParams.getParameter<double>("chi2dofMax"),
@@ -24,10 +25,11 @@ TrackQuality::TrackQuality(edm::ParameterSet& qualityParams) {
2425
}
2526

2627
else {
27-
setONNXModel(qualityAlgorithm,
28-
edm::FileInPath(qualityParams.getParameter<std::string>("ONNXmodel")),
28+
setONNXModel(AlgorithmString,
29+
qualityParams.getParameter<edm::FileInPath>("ONNXmodel"),
2930
qualityParams.getParameter<std::string>("ONNXInputName"),
3031
qualityParams.getParameter<std::vector<std::string>>("featureNames"));
32+
ONNXInvRScaling_ = qualityParams.getParameter<double>("ONNXInvRScale");
3133
}
3234
}
3335

@@ -41,6 +43,9 @@ std::vector<float> TrackQuality::featureTransform(TTTrack<Ref_Phase2TrackerDigi_
4143

4244
std::vector<float> transformedFeatures;
4345

46+
// Define feature map, filled as features are generated
47+
std::map<std::string, float> feature_map;
48+
4449
// The following converts the 7 bit hitmask in the TTTrackword to an expected
4550
// 11 bit hitmask based on the eta of the track
4651
std::vector<int> hitpattern_binary = {0, 0, 0, 0, 0, 0, 0};
@@ -109,7 +114,7 @@ std::vector<float> TrackQuality::featureTransform(TTTrack<Ref_Phase2TrackerDigi_
109114

110115
// bin bendchi2 variable (bins from https://twiki.cern.ch/twiki/bin/viewauth/CMS/HybridDataFormat#Fitted_Tracks_written_by_KalmanF)
111116
float tmp_trk_bendchi2 = aTrack.stubPtConsistency();
112-
std::vector<float> bendchi2_bins = {0, 0.5, 1.25, 2, 3, 5, 10, 50};
117+
std::array<float, 8> bendchi2_bins{{0, 0.5, 1.25, 2, 3, 5, 10, 50}};
113118
int n_bendchi2 = static_cast<int>(bendchi2_bins.size());
114119
float tmp_trk_bendchi2_bin = -1;
115120
for (int i = 0; i < n_bendchi2; i++) {
@@ -123,7 +128,7 @@ std::vector<float> TrackQuality::featureTransform(TTTrack<Ref_Phase2TrackerDigi_
123128

124129
// bin chi2rphi variable (bins from https://twiki.cern.ch/twiki/bin/viewauth/CMS/HybridDataFormat#Fitted_Tracks_written_by_KalmanF)
125130
float tmp_trk_chi2rphi = aTrack.chi2XY();
126-
std::vector<float> chi2rphi_bins = {0, 0.25, 0.5, 1, 2, 3, 5, 7, 10, 20, 40, 100, 200, 500, 1000, 3000};
131+
std::array<float, 16> chi2rphi_bins{{0, 0.25, 0.5, 1, 2, 3, 5, 7, 10, 20, 40, 100, 200, 500, 1000, 3000}};
127132
int n_chi2rphi = static_cast<int>(chi2rphi_bins.size());
128133
float tmp_trk_chi2rphi_bin = -1;
129134
for (int i = 0; i < n_chi2rphi; i++) {
@@ -137,7 +142,7 @@ std::vector<float> TrackQuality::featureTransform(TTTrack<Ref_Phase2TrackerDigi_
137142

138143
// bin chi2rz variable (bins from https://twiki.cern.ch/twiki/bin/viewauth/CMS/HybridDataFormat#Fitted_Tracks_written_by_KalmanF)
139144
float tmp_trk_chi2rz = aTrack.chi2Z();
140-
std::vector<float> chi2rz_bins = {0, 0.25, 0.5, 1, 2, 3, 5, 7, 10, 20, 40, 100, 200, 500, 1000, 3000};
145+
std::array<float, 16> chi2rz_bins{{0, 0.25, 0.5, 1, 2, 3, 5, 7, 10, 20, 40, 100, 200, 500, 1000, 3000}};
141146
int n_chi2rz = static_cast<int>(chi2rz_bins.size());
142147
float tmp_trk_chi2rz_bin = -1;
143148
for (int i = 0; i < n_chi2rz; i++) {
@@ -152,33 +157,32 @@ std::vector<float> TrackQuality::featureTransform(TTTrack<Ref_Phase2TrackerDigi_
152157
// get the nstub
153158
std::vector<edm::Ref<edmNew::DetSetVector<TTStub<Ref_Phase2TrackerDigi_>>, TTStub<Ref_Phase2TrackerDigi_>>> stubRefs =
154159
aTrack.getStubRefs();
155-
float tmp_trk_nstub = stubRefs.size();
156-
157-
// While not strictly necessary to define these parameters,
158-
// it is included so each variable is named to avoid confusion
159-
float tmp_trk_big_invr = 500 * abs(aTrack.rInv());
160-
float tmp_trk_tanl = abs(aTrack.tanL());
161-
float tmp_trk_z0 = aTrack.z0();
162-
float tmp_trk_phi = aTrack.phi();
163-
float tmp_trk_pt = aTrack.momentum().perp();
164-
float tmp_trk_eta = aTrack.eta();
165-
float tmp_trk_chi2 = aTrack.chi2();
166-
float tmp_trk_log_chi2 = log(tmp_trk_chi2);
167-
float tmp_trk_log_chi2rphi = log(tmp_trk_chi2rphi);
168-
float tmp_trk_log_chi2rz = log(tmp_trk_chi2rz);
169-
float tmp_trk_log_bendchi2 = log(tmp_trk_bendchi2);
170160

171-
// fill feature map
172-
std::map<std::string, float> feature_map;
173-
feature_map["log_chi2"] = tmp_trk_log_chi2;
174-
feature_map["log_chi2rphi"] = tmp_trk_log_chi2rphi;
175-
feature_map["log_chi2rz"] = tmp_trk_log_chi2rz;
176-
feature_map["log_bendchi2"] = tmp_trk_log_bendchi2;
161+
// fill the feature map
162+
feature_map["nstub"] = stubRefs.size();
163+
feature_map["rinv"] = ONNXInvRScaling_ * abs(aTrack.rInv());
164+
feature_map["tanl"] = abs(aTrack.tanL());
165+
feature_map["z0"] = aTrack.z0();
166+
feature_map["phi"] = aTrack.phi();
167+
feature_map["pt"] = aTrack.momentum().perp();
168+
feature_map["eta"] = aTrack.eta();
169+
170+
float tmp_trk_chi2 = aTrack.chi2();
177171
feature_map["chi2"] = tmp_trk_chi2;
172+
feature_map["log_chi2"] = log(tmp_trk_chi2);
173+
178174
feature_map["chi2rphi"] = tmp_trk_chi2rphi;
175+
feature_map["log_chi2rphi"] = log(tmp_trk_chi2rphi);
176+
179177
feature_map["chi2rz"] = tmp_trk_chi2rz;
178+
feature_map["log_chi2rz"] = log(tmp_trk_chi2rz);
179+
180+
feature_map["chi2rz"] = tmp_trk_chi2rz;
181+
feature_map["log_chi2rz"] = log(tmp_trk_chi2rz);
182+
180183
feature_map["bendchi2"] = tmp_trk_bendchi2;
181-
feature_map["nstub"] = tmp_trk_nstub;
184+
feature_map["log_bendchi2"] = log(tmp_trk_bendchi2);
185+
182186
feature_map["lay1_hits"] = float(hitpattern_expanded_binary[0]);
183187
feature_map["lay2_hits"] = float(hitpattern_expanded_binary[1]);
184188
feature_map["lay3_hits"] = float(hitpattern_expanded_binary[2]);
@@ -190,14 +194,10 @@ std::vector<float> TrackQuality::featureTransform(TTTrack<Ref_Phase2TrackerDigi_
190194
feature_map["disk3_hits"] = float(hitpattern_expanded_binary[8]);
191195
feature_map["disk4_hits"] = float(hitpattern_expanded_binary[9]);
192196
feature_map["disk5_hits"] = float(hitpattern_expanded_binary[10]);
193-
feature_map["rinv"] = tmp_trk_big_invr;
194-
feature_map["tanl"] = tmp_trk_tanl;
195-
feature_map["z0"] = tmp_trk_z0;
196-
feature_map["phi"] = tmp_trk_phi;
197+
197198
feature_map["dtot"] = float(tmp_trk_dtot);
198199
feature_map["ltot"] = float(tmp_trk_ltot);
199-
feature_map["pt"] = tmp_trk_pt;
200-
feature_map["eta"] = tmp_trk_eta;
200+
201201
feature_map["nlaymiss_interior"] = float(tmp_trk_nlaymiss_interior);
202202
feature_map["bendchi2_bin"] = tmp_trk_bendchi2_bin;
203203
feature_map["chi2rphi_bin"] = tmp_trk_chi2rphi_bin;
@@ -212,7 +212,7 @@ std::vector<float> TrackQuality::featureTransform(TTTrack<Ref_Phase2TrackerDigi_
212212
}
213213

214214
void TrackQuality::setTrackQuality(TTTrack<Ref_Phase2TrackerDigi_>& aTrack) {
215-
if (this->qualityAlgorithm_ == "Cut") {
215+
if (this->qualityAlgorithm_ == QualityAlgorithm::Cut) {
216216
// Get Track parameters
217217
float trk_pt = aTrack.momentum().perp();
218218
float trk_bend_chi2 = aTrack.stubPtConsistency();
@@ -232,7 +232,7 @@ void TrackQuality::setTrackQuality(TTTrack<Ref_Phase2TrackerDigi_>& aTrack) {
232232
aTrack.settrkMVA1(classification);
233233
}
234234

235-
if ((this->qualityAlgorithm_ == "NN") || (this->qualityAlgorithm_ == "GBDT")) {
235+
if ((this->qualityAlgorithm_ == QualityAlgorithm::NN) || (this->qualityAlgorithm_ == QualityAlgorithm::GBDT)) {
236236
// Setup ONNX input and output names and arrays
237237
std::vector<std::string> ortinput_names;
238238
std::vector<std::string> ortoutput_names;
@@ -255,11 +255,11 @@ void TrackQuality::setTrackQuality(TTTrack<Ref_Phase2TrackerDigi_>& aTrack) {
255255
// Run classification
256256
ortoutputs = Runtime.run(ortinput_names, ortinput, {}, ortoutput_names, batch_size);
257257

258-
if (this->qualityAlgorithm_ == "NN") {
258+
if (this->qualityAlgorithm_ == QualityAlgorithm::NN) {
259259
aTrack.settrkMVA1(ortoutputs[0][0]);
260260
}
261261

262-
if (this->qualityAlgorithm_ == "GBDT") {
262+
else if (this->qualityAlgorithm_ == QualityAlgorithm::GBDT) {
263263
aTrack.settrkMVA1(ortoutputs[1][1]);
264264
}
265265
// Slight differences in the ONNX models of the GBDTs and NNs mean different
@@ -271,14 +271,14 @@ void TrackQuality::setTrackQuality(TTTrack<Ref_Phase2TrackerDigi_>& aTrack) {
271271
}
272272
}
273273

274-
void TrackQuality::setCutParameters(std::string const& qualityAlgorithm,
274+
void TrackQuality::setCutParameters(std::string const& AlgorithmString,
275275
float maxZ0,
276276
float maxEta,
277277
float chi2dofMax,
278278
float bendchi2Max,
279279
float minPt,
280280
int nStubmin) {
281-
qualityAlgorithm_ = qualityAlgorithm;
281+
qualityAlgorithm_ = QualityAlgorithm::Cut;
282282
maxZ0_ = maxZ0;
283283
maxEta_ = maxEta;
284284
chi2dofMax_ = chi2dofMax;
@@ -287,11 +287,18 @@ void TrackQuality::setCutParameters(std::string const& qualityAlgorithm,
287287
nStubsmin_ = nStubmin;
288288
}
289289

290-
void TrackQuality::setONNXModel(std::string const& qualityAlgorithm,
290+
void TrackQuality::setONNXModel(std::string const& AlgorithmString,
291291
edm::FileInPath const& ONNXmodel,
292292
std::string const& ONNXInputName,
293293
std::vector<std::string> const& featureNames) {
294-
qualityAlgorithm_ = qualityAlgorithm;
294+
//Convert algorithm string to Enum class for track by track comparison
295+
if (AlgorithmString == "NN") {
296+
qualityAlgorithm_ = QualityAlgorithm::NN;
297+
} else if (AlgorithmString == "GBDT") {
298+
qualityAlgorithm_ = QualityAlgorithm::GBDT;
299+
} else {
300+
qualityAlgorithm_ = QualityAlgorithm::None;
301+
}
295302
ONNXmodel_ = ONNXmodel;
296303
ONNXInputName_ = ONNXInputName;
297304
featureNames_ = featureNames;

0 commit comments

Comments
 (0)