CMS 3D CMS Logo

L1TrackerEtMissEmulatorProducer.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: L1Trigger/L1TTrackMatch
4 // Class: L1TrackerEtMissEmulatorProducer
5 //
12 //
13 // Original Author: Christopher Brown
14 // Created: Fri, 19 Feb 2021
15 // Updated: Wed, 16 Jun 2021
16 //
17 //
18 
19 // system include files
20 #include <memory>
21 #include <numeric>
22 // user include files
38 
39 using namespace l1t;
40 
42 public:
44  typedef std::vector<L1TTTrackType> L1TTTrackCollectionType;
47 
48  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
49 
52 
53 private:
54  virtual void beginJob();
55  void produce(edm::Event&, const edm::EventSetup&) override;
56  virtual void endJob();
57 
58  // ----------member data ---------------------------
59 
60  std::vector<l1tmetemu::global_phi_t> cosLUT_; // Cos LUT array
61  std::vector<l1tmetemu::eta_t> EtaRegionsLUT_; // Various precomputed LUTs
62  std::vector<l1tmetemu::z_t> DeltaZLUT_;
63  std::vector<l1tmetemu::global_phi_t> phiQuadrants_;
64  std::vector<l1tmetemu::global_phi_t> phiShifts_;
65 
74 
75  vector<double> z0Thresholds_;
76  vector<double> etaRegions_;
77 
78  l1tmetemu::z_t deltaZ0_ = 0;
79 
81  int debug_;
82  bool cordicDebug_ = false;
83 
84  bool GTTinput_ = false;
85 
87 
89 
92 };
93 
94 // constructor//
96  : pvToken_(consumes<L1VertexCollectionType>(iConfig.getParameter<edm::InputTag>("L1VertexInputTag"))),
97  trackToken_(consumes<L1TTTrackCollectionType>(iConfig.getParameter<edm::InputTag>("L1TrackInputTag"))) {
98  // Setup LUTs
102 
103  // Get Emulator config parameters
104  cordicSteps_ = (int)iConfig.getParameter<int>("nCordicSteps");
105  debug_ = (int)iConfig.getParameter<int>("debug");
106 
107  GTTinput_ = (bool)iConfig.getParameter<bool>("useGTTinput");
108 
110 
111  // Name of output ED Product
112  L1MetCollectionName_ = (std::string)iConfig.getParameter<std::string>("L1MetCollectionName");
113 
114  // Input parameter cuts and convert to correct integer representations
115  maxZ0_ = l1tmetemu::digitizeSignedValue<l1tmetemu::z_t>(
116  (double)iConfig.getParameter<double>("maxZ0"), l1tmetemu::kInternalVTXWidth, l1tmetemu::kStepZ0);
117  minZ0_ = (1 << TTTrack_TrackWord::TrackBitWidths::kZ0Size) - maxZ0_;
118 
119  maxEta_ = l1tmetemu::digitizeSignedValue<l1tmetemu::eta_t>(
120  (double)iConfig.getParameter<double>("maxEta"), l1tmetemu::kInternalEtaWidth, l1tmetemu::kStepEta);
121 
122  chi2rphiMax_ =
123  l1tmetemu::getBin((double)iConfig.getParameter<double>("chi2rphidofMax"), TTTrack_TrackWord::chi2RPhiBins);
124  chi2rzMax_ = l1tmetemu::getBin((double)iConfig.getParameter<double>("chi2rzdofMax"), TTTrack_TrackWord::chi2RZBins);
125  bendChi2Max_ =
126  l1tmetemu::getBin((double)iConfig.getParameter<double>("bendChi2Max"), TTTrack_TrackWord::bendChi2Bins);
127 
128  minPt_ = l1tmetemu::digitizeSignedValue<l1tmetemu::pt_t>(
129  (double)iConfig.getParameter<double>("minPt"), l1tmetemu::kInternalPtWidth, l1tmetemu::kStepPt);
130 
131  nStubsmin_ = (l1tmetemu::nstub_t)iConfig.getParameter<int>("nStubsmin");
132 
133  z0Thresholds_ = iConfig.getParameter<std::vector<double>>("z0Thresholds");
134  etaRegions_ = iConfig.getParameter<std::vector<double>>("etaRegions");
135 
136  if (debug_ == 5) {
137  cordicDebug_ = true;
138  }
139 
140  // To have same bin spacing between 0 and pi/2 as between original phi
141  // granularity
142  int cosLUTbins = floor(l1tmetemu::kMaxCosLUTPhi / l1tmetemu::kStepPhi);
143 
144  // Compute LUTs
145  cosLUT_ = l1tmetemu::generateCosLUT(cosLUTbins);
148 
149  produces<std::vector<EtSum>>(L1MetCollectionName_);
150 }
151 
153 
155  using namespace edm;
156 
157  std::unique_ptr<std::vector<l1t::EtSum>> METCollection(new std::vector<l1t::EtSum>(0));
158 
160  iEvent.getByToken(pvToken_, L1VertexHandle);
161 
162  edm::Handle<L1TTTrackCollectionType> L1TTTrackHandle;
163  iEvent.getByToken(trackToken_, L1TTTrackHandle);
164 
165  // Initialize cordic class
167 
168  if (!L1VertexHandle.isValid()) {
169  LogError("L1TrackerEtMissEmulatorProducer") << "\nWarning: VertexCollection not found in the event. Exit\n";
170  return;
171  }
172 
173  if (!L1TTTrackHandle.isValid()) {
174  LogError("L1TrackerEtMissEmulatorProducer") << "\nWarning: L1TTTrackCollection not found in the event. Exit\n";
175  return;
176  }
177 
178  // Initialize sector sums, need 0 initialization in case a sector has no
179  // tracks
180  l1tmetemu::Et_t sumPx[l1tmetemu::kNSector * 2] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
181  l1tmetemu::Et_t sumPy[l1tmetemu::kNSector * 2] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
182  int sector_totals[l1tmetemu::kNSector] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
183 
184  // Track counters
185  int num_tracks{0};
186  int num_assoc_tracks{0};
187  int num_quality_tracks{0};
188 
189  // Get reference to first vertex in event vertex collection
190  L1VertexType& vtx = const_cast<L1VertexType&>(L1VertexHandle->at(0));
191 
192  for (const auto& track : *L1TTTrackHandle) {
193  num_tracks++;
194  L1TTTrackType& track_ref = const_cast<L1TTTrackType&>(track); // Get Reference to track to pass to TrackTransform
195 
196  // Convert to internal track representation
198 
199  // Parameter cuts
200  if (EtTrack.pt < minPt_)
201  continue;
202 
203  // Z signed so double bound
204  if (EtTrack.z0 & (1 << (l1tmetemu::kInternalVTXWidth - 1))) {
205  // if negative
206  if (EtTrack.z0 <= maxZ0_)
207  continue;
208  } else {
209  if (EtTrack.z0 > minZ0_)
210  continue;
211  }
212  if (EtTrack.eta > maxEta_)
213  continue;
214 
215  // Quality Cuts
216  if (EtTrack.chi2rphidof >= chi2rphiMax_)
217  continue;
218 
219  if (EtTrack.chi2rzdof >= chi2rzMax_)
220  continue;
221 
222  if (EtTrack.bendChi2 >= bendChi2Max_)
223  continue;
224 
225  if (EtTrack.nstubs < nStubsmin_)
226  continue;
227 
228  num_quality_tracks++;
229 
230  // Temporary int representation to get the difference
233 
234  l1tmetemu::z_t z_diff = abs(tempz - temppv);
235 
236  // Track to vertex association, adaptive z window based on eta region
237  for (unsigned int reg = 0; reg < l1tmetemu::kNEtaRegion; reg++) {
238  if (EtTrack.eta >= EtaRegionsLUT_[reg] && EtTrack.eta < EtaRegionsLUT_[reg + 1]) {
239  deltaZ0_ = DeltaZLUT_[reg];
240  break;
241  }
242  }
243 
244  if (z_diff <= deltaZ0_) {
245  num_assoc_tracks++;
246  if (debug_ == 7) {
247  edm::LogVerbatim("L1TrackerEtMissEmulatorProducer")
248  << "Track to Vertex ID: " << num_tracks << "\n"
249  << "Phi Sector: " << EtTrack.Sector << " pT: " << EtTrack.pt << " Phi: " << EtTrack.globalPhi
250  << " TanL: " << EtTrack.eta << " Z0: " << EtTrack.z0 << " Nstub: " << EtTrack.nstubs
251  << " Chi2rphi: " << EtTrack.chi2rphidof << " Chi2rz: " << EtTrack.chi2rzdof
252  << " bendChi2: " << EtTrack.bendChi2 << " PV: " << EtTrack.pV << "\n"
253  << "--------------------------------------------------------------\n";
254  }
255 
256  if (debug_ == 2) {
257  edm::LogVerbatim("L1TrackerEtMissEmulatorProducer")
258  << "========================Phi debug=================================\n"
259  << "Int pT: " << EtTrack.pt << "\n"
260  << "Int Phi: " << EtTrack.globalPhi << " Float Phi: " << EtTrack.phi
261  << " Actual Float Cos(Phi): " << cos(EtTrack.phi) << " Actual Float Sin(Phi): " << sin(EtTrack.phi) << "\n";
262  }
263  l1tmetemu::Et_t temppx = 0;
264  l1tmetemu::Et_t temppy = 0;
265 
266  // Split tracks in phi quadrants and access cosLUT_, backwards iteration
267  // through cosLUT_ gives sin Sum sector Et -ve when cos or sin phi are -ve
268  sector_totals[EtTrack.Sector] += 1;
269  if (EtTrack.globalPhi >= phiQuadrants_[0] && EtTrack.globalPhi < phiQuadrants_[1]) {
270  temppx = (EtTrack.pt * cosLUT_[EtTrack.globalPhi]);
271  temppy = (EtTrack.pt * cosLUT_[phiQuadrants_[1] - 1 - EtTrack.globalPhi]);
272 
273  if (debug_ == 2) {
274  edm::LogVerbatim("L1TrackerEtMissEmulatorProducer")
275  << "Sector: " << EtTrack.Sector << " Quadrant: " << 1 << "\n"
276  << "Int Phi: " << EtTrack.globalPhi << " Int Cos(Phi): " << cosLUT_[EtTrack.globalPhi]
277  << " Int Sin(Phi): " << cosLUT_[phiQuadrants_[1] - 1 - EtTrack.globalPhi] << "\n"
278 
279  << "Float Phi: " << (float)EtTrack.globalPhi / l1tmetemu::kGlobalPhiBins
280  << " Float Cos(Phi): " << (float)cosLUT_[EtTrack.globalPhi] / l1tmetemu::kGlobalPhiBins
281  << " Float Sin(Phi): "
282  << (float)cosLUT_[phiQuadrants_[1] - 1 - EtTrack.globalPhi] / l1tmetemu::kGlobalPhiBins << "\n";
283  }
284  } else if (EtTrack.globalPhi >= phiQuadrants_[1] && EtTrack.globalPhi < phiQuadrants_[2]) {
285  temppx = -(EtTrack.pt * cosLUT_[phiQuadrants_[2] - 1 - EtTrack.globalPhi]);
286  temppy = (EtTrack.pt * cosLUT_[EtTrack.globalPhi - phiQuadrants_[1]]);
287 
288  if (debug_ == 2) {
289  edm::LogVerbatim("L1TrackerEtMissEmulatorProducer")
290  << "Sector: " << EtTrack.Sector << " Quadrant: " << 2 << "\n"
291  << "Int Phi: " << EtTrack.globalPhi << " Int Cos(Phi): -"
292  << cosLUT_[phiQuadrants_[2] - 1 - EtTrack.globalPhi]
293  << " Int Sin(Phi): " << cosLUT_[EtTrack.globalPhi - phiQuadrants_[1]] << "\n"
294 
295  << "Float Phi: " << (float)EtTrack.globalPhi / l1tmetemu::kGlobalPhiBins << " Float Cos(Phi): -"
296  << (float)cosLUT_[phiQuadrants_[2] - 1 - EtTrack.globalPhi] / l1tmetemu::kGlobalPhiBins
297  << " Float Sin(Phi): " << (float)cosLUT_[EtTrack.globalPhi - phiQuadrants_[1]] / l1tmetemu::kGlobalPhiBins
298  << "\n";
299  }
300  } else if (EtTrack.globalPhi >= phiQuadrants_[2] && EtTrack.globalPhi < phiQuadrants_[3]) {
301  temppx = -(EtTrack.pt * cosLUT_[EtTrack.globalPhi - phiQuadrants_[2]]);
302  temppy = -(EtTrack.pt * cosLUT_[phiQuadrants_[3] - 1 - EtTrack.globalPhi]);
303 
304  if (debug_ == 2) {
305  edm::LogVerbatim("L1TrackerEtMissEmulatorProducer")
306  << "Sector: " << EtTrack.Sector << " Quadrant: " << 3 << "\n"
307  << "Int Phi: " << EtTrack.globalPhi << " Int Cos(Phi): -" << cosLUT_[EtTrack.globalPhi - phiQuadrants_[2]]
308  << " Int Sin(Phi): -" << cosLUT_[phiQuadrants_[3] - 1 - EtTrack.globalPhi] << "\n"
309 
310  << "Float Phi: " << (float)EtTrack.globalPhi / l1tmetemu::kGlobalPhiBins << " Float Cos(Phi): -"
311  << (float)cosLUT_[EtTrack.globalPhi - phiQuadrants_[2]] / l1tmetemu::kGlobalPhiBins
312  << " Float Sin(Phi): -"
313  << (float)cosLUT_[phiQuadrants_[3] - 1 - EtTrack.globalPhi] / l1tmetemu::kGlobalPhiBins << "\n";
314  }
315 
316  } else if (EtTrack.globalPhi >= phiQuadrants_[3] && EtTrack.globalPhi < phiQuadrants_[4]) {
317  temppx = (EtTrack.pt * cosLUT_[phiQuadrants_[4] - 1 - EtTrack.globalPhi]);
318  temppy = -(EtTrack.pt * cosLUT_[EtTrack.globalPhi - phiQuadrants_[3]]);
319 
320  if (debug_ == 2) {
321  edm::LogVerbatim("L1TrackerEtMissEmulatorProducer")
322  << "Sector: " << EtTrack.Sector << " Quadrant: " << 4 << "\n"
323  << "Int Phi: " << EtTrack.globalPhi
324  << " Int Cos(Phi): " << cosLUT_[phiQuadrants_[4] - 1 - EtTrack.globalPhi] << " Int Sin(Phi): -"
325  << cosLUT_[EtTrack.globalPhi - phiQuadrants_[3]] << "\n"
326 
327  << "Float Phi: " << (float)EtTrack.globalPhi / l1tmetemu::kGlobalPhiBins << " Float Cos(Phi): "
328  << (float)cosLUT_[phiQuadrants_[4] - 1 - EtTrack.globalPhi] / l1tmetemu::kGlobalPhiBins
329  << " Float Sin(Phi): -"
330  << (float)cosLUT_[EtTrack.globalPhi - phiQuadrants_[3]] / l1tmetemu::kGlobalPhiBins << "\n";
331  }
332  } else {
333  temppx = 0;
334  temppy = 0;
335  }
336  if (EtTrack.EtaSector) {
337  sumPx[EtTrack.Sector] = sumPx[EtTrack.Sector] + temppx;
338  sumPy[EtTrack.Sector] = sumPy[EtTrack.Sector] + temppy;
339  } else {
340  sumPx[l1tmetemu::kNSector + EtTrack.Sector] = sumPx[l1tmetemu::kNSector + EtTrack.Sector] + temppx;
341  sumPy[l1tmetemu::kNSector + EtTrack.Sector] = sumPy[l1tmetemu::kNSector + EtTrack.Sector] + temppy;
342  }
343  }
344 
345  } // end loop over tracks
346 
347  l1tmetemu::Et_t GlobalPx = 0;
348  l1tmetemu::Et_t GlobalPy = 0;
349 
350  float tempsumPx = 0;
351  float tempsumPy = 0;
352 
353  // Global Et sum as floats to emulate rounding in HW
354  for (unsigned int i = 0; i < l1tmetemu::kNSector * 2; i++) {
355  tempsumPx += floor((float)sumPx[i] / (float)l1tmetemu::kGlobalPhiBins);
356  tempsumPy += floor((float)sumPy[i] / (float)l1tmetemu::kGlobalPhiBins);
357  }
358 
359  // Recast rounded temporary sums into Et_t datatype
360  GlobalPx = tempsumPx;
361  GlobalPy = tempsumPy;
362 
363  // Perform cordic sqrt, take x,y and converts to polar coordinate r,phi where
364  // r=sqrt(x**2+y**2) and phi = atan(y/x)
365  l1tmetemu::EtMiss EtMiss = cordicSqrt.toPolar(GlobalPx, GlobalPy);
366 
367  // Recentre phi
368  l1tmetemu::METphi_t tempPhi = 0;
369 
370  if ((GlobalPx < 0) && (GlobalPy < 0))
371  tempPhi = EtMiss.Phi - l1tmetemu::kMETPhiBins / 2;
372  else if ((GlobalPx >= 0) && (GlobalPy >= 0))
373  tempPhi = (EtMiss.Phi) + l1tmetemu::kMETPhiBins / 2;
374  else if ((GlobalPx >= 0) && (GlobalPy < 0))
375  tempPhi = EtMiss.Phi - l1tmetemu::kMETPhiBins / 2;
376  else if ((GlobalPx < 0) && (GlobalPy >= 0))
377  tempPhi = EtMiss.Phi - 3 * l1tmetemu::kMETPhiBins / 2;
378 
379  if (debug_ == 6) {
380  std::string flpxarray[l1tmetemu::kNSector * 2];
381  std::string flpyarray[l1tmetemu::kNSector * 2];
382 
383  std::string intpxarray[l1tmetemu::kNSector * 2];
384  std::string intpyarray[l1tmetemu::kNSector * 2];
385 
386  std::string totalsarray[l1tmetemu::kNSector * 2];
387 
388  for (unsigned int i = 0; i < l1tmetemu::kNSector * 2; i++) {
389  flpxarray[i] = to_string(sumPx[i] * l1tmetemu::kStepPt) + "|";
390  flpyarray[i] = to_string(sumPy[i] * l1tmetemu::kStepPt) + "|";
391  intpxarray[i] = to_string(floor((float)sumPx[i] / (float)l1tmetemu::kGlobalPhiBins)) + "|";
392  intpyarray[i] = to_string(floor((float)sumPy[i] / (float)l1tmetemu::kGlobalPhiBins)) + "|";
393  totalsarray[i] = to_string(sector_totals[i]) + "|";
394  }
395 
396  edm::LogVerbatim("L1TrackerEtMissEmulatorProducer")
397  << "====Sector Pt====\n"
398  << "Float Px: " << flpxarray << "Float Py: " << flpyarray << "Integer Px: " << intpyarray
399  << "Integer Px: " << intpyarray << "Sector Totals: " << totalsarray
400 
401  << "====Global Pt====\n"
402  << "Integer Global Px: " << GlobalPx << "| Integer Global Py: " << GlobalPy << "\n"
403  << "Float Global Px: " << GlobalPx * l1tmetemu::kStepPt
404  << "| Float Global Py: " << GlobalPy * l1tmetemu::kStepPt << "\n";
405  }
406 
407  if (debug_ == 6) {
408  edm::LogVerbatim("L1TrackerEtMissEmulatorProducer")
409  << "====MET===\n"
410  << "Integer MET: " << EtMiss.Et << "| Integer MET phi: " << EtMiss.Phi << "\n"
411  << "Float MET: " << (EtMiss.Et) * l1tmetemu::kStepMET
412  << "| Float MET phi: " << (float)tempPhi * l1tmetemu::kStepMETPhi - M_PI << "\n"
413  << "# Intial Tracks: " << num_tracks << "\n"
414  << "# Tracks after Quality Cuts: " << num_quality_tracks << "\n"
415  << "# Tracks Associated to Vertex: " << num_assoc_tracks << "\n"
416  << "========================================================\n";
417  }
418 
419  math::XYZTLorentzVector missingEt(-GlobalPx, -GlobalPy, 0, EtMiss.Et);
420  EtSum L1EtSum(missingEt, EtSum::EtSumType::kMissingEt, (int)EtMiss.Et, 0, (int)tempPhi, (int)num_assoc_tracks);
421 
422  METCollection->push_back(L1EtSum);
423 
425 } // end producer
426 
428 
430 
431 // ------------ method fills 'descriptions' with the allowed parameters for the module ------------
433  //The following says we do not know what parameters are allowed so do no validation
434  // Please change this to state exactly what you do use, even if it is no parameters
436  desc.setUnknown();
437  descriptions.addDefault(desc);
438 }
439 
440 // define this as a plug-in
const unsigned int kGlobalPhiBins
Log< level::Info, true > LogVerbatim
static constexpr std::array< double, 1<< TrackBitWidths::kChi2RPhiSize > chi2RPhiBins
std::vector< eta_t > generateEtaRegionLUT(std::vector< double > EtaRegions)
ap_uint< kMETPhiSize > METphi_t
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
TTTrack< Ref_Phase2TrackerDigi_ > L1TTTrackType
TTTrack_TrackWord::chi2rphi_t chi2rphidof
std::vector< l1tmetemu::global_phi_t > phiQuadrants_
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
int unpackSignedValue(unsigned int bits, unsigned int nBits)
std::vector< l1tmetemu::global_phi_t > getPhiShift() const
ap_uint< kInternalVTXWidth > z_t
std::string to_string(const V &value)
Definition: OMSAccess.h:71
const double kStepEta
std::vector< z_t > generateDeltaZLUT(std::vector< double > DeltaZBins)
delete x;
Definition: CaloConfig.h:22
std::vector< l1tmetemu::eta_t > EtaRegionsLUT_
EtMiss cordicSqrt(Et_t x, Et_t y, int cordicSteps, std::vector< l1tmhtemu::MHTphi_t > atanLUT, std::vector< Et_t > magNormalisationLUT)
const unsigned int kNEtaRegion
const double kStepPt
const double kStepMET
static constexpr std::array< double, 1<< TrackBitWidths::kBendChi2Size > bendChi2Bins
Log< level::Error, false > LogError
std::vector< reco::MET > METCollection
collection of MET objects
Definition: METCollection.h:22
TTTrack_TrackWord::chi2rz_t chi2rzdof
const edm::EDGetTokenT< L1VertexCollectionType > pvToken_
void beginJob()
Definition: Breakpoints.cc:14
const unsigned int kNSector
const unsigned int kInternalVTXWidth
XYZTLorentzVectorD XYZTLorentzVector
Lorentz vector with cylindrical internal representation using pseudorapidity.
Definition: LorentzVector.h:29
int iEvent
Definition: GenABIO.cc:224
const edm::EDGetTokenT< L1TTTrackCollectionType > trackToken_
void addDefault(ParameterSetDescription const &psetDescription)
void produce(edm::Event &, const edm::EventSetup &) override
const double kStepZ0
std::vector< l1tmetemu::global_phi_t > getPhiQuad() const
L1TrackerEtMissEmulatorProducer(const edm::ParameterSet &)
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
const unsigned int kMETPhiBins
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
Definition: Cordic.h:7
const unsigned int kMETSize
std::vector< VertexWord > VertexWordCollection
Definition: VertexWord.h:195
ap_uint< kInternalEtaWidth > eta_t
Collection of MET.
ap_uint< TrackBitWidths::kChi2RZSize > chi2rz_t
#define M_PI
const unsigned int kInternalPtWidth
std::vector< l1tmetemu::global_phi_t > phiShifts_
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
l1tmetemu::nstub_t nstubs
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
Class to store the L1 Track Trigger tracks.
Definition: TTTrack.h:29
unsigned int getBin(double value, const T &bins)
std::vector< global_phi_t > generateCosLUT(unsigned int size)
l1tmetemu::global_phi_t globalPhi
bool isValid() const
Definition: HandleBase.h:70
const float kMaxCosLUTPhi
std::vector< l1tmetemu::global_phi_t > cosLUT_
HLT enums.
TTTrack_TrackWord::bendChi2_t bendChi2
const unsigned int kInternalEtaWidth
static constexpr std::array< double, 1<< TrackBitWidths::kChi2RZSize > chi2RZBins
ap_uint< 3 > nstub_t
std::vector< L1TTTrackType > L1TTTrackCollectionType
ap_uint< TrackBitWidths::kChi2RPhiSize > chi2rphi_t
InternalEtWord transformTrack(track &track_ref, vertex &PV)
def move(src, dest)
Definition: eostools.py:511
ap_uint< kInternalPtWidth > pt_t
ap_int< kInternalPtWidth+kEtExtra > Et_t
ap_uint< TrackBitWidths::kBendChi2Size > bendChi2_t
const double kStepPhi
const double kStepMETPhi