File indexing completed on 2024-04-06 12:22:05
0001 #include "L1Trigger/TrackFindingTracklet/interface/TrackletProcessorDisplaced.h"
0002 #include "L1Trigger/TrackFindingTracklet/interface/Settings.h"
0003 #include "L1Trigger/TrackFindingTracklet/interface/Globals.h"
0004 #include "L1Trigger/TrackFindingTracklet/interface/AllStubsMemory.h"
0005 #include "L1Trigger/TrackFindingTracklet/interface/AllInnerStubsMemory.h"
0006 #include "L1Trigger/TrackFindingTracklet/interface/StubPairsMemory.h"
0007 #include "L1Trigger/TrackFindingTracklet/interface/Tracklet.h"
0008 #include "L1Trigger/TrackFindingTracklet/interface/Util.h"
0009 #include "L1Trigger/TrackFindingTracklet/interface/IMATH_TrackletCalculator.h"
0010
0011 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0012 #include "FWCore/Utilities/interface/Exception.h"
0013 #include "DataFormats/Math/interface/deltaPhi.h"
0014
0015 #include <utility>
0016 #include <tuple>
0017
0018 using namespace std;
0019 using namespace trklet;
0020
0021 TrackletProcessorDisplaced::TrackletProcessorDisplaced(string name, Settings const& settings, Globals* globals)
0022 : TrackletCalculatorDisplaced(name, settings, globals),
0023 innerTable_(settings),
0024 innerOverlapTable_(settings),
0025 innerThirdTable_(settings) {
0026 innerallstubs_.clear();
0027 middleallstubs_.clear();
0028 outerallstubs_.clear();
0029 stubpairs_.clear();
0030 innervmstubs_.clear();
0031 outervmstubs_.clear();
0032
0033 const unsigned layerdiskPosInName = 4;
0034 const unsigned regionPosInName1 = 9;
0035
0036
0037 layerdisk_ = initLayerDisk(layerdiskPosInName);
0038
0039 unsigned int region = name.substr(1)[regionPosInName1] - 'A';
0040
0041
0042 if (layerdisk_ == LayerDisk::L1 || layerdisk_ == LayerDisk::L2 || layerdisk_ == LayerDisk::L3 ||
0043 layerdisk_ == LayerDisk::L5 || layerdisk_ == LayerDisk::D1 || layerdisk_ == LayerDisk::D3) {
0044 innerTable_.initVMRTable(layerdisk_, TrackletLUT::VMRTableType::inner, region);
0045 }
0046
0047 if (layerdisk_ == LayerDisk::L1 || layerdisk_ == LayerDisk::L2) {
0048 innerOverlapTable_.initVMRTable(
0049 layerdisk_, TrackletLUT::VMRTableType::inneroverlap, region);
0050 }
0051
0052 if (layerdisk_ == LayerDisk::L2 || layerdisk_ == LayerDisk::L3 || layerdisk_ == LayerDisk::L5 ||
0053 layerdisk_ == LayerDisk::D1) {
0054 innerThirdTable_.initVMRTable(
0055 layerdisk_, TrackletLUT::VMRTableType::innerthird, region);
0056 }
0057
0058 nbitszfinebintable_ = settings_.vmrlutzbits(layerdisk_);
0059 nbitsrfinebintable_ = settings_.vmrlutrbits(layerdisk_);
0060
0061 for (unsigned int ilayer = 0; ilayer < N_LAYER; ilayer++) {
0062 vector<TrackletProjectionsMemory*> tmp(settings_.nallstubs(ilayer), nullptr);
0063 trackletprojlayers_.push_back(tmp);
0064 }
0065
0066 for (unsigned int idisk = 0; idisk < N_DISK; idisk++) {
0067 vector<TrackletProjectionsMemory*> tmp(settings_.nallstubs(idisk + N_LAYER), nullptr);
0068 trackletprojdisks_.push_back(tmp);
0069 }
0070
0071
0072
0073 layer_ = 0;
0074 disk_ = 0;
0075 layer1_ = 0;
0076 layer2_ = 0;
0077 layer3_ = 0;
0078 disk1_ = 0;
0079 disk2_ = 0;
0080 disk3_ = 0;
0081
0082 constexpr unsigned layerPosInName1 = 4;
0083 constexpr unsigned diskPosInName1 = 4;
0084 constexpr unsigned layer1PosInName1 = 4;
0085 constexpr unsigned disk1PosInName1 = 4;
0086 constexpr unsigned layer2PosInName1 = 6;
0087 constexpr unsigned disk2PosInName1 = 6;
0088
0089 string name1 = name.substr(1);
0090 if (name1[3] == 'L')
0091 layer_ = name1[layerPosInName1] - '0';
0092 if (name1[3] == 'D')
0093 disk_ = name1[diskPosInName1] - '0';
0094
0095 if (name1[3] == 'L')
0096 layer1_ = name1[layer1PosInName1] - '0';
0097 if (name1[3] == 'D')
0098 disk1_ = name1[disk1PosInName1] - '0';
0099 if (name1[5] == 'L')
0100 layer2_ = name1[layer2PosInName1] - '0';
0101 if (name1[5] == 'D')
0102 disk2_ = name1[disk2PosInName1] - '0';
0103
0104
0105 iSeed_ = 0;
0106
0107 int iTC = name1[regionPosInName1] - 'A';
0108
0109 if (name1.substr(3, 6) == "L3L4L2") {
0110 iSeed_ = 8;
0111 layer3_ = 2;
0112 } else if (name1.substr(3, 6) == "L5L6L4") {
0113 iSeed_ = 9;
0114 layer3_ = 4;
0115 } else if (name1.substr(3, 6) == "L2L3D1") {
0116 iSeed_ = 10;
0117 disk3_ = 1;
0118 } else if (name1.substr(3, 6) == "D1D2L2") {
0119 iSeed_ = 11;
0120 layer3_ = 2;
0121 }
0122 assert(iSeed_ != 0);
0123
0124 constexpr int TCIndexMin = 128;
0125 constexpr int TCIndexMax = 191;
0126
0127 TCIndex_ = (iSeed_ << 4) + iTC;
0128 assert(TCIndex_ >= TCIndexMin && TCIndex_ < TCIndexMax);
0129
0130 assert((layer_ != 0) || (disk_ != 0));
0131 }
0132
0133 void TrackletProcessorDisplaced::addOutputProjection(TrackletProjectionsMemory*& outputProj, MemoryBase* memory) {
0134 outputProj = dynamic_cast<TrackletProjectionsMemory*>(memory);
0135 assert(outputProj != nullptr);
0136 }
0137
0138 void TrackletProcessorDisplaced::addOutput(MemoryBase* memory, string output) {
0139 if (settings_.writetrace()) {
0140 edm::LogVerbatim("Tracklet") << "In " << name_ << " adding output to " << memory->getName() << " to output "
0141 << output;
0142 }
0143
0144 if (output == "trackpar") {
0145 auto* tmp = dynamic_cast<TrackletParametersMemory*>(memory);
0146 assert(tmp != nullptr);
0147 trackletpars_ = tmp;
0148 return;
0149 }
0150
0151 if (output.substr(0, 7) == "projout") {
0152
0153 auto* tmp = dynamic_cast<TrackletProjectionsMemory*>(memory);
0154 assert(tmp != nullptr);
0155
0156 constexpr unsigned layerdiskPosInprojout = 8;
0157 constexpr unsigned phiPosInprojout = 12;
0158
0159 unsigned int layerdisk = output[layerdiskPosInprojout] - '1';
0160 unsigned int phiregion = output[phiPosInprojout] - 'A';
0161
0162 if (output[7] == 'L') {
0163 assert(layerdisk < N_LAYER);
0164 assert(phiregion < trackletprojlayers_[layerdisk].size());
0165
0166 assert(trackletprojlayers_[layerdisk][phiregion] == nullptr);
0167 trackletprojlayers_[layerdisk][phiregion] = tmp;
0168 return;
0169 }
0170
0171 if (output[7] == 'D') {
0172 assert(layerdisk < N_DISK);
0173 assert(phiregion < trackletprojdisks_[layerdisk].size());
0174
0175 assert(trackletprojdisks_[layerdisk][phiregion] == nullptr);
0176 trackletprojdisks_[layerdisk][phiregion] = tmp;
0177 return;
0178 }
0179 }
0180
0181 throw cms::Exception("BadConfig") << __FILE__ << " " << __LINE__ << " Could not find output : " << output;
0182 }
0183
0184 void TrackletProcessorDisplaced::addInput(MemoryBase* memory, string input) {
0185 if (settings_.writetrace()) {
0186 edm::LogVerbatim("Tracklet") << "In " << name_ << " adding input from " << memory->getName() << " to input "
0187 << input;
0188 }
0189
0190 if (input == "thirdallstubin") {
0191 auto* tmp = dynamic_cast<AllStubsMemory*>(memory);
0192 assert(tmp != nullptr);
0193 innerallstubs_.push_back(tmp);
0194 return;
0195 }
0196 if (input == "firstallstubin") {
0197 auto* tmp = dynamic_cast<AllStubsMemory*>(memory);
0198 assert(tmp != nullptr);
0199 middleallstubs_.push_back(tmp);
0200 return;
0201 }
0202 if (input == "secondallstubin") {
0203 auto* tmp = dynamic_cast<AllStubsMemory*>(memory);
0204 assert(tmp != nullptr);
0205 outerallstubs_.push_back(tmp);
0206 return;
0207 }
0208 if (input.substr(0, 8) == "stubpair") {
0209 auto* tmp = dynamic_cast<StubPairsMemory*>(memory);
0210 assert(tmp != nullptr);
0211 stubpairs_.push_back(tmp);
0212 return;
0213 }
0214
0215 if (input == "thirdvmstubin") {
0216 auto* tmp = dynamic_cast<VMStubsTEMemory*>(memory);
0217 assert(tmp != nullptr);
0218 innervmstubs_.push_back(tmp);
0219 return;
0220 }
0221 if (input == "secondvmstubin") {
0222 auto* tmp = dynamic_cast<VMStubsTEMemory*>(memory);
0223 assert(tmp != nullptr);
0224
0225 outervmstubs_.push_back(tmp);
0226 return;
0227 }
0228
0229 throw cms::Exception("BadConfig") << __FILE__ << " " << __LINE__ << " Could not find input : " << input;
0230 }
0231
0232 void TrackletProcessorDisplaced::execute(unsigned int iSector, double phimin, double phimax) {
0233 unsigned int countall = 0;
0234 unsigned int countsel = 0;
0235
0236
0237 count_ = 0;
0238
0239 phimin_ = phimin;
0240 phimax_ = phimax;
0241 iSector_ = iSector;
0242
0243 assert(!innerallstubs_.empty());
0244 assert(!middleallstubs_.empty());
0245 assert(!outerallstubs_.empty());
0246 assert(!innervmstubs_.empty());
0247 assert(!outervmstubs_.empty());
0248 assert(stubpairs_.empty());
0249
0250 for (auto& iInnerMem : middleallstubs_) {
0251 assert(iInnerMem->nStubs() == iInnerMem->nStubs());
0252 for (unsigned int j = 0; j < iInnerMem->nStubs(); j++) {
0253 const Stub* firstallstub = iInnerMem->getStub(j);
0254
0255 if (settings_.debugTracklet()) {
0256 edm::LogVerbatim("Tracklet") << "In " << getName() << " have first stub\n";
0257 }
0258
0259 int inner = 0;
0260 bool negdisk = (firstallstub->disk().value() < 0);
0261 int indexz = (((1 << (firstallstub->z().nbits() - 1)) + firstallstub->z().value()) >>
0262 (firstallstub->z().nbits() - nbitszfinebintable_));
0263 int indexr = -1;
0264 if (layerdisk_ > (N_LAYER - 1)) {
0265 if (negdisk) {
0266 indexz = (1 << nbitszfinebintable_) - indexz;
0267 }
0268 indexr = firstallstub->r().value();
0269 if (firstallstub->isPSmodule()) {
0270 indexr = firstallstub->r().value() >> (firstallstub->r().nbits() - nbitsrfinebintable_);
0271 }
0272 } else {
0273
0274 indexr = (((1 << (firstallstub->r().nbits() - 1)) + firstallstub->r().value()) >>
0275 (firstallstub->r().nbits() - nbitsrfinebintable_));
0276 }
0277
0278 assert(indexz >= 0);
0279 assert(indexr >= 0);
0280 assert(indexz < (1 << nbitszfinebintable_));
0281 assert(indexr < (1 << nbitsrfinebintable_));
0282
0283
0284
0285
0286 unsigned int lutwidth = settings_.lutwidthtab(inner, iSeed_);
0287 if (settings_.extended()) {
0288 lutwidth = settings_.lutwidthtabextended(inner, iSeed_);
0289 }
0290
0291 int lutval = -999;
0292
0293 if (iSeed_ < Seed::L1D1 || iSeed_ > Seed::L2D1) {
0294 lutval = innerTable_.lookup((indexz << nbitsrfinebintable_) + indexr);
0295 } else {
0296 lutval = innerOverlapTable_.lookup((indexz << nbitsrfinebintable_) + indexr);
0297 }
0298
0299 if (lutval == -1)
0300 continue;
0301 if (settings_.extended() &&
0302 (iSeed_ == Seed::L2L3L4 || iSeed_ == Seed::L4L5L6 || iSeed_ == Seed::D1D2L2 || iSeed_ == Seed::L2L3D1)) {
0303 int lutval2 = innerThirdTable_.lookup((indexz << nbitsrfinebintable_) + indexr);
0304 if (lutval2 != -1)
0305 lutval += (lutval2 << 10);
0306 }
0307
0308 assert(lutval >= 0);
0309
0310
0311 FPGAWord binlookup(lutval, lutwidth, true, __LINE__, __FILE__);
0312
0313 if ((layer1_ == 3 && layer2_ == 4) || (layer1_ == 5 && layer2_ == 6)) {
0314 if (settings_.debugTracklet()) {
0315 edm::LogVerbatim("Tracklet") << getName() << " Layer-layer pair\n";
0316 }
0317
0318 constexpr int andlookupbits = 1023;
0319 constexpr int shiftzdiffmax = 7;
0320 constexpr int andnewbin = 127;
0321 constexpr int divbin = 8;
0322 constexpr int andzbinfirst = 7;
0323 constexpr int shiftstart = 1;
0324 constexpr int andlast = 1;
0325 constexpr int maxlast = 8;
0326
0327 int lookupbits = binlookup.value() & andlookupbits;
0328 int zdiffmax = (lookupbits >> shiftzdiffmax);
0329 int newbin = (lookupbits & andnewbin);
0330 int bin = newbin / divbin;
0331
0332 int zbinfirst = newbin & andzbinfirst;
0333
0334 int start = (bin >> shiftstart);
0335 int last = start + (bin & andlast);
0336
0337 assert(last < maxlast);
0338
0339 if (settings_.debugTracklet()) {
0340 edm::LogVerbatim("Tracklet") << "Will look in zbins " << start << " to " << last << endl;
0341 }
0342
0343 for (int ibin = start; ibin <= last; ibin++) {
0344 for (unsigned int m = 0; m < outervmstubs_.size(); m++) {
0345 for (unsigned int j = 0; j < outervmstubs_.at(m)->nVMStubsBinned(ibin); j++) {
0346 if (settings_.debugTracklet()) {
0347 edm::LogVerbatim("Tracklet")
0348 << "In " << getName() << " have second stub(1) " << ibin << " " << j << endl;
0349 }
0350
0351 const VMStubTE& secondvmstub = outervmstubs_.at(m)->getVMStubTEBinned(ibin, j);
0352
0353 int zbin = (secondvmstub.vmbits().value() & 7);
0354 if (start != ibin)
0355 zbin += 8;
0356 if (zbin < zbinfirst || zbin - zbinfirst > zdiffmax) {
0357 if (settings_.debugTracklet()) {
0358 edm::LogVerbatim("Tracklet") << "Stubpair rejected because of wrong zbin";
0359 }
0360 continue;
0361 }
0362
0363 if ((layer2_ == 4 && layer3_ == 2) || (layer2_ == 6 && layer3_ == 4)) {
0364 constexpr int vmbitshift = 10;
0365 constexpr int andlookupbits_ = 1023;
0366 constexpr int andnewbin_ = 127;
0367 constexpr int divbin_ = 8;
0368 constexpr int shiftstart_ = 1;
0369 constexpr int andlast_ = 1;
0370
0371 int lookupbits_ = (int)((binlookup.value() >> vmbitshift) & andlookupbits_);
0372 int newbin_ = (lookupbits_ & andnewbin_);
0373 int bin_ = newbin_ / divbin_;
0374
0375 int start_ = (bin_ >> shiftstart_);
0376 int last_ = start_ + (bin_ & andlast_);
0377
0378 if (settings_.debugTracklet()) {
0379 edm::LogVerbatim("Tracklet")
0380 << "Will look in zbins for third stub" << start_ << " to " << last_ << endl;
0381 }
0382
0383 for (int ibin_ = start_; ibin_ <= last_; ibin_++) {
0384 for (unsigned int k = 0; k < innervmstubs_.size(); k++) {
0385 for (unsigned int l = 0; l < innervmstubs_.at(k)->nVMStubsBinned(ibin_); l++) {
0386 if (settings_.debugTracklet()) {
0387 edm::LogVerbatim("Tracklet") << "In " << getName() << " have third stub\n";
0388 }
0389
0390 countall++;
0391
0392 const VMStubTE& thirdvmstub = innervmstubs_.at(k)->getVMStubTEBinned(ibin_, l);
0393
0394 const Stub* innerFPGAStub = firstallstub;
0395 const Stub* middleFPGAStub = secondvmstub.stub();
0396 const Stub* outerFPGAStub = thirdvmstub.stub();
0397
0398 const L1TStub* innerStub = innerFPGAStub->l1tstub();
0399 const L1TStub* middleStub = middleFPGAStub->l1tstub();
0400 const L1TStub* outerStub = outerFPGAStub->l1tstub();
0401
0402 if (settings_.debugTracklet()) {
0403 edm::LogVerbatim("Tracklet")
0404 << "LLL seeding\n"
0405 << innerFPGAStub->strbare() << middleFPGAStub->strbare() << outerFPGAStub->strbare()
0406 << innerStub->stubword() << middleStub->stubword() << outerStub->stubword()
0407 << innerFPGAStub->layerdisk() << middleFPGAStub->layerdisk() << outerFPGAStub->layerdisk();
0408 }
0409
0410 if (settings_.debugTracklet()) {
0411 edm::LogVerbatim("Tracklet")
0412 << "TrackletCalculatorDisplaced execute " << getName() << "[" << iSector_ << "]";
0413 }
0414
0415 if (innerFPGAStub->layerdisk() < N_LAYER && middleFPGAStub->layerdisk() < N_LAYER &&
0416 outerFPGAStub->layerdisk() < N_LAYER) {
0417 bool accept =
0418 LLLSeeding(outerFPGAStub, outerStub, innerFPGAStub, innerStub, middleFPGAStub, middleStub);
0419
0420 if (accept)
0421 countsel++;
0422 } else if (innerFPGAStub->layerdisk() >= N_LAYER && middleFPGAStub->layerdisk() >= N_LAYER &&
0423 outerFPGAStub->layerdisk() >= N_LAYER) {
0424 throw cms::Exception("LogicError") << __FILE__ << " " << __LINE__ << " Invalid seeding!";
0425 }
0426
0427 if (settings_.debugTracklet()) {
0428 edm::LogVerbatim("Tracklet") << "TrackletCalculatorDisplaced execute done";
0429 }
0430 }
0431 }
0432 }
0433 }
0434 }
0435 }
0436 }
0437
0438 } else if (layer1_ == 2 && layer2_ == 3) {
0439 if (settings_.debugTracklet()) {
0440 edm::LogVerbatim("Tracklet") << getName() << " Layer-layer pair";
0441 }
0442
0443 constexpr int andlookupbits = 1023;
0444 constexpr int shiftzdiffmax = 7;
0445 constexpr int andnewbin = 127;
0446 constexpr int divbin = 8;
0447 constexpr int andzbinfirst = 7;
0448 constexpr int shiftstart = 1;
0449 constexpr int andlast = 1;
0450 constexpr int maxlast = 8;
0451
0452 int lookupbits = binlookup.value() & andlookupbits;
0453 int zdiffmax = (lookupbits >> shiftzdiffmax);
0454 int newbin = (lookupbits & andnewbin);
0455 int bin = newbin / divbin;
0456
0457 int zbinfirst = newbin & andzbinfirst;
0458
0459 int start = (bin >> shiftstart);
0460 int last = start + (bin & andlast);
0461
0462 assert(last < maxlast);
0463
0464 if (settings_.debugTracklet()) {
0465 edm::LogVerbatim("Tracklet") << "Will look in zbins " << start << " to " << last;
0466 }
0467
0468 for (int ibin = start; ibin <= last; ibin++) {
0469 for (unsigned int m = 0; m < outervmstubs_.size(); m++) {
0470 for (unsigned int j = 0; j < outervmstubs_.at(m)->nVMStubsBinned(ibin); j++) {
0471 if (settings_.debugTracklet()) {
0472 edm::LogVerbatim("Tracklet") << "In " << getName() << " have second stub(1) " << ibin << " " << j;
0473 }
0474
0475 const VMStubTE& secondvmstub = outervmstubs_.at(m)->getVMStubTEBinned(ibin, j);
0476
0477 int zbin = (secondvmstub.vmbits().value() & 7);
0478 if (start != ibin)
0479 zbin += 8;
0480 if (zbin < zbinfirst || zbin - zbinfirst > zdiffmax) {
0481 if (settings_.debugTracklet()) {
0482 edm::LogVerbatim("Tracklet") << "Stubpair rejected because of wrong zbin";
0483 }
0484 continue;
0485 }
0486
0487 if (layer2_ == 3 && disk3_ == 1) {
0488 constexpr int vmbitshift = 10;
0489 constexpr int andlookupbits_ = 1023;
0490 constexpr int andnewbin_ = 127;
0491 constexpr int divbin_ = 8;
0492 constexpr int shiftstart_ = 1;
0493 constexpr int andlast_ = 1;
0494
0495 int lookupbits_ = (int)((binlookup.value() >> vmbitshift) & andlookupbits_);
0496 int newbin_ = (lookupbits_ & andnewbin_);
0497 int bin_ = newbin_ / divbin_;
0498
0499 int start_ = (bin_ >> shiftstart_);
0500 int last_ = start_ + (bin_ & andlast_);
0501
0502 for (int ibin_ = start_; ibin_ <= last_; ibin_++) {
0503 for (unsigned int k = 0; k < innervmstubs_.size(); k++) {
0504 for (unsigned int l = 0; l < innervmstubs_.at(k)->nVMStubsBinned(ibin_); l++) {
0505 if (settings_.debugTracklet()) {
0506 edm::LogVerbatim("Tracklet") << "In " << getName() << " have third stub";
0507 }
0508
0509 countall++;
0510
0511 const VMStubTE& thirdvmstub = innervmstubs_.at(k)->getVMStubTEBinned(ibin_, l);
0512
0513 const Stub* innerFPGAStub = firstallstub;
0514 const Stub* middleFPGAStub = secondvmstub.stub();
0515 const Stub* outerFPGAStub = thirdvmstub.stub();
0516
0517 const L1TStub* innerStub = innerFPGAStub->l1tstub();
0518 const L1TStub* middleStub = middleFPGAStub->l1tstub();
0519 const L1TStub* outerStub = outerFPGAStub->l1tstub();
0520
0521 if (settings_.debugTracklet()) {
0522 edm::LogVerbatim("Tracklet")
0523 << "LLD seeding\n"
0524 << innerFPGAStub->strbare() << middleFPGAStub->strbare() << outerFPGAStub->strbare()
0525 << innerStub->stubword() << middleStub->stubword() << outerStub->stubword()
0526 << innerFPGAStub->layerdisk() << middleFPGAStub->layerdisk() << outerFPGAStub->layerdisk();
0527 }
0528
0529 if (settings_.debugTracklet()) {
0530 edm::LogVerbatim("Tracklet")
0531 << "TrackletCalculatorDisplaced execute " << getName() << "[" << iSector_ << "]";
0532 }
0533
0534 bool accept =
0535 LLDSeeding(outerFPGAStub, outerStub, innerFPGAStub, innerStub, middleFPGAStub, middleStub);
0536
0537 if (accept)
0538 countsel++;
0539
0540 if (settings_.debugTracklet()) {
0541 edm::LogVerbatim("Tracklet") << "TrackletCalculatorDisplaced execute done";
0542 }
0543 }
0544 }
0545 }
0546 }
0547 }
0548 }
0549 }
0550
0551 } else if (disk1_ == 1 && disk2_ == 2) {
0552 if (settings_.debugTracklet())
0553 edm::LogVerbatim("Tracklet") << getName() << " Disk-disk pair";
0554
0555 constexpr int andlookupbits = 511;
0556 constexpr int shiftrdiffmax = 6;
0557 constexpr int andnewbin = 63;
0558 constexpr int divbin = 8;
0559 constexpr int andrbinfirst = 7;
0560 constexpr int shiftstart = 1;
0561 constexpr int andlast = 1;
0562 constexpr int maxlast = 8;
0563
0564 int lookupbits = binlookup.value() & andlookupbits;
0565 bool negdisk = firstallstub->disk().value() < 0;
0566 int rdiffmax = (lookupbits >> shiftrdiffmax);
0567 int newbin = (lookupbits & andnewbin);
0568 int bin = newbin / divbin;
0569
0570 int rbinfirst = newbin & andrbinfirst;
0571
0572 int start = (bin >> shiftstart);
0573 if (negdisk)
0574 start += 4;
0575 int last = start + (bin & andlast);
0576 assert(last < maxlast);
0577
0578 for (int ibin = start; ibin <= last; ibin++) {
0579 for (unsigned int m = 0; m < outervmstubs_.size(); m++) {
0580 if (settings_.debugTracklet()) {
0581 edm::LogVerbatim("Tracklet")
0582 << getName() << " looking for matching stub in " << outervmstubs_.at(m)->getName()
0583 << " in bin = " << ibin << " with " << outervmstubs_.at(m)->nVMStubsBinned(ibin) << " stubs";
0584 }
0585
0586 for (unsigned int j = 0; j < outervmstubs_.at(m)->nVMStubsBinned(ibin); j++) {
0587 const VMStubTE& secondvmstub = outervmstubs_.at(m)->getVMStubTEBinned(ibin, j);
0588 int rbin = (secondvmstub.vmbits().value() & 7);
0589 if (start != ibin)
0590 rbin += 8;
0591 if (rbin < rbinfirst)
0592 continue;
0593 if (rbin - rbinfirst > rdiffmax)
0594 continue;
0595
0596 if (disk2_ == 2 && layer3_ == 2) {
0597 constexpr int vmbitshift = 10;
0598 constexpr int andlookupbits_ = 1023;
0599 constexpr int andnewbin_ = 127;
0600 constexpr int divbin_ = 8;
0601 constexpr int shiftstart_ = 1;
0602 constexpr int andlast_ = 1;
0603
0604 int lookupbits_ = (int)((binlookup.value() >> vmbitshift) & andlookupbits_);
0605 int newbin_ = (lookupbits_ & andnewbin_);
0606 int bin_ = newbin_ / divbin_;
0607
0608 int start_ = (bin_ >> shiftstart_);
0609 int last_ = start_ + (bin_ & andlast_);
0610
0611 if (firstallstub->disk().value() < 0) {
0612 start_ = settings_.NLONGVMBINS() - last_ - 1;
0613 last_ = settings_.NLONGVMBINS() - start_ - 1;
0614 }
0615
0616 for (int ibin_ = start_; ibin_ <= last_; ibin_++) {
0617 for (unsigned int k = 0; k < innervmstubs_.size(); k++) {
0618 for (unsigned int l = 0; l < innervmstubs_.at(k)->nVMStubsBinned(ibin_); l++) {
0619 if (settings_.debugTracklet()) {
0620 edm::LogVerbatim("Tracklet") << "In " << getName() << " have third stub";
0621 }
0622
0623 countall++;
0624
0625 const VMStubTE& thirdvmstub = innervmstubs_.at(k)->getVMStubTEBinned(ibin_, l);
0626
0627 const Stub* innerFPGAStub = firstallstub;
0628 const Stub* middleFPGAStub = secondvmstub.stub();
0629 const Stub* outerFPGAStub = thirdvmstub.stub();
0630
0631 const L1TStub* innerStub = innerFPGAStub->l1tstub();
0632 const L1TStub* middleStub = middleFPGAStub->l1tstub();
0633 const L1TStub* outerStub = outerFPGAStub->l1tstub();
0634
0635 if (settings_.debugTracklet()) {
0636 edm::LogVerbatim("Tracklet")
0637 << "DDL seeding\n"
0638 << innerFPGAStub->strbare() << middleFPGAStub->strbare() << outerFPGAStub->strbare()
0639 << innerStub->stubword() << middleStub->stubword() << outerStub->stubword()
0640 << innerFPGAStub->layerdisk() << middleFPGAStub->layerdisk() << outerFPGAStub->layerdisk();
0641 }
0642
0643 if (settings_.debugTracklet()) {
0644 edm::LogVerbatim("Tracklet")
0645 << "TrackletCalculatorDisplaced execute " << getName() << "[" << iSector_ << "]";
0646 }
0647
0648 bool accept =
0649 DDLSeeding(outerFPGAStub, outerStub, innerFPGAStub, innerStub, middleFPGAStub, middleStub);
0650
0651 if (accept)
0652 countsel++;
0653
0654 if (settings_.debugTracklet()) {
0655 edm::LogVerbatim("Tracklet") << "TrackletCalculatorDisplaced execute done";
0656 }
0657 }
0658 }
0659 }
0660 }
0661 }
0662 }
0663 }
0664 }
0665 }
0666 }
0667
0668 if (settings_.writeMonitorData("TPD")) {
0669 globals_->ofstream("trackletprocessordisplaced.txt") << getName() << " " << countall << " " << countsel << endl;
0670 }
0671 }