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
76 //
78 
80 // 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 
156 #ifndef USEHYBRID
158 #endif
162 
165 
167  std::ofstream asciiEventOut_;
168 
169  // settings containing various constants for the tracklet processing
171 
172  // event processor for the tracklet track finding
174 
175  // used to "kill" stubs from a selected area of the detector
178 
179  unsigned int nHelixPar_;
180  bool extended_;
181  bool reduced_;
182 
184  std::unique_ptr<L1TrackQuality> trackQualityModel_;
185 
186  std::map<string, vector<int>> dtclayerdisk;
187 
191 
196 
197  // ED output token for clock and bit accurate tracks
199  // ED output token for clock and bit accurate stubs
201  // ChannelAssignment token
203  // helper class to assign tracks to channel
205 
206  // helper class to store DTC configuration
207  const Setup* setup_;
208  // helper class to store configuration needed by HitPatternHelper
210 
211  // Setup token
217 
220  void beginRun(const edm::Run& run, const edm::EventSetup& iSetup) override;
221  void endRun(edm::Run const&, edm::EventSetup const&) override;
222  void produce(edm::Event& iEvent, const edm::EventSetup& iSetup) override;
223 };
224 
226 // CONSTRUCTOR
228  : config(iConfig),
229  readMoreMcTruth_(iConfig.getParameter<bool>("readMoreMcTruth")),
230  MCTruthClusterInputTag(readMoreMcTruth_ ? config.getParameter<edm::InputTag>("MCTruthClusterInputTag")
231  : edm::InputTag()),
232  MCTruthStubInputTag(readMoreMcTruth_ ? config.getParameter<edm::InputTag>("MCTruthStubInputTag")
233  : edm::InputTag()),
234  TrackingParticleInputTag(readMoreMcTruth_ ? iConfig.getParameter<edm::InputTag>("TrackingParticleInputTag")
235  : edm::InputTag()),
236  // book ED products
237  getTokenBS_(consumes<reco::BeamSpot>(config.getParameter<edm::InputTag>("BeamSpotSource"))),
238  getTokenDTC_(consumes<TTDTC>(edm::InputTag(iConfig.getParameter<edm::InputTag>("InputTagTTDTC")))),
239  // book ED output token for clock and bit accurate tracks
240  putTokenTracks_(produces<Streams>("Level1TTTracks")),
241  // book ED output token for clock and bit accurate stubs
242  putTokenStubs_(produces<StreamsStub>("Level1TTTracks")),
243  // book ES products
244  esGetTokenChannelAssignment_(esConsumes<ChannelAssignment, ChannelAssignmentRcd, Transition::BeginRun>()),
245  esGetTokenBfield_(esConsumes<edm::Transition::BeginRun>()),
246  esGetTokenTGeom_(esConsumes()),
247  esGetTokenTTopo_(esConsumes()),
248  esGetToken_(esConsumes<tt::Setup, tt::SetupRcd, edm::Transition::BeginRun>()),
249  esGetTokenHPH_(esConsumes<hph::Setup, hph::SetupRcd, edm::Transition::BeginRun>()) {
250  if (readMoreMcTruth_) {
251  getTokenTTClusterMCTruth_ = consumes<TTClusterAssociationMap<Ref_Phase2TrackerDigi_>>(MCTruthClusterInputTag);
252  getTokenTrackingParticle_ = consumes<std::vector<TrackingParticle>>(TrackingParticleInputTag);
253  }
254 
255  produces<std::vector<TTTrack<Ref_Phase2TrackerDigi_>>>("Level1TTTracks").setBranchAlias("Level1TTTracks");
256 
257  asciiEventOutName_ = iConfig.getUntrackedParameter<string>("asciiFileName", "");
258 
259  processingModulesFile = iConfig.getParameter<edm::FileInPath>("processingModulesFile");
260  memoryModulesFile = iConfig.getParameter<edm::FileInPath>("memoryModulesFile");
261  wiresFile = iConfig.getParameter<edm::FileInPath>("wiresFile");
262 
263  failScenario_ = iConfig.getUntrackedParameter<int>("FailScenario", 0);
264 
265  extended_ = iConfig.getParameter<bool>("Extended");
266  reduced_ = iConfig.getParameter<bool>("Reduced");
267  nHelixPar_ = iConfig.getParameter<unsigned int>("Hnpar");
268 
269  if (extended_) {
270  tableTEDFile = iConfig.getParameter<edm::FileInPath>("tableTEDFile");
271  tableTREFile = iConfig.getParameter<edm::FileInPath>("tableTREFile");
272  }
273 
274  // initial ES products
275  channelAssignment_ = nullptr;
276  setup_ = nullptr;
277 
278  // --------------------------------------------------------------------------------
279  // set options in Settings based on inputs from configuration files
280  // --------------------------------------------------------------------------------
281 
285 
286 #ifndef USEHYBRID
287  fitPatternFile = iConfig.getParameter<edm::FileInPath>("fitPatternFile");
289 #endif
293 
294  settings_.setFakefit(iConfig.getParameter<bool>("Fakefit"));
295  settings_.setStoreTrackBuilderOutput(iConfig.getParameter<bool>("StoreTrackBuilderOutput"));
296  settings_.setRemovalType(iConfig.getParameter<string>("RemovalType"));
297  settings_.setDoMultipleMatches(iConfig.getParameter<bool>("DoMultipleMatches"));
298 
299  if (extended_) {
302 
303  //FIXME: The TED and TRE tables are currently disabled by default, so we
304  //need to allow for the additional tracklets that will eventually be
305  //removed by these tables, once they are finalized
307  }
308 
309  eventnum = 0;
310  if (not asciiEventOutName_.empty()) {
311  asciiEventOut_.open(asciiEventOutName_.c_str());
312  }
313 
314  if (settings_.debugTracklet()) {
315  edm::LogVerbatim("Tracklet")
316 #ifndef USEHYBRID
317  << "fit pattern : " << fitPatternFile.fullPath()
318 #endif
319  << "\n process modules : " << processingModulesFile.fullPath()
320  << "\n memory modules : " << memoryModulesFile.fullPath() << "\n wires : " << wiresFile.fullPath();
321  if (extended_) {
322  edm::LogVerbatim("Tracklet") << "table_TED : " << tableTEDFile.fullPath()
323  << "\n table_TRE : " << tableTREFile.fullPath();
324  }
325  }
326 
327  trackQuality_ = iConfig.getParameter<bool>("TrackQuality");
328  if (trackQuality_) {
329  trackQualityModel_ = std::make_unique<L1TrackQuality>(iConfig.getParameter<edm::ParameterSet>("TrackQualityPSet"));
330  }
332  cms::Exception exception("ConfigurationNotSupported.");
333  exception.addContext("L1FPGATrackProducer::produce");
335  exception << "Storing of TrackBuilder output does not support doMultipleMatches.";
336  if (!settings_.removalType().empty())
337  exception << "Storing of TrackBuilder output does not support duplicate removal.";
338  throw exception;
339  }
340 }
341 
343 // DESTRUCTOR
345  if (asciiEventOut_.is_open()) {
346  asciiEventOut_.close();
347  }
348 }
349 
351 //
353 
355 // BEGIN JOB
358  // GET MAGNETIC FIELD //
359  const MagneticField* theMagneticField = &iSetup.getData(esGetTokenBfield_);
360  double mMagneticFieldStrength = theMagneticField->inTesla(GlobalPoint(0, 0, 0)).z();
361  settings_.setBfield(mMagneticFieldStrength);
362 
363  setup_ = &iSetup.getData(esGetToken_);
364 
366 
367  setupHPH_ = &iSetup.getData(esGetTokenHPH_);
368  // Tracklet pattern reco output channel info.
370  // initialize the tracklet event processing (this sets all the processing & memory modules, wiring, etc)
372 }
373 
375 // PRODUCE
377  typedef std::map<trklet::L1TStub,
380  stubMapType;
381  typedef std::map<unsigned int,
383  stubIndexMapType;
385  TTClusterRef;
386 
388  auto L1TkTracksForOutput = std::make_unique<std::vector<TTTrack<Ref_Phase2TrackerDigi_>>>();
389 
390  stubMapType stubMap;
391  stubIndexMapType stubIndexMap;
392 
394  // GET BS //
395  edm::Handle<reco::BeamSpot> beamSpotHandle;
396  iEvent.getByToken(getTokenBS_, beamSpotHandle);
397  math::XYZPoint bsPosition = beamSpotHandle->position();
398 
399  eventnum++;
401  ev.setEventNum(eventnum);
402  ev.setIP(bsPosition.x(), bsPosition.y());
403 
404  // tracking particles
405  edm::Handle<std::vector<TrackingParticle>> TrackingParticleHandle;
406  if (readMoreMcTruth_)
407  iEvent.getByToken(getTokenTrackingParticle_, TrackingParticleHandle);
408 
409  // tracker topology
410  const TrackerTopology* const tTopo = &iSetup.getData(esGetTokenTTopo_);
411  const TrackerGeometry* const theTrackerGeom = &iSetup.getData(esGetTokenTGeom_);
412 
413  // check killing stubs for detector degradation studies
414  // if failType = 0, StubKiller does not kill any modules
415  int failType = 0;
416  if (failScenario_ < 0 || failScenario_ > 9) {
417  edm::LogVerbatim("Tracklet") << "Invalid fail scenario! Ignoring input";
418  } else
419  failType = failScenario_;
420 
421  stubKiller_ = new StubKiller();
422  stubKiller_->initialise(failType, tTopo, theTrackerGeom);
423 
425  // GET THE PRIMITIVES //
426  edm::Handle<TTDTC> handleDTC;
427  iEvent.getByToken<TTDTC>(getTokenDTC_, handleDTC);
428 
429  // must be defined for code to compile, even if it's not used unless readMoreMcTruth_ is true
430  map<edm::Ptr<TrackingParticle>, int> translateTP;
431 
432  // MC truth association maps
434  if (readMoreMcTruth_) {
435  iEvent.getByToken(getTokenTTClusterMCTruth_, MCTruthTTClusterHandle);
436 
439 
440  int ntps = 1; //count from 1 ; 0 will mean invalid
441 
442  int this_tp = 0;
443  if (readMoreMcTruth_) {
444  for (const auto& iterTP : *TrackingParticleHandle) {
445  edm::Ptr<TrackingParticle> tp_ptr(TrackingParticleHandle, this_tp);
446  this_tp++;
447 
448  // only keep TPs producing a cluster
449  if (MCTruthTTClusterHandle->findTTClusterRefs(tp_ptr).empty())
450  continue;
451 
452  if (iterTP.g4Tracks().empty()) {
453  continue;
454  }
455 
456  int sim_eventid = iterTP.g4Tracks().at(0).eventId().event();
457  int sim_type = iterTP.pdgId();
458  float sim_pt = iterTP.pt();
459  float sim_eta = iterTP.eta();
460  float sim_phi = iterTP.phi();
461 
462  float vx = iterTP.vertex().x();
463  float vy = iterTP.vertex().y();
464  float vz = iterTP.vertex().z();
465 
466  if (sim_pt < 1.0 || std::abs(vz) > 100.0 || hypot(vx, vy) > 50.0)
467  continue;
468 
469  ev.addL1SimTrack(sim_eventid, ntps, sim_type, sim_pt, sim_eta, sim_phi, vx, vy, vz);
470 
471  translateTP[tp_ptr] = ntps;
472  ntps++;
473 
474  } //end loop over TPs
475  }
476 
477  } // end if (readMoreMcTruth_)
478 
482 
483  // Process stubs in each region and channel within that tracking region
484  unsigned int theStubIndex = 0;
485  for (const int& region : handleDTC->tfpRegions()) {
486  for (const int& channel : handleDTC->tfpChannels()) {
487  // Get the DTC name & ID from the channel
488  unsigned int atcaSlot = channel % 12;
489  string dtcname = settings_.slotToDTCname(atcaSlot);
490  if (channel % 24 >= 12)
491  dtcname = "neg" + dtcname;
492  dtcname += (channel < 24) ? "_A" : "_B"; // which detector region
493  int dtcId = setup_->dtcId(region, channel);
494 
495  // Get the stubs from the DTC
496  const tt::StreamStub& streamFromDTC{handleDTC->stream(region, channel)};
497 
498  // Prepare the DTC stubs for the IR
499  for (size_t stubIndex = 0; stubIndex < streamFromDTC.size(); ++stubIndex) {
500  const tt::FrameStub& stub{streamFromDTC[stubIndex]};
501  const TTStubRef& stubRef = stub.first;
502 
503  if (stubRef.isNull())
504  continue;
505 
506  const GlobalPoint& ttPos = setup_->stubPos(stubRef);
507 
508  //Get the 2 bits for the layercode
509  string layerword = stub.second.to_string().substr(61, 2);
510  unsigned int layercode = 2 * (layerword[0] - '0') + layerword[1] - '0';
511  assert(layercode < 4);
512 
513  //translation from the two bit layercode to the layer/disk number of each of the
514  //12 channels (dtcs)
515  // FIX: take this from DTC cabling map.
516  static const int layerdisktab[12][4] = {{0, 6, 8, 10},
517  {0, 7, 9, -1},
518  {1, 7, -1, -1},
519  {6, 8, 10, -1},
520  {2, 7, -1, -1},
521  {2, 9, -1, -1},
522  {3, 4, -1, -1},
523  {4, -1, -1, -1},
524  {5, -1, -1, -1},
525  {5, 8, -1, -1},
526  {6, 9, -1, -1},
527  {7, 10, -1, -1}};
528 
529  int layerdisk = layerdisktab[channel % 12][layercode];
530  assert(layerdisk != -1);
531 
532  //Get the 36 bit word - skip the lowest 3 buts (status and layer code)
533  constexpr int DTCLinkWordSize = 64;
534  constexpr int StubWordSize = 36;
535  constexpr int LayerandStatusCodeSize = 3;
536  string stubword =
537  stub.second.to_string().substr(DTCLinkWordSize - StubWordSize - LayerandStatusCodeSize, StubWordSize);
538  string stubwordhex = "";
539 
540  //Loop over the 9 words in the 36 bit stub word
541  for (unsigned int i = 0; i < 9; i++) {
542  bitset<4> bits(stubword.substr(i * 4, 4));
543  ulong val = bits.to_ulong();
544  stubwordhex += ((val < 10) ? ('0' + val) : ('A' + val - 10));
545  }
546 
549  innerCluster = stub.first->clusterRef(0);
551  outerCluster = stub.first->clusterRef(1);
552 
553  // -----------------------------------------------------
554  // check module orientation, if flipped, need to store that information for track fit
555  // -----------------------------------------------------
556 
557  const DetId innerDetId = innerCluster->getDetId();
558  const GeomDetUnit* det_inner = theTrackerGeom->idToDetUnit(innerDetId);
559  const auto* theGeomDet_inner = dynamic_cast<const PixelGeomDetUnit*>(det_inner);
560  const PixelTopology* topol_inner = dynamic_cast<const PixelTopology*>(&(theGeomDet_inner->specificTopology()));
561 
562  MeasurementPoint coords_inner = innerCluster->findAverageLocalCoordinatesCentered();
563  LocalPoint clustlp_inner = topol_inner->localPosition(coords_inner);
564  GlobalPoint posStub_inner = theGeomDet_inner->surface().toGlobal(clustlp_inner);
565 
566  const DetId outerDetId = outerCluster->getDetId();
567  const GeomDetUnit* det_outer = theTrackerGeom->idToDetUnit(outerDetId);
568  const auto* theGeomDet_outer = dynamic_cast<const PixelGeomDetUnit*>(det_outer);
569  const PixelTopology* topol_outer = dynamic_cast<const PixelTopology*>(&(theGeomDet_outer->specificTopology()));
570 
571  MeasurementPoint coords_outer = outerCluster->findAverageLocalCoordinatesCentered();
572  LocalPoint clustlp_outer = topol_outer->localPosition(coords_outer);
573  GlobalPoint posStub_outer = theGeomDet_outer->surface().toGlobal(clustlp_outer);
574 
575  bool isFlipped = (posStub_outer.mag() < posStub_inner.mag());
576 
577  vector<int> assocTPs;
578 
579  for (unsigned int iClus = 0; iClus <= 1; iClus++) { // Loop over both clusters that make up stub.
580 
581  const TTClusterRef& ttClusterRef = stubRef->clusterRef(iClus);
582 
583  // Now identify all TP's contributing to either cluster in stub.
584  if (readMoreMcTruth_) {
585  vector<edm::Ptr<TrackingParticle>> vecTpPtr =
586  MCTruthTTClusterHandle->findTrackingParticlePtrs(ttClusterRef);
587 
588  for (const edm::Ptr<TrackingParticle>& tpPtr : vecTpPtr) {
589  if (translateTP.find(tpPtr) != translateTP.end()) {
590  if (iClus == 0) {
591  assocTPs.push_back(translateTP.at(tpPtr));
592  } else {
593  assocTPs.push_back(-translateTP.at(tpPtr));
594  }
595  // N.B. Since not all tracking particles are stored in InputData::vTPs_, sometimes no match will be found.
596  } else {
597  assocTPs.push_back(0);
598  }
599  }
600  }
601  }
602 
603  double stubbend = stubRef->bendFE(); //stubRef->rawBend()
604  if (ttPos.z() < -120) {
605  stubbend = -stubbend;
606  }
607 
608  bool barrel = (layerdisk < N_LAYER);
609  // See https://github.com/cms-sw/cmssw/tree/master/Geometry/TrackerNumberingBuilder
610  enum TypeBarrel { nonBarrel = 0, tiltedMinus = 1, tiltedPlus = 2, flat = 3 };
611  const TypeBarrel type = static_cast<TypeBarrel>(tTopo->tobSide(innerDetId));
612  bool tiltedBarrel = barrel && (type == tiltedMinus || type == tiltedPlus);
613  unsigned int tiltedRingId = 0;
614  // Tilted module ring no. (Increasing 1 to 12 as |z| increases).
615  if (tiltedBarrel) {
616  tiltedRingId = tTopo->tobRod(innerDetId);
617  if (type == tiltedMinus) {
618  unsigned int layp1 = 1 + layerdisk; // Setup counts from 1
619  unsigned int nTilted = setup_->numTiltedLayerRing(layp1);
620  tiltedRingId = 1 + nTilted - tiltedRingId;
621  }
622  }
623  // Endcap module ring number (1-15) in endcap disks.
624  unsigned int endcapRingId = barrel ? 0 : tTopo->tidRing(innerDetId);
625 
626  const unsigned int intDetId = innerDetId.rawId();
627 
628  // check killing stubs for detector degredation studies
629  const TTStub<Ref_Phase2TrackerDigi_>* theStub = &(*stubRef);
630  bool killThisStub = stubKiller_->killStub(theStub);
631  if (!killThisStub) {
632  ev.addStub(dtcname,
633  region,
634  layerdisk,
635  stubwordhex,
636  setup_->psModule(dtcId),
637  isFlipped,
638  tiltedBarrel,
639  tiltedRingId,
640  endcapRingId,
641  intDetId,
642  ttPos.x(),
643  ttPos.y(),
644  ttPos.z(),
645  stubbend,
646  stubRef->innerClusterPosition(),
647  assocTPs,
648  theStubIndex);
649 
650  const trklet::L1TStub& lastStub = ev.lastStub();
651  stubMap[lastStub] = stubRef;
652  stubIndexMap[lastStub.uniqueIndex()] = stub.first;
653  theStubIndex++;
654  }
655  }
656  }
657  }
658 
660  // NOW RUN THE L1 tracking
661 
662  if (!asciiEventOutName_.empty()) {
663  ev.write(asciiEventOut_);
664  }
665 
666  const std::vector<trklet::Track>& tracks = eventProcessor.tracks();
667 
668  // max number of projection layers
669  const unsigned int maxNumProjectionLayers = channelAssignment_->maxNumProjectionLayers();
670  // number of track channels
671  const unsigned int numStreamsTrack = N_SECTOR * channelAssignment_->numChannelsTrack();
672  // number of stub channels
673  const unsigned int numStreamsStub = N_SECTOR * channelAssignment_->numChannelsStub();
674  // number of seeding layers
675  const unsigned int numSeedingLayers = channelAssignment_->numSeedingLayers();
676  // max number of stub channel per track
677  const unsigned int numStubChannel = maxNumProjectionLayers + numSeedingLayers;
678  // number of stub channels if all seed types streams padded to have same number of stub channels (for coding simplicity)
679  const unsigned int numStreamsStubRaw = numStreamsTrack * numStubChannel;
680 
681  // Streams formatted to allow this code to run outside CMSSW.
682  vector<vector<string>> streamsTrackRaw(numStreamsTrack);
683  vector<vector<StubStreamData>> streamsStubRaw(numStreamsStubRaw);
684 
685  // this performs the actual tracklet event processing
686  eventProcessor.event(ev, streamsTrackRaw, streamsStubRaw);
687 
688  for (const auto& track : tracks) {
689  if (track.duplicate())
690  continue;
691 
692  // this is where we create the TTTrack object
693  double tmp_rinv = track.rinv(settings_);
694  double tmp_phi = track.phi0(settings_);
695  double tmp_tanL = track.tanL(settings_);
696  double tmp_z0 = track.z0(settings_);
697  double tmp_d0 = track.d0(settings_);
698  double tmp_chi2rphi = track.chisqrphi();
699  double tmp_chi2rz = track.chisqrz();
700  unsigned int tmp_hit = track.hitpattern();
701 
702  TTTrack<Ref_Phase2TrackerDigi_> aTrack(tmp_rinv,
703  tmp_phi,
704  tmp_tanL,
705  tmp_z0,
706  tmp_d0,
707  tmp_chi2rphi,
708  tmp_chi2rz,
709  0,
710  0,
711  0,
712  tmp_hit,
714  settings_.bfield());
715 
716  unsigned int trksector = track.sector();
717  unsigned int trkseed = (unsigned int)abs(track.seed());
718 
719  aTrack.setPhiSector(trksector);
720  aTrack.setTrackSeedType(trkseed);
721 
722  const vector<trklet::L1TStub>& stubptrs = track.stubs();
723  vector<trklet::L1TStub> stubs;
724 
725  stubs.reserve(stubptrs.size());
726  for (const auto& stubptr : stubptrs) {
727  stubs.push_back(stubptr);
728  }
729 
730  int countStubs = 0;
731  stubMapType::const_iterator it;
732  stubIndexMapType::const_iterator itIndex;
733  for (const auto& itstubs : stubs) {
734  itIndex = stubIndexMap.find(itstubs.uniqueIndex());
735  if (itIndex != stubIndexMap.end()) {
736  aTrack.addStubRef(itIndex->second);
737  countStubs = countStubs + 1;
738  } else {
739  // could not find stub in stub map
740  }
741  }
742 
743  // pt consistency
744  aTrack.setStubPtConsistency(
745  StubPtConsistency::getConsistency(aTrack, theTrackerGeom, tTopo, settings_.bfield(), settings_.nHelixPar()));
746 
747  // set track word before TQ MVA calculated which uses track word variables
748  aTrack.setTrackWordBits();
749 
750  if (trackQuality_) {
751  trackQualityModel_->setL1TrackQuality(aTrack);
752  }
753 
754  // hph::HitPatternHelper hph(setupHPH_, tmp_hit, tmp_tanL, tmp_z0);
755  // if (trackQuality_) {
756  // trackQualityModel_->setBonusFeatures(hph.bonusFeatures());
757  // }
758 
759  // set track word again to set MVA variable from TTTrack into track word
760  aTrack.setTrackWordBits();
761  // test track word
762  //aTrack.testTrackWordBits();
763 
764  L1TkTracksForOutput->push_back(aTrack);
765  }
766 
767  iEvent.put(std::move(L1TkTracksForOutput), "Level1TTTracks");
768 
769  // produce clock and bit accurate stream output tracks and stubs.
770  // from end of tracklet pattern recognition.
771  // Convertion here is from stream format that allows this code to run
772  // outside CMSSW to the EDProduct one.
773  Streams streamsTrack(numStreamsTrack);
774  StreamsStub streamsStub(numStreamsStub);
775 
776  for (unsigned int chanTrk = 0; chanTrk < numStreamsTrack; chanTrk++) {
777  for (unsigned int itk = 0; itk < streamsTrackRaw[chanTrk].size(); itk++) {
778  std::string bitsTrk = streamsTrackRaw[chanTrk][itk];
779  int iSeed = chanTrk % channelAssignment_->numChannelsTrack(); // seed type
780  streamsTrack[chanTrk].emplace_back(bitsTrk);
781 
782  const unsigned int chanStubOffsetIn = chanTrk * numStubChannel;
783  const unsigned int chanStubOffsetOut = channelAssignment_->offsetStub(chanTrk);
784  const unsigned int numProjLayers = channelAssignment_->numProjectionLayers(iSeed);
785  TTBV hitMap(0, numProjLayers + numSeedingLayers);
786  // remove padding from stub stream
787  for (unsigned int iproj = 0; iproj < numStubChannel; iproj++) {
788  // FW current has one (perhaps invalid) stub per layer per track.
789  const StubStreamData& stubdata = streamsStubRaw[chanStubOffsetIn + iproj][itk];
790  const L1TStub& stub = stubdata.stub();
791  if (!stubdata.valid())
792  continue;
793  const TTStubRef& ttStubRef = stubMap[stub];
794  const int seedType = stubdata.iSeed();
795  const int layerId = setup_->layerId(ttStubRef);
796  const int channelId = channelAssignment_->channelId(seedType, layerId);
797  hitMap.set(channelId);
798  streamsStub[chanStubOffsetOut + channelId].emplace_back(ttStubRef, stubdata.dataBits());
799  }
800  for (int layerId : hitMap.ids(false)) { // invalid stubs
801  streamsStub[chanStubOffsetOut + layerId].emplace_back(tt::FrameStub());
802  }
803  }
804  }
805 
806  iEvent.emplace(putTokenTracks_, std::move(streamsTrack));
807  iEvent.emplace(putTokenStubs_, std::move(streamsStub));
808 
809 }
810 
811 // ///////////////////////////
812 // // DEFINE THIS AS A PLUG-IN
Log< level::Info, true > LogVerbatim
void setMemoryModulesFile(std::string memoryModulesFileName)
Definition: Settings.h:86
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:616
unsigned int tobSide(const DetId &id) const
void setStoreTrackBuilderOutput(bool storeTrackBuilderOutput)
Definition: Settings.h:258
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)
void setFitPatternFile(std::string fitPatternFileName)
Definition: Settings.h:82
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
std::string slotToDTCname(unsigned int slot) const
Definition: Settings.h:469
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
const edm::EDGetTokenT< reco::BeamSpot > getTokenBS_
edm::InputTag MCTruthClusterInputTag
void setReduced(bool reduced)
Definition: Settings.h:280
trklet::TrackletEventProcessor eventProcessor
int channelId(const TTTrackRef &ttTrackRef) const
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:261
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:824
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:284
int layerId(const TTStubRef &ttStubRef) const
Definition: Setup.cc:511
const std::string & dataBits() const
void initialise(unsigned int killScenario, const TrackerTopology *trackerTopology, const TrackerGeometry *trackerGeometry)
Definition: StubKiller.cc:20
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_
bool killStub(const TTStub< Ref_Phase2TrackerDigi_ > *stub, const std::vector< int > layersToKill, const double minPhiToKill, const double maxPhiToKill, const double minZToKill, const double maxZToKill, const double minRToKill, const double maxRToKill, const double fractionOfStubsToKillInLayers, const double fractionOfStubsToKillEverywhere)
Definition: StubKiller.cc:212
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
std::string removalType() const
Definition: Settings.h:251
const edm::ESGetToken< tt::Setup, tt::SetupRcd > esGetToken_
bool doMultipleMatches() const
Definition: Settings.h:254
const edm::EDPutTokenT< Streams > putTokenTracks_
void setFakefit(bool fakefit)
Definition: Settings.h:256
Class to store the L1 Track Trigger stubs.
Definition: TTStub.h:22
bool isNull() const
Checks for null.
Definition: Ref.h:229
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:194
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:257
bool psModule(int dtcId) const
Definition: Setup.cc:322
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
const std::vector< float > & sim_pt()
Definition: Trktree.cc:6774
void setProcessingModulesFile(std::string processingModulesFileName)
Definition: Settings.h:83
unsigned int nHelixPar() const
Definition: Settings.h:265
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:262
edm::FileInPath memoryModulesFile
std::map< string, vector< int > > dtclayerdisk
const edm::EDPutTokenT< StreamsStub > putTokenStubs_
double numTiltedLayerRing(int layerId) const
Definition: Setup.h:313
const std::vector< float > & sim_eta()
Definition: Trktree.cc:6715
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:317
void setNHelixPar(unsigned int nHelixPar)
Definition: Settings.h:266
unsigned int tidRing(const DetId &id) const
void setWiresFile(std::string wiresFileName)
Definition: Settings.h:87
const std::string & fullPath() const
Definition: FileInPath.cc:144
void setBfield(double bfield)
Definition: Settings.h:285
void setTableTREFile(std::string tableTREFileName)
Definition: Settings.h:89
const std::vector< float > & sim_phi()
Definition: Trktree.cc:6927
void passSetup(const tt::Setup *setup)
Definition: Settings.h:71
edm::ParameterSet config
Containers of parameters passed by python configuration file.
int dtcId(int tklId) const
Definition: Setup.cc:294
void setTableTEDFile(std::string tableTEDFileName)
Definition: Settings.h:88
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:269
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_