Skip to content

Commit 96ce323

Browse files
authored
Merge pull request #48935 from cms-ngt-hlt/ngtScoutingTrackExtras
[NGT] Add extra NGT scouting track table producer, when using `NANO:@NGTScoutingVal`
2 parents 0da6816 + acb3675 commit 96ce323

File tree

5 files changed

+186
-30
lines changed

5 files changed

+186
-30
lines changed
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
#include <memory>
2+
3+
// user include files
4+
#include "CommonTools/Utils/interface/StringCutObjectSelector.h"
5+
#include "DataFormats/BeamSpot/interface/BeamSpot.h"
6+
#include "DataFormats/Common/interface/ValueMap.h"
7+
#include "DataFormats/NanoAOD/interface/FlatTable.h"
8+
#include "DataFormats/TrackReco/interface/Track.h"
9+
#include "DataFormats/TrackReco/interface/TrackFwd.h"
10+
#include "FWCore/Framework/interface/Event.h"
11+
#include "FWCore/Framework/interface/Frameworkfwd.h"
12+
#include "FWCore/Framework/interface/MakerMacros.h"
13+
#include "FWCore/Framework/interface/stream/EDProducer.h"
14+
#include "FWCore/ParameterSet/interface/ParameterSet.h"
15+
#include "FWCore/Utilities/interface/StreamID.h"
16+
17+
//
18+
// class declaration
19+
//
20+
21+
class HLTTracksExtraTableProducer : public edm::stream::EDProducer<> {
22+
public:
23+
explicit HLTTracksExtraTableProducer(const edm::ParameterSet&);
24+
static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
25+
26+
private:
27+
void produce(edm::Event&, const edm::EventSetup&) override;
28+
29+
// ----------member data ---------------------------
30+
const bool skipNonExistingSrc_;
31+
const std::string tableName_;
32+
const unsigned int precision_;
33+
const edm::EDGetTokenT<std::vector<reco::Track>> tracks_;
34+
const edm::EDGetTokenT<reco::BeamSpot> beamSpot_;
35+
};
36+
37+
//
38+
// constructors
39+
//
40+
41+
HLTTracksExtraTableProducer::HLTTracksExtraTableProducer(const edm::ParameterSet& params)
42+
: skipNonExistingSrc_(params.getParameter<bool>("skipNonExistingSrc")),
43+
tableName_(params.getParameter<std::string>("tableName")),
44+
precision_(params.getParameter<int>("precision")),
45+
tracks_(consumes<std::vector<reco::Track>>(params.getParameter<edm::InputTag>("tracksSrc"))),
46+
beamSpot_(consumes<reco::BeamSpot>(params.getParameter<edm::InputTag>("beamSpot"))) {
47+
produces<nanoaod::FlatTable>(tableName_);
48+
}
49+
50+
//
51+
// member functions
52+
//
53+
54+
// ------------ method called to produce the data ------------
55+
void HLTTracksExtraTableProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
56+
using namespace edm;
57+
58+
//vertex collection
59+
auto tracksIn = iEvent.getHandle(tracks_);
60+
auto beamSpotIn = iEvent.getHandle(beamSpot_);
61+
const size_t nTracks = tracksIn.isValid() ? (*tracksIn).size() : 0;
62+
63+
static constexpr float default_value = std::numeric_limits<float>::quiet_NaN();
64+
65+
// initialize to quiet Nans
66+
std::vector<float> v_dxyBS(nTracks, default_value);
67+
std::vector<float> v_dzBS(nTracks, default_value);
68+
69+
if ((tracksIn.isValid() && beamSpotIn.isValid()) || !(this->skipNonExistingSrc_)) {
70+
const auto& tracks = *tracksIn;
71+
const auto& beamSpot = *beamSpotIn;
72+
math::XYZPoint point(beamSpot.x0(), beamSpot.y0(), beamSpot.z0());
73+
for (size_t tk_index = 0; tk_index < nTracks; ++tk_index) {
74+
v_dxyBS[tk_index] = tracks[tk_index].dxy(point);
75+
v_dzBS[tk_index] = tracks[tk_index].dz(point);
76+
}
77+
} else {
78+
edm::LogWarning("HLTTracksExtraTableProducer")
79+
<< " Invalid handle for " << tableName_ << " in tracks input collection";
80+
}
81+
82+
//table for all primary vertices
83+
auto tracksTable = std::make_unique<nanoaod::FlatTable>(nTracks, tableName_, /*singleton*/ false, /*extension*/ true);
84+
tracksTable->addColumn<float>("dzBS", v_dzBS, "tracks dz() w.r.t Beam Spot", precision_);
85+
tracksTable->addColumn<float>("dxyBS", v_dxyBS, "tracks dxy() w.r.t Beam Spot", precision_);
86+
iEvent.put(std::move(tracksTable), tableName_);
87+
}
88+
89+
// ------------ fill 'descriptions' with the allowed parameters for the module ------------
90+
void HLTTracksExtraTableProducer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
91+
edm::ParameterSetDescription desc;
92+
93+
desc.add<bool>("skipNonExistingSrc", false)
94+
->setComment("whether or not to skip producing the table on absent input product");
95+
desc.add<std::string>("tableName")->setComment("name of the flat table ouput");
96+
desc.add<edm::InputTag>("tracksSrc")->setComment("std::vector<reco::Track> input collections");
97+
desc.add<edm::InputTag>("beamSpot")->setComment("input BeamSpot collection");
98+
desc.add<int>("precision", 7);
99+
descriptions.addWithDefaultLabel(desc);
100+
}
101+
102+
// ------------ define this as a plug-in ------------
103+
DEFINE_FWK_MODULE(HLTTracksExtraTableProducer);

HLTrigger/NGTScouting/plugins/HLTVertexTableProducer.cc

Lines changed: 44 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
// user include files
44
#include "CommonTools/Utils/interface/StringCutObjectSelector.h"
5-
#include "DataFormats/Candidate/interface/VertexCompositePtrCandidate.h"
65
#include "DataFormats/Common/interface/ValueMap.h"
76
#include "DataFormats/NanoAOD/interface/FlatTable.h"
87
#include "DataFormats/ParticleFlowCandidate/interface/PFCandidate.h"
@@ -37,6 +36,7 @@ class HLTVertexTableProducer : public edm::stream::EDProducer<> {
3736
const edm::EDGetTokenT<edm::ValueMap<float>> pvsScore_;
3837
const StringCutObjectSelector<reco::Vertex> goodPvCut_;
3938
const std::string goodPvCutString_;
39+
const bool usePF_;
4040
const std::string pvName_;
4141
const double dlenMin_, dlenSigMin_;
4242
};
@@ -52,11 +52,11 @@ HLTVertexTableProducer::HLTVertexTableProducer(const edm::ParameterSet& params)
5252
pvsScore_(consumes<edm::ValueMap<float>>(params.getParameter<edm::InputTag>("pvSrc"))),
5353
goodPvCut_(params.getParameter<std::string>("goodPvCut"), true),
5454
goodPvCutString_(params.getParameter<std::string>("goodPvCut")),
55+
usePF_(params.getParameter<bool>("usePF")),
5556
pvName_(params.getParameter<std::string>("pvName")),
5657
dlenMin_(params.getParameter<double>("dlenMin")),
5758
dlenSigMin_(params.getParameter<double>("dlenSigMin")) {
5859
produces<nanoaod::FlatTable>("PV");
59-
produces<edm::PtrVector<reco::VertexCompositePtrCandidate>>();
6060
}
6161

6262
//
@@ -69,6 +69,7 @@ void HLTVertexTableProducer::produce(edm::Event& iEvent, const edm::EventSetup&
6969

7070
//vertex collection
7171
auto pvsIn = iEvent.getHandle(pvs_);
72+
auto pvScoreIn = iEvent.getHandle(pvsScore_);
7273
const size_t nPVs = pvsIn.isValid() ? (*pvsIn).size() : 0;
7374

7475
static constexpr float default_value = std::numeric_limits<float>::quiet_NaN();
@@ -90,7 +91,6 @@ void HLTVertexTableProducer::produce(edm::Event& iEvent, const edm::EventSetup&
9091

9192
if (pvsIn.isValid() || !(this->skipNonExistingSrc_)) {
9293
const auto& pvs = *pvsIn;
93-
const auto& pvsScoreProd = iEvent.get(pvsScore_);
9494

9595
auto pfcIn = iEvent.getHandle(pfc_);
9696
const bool isPfcValid = pfcIn.isValid();
@@ -109,40 +109,55 @@ void HLTVertexTableProducer::produce(edm::Event& iEvent, const edm::EventSetup&
109109
v_zError[i] = pv.zError();
110110
v_nTracks[i] = pv.nTracks();
111111
v_is_good[i] = goodPvCut_(pv);
112-
v_pv_score[i] = pvsScoreProd.get(pvsIn.id(), i);
113112

114-
float sumpt2 = 0.f, sumpx = 0.f, sumpy = 0.f;
113+
if (pvScoreIn.isValid() || !(this->skipNonExistingSrc_)) {
114+
const auto& pvsScoreProd = *pvScoreIn;
115+
v_pv_score[i] = pvsScoreProd.get(pvsIn.id(), i);
116+
}
115117

116-
if (isPfcValid || !(this->skipNonExistingSrc_)) {
117-
for (const auto& obj : *pfcIn) {
118-
if (obj.charge() == 0 || !obj.trackRef().isNonnull())
119-
continue;
118+
float sumpt2 = 0.f, sumpx = 0.f, sumpy = 0.f;
120119

121-
const auto dz = std::abs(obj.trackRef()->dz(pos));
122-
if (dz >= 0.2)
123-
continue;
120+
if (usePF_) {
121+
if (isPfcValid || !(this->skipNonExistingSrc_)) {
122+
for (const auto& obj : *pfcIn) {
123+
if (obj.charge() == 0 || !obj.trackRef().isNonnull())
124+
continue;
124125

125-
bool isClosest = true;
126-
for (size_t j = 0; j < nPVs; ++j) {
127-
if (j == i)
126+
const auto dz = std::abs(obj.trackRef()->dz(pos));
127+
if (dz >= 0.2)
128128
continue;
129-
const auto dz_j = std::abs(obj.trackRef()->dz(pvs[j].position()));
130-
if (dz_j < dz) {
131-
isClosest = false;
132-
break;
129+
130+
bool isClosest = true;
131+
for (size_t j = 0; j < nPVs; ++j) {
132+
if (j == i)
133+
continue;
134+
const auto dz_j = std::abs(obj.trackRef()->dz(pvs[j].position()));
135+
if (dz_j < dz) {
136+
isClosest = false;
137+
break;
138+
}
133139
}
134-
}
135140

136-
if (isClosest) {
137-
const float pt = obj.pt();
138-
sumpt2 += pt * pt;
139-
sumpx += obj.px();
140-
sumpy += obj.py();
141+
if (isClosest) {
142+
const float pt = obj.pt();
143+
sumpt2 += pt * pt;
144+
sumpx += obj.px();
145+
sumpy += obj.py();
146+
}
141147
}
148+
} else {
149+
edm::LogWarning("HLTVertexTableProducer")
150+
<< " Invalid handle for " << pvName_ << " in PF candidate input collection";
142151
}
143152
} else {
144-
edm::LogWarning("HLTVertexTableProducer")
145-
<< " Invalid handle for " << pvName_ << " in PF candidate input collection";
153+
// Loop over tracks used in PV fit
154+
for (auto t = pv.tracks_begin(); t != pv.tracks_end(); ++t) {
155+
const auto& trk = **t; // trk is a reco::TrackBase
156+
const float pt = trk.pt();
157+
sumpt2 += pt * pt;
158+
sumpx += trk.px();
159+
sumpy += trk.py();
160+
}
146161
}
147162
v_pv_sumpt2[i] = sumpt2;
148163
v_pv_sumpx[i] = sumpx;
@@ -186,6 +201,8 @@ void HLTVertexTableProducer::fillDescriptions(edm::ConfigurationDescriptions& de
186201
desc.add<std::string>("pvName")->setComment("name of the flat table ouput");
187202
desc.add<edm::InputTag>("pvSrc")->setComment(
188203
"std::vector<reco::Vertex> and ValueMap<float> primary vertex input collections");
204+
desc.add<bool>("usePF", true)
205+
->setComment("if true, use PF candidate-based association; if false, use only tracks used in PV fit");
189206
desc.add<edm::InputTag>("pfSrc")->setComment("reco::PFCandidateCollection PF candidates input collections");
190207
desc.add<std::string>("goodPvCut")->setComment("selection on the primary vertex");
191208
desc.add<double>("dlenMin")->setComment("minimum value of dl to select secondary vertex");

HLTrigger/NGTScouting/python/HLTNanoProducer_cff.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
#+ hltTriggerAcceptFilter
4848
+ hltVertexTable
4949
+ hltPixelTrackTable
50+
+ hltPixelVertexTable
5051
+ hltGeneralTrackTable
5152
+ hltEgammaPacker
5253
+ hltPhotonTable
@@ -70,6 +71,7 @@
7071
+ dstTriggerAcceptFilter
7172
+ hltVertexTable
7273
+ hltPixelTrackTable
74+
+ hltPixelVertexTable
7375
+ hltGeneralTrackTable
7476
+ hltEgammaPacker
7577
+ hltPhotonTable
@@ -88,6 +90,11 @@
8890
+ HTTable
8991
)
9092

93+
trackingExtraNanoProducer = cms.Sequence(
94+
hltPixelTrackExtTable+
95+
hltGeneralTrackExtTable
96+
)
97+
9198
def hltNanoCustomize(process):
9299

93100
if hasattr(process, "NANOAODSIMoutput"):
@@ -108,6 +115,10 @@ def hltNanoCustomize(process):
108115
def hltNanoValCustomize(process):
109116
if hasattr(process, "dstNanoProducer"):
110117

111-
process.dstNanoProducer += (process.hltTiclAssociationsTableSequence + process.hltSimTracksterSequence + process.hltSimTiclCandidateTable + process.hltSimTiclCandidateExtraTable )
118+
process.dstNanoProducer += (process.hltTiclAssociationsTableSequence +
119+
process.hltSimTracksterSequence +
120+
process.hltSimTiclCandidateTable +
121+
process.hltSimTiclCandidateExtraTable +
122+
process.trackingExtraNanoProducer)
112123

113124
return process

HLTrigger/NGTScouting/python/hltTracks_cfi.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
phi = Var("phi()", "float", doc = "#phi (rad)"),
1616
dXY = Var("dxy()", "float", doc = "dXY (cm)"),
1717
dZ = Var("dz()", "float", doc = "dZ (cm)"),
18+
dxyError = Var("dxyError()", "float", doc = "dxyError (cm)"),
19+
dZError = Var("dzError()", "float", doc = "dzError (cm)"),
1820
t0 = Var("t0()", "float", doc = "t0 (ns)"),
1921
vx = Var("vx()", "float", doc = "vx (cm)"),
2022
vy = Var("vy()", "float", doc = "vy (cm)"),
@@ -30,6 +32,13 @@
3032
)
3133
)
3234

35+
hltPixelTrackExtTable = cms.EDProducer("HLTTracksExtraTableProducer",
36+
tableName = cms.string("hltPixelTrack"),
37+
skipNonExistingSrc = cms.bool(True),
38+
tracksSrc = cms.InputTag("hltPhase2PixelTracks"),
39+
beamSpot = cms.InputTag("hltOnlineBeamSpot"),
40+
precision = cms.int32(7))
41+
3342
hltGeneralTrackTable = cms.EDProducer(
3443
"SimpleTriggerTrackFlatTableProducer",
3544
skipNonExistingSrc = cms.bool(True),
@@ -55,3 +64,10 @@
5564
ndof = Var("ndof()", "float", doc = "Number of degrees of freedom"),
5665
)
5766
)
67+
68+
hltGeneralTrackExtTable = cms.EDProducer("HLTTracksExtraTableProducer",
69+
tableName = cms.string("hltGeneralTrack"),
70+
skipNonExistingSrc = cms.bool(True),
71+
tracksSrc = cms.InputTag("hltGeneralTracks"),
72+
beamSpot = cms.InputTag("hltOnlineBeamSpot"),
73+
precision = cms.int32(7))

HLTrigger/NGTScouting/python/hltVertices_cfi.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,14 @@
88
pfSrc = cms.InputTag("hltParticleFlowTmp"),
99
dlenMin = cms.double(0),
1010
dlenSigMin = cms.double(3),
11-
pvName = cms.string("hltPrimaryVertex"),
12-
)
11+
pvName = cms.string("hltPrimaryVertex"))
12+
13+
hltPixelVertexTable = cms.EDProducer("HLTVertexTableProducer",
14+
skipNonExistingSrc = cms.bool(True),
15+
pvSrc = cms.InputTag("hltPhase2PixelVertices"),
16+
goodPvCut = cms.string(""),
17+
usePF = cms.bool(False), # use directly the tracks from PV fit
18+
pfSrc = cms.InputTag(""),
19+
dlenMin = cms.double(0),
20+
dlenSigMin = cms.double(3),
21+
pvName = cms.string("hltPixelVertex"))

0 commit comments

Comments
 (0)