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) {
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) {
0106
0107 int nrbits = 3;
0108 int ibinmask = (1 << (nrbits - 1)) - 1;
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 }