Back to home page

Project CMSSW displayed by LXR

 
 

    


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   //New code to calculate lut value
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) {  //Also use r-position
0089     int ibinMask = 3;             //Get two least sign. bits
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 }