CMS 3D CMS Logo

L1GTProducer.cc
Go to the documentation of this file.
4 
7 
10 
16 
19 
22 
30 
32 
33 #include <vector>
34 #include <array>
35 #include <string>
36 #include <type_traits>
37 
38 namespace l1t {
39 
41  public:
42  explicit L1GTProducer(const edm::ParameterSet &);
43  ~L1GTProducer() override = default;
44 
46 
47  private:
51 
54  void produceGMTTkMuons(edm::Event &event) const;
55 
56  void produceCL2JetsSC4(edm::Event &event) const;
57  void produceCL2JetsSC8(edm::Event &event) const;
58  void produceCL2Photons(edm::Event &event) const;
60  void produceCL2Taus(edm::Event &event) const;
61  void produceCL2EtSum(edm::Event &event) const;
62  void produceCl2HtSum(edm::Event &event) const;
63 
64  void produce(edm::StreamID, edm::Event &, const edm::EventSetup &) const override;
65 
67 
71 
75 
83  };
84 
86  : scales_(config.getParameter<edm::ParameterSet>("scales")),
87  gttPromptJetToken_(consumes<TkJetWordCollection>(config.getParameter<edm::InputTag>("GTTPromptJets"))),
88  gttDisplacedJetToken_(consumes<TkJetWordCollection>(config.getParameter<edm::InputTag>("GTTDisplacedJets"))),
89  gttPrimaryVertexToken_(consumes<VertexWordCollection>(config.getParameter<edm::InputTag>("GTTPrimaryVert"))),
90  gmtSaPromptMuonToken_(consumes<SAMuonCollection>(config.getParameter<edm::InputTag>("GMTSaPromptMuons"))),
91  gmtSaDisplacedMuonToken_(consumes<SAMuonCollection>(config.getParameter<edm::InputTag>("GMTSaDisplacedMuons"))),
92  gmtTkMuonToken_(consumes<TrackerMuonCollection>(config.getParameter<edm::InputTag>("GMTTkMuons"))),
93  cl2JetSC4Token_(consumes<PFJetCollection>(config.getParameter<edm::InputTag>("CL2JetsSC4"))),
94  cl2JetSC8Token_(consumes<PFJetCollection>(config.getParameter<edm::InputTag>("CL2JetsSC8"))),
95  cl2PhotonToken_(consumes<TkEmCollection>(config.getParameter<edm::InputTag>("CL2Photons"))),
96  cl2ElectronToken_(consumes<TkElectronCollection>(config.getParameter<edm::InputTag>("CL2Electrons"))),
97  cl2TauToken_(consumes<PFTauCollection>(config.getParameter<edm::InputTag>("CL2Taus"))),
98  cl2EtSumToken_(consumes<std::vector<l1t::EtSum>>(config.getParameter<edm::InputTag>("CL2EtSum"))),
99  cl2HtSumToken_(consumes<std::vector<l1t::EtSum>>(config.getParameter<edm::InputTag>("CL2HtSum"))) {
100  produces<P2GTCandidateCollection>("GTTPromptJets");
101  produces<P2GTCandidateCollection>("GTTDisplacedJets");
102  produces<P2GTCandidateCollection>("GTTPrimaryVert");
103 
104  produces<P2GTCandidateCollection>("GMTSaPromptMuons");
105  produces<P2GTCandidateCollection>("GMTSaDisplacedMuons");
106  produces<P2GTCandidateCollection>("GMTTkMuons");
107 
108  produces<P2GTCandidateCollection>("CL2JetsSC4");
109  produces<P2GTCandidateCollection>("CL2JetsSC8");
110  produces<P2GTCandidateCollection>("CL2Photons");
111  produces<P2GTCandidateCollection>("CL2Electrons");
112  produces<P2GTCandidateCollection>("CL2Taus");
113  produces<P2GTCandidateCollection>("CL2EtSum");
114  produces<P2GTCandidateCollection>("CL2HtSum");
115  }
116 
119 
120  edm::ParameterSetDescription scalesDesc;
122  desc.add<edm::ParameterSetDescription>("scales", scalesDesc);
123 
124  desc.add<edm::InputTag>("GTTPromptJets");
125  desc.add<edm::InputTag>("GTTDisplacedJets");
126  desc.add<edm::InputTag>("GTTPrimaryVert");
127 
128  desc.add<edm::InputTag>("GMTSaPromptMuons");
129  desc.add<edm::InputTag>("GMTSaDisplacedMuons");
130  desc.add<edm::InputTag>("GMTTkMuons");
131 
132  desc.add<edm::InputTag>("CL2JetsSC4");
133  desc.add<edm::InputTag>("CL2JetsSC8");
134  desc.add<edm::InputTag>("CL2Photons");
135  desc.add<edm::InputTag>("CL2Electrons");
136  desc.add<edm::InputTag>("CL2Taus");
137  desc.add<edm::InputTag>("CL2EtSum");
138  desc.add<edm::InputTag>("CL2HtSum");
139 
140  description.addWithDefaultLabel(desc);
141  }
142 
144  std::unique_ptr<P2GTCandidateCollection> outputCollection = std::make_unique<P2GTCandidateCollection>();
146  for (std::size_t i = 0; i < collection.size() && i < 10; i++) {
147  const VertexWord &obj = collection[i];
148  int hwZ0 = obj.z0Word().V.to_int() * 5;
149  P2GTCandidate gtObj(
151  gtObj.hwZ0_ = hwZ0;
152  gtObj.hwQualityScore_ = obj.qualityWord().V.to_int();
153  gtObj.hwSum_pT_pv_ = obj.multiplicityWord().V.to_int();
154  gtObj.hwNumber_of_tracks_in_pv_ = obj.multiplicityWord().V.to_int();
155  gtObj.hwNumber_of_tracks_not_in_pv_ = obj.inverseMultiplicityWord().V.to_int();
157 
158  outputCollection->push_back(gtObj);
159  }
160  event.put(std::move(outputCollection), "GTTPrimaryVert");
161  }
162 
164  std::unique_ptr<P2GTCandidateCollection> outputCollection = std::make_unique<P2GTCandidateCollection>();
166  for (std::size_t i = 0; i < collection.size() && i < 12; i++) {
167  const TkJetWord &obj = collection[i];
168  int hwZ0 = obj.z0Word().V.to_int() << 7;
169  P2GTCandidate gtObj(0,
171  scales_.to_eta(obj.glbEtaWord().V.to_int()),
172  scales_.to_phi(obj.glbPhiWord().V.to_int()),
173  0),
175  gtObj.hwPT_ = obj.ptWord().V.to_int();
176  gtObj.hwPhi_ = obj.glbPhiWord().V.to_int();
177  gtObj.hwEta_ = obj.glbEtaWord().V.to_int();
178  gtObj.hwZ0_ = hwZ0;
179  gtObj.hwNumber_of_tracks_ = obj.ntWord().V.to_int();
181 
182  outputCollection->push_back(gtObj);
183  }
184  event.put(std::move(outputCollection), "GTTPromptJets");
185  }
186 
188  std::unique_ptr<P2GTCandidateCollection> outputCollection = std::make_unique<P2GTCandidateCollection>();
190  for (std::size_t i = 0; i < collection.size() && i < 12; i++) {
191  const TkJetWord &obj = collection[i];
192  int hwZ0 = obj.z0Word().V.to_int() << 7;
193  P2GTCandidate gtObj(0,
195  scales_.to_eta(obj.glbEtaWord().V.to_int()),
196  scales_.to_phi(obj.glbPhiWord().V.to_int()),
197  0),
199  gtObj.hwPT_ = obj.ptWord().V.to_int();
200  gtObj.hwPhi_ = obj.glbPhiWord().V.to_int();
201  gtObj.hwEta_ = obj.glbEtaWord().V.to_int();
202  gtObj.hwZ0_ = hwZ0;
203  gtObj.hwNumber_of_tracks_ = obj.ntWord().V.to_int();
205 
206  outputCollection->push_back(gtObj);
207  }
208  event.put(std::move(outputCollection), "GTTDisplacedJets");
209  }
210 
212  std::unique_ptr<P2GTCandidateCollection> outputCollection = std::make_unique<P2GTCandidateCollection>();
214  for (size_t i = 0; i < collection.size() && i < 12; i++) {
215  const SAMuon &obj = collection[i];
216  int hwZ0 = obj.apZ0().to_int() << 12;
217  P2GTCandidate gtObj(scales_.to_chg(obj.apCharge().to_int()),
219  scales_.to_eta(obj.apEta().to_int()),
220  scales_.to_phi(obj.apPhi().to_int()),
221  0),
223  gtObj.hwPT_ = obj.apPt().to_int();
224  gtObj.hwPhi_ = obj.apPhi().to_int();
225  gtObj.hwEta_ = obj.apEta().to_int();
226  gtObj.hwZ0_ = hwZ0;
227  gtObj.hwQualityScore_ = obj.apQualFlags().to_int();
228  gtObj.hwCharge_ = obj.apCharge().to_int();
229  gtObj.hwD0_ = obj.apD0().to_int();
231 
232  outputCollection->push_back(gtObj);
233  }
234  event.put(std::move(outputCollection), "GMTSaPromptMuons");
235  }
236 
238  std::unique_ptr<P2GTCandidateCollection> outputCollection = std::make_unique<P2GTCandidateCollection>();
240  for (size_t i = 0; i < collection.size() && i < 12; i++) {
241  const SAMuon &obj = collection[i];
242  int hwZ0 = obj.apZ0().to_int() << 12;
243  P2GTCandidate gtObj(scales_.to_chg(obj.apCharge().to_int()),
245  scales_.to_eta(obj.apEta().to_int()),
246  scales_.to_phi(obj.apPhi().to_int()),
247  0),
249  gtObj.hwPT_ = obj.apPt().to_int();
250  gtObj.hwPhi_ = obj.apPhi().to_int();
251  gtObj.hwEta_ = obj.apEta().to_int();
252  gtObj.hwZ0_ = hwZ0;
253  gtObj.hwQualityScore_ = obj.apQualFlags().to_int();
254  gtObj.hwCharge_ = obj.apCharge().to_int();
255  gtObj.hwD0_ = obj.apD0().to_int();
257 
258  outputCollection->push_back(gtObj);
259  }
260  event.put(std::move(outputCollection), "GMTSaDisplacedMuons");
261  }
262 
264  std::unique_ptr<P2GTCandidateCollection> outputCollection = std::make_unique<P2GTCandidateCollection>();
266  for (size_t i = 0; i < collection.size() && i < 12; i++) {
267  const TrackerMuon &obj = collection[i];
268  int hwZ0 = obj.apZ0().to_int() << 7;
269  P2GTCandidate gtObj(scales_.to_chg(obj.apCharge().to_int()),
271  scales_.to_eta(obj.apEta().to_int()),
272  scales_.to_phi(obj.apPhi().to_int()),
273  0),
275  gtObj.hwPT_ = obj.apPt().to_int();
276  gtObj.hwPhi_ = obj.apPhi().to_int();
277  gtObj.hwEta_ = obj.apEta().to_int();
278  gtObj.hwZ0_ = hwZ0;
279  gtObj.hwQualityScore_ = obj.apQualFlags().to_int();
280  gtObj.hwIsolationPT_ = obj.apIso().to_int();
281  gtObj.hwCharge_ = obj.apCharge().to_int();
282  gtObj.hwD0_ = obj.apD0().to_int();
283  gtObj.hwBeta_ = obj.apBeta().to_int();
285 
286  outputCollection->push_back(gtObj);
287  }
288  event.put(std::move(outputCollection), "GMTTkMuons");
289  }
290 
292  std::unique_ptr<P2GTCandidateCollection> outputCollection = std::make_unique<P2GTCandidateCollection>();
293  const PFJetCollection &collection = event.get(cl2JetSC4Token_);
294  for (size_t i = 0; i < collection.size() && i < 12; i++) {
295  l1gt::Jet gtJet = l1gt::Jet::unpack(collection[i].getHWJetGT());
296  int hwZ0 = gtJet.z0.V.to_int() << 7;
297  P2GTCandidate gtObj(0,
299  scales_.to_eta(gtJet.v3.eta.V.to_int()),
300  scales_.to_phi(gtJet.v3.phi.V.to_int()),
301  0),
303  gtObj.hwPT_ = gtJet.v3.pt.V.to_int();
304  gtObj.hwPhi_ = gtJet.v3.phi.V.to_int();
305  gtObj.hwEta_ = gtJet.v3.eta.V.to_int();
306  gtObj.hwZ0_ = hwZ0;
308 
309  outputCollection->push_back(gtObj);
310  }
311  event.put(std::move(outputCollection), "CL2JetsSC4");
312  }
313 
315  std::unique_ptr<P2GTCandidateCollection> outputCollection = std::make_unique<P2GTCandidateCollection>();
316  const PFJetCollection &collection = event.get(cl2JetSC8Token_);
317  for (size_t i = 0; i < collection.size() && i < 12; i++) {
318  l1gt::Jet gtJet = l1gt::Jet::unpack(collection[i].getHWJetGT());
319  int hwZ0 = gtJet.z0.V.to_int() << 7;
320  P2GTCandidate gtObj(0,
322  scales_.to_eta(gtJet.v3.eta.V.to_int()),
323  scales_.to_phi(gtJet.v3.phi.V.to_int()),
324  0),
326  gtObj.hwPT_ = gtJet.v3.pt.V.to_int();
327  gtObj.hwPhi_ = gtJet.v3.phi.V.to_int();
328  gtObj.hwEta_ = gtJet.v3.eta.V.to_int();
329  gtObj.hwZ0_ = hwZ0;
331 
332  outputCollection->push_back(gtObj);
333  }
334  event.put(std::move(outputCollection), "CL2JetsSC8");
335  }
336 
338  std::unique_ptr<P2GTCandidateCollection> outputCollection = std::make_unique<P2GTCandidateCollection>();
339  const TkEmCollection &collection = event.get(cl2PhotonToken_);
340  for (size_t i = 0; i < collection.size() && i < 12; i++) {
341  l1gt::Photon gtPhoton = collection[i].hwObj();
342  P2GTCandidate gtObj(0,
344  scales_.to_eta(gtPhoton.v3.eta.V.to_int()),
345  scales_.to_phi(gtPhoton.v3.phi.V.to_int()),
346  0));
347  gtObj.hwPT_ = gtPhoton.v3.pt.V.to_int();
348  gtObj.hwPhi_ = gtPhoton.v3.phi.V.to_int();
349  gtObj.hwEta_ = gtPhoton.v3.eta.V.to_int();
350  gtObj.hwIsolationPT_ = gtPhoton.isolationPT.V.to_int();
351  gtObj.hwQualityFlags_ = gtPhoton.qualityFlags.V.to_int();
352  gtObj.objectType_ = P2GTCandidate::CL2Photons;
353 
354  outputCollection->push_back(gtObj);
355  }
356  event.put(std::move(outputCollection), "CL2Photons");
357  }
358 
360  std::unique_ptr<P2GTCandidateCollection> outputCollection = std::make_unique<P2GTCandidateCollection>();
362  for (size_t i = 0; i < collection.size() && i < 12; i++) {
363  l1gt::Electron gtElectron = collection[i].hwObj();
364  int hwZ0 = gtElectron.z0.V.to_int() << 7;
365  P2GTCandidate gtObj(scales_.to_chg(gtElectron.charge.V.to_int()),
367  scales_.to_eta(gtElectron.v3.eta.V.to_int()),
368  scales_.to_phi(gtElectron.v3.phi.V.to_int()),
369  0),
371  gtObj.hwPT_ = gtElectron.v3.pt.V.to_int();
372  gtObj.hwPhi_ = gtElectron.v3.phi.V.to_int();
373  gtObj.hwEta_ = gtElectron.v3.eta.V.to_int();
374  gtObj.hwZ0_ = hwZ0;
375  gtObj.hwIsolationPT_ = gtElectron.isolationPT.V.to_int();
376  gtObj.hwQualityFlags_ = gtElectron.qualityFlags.V.to_int();
377  gtObj.hwCharge_ = gtElectron.charge.V.to_int();
379 
380  outputCollection->push_back(gtObj);
381  }
382  event.put(std::move(outputCollection), "CL2Electrons");
383  }
384 
386  std::unique_ptr<P2GTCandidateCollection> outputCollection = std::make_unique<P2GTCandidateCollection>();
387  const PFTauCollection &collection = event.get(cl2TauToken_);
388  for (size_t i = 0; i < collection.size() && i < 12; i++) {
389  l1gt::Tau gtTau = collection[i].getHWTauGT();
390  P2GTCandidate gtObj(scales_.to_chg(gtTau.charge.V.to_int()),
392  scales_.to_eta(gtTau.v3.eta.V.to_int()),
393  scales_.to_phi(gtTau.v3.phi.V.to_int()),
394  0));
395  gtObj.hwPT_ = gtTau.v3.pt.V.to_int();
396  gtObj.hwPhi_ = gtTau.v3.phi.V.to_int();
397  gtObj.hwEta_ = gtTau.v3.eta.V.to_int();
398  gtObj.hwSeed_pT_ = gtTau.seed_pt.V.to_int();
399  gtObj.hwSeed_z0_ = gtTau.seed_z0.V.to_int();
400  gtObj.hwCharge_ = gtTau.charge.V.to_int();
401  gtObj.hwType_ = gtTau.type.V.to_int();
402  gtObj.hwQualityScore_ = gtTau.quality.V.to_int();
403  gtObj.objectType_ = P2GTCandidate::CL2Taus;
404 
405  outputCollection->push_back(gtObj);
406  }
407  event.put(std::move(outputCollection), "CL2Taus");
408  }
409 
411  std::unique_ptr<P2GTCandidateCollection> outputCollection = std::make_unique<P2GTCandidateCollection>();
412  const std::vector<EtSum> &collection = event.get(cl2EtSumToken_);
413  const EtSum &met = collection[0];
414 
415  l1gt::Sum sum{true /* valid */, met.pt(), met.phi() / l1gt::Scales::ETAPHI_LSB, 0 /* scalar sum */};
416 
417  P2GTCandidate gtObj(0,
419  scales_.to_pT(sum.vector_pt.V.to_int()), 0, scales_.to_phi(sum.vector_phi.V.to_int()), 0));
420  gtObj.hwPT_ = sum.vector_pt.V.to_int();
421  gtObj.hwPhi_ = sum.vector_phi.V.to_int();
422  gtObj.hwScalarSumPT_ = sum.scalar_pt.V.to_int();
423  gtObj.objectType_ = P2GTCandidate::CL2EtSum;
424 
425  outputCollection->push_back(gtObj);
426  event.put(std::move(outputCollection), "CL2EtSum");
427  }
428 
430  std::unique_ptr<P2GTCandidateCollection> outputCollection = std::make_unique<P2GTCandidateCollection>();
431  const std::vector<EtSum> &collection = event.get(cl2HtSumToken_);
432  const EtSum &ht = collection[0];
433  const EtSum &mht = collection[1];
434 
435  P2GTCandidate gtObj(
436  0, reco::ParticleState::PolarLorentzVector(scales_.to_pT(mht.hwPt()), 0, scales_.to_phi(mht.hwPhi()), 0));
437  gtObj.hwPT_ = mht.hwPt();
438  gtObj.hwPhi_ = mht.hwPhi();
439  gtObj.hwScalarSumPT_ = ht.hwPt();
440  gtObj.objectType_ = P2GTCandidate::CL2HtSum;
441 
442  outputCollection->push_back(gtObj);
443  event.put(std::move(outputCollection), "CL2HtSum");
444  }
445 
450 
454 
462  }
463 } // namespace l1t
464 
465 using namespace l1t;
466 
~L1GTProducer() override=default
egquality_t qualityFlags
Definition: gt_datatypes.h:316
const edm::EDGetTokenT< VertexWordCollection > gttPrimaryVertexToken_
Definition: L1GTProducer.cc:70
std::vector< l1t::TkJetWord > TkJetWordCollection
Definition: TkJetWord.h:191
std::vector< TkElectron > TkElectronCollection
Definition: TkElectronFwd.h:16
std::vector< l1t::PFTau > PFTauCollection
Definition: PFTau.h:90
const edm::EDGetTokenT< TkElectronCollection > cl2ElectronToken_
Definition: L1GTProducer.cc:79
L1GTProducer(const edm::ParameterSet &)
Definition: L1GTProducer.cc:85
Optional< int > hwNumber_of_tracks_in_pv_
const L1GTScales scales_
Definition: L1GTProducer.cc:66
math::PtEtaPhiMLorentzVector PolarLorentzVector
Lorentz vector.
Definition: ParticleState.h:29
Optional< int > hwIsolationPT_
const edm::EDGetTokenT< TkJetWordCollection > gttPromptJetToken_
Definition: L1GTProducer.cc:68
void produceCL2JetsSC8(edm::Event &event) const
double to_phi(int value) const
Definition: L1GTScales.h:82
ObjectType objectType_
int to_chg(int value) const
Definition: L1GTScales.h:87
static void fillPSetDescription(edm::ParameterSetDescription &)
Definition: L1GTScales.cc:53
delete x;
Definition: CaloConfig.h:22
Definition: config.py:1
math::XYZPoint Point
point in the space
Definition: ParticleState.h:31
Optional< int > hwD0_
void produceGMTSaPromptMuons(edm::Event &event) const
const edm::EDGetTokenT< std::vector< l1t::EtSum > > cl2HtSumToken_
Definition: L1GTProducer.cc:82
iso_t isolationPT
Definition: gt_datatypes.h:317
const edm::EDGetTokenT< PFTauCollection > cl2TauToken_
Definition: L1GTProducer.cc:80
double to_z0(int value) const
Definition: L1GTScales.h:84
void produceCL2Taus(edm::Event &event) const
void produceCL2Photons(edm::Event &event) const
Optional< int > hwCharge_
static Jet unpack(const std::array< uint64_t, 2 > &src)
Definition: gt_datatypes.h:129
std::vector< l1t::PFJet > PFJetCollection
Definition: PFJet.h:61
Optional< int > hwQualityScore_
std::vector< TkEm > TkEmCollection
Definition: TkEmFwd.h:17
double to_eta(int value) const
Definition: L1GTScales.h:83
void produceCL2Electrons(edm::Event &event) const
void produceGMTTkMuons(edm::Event &event) const
Optional< int > hwQualityFlags_
Optional< int > hwPT_
const edm::EDGetTokenT< PFJetCollection > cl2JetSC4Token_
Definition: L1GTProducer.cc:76
void produceGTTPromptJets(edm::Event &event) const
egquality_t qualityFlags
Definition: gt_datatypes.h:264
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
const edm::EDGetTokenT< TrackerMuonCollection > gmtTkMuonToken_
Definition: L1GTProducer.cc:74
std::vector< VertexWord > VertexWordCollection
Definition: VertexWord.h:197
const edm::EDGetTokenT< std::vector< l1t::EtSum > > cl2EtSumToken_
Definition: L1GTProducer.cc:81
ThreeVector v3
Definition: gt_datatypes.h:263
void produceCL2EtSum(edm::Event &event) const
static void fillDescriptions(edm::ConfigurationDescriptions &)
void produceCL2JetsSC4(edm::Event &event) const
const edm::EDGetTokenT< SAMuonCollection > gmtSaDisplacedMuonToken_
Definition: L1GTProducer.cc:73
void produceGTTDisplacedJets(edm::Event &event) const
std::vector< TrackerMuon > TrackerMuonCollection
Definition: TrackerMuon.h:17
std::vector< SAMuon > SAMuonCollection
Definition: SAMuon.h:15
void produce(edm::StreamID, edm::Event &, const edm::EventSetup &) const override
Optional< int > hwNumber_of_tracks_
const edm::EDGetTokenT< SAMuonCollection > gmtSaPromptMuonToken_
Definition: L1GTProducer.cc:72
const edm::EDGetTokenT< PFJetCollection > cl2JetSC8Token_
Definition: L1GTProducer.cc:77
double to_pT(int value) const
Definition: L1GTScales.h:81
constexpr float ETAPHI_LSB
Definition: gt_datatypes.h:45
ThreeVector v3
Definition: gt_datatypes.h:315
HLT enums.
void produceCl2HtSum(edm::Event &event) const
Optional< int > hwSum_pT_pv_
ap_uint< 1 > charge
Definition: gt_datatypes.h:265
Optional< int > hwNumber_of_tracks_not_in_pv_
void produceGTTPrimaryVert(edm::Event &event) const
Optional< int > hwPhi_
const edm::EDGetTokenT< TkEmCollection > cl2PhotonToken_
Definition: L1GTProducer.cc:78
Optional< int > hwEta_
def move(src, dest)
Definition: eostools.py:511
Optional< int > hwBeta_
void produceGMTSaDisplacedMuons(edm::Event &event) const
Definition: event.py:1
const edm::EDGetTokenT< TkJetWordCollection > gttDisplacedJetToken_
Definition: L1GTProducer.cc:69
Optional< int > hwZ0_