CMS 3D CMS Logo

L1FPGATrackProducer.cc
Go to the documentation of this file.
1 // Producer by Anders //
3 // and Emmanuele //
4 // july 2012 @ CU //
6 
8 // FRAMEWORK HEADERS
11 //
18 //
22 
24 // DATA FORMATS HEADERS
27 //
33 //
36 
45 //
48 //
56 //
59 //
64 
66 // DETECTOR GEOMETRY HEADERS
77 //
79 
81 // Tracklet emulation
92 
94 // PHYSICS TOOLS
97 
100 
103 
105 // STD HEADERS
106 #include <memory>
107 #include <string>
108 #include <iostream>
109 #include <fstream>
110 
112 // NAMESPACES
113 using namespace edm;
114 using namespace std;
115 using namespace tt;
116 using namespace trklet;
117 
119 // //
120 // CLASS DEFINITION //
121 // //
123 
125 // this class is needed to make a map
126 // between different types of stubs
128 public:
129  bool operator()(const trklet::L1TStub& a, const trklet::L1TStub& b) const {
130  if (a.x() != b.x())
131  return (b.x() > a.x());
132  else if (a.y() != b.y())
133  return (b.y() > a.y());
134  else if (a.z() != b.z())
135  return (a.z() > b.z());
136  else
137  return a.bend() > b.bend();
138  }
139 };
140 
141 class L1FPGATrackProducer : public edm::one::EDProducer<edm::one::WatchRuns> {
142 public:
144  explicit L1FPGATrackProducer(const edm::ParameterSet& iConfig);
145  ~L1FPGATrackProducer() override;
146 
147 private:
148  int eventnum;
149 
152 
154 
160 
163 
165  std::ofstream asciiEventOut_;
166 
167  // settings containing various constants for the tracklet processing
169 
170  // event processor for the tracklet track finding
172 
173  unsigned int nHelixPar_;
174  bool extended_;
175  bool reduced_;
176 
178  std::unique_ptr<L1TrackQuality> trackQualityModel_;
179 
180  std::map<string, vector<int>> dtclayerdisk;
181 
185 
190 
191  // ED output token for clock and bit accurate tracks
193  // ED output token for clock and bit accurate stubs
195  // ChannelAssignment token
197  // helper class to assign tracks to channel
199 
200  // helper class to store DTC configuration
201  const Setup* setup_;
202  // helper class to store configuration needed by HitPatternHelper
204 
205  // Setup token
211 
214  void beginRun(const edm::Run& run, const edm::EventSetup& iSetup) override;
215  void endRun(edm::Run const&, edm::EventSetup const&) override;
216  void produce(edm::Event& iEvent, const edm::EventSetup& iSetup) override;
217 };
218 
220 // CONSTRUCTOR
222  : config(iConfig),
223  readMoreMcTruth_(iConfig.getParameter<bool>("readMoreMcTruth")),
224  MCTruthClusterInputTag(readMoreMcTruth_ ? config.getParameter<edm::InputTag>("MCTruthClusterInputTag")
225  : edm::InputTag()),
226  MCTruthStubInputTag(readMoreMcTruth_ ? config.getParameter<edm::InputTag>("MCTruthStubInputTag")
227  : edm::InputTag()),
228  TrackingParticleInputTag(readMoreMcTruth_ ? iConfig.getParameter<edm::InputTag>("TrackingParticleInputTag")
229  : edm::InputTag()),
230  // book ED products
231  getTokenBS_(consumes<reco::BeamSpot>(config.getParameter<edm::InputTag>("BeamSpotSource"))),
232  getTokenDTC_(consumes<TTDTC>(edm::InputTag(iConfig.getParameter<edm::InputTag>("InputTagTTDTC")))),
233  // book ED output token for clock and bit accurate tracks
234  putTokenTracks_(produces<Streams>("Level1TTTracks")),
235  // book ED output token for clock and bit accurate stubs
236  putTokenStubs_(produces<StreamsStub>("Level1TTTracks")),
237  // book ES products
238  esGetTokenChannelAssignment_(esConsumes<ChannelAssignment, ChannelAssignmentRcd, Transition::BeginRun>()),
239  esGetTokenBfield_(esConsumes<edm::Transition::BeginRun>()),
240  esGetTokenTGeom_(esConsumes()),
241  esGetTokenTTopo_(esConsumes()),
242  esGetToken_(esConsumes<tt::Setup, tt::SetupRcd, edm::Transition::BeginRun>()),
243  esGetTokenHPH_(esConsumes<hph::Setup, hph::SetupRcd, edm::Transition::BeginRun>()) {
244  if (readMoreMcTruth_) {
245  getTokenTTClusterMCTruth_ = consumes<TTClusterAssociationMap<Ref_Phase2TrackerDigi_>>(MCTruthClusterInputTag);
246  getTokenTrackingParticle_ = consumes<std::vector<TrackingParticle>>(TrackingParticleInputTag);
247  }
248 
249  produces<std::vector<TTTrack<Ref_Phase2TrackerDigi_>>>("Level1TTTracks").setBranchAlias("Level1TTTracks");
250 
251  asciiEventOutName_ = iConfig.getUntrackedParameter<string>("asciiFileName", "");
252 
253  fitPatternFile = iConfig.getParameter<edm::FileInPath>("fitPatternFile");
254  processingModulesFile = iConfig.getParameter<edm::FileInPath>("processingModulesFile");
255  memoryModulesFile = iConfig.getParameter<edm::FileInPath>("memoryModulesFile");
256  wiresFile = iConfig.getParameter<edm::FileInPath>("wiresFile");
257 
258  extended_ = iConfig.getParameter<bool>("Extended");
259  reduced_ = iConfig.getParameter<bool>("Reduced");
260  nHelixPar_ = iConfig.getParameter<unsigned int>("Hnpar");
261 
262  if (extended_) {
263  tableTEDFile = iConfig.getParameter<edm::FileInPath>("tableTEDFile");
264  tableTREFile = iConfig.getParameter<edm::FileInPath>("tableTREFile");
265  }
266 
267  // initial ES products
268  channelAssignment_ = nullptr;
269  setup_ = nullptr;
270 
271  // --------------------------------------------------------------------------------
272  // set options in Settings based on inputs from configuration files
273  // --------------------------------------------------------------------------------
274 
278 
283 
284  settings_.setFakefit(iConfig.getParameter<bool>("Fakefit"));
285  settings_.setStoreTrackBuilderOutput(iConfig.getParameter<bool>("StoreTrackBuilderOutput"));
286  settings_.setRemovalType(iConfig.getParameter<string>("RemovalType"));
287  settings_.setDoMultipleMatches(iConfig.getParameter<bool>("DoMultipleMatches"));
288 
289  if (extended_) {
292 
293  //FIXME: The TED and TRE tables are currently disabled by default, so we
294  //need to allow for the additional tracklets that will eventually be
295  //removed by these tables, once they are finalized
297  }
298 
299  eventnum = 0;
300  if (not asciiEventOutName_.empty()) {
301  asciiEventOut_.open(asciiEventOutName_.c_str());
302  }
303 
304  if (settings_.debugTracklet()) {
305  edm::LogVerbatim("Tracklet") << "fit pattern : " << fitPatternFile.fullPath()
306  << "\n process modules : " << processingModulesFile.fullPath()
307  << "\n memory modules : " << memoryModulesFile.fullPath()
308  << "\n wires : " << wiresFile.fullPath();
309  if (extended_) {
310  edm::LogVerbatim("Tracklet") << "table_TED : " << tableTEDFile.fullPath()
311  << "\n table_TRE : " << tableTREFile.fullPath();
312  }
313  }
314 
315  trackQuality_ = iConfig.getParameter<bool>("TrackQuality");
316  if (trackQuality_) {
317  trackQualityModel_ = std::make_unique<L1TrackQuality>(iConfig.getParameter<edm::ParameterSet>("TrackQualityPSet"));
318  }
320  cms::Exception exception("ConfigurationNotSupported.");
321  exception.addContext("L1FPGATrackProducer::produce");
323  exception << "Storing of TrackBuilder output does not support doMultipleMatches.";
324  if (!settings_.removalType().empty())
325  exception << "Storing of TrackBuilder output does not support duplicate removal.";
326  throw exception;
327  }
328 }
329 
331 // DESTRUCTOR
333  if (asciiEventOut_.is_open()) {
334  asciiEventOut_.close();
335  }
336 }
337 
339 //
341 
343 // BEGIN JOB
346  // GET MAGNETIC FIELD //
347  const MagneticField* theMagneticField = &iSetup.getData(esGetTokenBfield_);
348  double mMagneticFieldStrength = theMagneticField->inTesla(GlobalPoint(0, 0, 0)).z();
349  settings_.setBfield(mMagneticFieldStrength);
350 
351  setup_ = &iSetup.getData(esGetToken_);
352 
354 
355  setupHPH_ = &iSetup.getData(esGetTokenHPH_);
356  // Tracklet pattern reco output channel info.
358  // initialize the tracklet event processing (this sets all the processing & memory modules, wiring, etc)
360 }
361 
363 // PRODUCE
365  typedef std::map<trklet::L1TStub,
368  stubMapType;
369  typedef std::map<unsigned int,
371  stubIndexMapType;
373  TTClusterRef;
374 
376  auto L1TkTracksForOutput = std::make_unique<std::vector<TTTrack<Ref_Phase2TrackerDigi_>>>();
377 
378  stubMapType stubMap;
379  stubIndexMapType stubIndexMap;
380 
382  // GET BS //
383  edm::Handle<reco::BeamSpot> beamSpotHandle;
384  iEvent.getByToken(getTokenBS_, beamSpotHandle);
385  math::XYZPoint bsPosition = beamSpotHandle->position();
386 
387  eventnum++;
389  ev.setEventNum(eventnum);
390  ev.setIP(bsPosition.x(), bsPosition.y());
391 
392  // tracking particles
393  edm::Handle<std::vector<TrackingParticle>> TrackingParticleHandle;
394  if (readMoreMcTruth_)
395  iEvent.getByToken(getTokenTrackingParticle_, TrackingParticleHandle);
396 
397  // tracker topology
398  const TrackerTopology* const tTopo = &iSetup.getData(esGetTokenTTopo_);
399  const TrackerGeometry* const theTrackerGeom = &iSetup.getData(esGetTokenTGeom_);
400 
402  // GET THE PRIMITIVES //
403  edm::Handle<TTDTC> handleDTC;
404  iEvent.getByToken<TTDTC>(getTokenDTC_, handleDTC);
405 
406  // must be defined for code to compile, even if it's not used unless readMoreMcTruth_ is true
407  map<edm::Ptr<TrackingParticle>, int> translateTP;
408 
409  // MC truth association maps
411  if (readMoreMcTruth_) {
412  iEvent.getByToken(getTokenTTClusterMCTruth_, MCTruthTTClusterHandle);
413 
416 
417  int ntps = 1; //count from 1 ; 0 will mean invalid
418 
419  int this_tp = 0;
420  if (readMoreMcTruth_) {
421  for (const auto& iterTP : *TrackingParticleHandle) {
422  edm::Ptr<TrackingParticle> tp_ptr(TrackingParticleHandle, this_tp);
423  this_tp++;
424 
425  // only keep TPs producing a cluster
426  if (MCTruthTTClusterHandle->findTTClusterRefs(tp_ptr).empty())
427  continue;
428 
429  if (iterTP.g4Tracks().empty()) {
430  continue;
431  }
432 
433  int sim_eventid = iterTP.g4Tracks().at(0).eventId().event();
434  int sim_type = iterTP.pdgId();
435  float sim_pt = iterTP.pt();
436  float sim_eta = iterTP.eta();
437  float sim_phi = iterTP.phi();
438 
439  float vx = iterTP.vertex().x();
440  float vy = iterTP.vertex().y();
441  float vz = iterTP.vertex().z();
442 
443  if (sim_pt < 1.0 || std::abs(vz) > 100.0 || hypot(vx, vy) > 50.0)
444  continue;
445 
446  ev.addL1SimTrack(sim_eventid, ntps, sim_type, sim_pt, sim_eta, sim_phi, vx, vy, vz);
447 
448  translateTP[tp_ptr] = ntps;
449  ntps++;
450 
451  } //end loop over TPs
452  }
453 
454  } // end if (readMoreMcTruth_)
455 
459 
460  // Process stubs in each region and channel within that tracking region
461  unsigned int theStubIndex = 0;
462  for (const int& region : handleDTC->tfpRegions()) {
463  for (const int& channel : handleDTC->tfpChannels()) {
464  // Get the DTC name & ID from the channel
465  unsigned int atcaSlot = channel % 12;
466  string dtcname = settings_.slotToDTCname(atcaSlot);
467  if (channel % 24 >= 12)
468  dtcname = "neg" + dtcname;
469  dtcname += (channel < 24) ? "_A" : "_B"; // which detector region
470  int dtcId = setup_->dtcId(region, channel);
471 
472  // Get the stubs from the DTC
473  const tt::StreamStub& streamFromDTC{handleDTC->stream(region, channel)};
474 
475  // Prepare the DTC stubs for the IR
476  for (size_t stubIndex = 0; stubIndex < streamFromDTC.size(); ++stubIndex) {
477  const tt::FrameStub& stub{streamFromDTC[stubIndex]};
478  const TTStubRef& stubRef = stub.first;
479 
480  if (stubRef.isNull())
481  continue;
482 
483  const GlobalPoint& ttPos = setup_->stubPos(stubRef);
484 
485  //Get the 2 bits for the layercode
486  string layerword = stub.second.to_string().substr(61, 2);
487  unsigned int layercode = 2 * (layerword[0] - '0') + layerword[1] - '0';
488  assert(layercode < 4);
489 
490  //translation from the two bit layercode to the layer/disk number of each of the
491  //12 channels (dtcs)
492  // FIX: take this from DTC cabling map.
493  static const int layerdisktab[12][4] = {{0, 6, 8, 10},
494  {0, 7, 9, -1},
495  {1, 7, -1, -1},
496  {6, 8, 10, -1},
497  {2, 7, -1, -1},
498  {2, 9, -1, -1},
499  {3, 4, -1, -1},
500  {4, -1, -1, -1},
501  {5, -1, -1, -1},
502  {5, 8, -1, -1},
503  {6, 9, -1, -1},
504  {7, 10, -1, -1}};
505 
506  int layerdisk = layerdisktab[channel % 12][layercode];
507  assert(layerdisk != -1);
508 
509  //Get the 36 bit word - skip the lowest 3 buts (status and layer code)
510  constexpr int DTCLinkWordSize = 64;
511  constexpr int StubWordSize = 36;
512  constexpr int LayerandStatusCodeSize = 3;
513  string stubword =
514  stub.second.to_string().substr(DTCLinkWordSize - StubWordSize - LayerandStatusCodeSize, StubWordSize);
515  string stubwordhex = "";
516 
517  //Loop over the 9 words in the 36 bit stub word
518  for (unsigned int i = 0; i < 9; i++) {
519  bitset<4> bits(stubword.substr(i * 4, 4));
520  ulong val = bits.to_ulong();
521  stubwordhex += ((val < 10) ? ('0' + val) : ('A' + val - 10));
522  }
523 
526  innerCluster = stub.first->clusterRef(0);
528  outerCluster = stub.first->clusterRef(1);
529 
530  // -----------------------------------------------------
531  // check module orientation, if flipped, need to store that information for track fit
532  // -----------------------------------------------------
533 
534  const DetId innerDetId = innerCluster->getDetId();
535  const GeomDetUnit* det_inner = theTrackerGeom->idToDetUnit(innerDetId);
536  const auto* theGeomDet_inner = dynamic_cast<const PixelGeomDetUnit*>(det_inner);
537  const PixelTopology* topol_inner = dynamic_cast<const PixelTopology*>(&(theGeomDet_inner->specificTopology()));
538 
539  MeasurementPoint coords_inner = innerCluster->findAverageLocalCoordinatesCentered();
540  LocalPoint clustlp_inner = topol_inner->localPosition(coords_inner);
541  GlobalPoint posStub_inner = theGeomDet_inner->surface().toGlobal(clustlp_inner);
542 
543  const DetId outerDetId = outerCluster->getDetId();
544  const GeomDetUnit* det_outer = theTrackerGeom->idToDetUnit(outerDetId);
545  const auto* theGeomDet_outer = dynamic_cast<const PixelGeomDetUnit*>(det_outer);
546  const PixelTopology* topol_outer = dynamic_cast<const PixelTopology*>(&(theGeomDet_outer->specificTopology()));
547 
548  MeasurementPoint coords_outer = outerCluster->findAverageLocalCoordinatesCentered();
549  LocalPoint clustlp_outer = topol_outer->localPosition(coords_outer);
550  GlobalPoint posStub_outer = theGeomDet_outer->surface().toGlobal(clustlp_outer);
551 
552  bool isFlipped = (posStub_outer.mag() < posStub_inner.mag());
553 
554  vector<int> assocTPs;
555 
556  for (unsigned int iClus = 0; iClus <= 1; iClus++) { // Loop over both clusters that make up stub.
557 
558  const TTClusterRef& ttClusterRef = stubRef->clusterRef(iClus);
559 
560  // Now identify all TP's contributing to either cluster in stub.
561  if (readMoreMcTruth_) {
562  vector<edm::Ptr<TrackingParticle>> vecTpPtr =
563  MCTruthTTClusterHandle->findTrackingParticlePtrs(ttClusterRef);
564 
565  for (const edm::Ptr<TrackingParticle>& tpPtr : vecTpPtr) {
566  if (translateTP.find(tpPtr) != translateTP.end()) {
567  if (iClus == 0) {
568  assocTPs.push_back(translateTP.at(tpPtr));
569  } else {
570  assocTPs.push_back(-translateTP.at(tpPtr));
571  }
572  // N.B. Since not all tracking particles are stored in InputData::vTPs_, sometimes no match will be found.
573  } else {
574  assocTPs.push_back(0);
575  }
576  }
577  }
578  }
579 
580  double stubbend = stubRef->bendFE(); //stubRef->rawBend()
581  if (ttPos.z() < -120) {
582  stubbend = -stubbend;
583  }
584 
585  bool barrel = (layerdisk < N_LAYER);
586  // See https://github.com/cms-sw/cmssw/tree/master/Geometry/TrackerNumberingBuilder
587  enum TypeBarrel { nonBarrel = 0, tiltedMinus = 1, tiltedPlus = 2, flat = 3 };
588  const TypeBarrel type = static_cast<TypeBarrel>(tTopo->tobSide(innerDetId));
589  bool tiltedBarrel = barrel && (type == tiltedMinus || type == tiltedPlus);
590  unsigned int tiltedRingId = 0;
591  // Tilted module ring no. (Increasing 1 to 12 as |z| increases).
592  if (tiltedBarrel) {
593  tiltedRingId = tTopo->tobRod(innerDetId);
594  if (type == tiltedMinus) {
595  unsigned int layp1 = 1 + layerdisk; // Setup counts from 1
596  unsigned int nTilted = setup_->numTiltedLayerRing(layp1);
597  tiltedRingId = 1 + nTilted - tiltedRingId;
598  }
599  }
600  // Endcap module ring number (1-15) in endcap disks.
601  unsigned int endcapRingId = barrel ? 0 : tTopo->tidRing(innerDetId);
602 
603  const unsigned int intDetId = innerDetId.rawId();
604 
605  ev.addStub(dtcname,
606  region,
607  layerdisk,
608  stubwordhex,
609  setup_->psModule(dtcId),
610  isFlipped,
611  tiltedBarrel,
612  tiltedRingId,
613  endcapRingId,
614  intDetId,
615  ttPos.x(),
616  ttPos.y(),
617  ttPos.z(),
618  stubbend,
619  stubRef->innerClusterPosition(),
620  assocTPs,
621  theStubIndex);
622 
623  const trklet::L1TStub& lastStub = ev.lastStub();
624  stubMap[lastStub] = stubRef;
625  stubIndexMap[lastStub.uniqueIndex()] = stub.first;
626  theStubIndex++;
627  }
628  }
629  }
630 
632  // NOW RUN THE L1 tracking
633 
634  if (!asciiEventOutName_.empty()) {
635  ev.write(asciiEventOut_);
636  }
637 
638  const std::vector<trklet::Track>& tracks = eventProcessor.tracks();
639 
640  const unsigned int maxNumProjectionLayers = channelAssignment_->maxNumProjectionLayers();
641  // number of track channels
642  const unsigned int numStreamsTrack = N_SECTOR * channelAssignment_->numChannelsTrack();
643  // number of stub channels
644  const unsigned int numStreamsStub = N_SECTOR * channelAssignment_->numChannelsStub();
645  // number of stub channels if all seed types streams padded to have same number of stub channels (for coding simplicity)
646  const unsigned int numStreamsStubRaw = numStreamsTrack * maxNumProjectionLayers;
647 
648  // Streams formatted to allow this code to run outside CMSSW.
649  vector<vector<string>> streamsTrackRaw(numStreamsTrack);
650  vector<vector<StubStreamData>> streamsStubRaw(numStreamsStubRaw);
651 
652  // this performs the actual tracklet event processing
653  eventProcessor.event(ev, streamsTrackRaw, streamsStubRaw);
654 
655  for (const auto& track : tracks) {
656  if (track.duplicate())
657  continue;
658 
659  // this is where we create the TTTrack object
660  double tmp_rinv = track.rinv(settings_);
661  double tmp_phi = track.phi0(settings_);
662  double tmp_tanL = track.tanL(settings_);
663  double tmp_z0 = track.z0(settings_);
664  double tmp_d0 = track.d0(settings_);
665  double tmp_chi2rphi = track.chisqrphi();
666  double tmp_chi2rz = track.chisqrz();
667  unsigned int tmp_hit = track.hitpattern();
668 
669  TTTrack<Ref_Phase2TrackerDigi_> aTrack(tmp_rinv,
670  tmp_phi,
671  tmp_tanL,
672  tmp_z0,
673  tmp_d0,
674  tmp_chi2rphi,
675  tmp_chi2rz,
676  0,
677  0,
678  0,
679  tmp_hit,
681  settings_.bfield());
682 
683  unsigned int trksector = track.sector();
684  unsigned int trkseed = (unsigned int)abs(track.seed());
685 
686  aTrack.setPhiSector(trksector);
687  aTrack.setTrackSeedType(trkseed);
688 
689  const vector<trklet::L1TStub>& stubptrs = track.stubs();
690  vector<trklet::L1TStub> stubs;
691 
692  stubs.reserve(stubptrs.size());
693  for (const auto& stubptr : stubptrs) {
694  stubs.push_back(stubptr);
695  }
696 
697  int countStubs = 0;
698  stubMapType::const_iterator it;
699  stubIndexMapType::const_iterator itIndex;
700  for (const auto& itstubs : stubs) {
701  itIndex = stubIndexMap.find(itstubs.uniqueIndex());
702  if (itIndex != stubIndexMap.end()) {
703  aTrack.addStubRef(itIndex->second);
704  countStubs = countStubs + 1;
705  } else {
706  // could not find stub in stub map
707  }
708  }
709 
710  // pt consistency
711  aTrack.setStubPtConsistency(
712  StubPtConsistency::getConsistency(aTrack, theTrackerGeom, tTopo, settings_.bfield(), settings_.nHelixPar()));
713 
714  // set TTTrack word
715  aTrack.setTrackWordBits();
716 
717  if (trackQuality_) {
718  trackQualityModel_->setL1TrackQuality(aTrack);
719  }
720 
721  // hph::HitPatternHelper hph(setupHPH_, tmp_hit, tmp_tanL, tmp_z0);
722  // if (trackQuality_) {
723  // trackQualityModel_->setBonusFeatures(hph.bonusFeatures());
724  // }
725 
726  // test track word
727  //aTrack.testTrackWordBits();
728 
729  L1TkTracksForOutput->push_back(aTrack);
730  }
731 
732  iEvent.put(std::move(L1TkTracksForOutput), "Level1TTTracks");
733 
734  // produce clock and bit accurate stream output tracks and stubs.
735  // from end of tracklet pattern recognition.
736  // Convertion here is from stream format that allows this code to run
737  // outside CMSSW to the EDProduct one.
738  Streams streamsTrack(numStreamsTrack);
739  StreamsStub streamsStub(numStreamsStub);
740 
741  for (unsigned int chanTrk = 0; chanTrk < numStreamsTrack; chanTrk++) {
742  for (unsigned int itk = 0; itk < streamsTrackRaw[chanTrk].size(); itk++) {
743  std::string bitsTrk = streamsTrackRaw[chanTrk][itk];
744  int iSeed = chanTrk % channelAssignment_->numChannelsTrack(); // seed type
745  streamsTrack[chanTrk].emplace_back(bitsTrk);
746 
747  const unsigned int chanStubOffsetIn = chanTrk * maxNumProjectionLayers;
748  const unsigned int chanStubOffsetOut = channelAssignment_->offsetStub(chanTrk);
749  const unsigned int numProjLayers = channelAssignment_->numProjectionLayers(iSeed);
750  TTBV hitMap(0, numProjLayers);
751  // remove padding from stub stream
752  for (unsigned int iproj = 0; iproj < maxNumProjectionLayers; iproj++) {
753  // FW current has one (perhaps invalid) stub per layer per track.
754  const StubStreamData& stubdata = streamsStubRaw[chanStubOffsetIn + iproj][itk];
755  const L1TStub& stub = stubdata.stub();
756  if (stubdata.valid()) {
757  const TTStubRef ttStubRef = stubMap[stub];
758  int layerId(-1);
759  if (!channelAssignment_->layerId(stubdata.iSeed(), ttStubRef, layerId))
760  continue;
761  hitMap.set(layerId);
762  streamsStub[chanStubOffsetOut + layerId].emplace_back(ttStubRef, stubdata.dataBits());
763  }
764  }
765  for (int layerId : hitMap.ids(false)) { // invalid stubs
766  streamsStub[chanStubOffsetOut + layerId].emplace_back(tt::FrameStub());
767  }
768  }
769  }
770 
771  iEvent.emplace(putTokenTracks_, std::move(streamsTrack));
772  iEvent.emplace(putTokenStubs_, std::move(streamsStub));
773 
774 }
775 
776 // ///////////////////////////
777 // // DEFINE THIS AS A PLUG-IN
Log< level::Info, true > LogVerbatim
void setMemoryModulesFile(std::string memoryModulesFileName)
Definition: Settings.h:84
ESGetTokenH3DDVariant esConsumes(std::string const &Record, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
T getParameter(std::string const &) const
Definition: ParameterSet.h:307
edm::InputTag MCTruthStubInputTag
MPlex< T, D1, D2, N > hypot(const MPlex< T, D1, D2, N > &a, const MPlex< T, D1, D2, N > &b)
Definition: Matriplex.h:417
unsigned int tobSide(const DetId &id) const
void setStoreTrackBuilderOutput(bool storeTrackBuilderOutput)
Definition: Settings.h:256
edm::FileInPath tableTREFile
T const & getData(const ESGetToken< T, R > &iToken) const noexcept(false)
Definition: EventSetup.h:119
trklet::Settings settings_
const TrackerGeomDet * idToDetUnit(DetId) const override
Return the pointer to the GeomDetUnit corresponding to a given DetId.
virtual LocalPoint localPosition(const MeasurementPoint &) const =0
const Point & position() const
position
Definition: BeamSpot.h:59
void init(Settings const &theSettings, const tt::Setup *setup=nullptr)
std::string fullPath() const
Definition: FileInPath.cc:161
void setFitPatternFile(std::string fitPatternFileName)
Definition: Settings.h:80
Bit vector used by Track Trigger emulators. Mainly used to convert integers into arbitrary (within ma...
Definition: TTBV.h:20
std::pair< TTStubRef, Frame > FrameStub
Definition: TTTypes.h:60
T z() const
Definition: PV3DBase.h:61
virtual GlobalVector inTesla(const GlobalPoint &gp) const =0
Field value ad specified global point, in Tesla.
Class to process and provide run-time constants used by Track Trigger emulators.
Definition: Setup.h:44
std::vector< StreamStub > StreamsStub
Definition: TTTypes.h:66
std::vector< FrameStub > StreamStub
Definition: TTTypes.h:63
constexpr uint32_t bits
Definition: gpuClustering.h:25
std::string slotToDTCname(unsigned int slot) const
Definition: Settings.h:456
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
const edm::EDGetTokenT< reco::BeamSpot > getTokenBS_
edm::InputTag MCTruthClusterInputTag
void setReduced(bool reduced)
Definition: Settings.h:271
trklet::TrackletEventProcessor eventProcessor
Definition: config.py:1
void beginRun(const edm::Run &run, const edm::EventSetup &iSetup) override
Class to assign tracklet tracks and stubs to output channel based on their Pt or seed type as well as...
const std::vector< int > & tfpChannels() const
Definition: TTDTC.h:26
assert(be >=bs)
const hph::Setup * setupHPH_
int offsetStub(int channelTrack) const
T getUntrackedParameter(std::string const &, T const &) const
edm::FileInPath tableTEDFile
void setRemovalType(std::string removalType)
Definition: Settings.h:259
edm::EDGetTokenT< std::vector< TrackingParticle > > getTokenTrackingParticle_
T x() const
Definition: PV3DBase.h:59
const edm::ESGetToken< TrackerTopology, TrackerTopologyRcd > esGetTokenTTopo_
const edm::ESGetToken< TrackerGeometry, TrackerDigiGeometryRecord > esGetTokenTGeom_
T y() const
Definition: PV3DBase.h:60
void produce(edm::Event &iEvent, const edm::EventSetup &iSetup) override
const edm::ESGetToken< MagneticField, IdealMagneticFieldRecord > esGetTokenBfield_
int iEvent
Definition: GenABIO.cc:224
Definition: TTTypes.h:54
const edm::ESGetToken< hph::Setup, hph::SetupRcd > esGetTokenHPH_
GlobalPoint stubPos(const TTStubRef &ttStubRef) const
Definition: Setup.cc:820
std::vector< int > ids(bool b=true, bool singed=false) const
Definition: TTBV.h:334
TTClusterRefT< Ref_Phase2TrackerDigi_ > TTClusterRef
Definition: TTTypes.h:45
double bfield() const
Definition: Settings.h:275
const std::string & dataBits() const
edm::FileInPath processingModulesFile
T mag() const
Definition: PV3DBase.h:64
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
const std::vector< int > & tfpRegions() const
Definition: TTDTC.h:24
Transition
Definition: Transition.h:12
const ChannelAssignment * channelAssignment_
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
std::string removalType() const
Definition: Settings.h:249
const edm::ESGetToken< tt::Setup, tt::SetupRcd > esGetToken_
bool doMultipleMatches() const
Definition: Settings.h:252
const edm::EDPutTokenT< Streams > putTokenTracks_
void setFakefit(bool fakefit)
Definition: Settings.h:254
Class to store the L1 Track Trigger stubs.
Definition: TTStub.h:22
bool isNull() const
Checks for null.
Definition: Ref.h:235
TTBV & set()
Definition: TTBV.h:187
const std::vector< Track > & tracks() const
bool operator()(const trklet::L1TStub &a, const trklet::L1TStub &b) const
edm::InputTag TrackingParticleInputTag
bool debugTracklet() const
Definition: Settings.h:192
constexpr unsigned int N_SECTOR
Definition: Settings.h:23
void endRun(edm::Run const &, edm::EventSetup const &) override
int numProjectionLayers(int seedType) const
Definition: DetId.h:17
const L1TStub & stub() const
bool storeTrackBuilderOutput() const
Definition: Settings.h:255
bool psModule(int dtcId) const
Definition: Setup.cc:318
NOTE: this is needed even if it seems not.
Definition: TTCluster.h:27
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:57
XYZPointD XYZPoint
point in space with cartesian internal representation
Definition: Point3D.h:12
Class to store the L1 Track Trigger tracks.
Definition: TTTrack.h:29
void setProcessingModulesFile(std::string processingModulesFileName)
Definition: Settings.h:81
unsigned int nHelixPar() const
Definition: Settings.h:263
L1FPGATrackProducer(const edm::ParameterSet &iConfig)
Constructor/destructor.
const edm::EDGetTokenT< TTDTC > getTokenDTC_
double b
Definition: hdecay.h:120
Class to store hardware like structured TTStub Collection used by Track Trigger emulators.
Definition: TTDTC.h:17
std::vector< Stream > Streams
Definition: TTTypes.h:68
unsigned int tobRod(const DetId &id) const
void setDoMultipleMatches(bool doMultipleMatches)
Definition: Settings.h:260
edm::FileInPath memoryModulesFile
std::map< string, vector< int > > dtclayerdisk
const edm::EDPutTokenT< StreamsStub > putTokenStubs_
double numTiltedLayerRing(int layerId) const
Definition: Setup.h:309
fixed size matrix
HLT enums.
double a
Definition: hdecay.h:121
std::unique_ptr< L1TrackQuality > trackQualityModel_
edm::FileInPath fitPatternFile
File path for configuration files.
edm::EDGetTokenT< TTClusterAssociationMap< Ref_Phase2TrackerDigi_ > > getTokenTTClusterMCTruth_
void setNbitstrackletindex(unsigned int nbitstrackletindex)
Definition: Settings.h:304
void setNHelixPar(unsigned int nHelixPar)
Definition: Settings.h:264
unsigned int tidRing(const DetId &id) const
void setWiresFile(std::string wiresFileName)
Definition: Settings.h:85
bool layerId(int seedType, const TTStubRef &ttStubRef, int &layerId) const
void setBfield(double bfield)
Definition: Settings.h:276
void setTableTREFile(std::string tableTREFileName)
Definition: Settings.h:87
void passSetup(const tt::Setup *setup)
Definition: Settings.h:69
edm::ParameterSet config
Containers of parameters passed by python configuration file.
int dtcId(int tklId) const
Definition: Setup.cc:290
void setTableTEDFile(std::string tableTEDFileName)
Definition: Settings.h:86
void event(SLHCEvent &ev, std::vector< std::vector< std::string >> &streamsTrackRaw, std::vector< std::vector< StubStreamData >> &streamsStubRaw)
const tt::StreamStub & stream(int tfpRegion, int tfpChannel) const
Definition: TTDTC.cc:48
def move(src, dest)
Definition: eostools.py:511
void setExtended(bool extended)
Definition: Settings.h:267
Definition: Run.h:45
unsigned int uniqueIndex() const
Definition: L1TStub.h:92
float getConsistency(TTTrack< Ref_Phase2TrackerDigi_ > aTrack, const TrackerGeometry *theTrackerGeom, const TrackerTopology *tTopo, double mMagneticFieldStrength, int nPar)
constexpr int N_LAYER
Definition: Settings.h:25
const ESGetToken< ChannelAssignment, ChannelAssignmentRcd > esGetTokenChannelAssignment_