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