Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:22:04

0001 #include "L1Trigger/TrackFindingTracklet/interface/TrackletEngine.h"
0002 #include "L1Trigger/TrackFindingTracklet/interface/StubPairsMemory.h"
0003 #include "L1Trigger/TrackFindingTracklet/interface/VMStubsTEMemory.h"
0004 #include "L1Trigger/TrackFindingTracklet/interface/Globals.h"
0005 #include "L1Trigger/TrackFindingTracklet/interface/Settings.h"
0006 #include "L1Trigger/TrackFindingTracklet/interface/Util.h"
0007 
0008 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0009 #include "FWCore/Utilities/interface/Exception.h"
0010 
0011 #include <filesystem>
0012 
0013 using namespace trklet;
0014 using namespace std;
0015 
0016 TrackletEngine::TrackletEngine(string name, Settings const& settings, Globals* global)
0017     : ProcessBase(name, settings, global), innerptlut_(settings), outerptlut_(settings) {
0018   stubpairs_ = nullptr;
0019   innervmstubs_ = nullptr;
0020   outervmstubs_ = nullptr;
0021 
0022   initLayerDisksandISeed(layerdisk1_, layerdisk2_, iSeed_);
0023 
0024   innerphibits_ = settings.nfinephi(0, iSeed_);
0025   outerphibits_ = settings.nfinephi(1, iSeed_);
0026 }
0027 
0028 void TrackletEngine::addOutput(MemoryBase* memory, string output) {
0029   if (settings_.writetrace()) {
0030     edm::LogVerbatim("Tracklet") << "In " << name_ << " adding output to " << memory->getName() << " to output "
0031                                  << output;
0032   }
0033   if (output == "stubpairout") {
0034     StubPairsMemory* tmp = dynamic_cast<StubPairsMemory*>(memory);
0035     assert(tmp != nullptr);
0036     stubpairs_ = tmp;
0037     return;
0038   }
0039   throw cms::Exception("BadConfig") << __FILE__ << " " << __LINE__ << " Could not find output : " << output;
0040 }
0041 
0042 void TrackletEngine::addInput(MemoryBase* memory, string input) {
0043   if (settings_.writetrace()) {
0044     edm::LogVerbatim("Tracklet") << "In " << name_ << " adding input from " << memory->getName() << " to input "
0045                                  << input;
0046   }
0047   if (input == "innervmstubin") {
0048     VMStubsTEMemory* tmp = dynamic_cast<VMStubsTEMemory*>(memory);
0049     assert(tmp != nullptr);
0050     innervmstubs_ = tmp;
0051     setVMPhiBin();
0052     return;
0053   }
0054   if (input == "outervmstubin") {
0055     VMStubsTEMemory* tmp = dynamic_cast<VMStubsTEMemory*>(memory);
0056     assert(tmp != nullptr);
0057     outervmstubs_ = tmp;
0058     setVMPhiBin();
0059     return;
0060   }
0061   throw cms::Exception("BadConfig") << __FILE__ << " " << __LINE__ << " Could not find input : " << input;
0062 }
0063 
0064 void TrackletEngine::execute() {
0065   if (!settings_.useSeed(iSeed_))
0066     return;
0067 
0068   unsigned int countall = 0;
0069   unsigned int countpass = 0;
0070 
0071   assert(innervmstubs_ != nullptr);
0072   assert(outervmstubs_ != nullptr);
0073 
0074   for (unsigned int i = 0; i < innervmstubs_->nVMStubs(); i++) {
0075     const VMStubTE& innervmstub = innervmstubs_->getVMStubTE(i);
0076     FPGAWord lookupbits = innervmstub.vmbits();
0077 
0078     unsigned int nbits = 7;
0079     if (iSeed_ == 4 || iSeed_ == 5)
0080       nbits = 6;
0081     int rzdiffmax = lookupbits.bits(nbits, lookupbits.nbits() - nbits);
0082     int rzbinfirst = lookupbits.bits(0, 3);
0083     int start = lookupbits.bits(4, nbits - 4);
0084     int next = lookupbits.bits(3, 1);
0085 
0086     if ((iSeed_ == 4 || iSeed_ == 5) && innervmstub.stub()->disk().value() < 0) {  //TODO - need to store negative disk
0087       start += 4;
0088     }
0089     int last = start + next;
0090 
0091     for (int ibin = start; ibin <= last; ibin++) {
0092       for (unsigned int j = 0; j < outervmstubs_->nVMStubsBinned(ibin); j++) {
0093         if (countall >= settings_.maxStep("TE"))
0094           break;
0095         countall++;
0096         const VMStubTE& outervmstub = outervmstubs_->getVMStubTEBinned(ibin, j);
0097 
0098         int rzbin = outervmstub.vmbits().bits(0, N_RZBITS);
0099 
0100         FPGAWord iphiinnerbin = innervmstub.finephi();
0101         FPGAWord iphiouterbin = outervmstub.finephi();
0102 
0103         unsigned int index = (iphiinnerbin.value() << outerphibits_) + iphiouterbin.value();
0104 
0105         if (iSeed_ >= 4) {  //Also use r-position
0106 
0107           int nrbits = 3;                          // Number of bits used for r position in disk LUT
0108           int ibinmask = (1 << (nrbits - 1)) - 1;  // Mask of two least significant bits
0109 
0110           int ir = ((ibin & ibinmask) << 1) + (rzbin >> (N_RZBITS - 1));
0111           index += (ir << (outerphibits_ + innerphibits_));
0112         }
0113 
0114         if (start != ibin)
0115           rzbin += (1 << N_RZBITS);
0116         if ((rzbin < rzbinfirst) || (rzbin - rzbinfirst > rzdiffmax)) {
0117           continue;
0118         }
0119 
0120         FPGAWord innerbend = innervmstub.bend();
0121         FPGAWord outerbend = outervmstub.bend();
0122 
0123         int ptinnerindex = (index << innerbend.nbits()) + innerbend.value();
0124         int ptouterindex = (index << outerbend.nbits()) + outerbend.value();
0125 
0126         if (!(innerptlut_.lookup(ptinnerindex) && outerptlut_.lookup(ptouterindex))) {
0127           if (settings_.debugTracklet()) {
0128             edm::LogVerbatim("Tracklet") << "Stub pair rejected because of stub pt cut bends : "
0129                                          << settings_.benddecode(
0130                                                 innervmstub.bend().value(), layerdisk1_, innervmstub.isPSmodule())
0131                                          << " "
0132                                          << settings_.benddecode(
0133                                                 outervmstub.bend().value(), layerdisk2_, outervmstub.isPSmodule());
0134           }
0135           continue;
0136         }
0137 
0138         if (settings_.debugTracklet())
0139           edm::LogVerbatim("Tracklet") << "Adding stub pair in " << getName();
0140 
0141         assert(stubpairs_ != nullptr);
0142         stubpairs_->addStubPair(innervmstub, outervmstub);
0143         countpass++;
0144       }
0145     }
0146   }
0147 
0148   if (settings_.writeMonitorData("TE")) {
0149     globals_->ofstream("trackletengine.txt") << getName() << " " << countall << " " << countpass << endl;
0150   }
0151 }
0152 
0153 void TrackletEngine::setVMPhiBin() {
0154   if (innervmstubs_ == nullptr || outervmstubs_ == nullptr)
0155     return;
0156 
0157   innervmstubs_->setother(outervmstubs_);
0158   outervmstubs_->setother(innervmstubs_);
0159 
0160   double innerphimin, innerphimax;
0161   innervmstubs_->getPhiRange(innerphimin, innerphimax, iSeed_, 0);
0162 
0163   double outerphimin, outerphimax;
0164   outervmstubs_->getPhiRange(outerphimin, outerphimax, iSeed_, 1);
0165 
0166   string innermem = innervmstubs_->getName().substr(6);
0167   string outermem = outervmstubs_->getName().substr(6);
0168 
0169   innerptlut_.initteptlut(true,
0170                           false,
0171                           iSeed_,
0172                           layerdisk1_,
0173                           layerdisk2_,
0174                           innerphibits_,
0175                           outerphibits_,
0176                           innerphimin,
0177                           innerphimax,
0178                           outerphimin,
0179                           outerphimax,
0180                           innermem,
0181                           outermem);
0182 
0183   outerptlut_.initteptlut(false,
0184                           false,
0185                           iSeed_,
0186                           layerdisk1_,
0187                           layerdisk2_,
0188                           innerphibits_,
0189                           outerphibits_,
0190                           innerphimin,
0191                           innerphimax,
0192                           outerphimin,
0193                           outerphimax,
0194                           innermem,
0195                           outermem);
0196 
0197   TrackletLUT innertememlut(settings_);
0198   TrackletLUT outertememlut(settings_);
0199 
0200   innertememlut.initteptlut(true,
0201                             true,
0202                             iSeed_,
0203                             layerdisk1_,
0204                             layerdisk2_,
0205                             innerphibits_,
0206                             outerphibits_,
0207                             innerphimin,
0208                             innerphimax,
0209                             outerphimin,
0210                             outerphimax,
0211                             innermem,
0212                             outermem);
0213 
0214   outertememlut.initteptlut(false,
0215                             true,
0216                             iSeed_,
0217                             layerdisk1_,
0218                             layerdisk2_,
0219                             innerphibits_,
0220                             outerphibits_,
0221                             innerphimin,
0222                             innerphimax,
0223                             outerphimin,
0224                             outerphimax,
0225                             innermem,
0226                             outermem);
0227 
0228   innervmstubs_->setbendtable(innertememlut);
0229   outervmstubs_->setbendtable(outertememlut);
0230 }