File indexing completed on 2024-11-19 23:20:13
0001 #include "L1Trigger/TrackFindingTracklet/interface/TrackletEngineUnit.h"
0002 #include "L1Trigger/TrackFindingTracklet/interface/VMStubsTEMemory.h"
0003 #include "L1Trigger/TrackFindingTracklet/interface/Settings.h"
0004
0005 using namespace std;
0006 using namespace trklet;
0007
0008 TrackletEngineUnit::TrackletEngineUnit(const Settings* const settings,
0009 unsigned int nbitsfinephi,
0010 unsigned int layerdisk1,
0011 unsigned int layerdisk2,
0012 unsigned int iSeed,
0013 unsigned int nbitsfinephidiff,
0014 unsigned int iAllStub,
0015 const TrackletLUT* pttableinnernew,
0016 const TrackletLUT* pttableouternew,
0017 VMStubsTEMemory* outervmstubs)
0018 : settings_(settings),
0019 nearfull_(false),
0020 idle_(true),
0021 pttableinnernew_(pttableinnernew),
0022 pttableouternew_(pttableouternew),
0023 goodpair_(false),
0024 goodpair__(false),
0025 candpairs_(3) {
0026 nbitsfinephi_ = nbitsfinephi;
0027 layerdisk2_ = layerdisk2;
0028 layerdisk1_ = layerdisk1;
0029 iSeed_ = iSeed;
0030 nbitsfinephidiff_ = nbitsfinephidiff;
0031 iAllStub_ = iAllStub;
0032 outervmstubs_ = outervmstubs;
0033 }
0034
0035 void TrackletEngineUnit::init(const TEData& tedata) {
0036 tedata_ = tedata;
0037 nreg_ = 0;
0038 istub_ = 0;
0039 idle_ = false;
0040 assert(!tedata_.regions_.empty());
0041 std::tie(next_, ireg_, nstub_) = tedata_.regions_[0];
0042 }
0043
0044 void TrackletEngineUnit::reset() {
0045 idle_ = true;
0046 goodpair_ = false;
0047 goodpair__ = false;
0048 candpairs_.reset();
0049 }
0050
0051 void TrackletEngineUnit::step(bool, int, int) {
0052 if (goodpair__) {
0053 candpairs_.store(candpair__);
0054 }
0055
0056 goodpair__ = goodpair_;
0057 candpair__ = candpair_;
0058
0059 goodpair_ = false;
0060
0061 if (idle_ || nearfull_) {
0062 return;
0063 }
0064
0065 int ibin = tedata_.start_ + next_;
0066
0067 int nbins = (1 << NFINERZBITS);
0068
0069 assert(istub_ < outervmstubs_->nVMStubsBinned(ireg_ * nbins + ibin));
0070
0071 const VMStubTE& outervmstub = outervmstubs_->getVMStubTEBinned(ireg_ * nbins + ibin, istub_);
0072 int rzbin = (outervmstub.vmbits().value() & (nbins - 1));
0073
0074 FPGAWord iphiouterbin = outervmstub.finephi();
0075
0076 assert(iphiouterbin == outervmstub.finephi());
0077
0078
0079 int outerfinephi = iAllStub_ * (1 << (nbitsfinephi_ - settings_->nbitsallstubs(layerdisk2_))) +
0080 ireg_ * (1 << settings_->nfinephi(1, iSeed_)) + iphiouterbin.value();
0081 int idphi = outerfinephi - tedata_.innerfinephi_;
0082
0083 bool inrange = (idphi < (1 << (nbitsfinephidiff_ - 1))) && (idphi >= -(1 << (nbitsfinephidiff_ - 1)));
0084
0085 idphi = idphi & ((1 << nbitsfinephidiff_) - 1);
0086
0087 unsigned int firstDiskSeed = 4;
0088 if (iSeed_ >= firstDiskSeed) {
0089 int ibinMask = 3;
0090 int ir = ((ibin & ibinMask) << 1) + (rzbin >> (NFINERZBITS - 1));
0091 int nrbits = 3;
0092 idphi = (idphi << nrbits) + ir;
0093 }
0094
0095 if (next_ != 0)
0096 rzbin += (1 << NFINERZBITS);
0097
0098 if ((rzbin < tedata_.rzbinfirst_) || (rzbin - tedata_.rzbinfirst_ > tedata_.rzdiffmax_)) {
0099 if (settings_->debugTracklet()) {
0100 edm::LogVerbatim("Tracklet") << " layer-disk stub pair rejected because rbin cut : " << rzbin << " "
0101 << tedata_.rzbinfirst_ << " " << tedata_.rzdiffmax_;
0102 }
0103 } else {
0104 FPGAWord outerbend = outervmstub.bend();
0105
0106 int ptinnerindex = (idphi << tedata_.innerbend_.nbits()) + tedata_.innerbend_.value();
0107 int ptouterindex = (idphi << outerbend.nbits()) + outerbend.value();
0108
0109 if (!(inrange && pttableinnernew_->lookup(ptinnerindex) && pttableouternew_->lookup(ptouterindex))) {
0110 if (settings_->debugTracklet()) {
0111 edm::LogVerbatim("Tracklet") << " Stub pair rejected because of stub pt cut bends : "
0112 << settings_->benddecode(
0113 tedata_.innerbend_.value(), layerdisk1_, tedata_.stub_->isPSmodule())
0114 << " "
0115 << settings_->benddecode(outerbend.value(), layerdisk2_, outervmstub.isPSmodule());
0116 }
0117 } else {
0118 candpair_ = pair<const Stub*, const Stub*>(tedata_.stub_, outervmstub.stub());
0119 goodpair_ = true;
0120 }
0121 }
0122
0123 istub_++;
0124 assert(nstub_ <= N_VMSTUBSMAX);
0125 if (istub_ >= nstub_) {
0126 istub_ = 0;
0127 nreg_++;
0128 if (nreg_ >= tedata_.regions_.size()) {
0129 nreg_ = 0;
0130 idle_ = true;
0131 } else {
0132 std::tie(next_, ireg_, nstub_) = tedata_.regions_[nreg_];
0133 }
0134 }
0135 }