From 22ab35470420a11e8f1f893eb11ffbcd137ee7bf Mon Sep 17 00:00:00 2001 From: Anders Ryd Date: Sat, 27 Jun 2020 12:52:55 -0400 Subject: [PATCH 1/9] Some cleanup in writing of LUTs. Now all files use .tab extension and write to directory specificy by settigs::tablePath --- .../TrackFindingTracklet/interface/Settings.h | 10 ++-- .../src/MatchCalculator.cc | 12 ++--- .../TrackFindingTracklet/src/MatchEngine.cc | 2 +- .../src/MatchProcessor.cc | 6 +-- .../TrackFindingTracklet/src/TrackDerTable.cc | 46 +++++++++---------- .../src/TrackletEngine.cc | 4 +- .../src/TrackletProcessor.cc | 2 +- .../src/VMRouterPhiCorrTable.cc | 2 +- .../src/VMStubsTEMemory.cc | 2 +- 9 files changed, 44 insertions(+), 42 deletions(-) diff --git a/L1Trigger/TrackFindingTracklet/interface/Settings.h b/L1Trigger/TrackFindingTracklet/interface/Settings.h index 6516fa77bee95..9d20e34aab93f 100644 --- a/L1Trigger/TrackFindingTracklet/interface/Settings.h +++ b/L1Trigger/TrackFindingTracklet/interface/Settings.h @@ -151,6 +151,7 @@ namespace trklet { bool writeMem() const { return writeMem_; } bool writeTable() const { return writeTable_; } + std::string tablePath() const { return tablePath_; } bool writeVerilog() const { return writeVerilog_; } bool writeHLS() const { return writeHLS_; } @@ -348,8 +349,8 @@ namespace trklet { std::string processingModulesFile_; std::string memoryModulesFile_; std::string wiresFile_; - std::string tableTEDFile_; - std::string tableTREFile_; + std::string tableTEDFile_{"../data/table_TED/table_TED_Dummy.tx"}; + std::string tableTREFile_{"../data/table_TRE/table_TRE_Dummy.tx"}; double rcrit_{55.0}; // critical radius for the hourglass configuration @@ -636,8 +637,9 @@ namespace trklet { bool warnNoDer_{false}; //If true will print out warnings about missing track fit derivatives bool writeMem_{false}; //If true will print out content of memories to files - bool writeTable_{false}; //IF true will print out content of LUTs to files - + bool writeTable_{false}; //If true will print out content of LUTs to files + std::string tablePath_{"../data/LUTs/"}; //path to writing LUTs + // Write various lookup tables and autogenerated code (from iMath) bool writeVerilog_{false}; //Write out auto-generated Verilog mudules used by TCs bool writeHLS_{false}; //Write out auto-generated HLS mudules used by TCs diff --git a/L1Trigger/TrackFindingTracklet/src/MatchCalculator.cc b/L1Trigger/TrackFindingTracklet/src/MatchCalculator.cc index 7e43c32886922..9a60050ef2134 100644 --- a/L1Trigger/TrackFindingTracklet/src/MatchCalculator.cc +++ b/L1Trigger/TrackFindingTracklet/src/MatchCalculator.cc @@ -58,7 +58,7 @@ MatchCalculator::MatchCalculator(string name, Settings const& settings, Globals* if (iSector_ == 0 && layerdisk_ < N_LAYER && settings_.writeTable()) { ofstream outphicut; - outphicut.open(getName() + "_phicut.tab"); + outphicut.open(settings_.tablePath()+getName() + "_phicut.tab"); outphicut << "{" << endl; for (unsigned int seedindex = 0; seedindex < N_SEED; seedindex++) { if (seedindex != 0) @@ -69,7 +69,7 @@ MatchCalculator::MatchCalculator(string name, Settings const& settings, Globals* outphicut.close(); ofstream outzcut; - outzcut.open(getName() + "_zcut.tab"); + outzcut.open(settings_.tablePath()+getName() + "_zcut.tab"); outzcut << "{" << endl; for (unsigned int seedindex = 0; seedindex < N_SEED; seedindex++) { if (seedindex != 0) @@ -82,7 +82,7 @@ MatchCalculator::MatchCalculator(string name, Settings const& settings, Globals* if (iSector_ == 0 && layerdisk_ >= N_LAYER && settings_.writeTable()) { ofstream outphicut; - outphicut.open(getName() + "_PSphicut.tab"); + outphicut.open(settings_.tablePath()+getName() + "_PSphicut.tab"); outphicut << "{" << endl; for (unsigned int seedindex = 0; seedindex < N_SEED; seedindex++) { if (seedindex != 0) @@ -92,7 +92,7 @@ MatchCalculator::MatchCalculator(string name, Settings const& settings, Globals* outphicut << endl << "};" << endl; outphicut.close(); - outphicut.open(getName() + "_2Sphicut.tab"); + outphicut.open(settings_.tablePath()+getName() + "_2Sphicut.tab"); outphicut << "{" << endl; for (unsigned int seedindex = 0; seedindex < N_SEED; seedindex++) { if (seedindex != 0) @@ -103,7 +103,7 @@ MatchCalculator::MatchCalculator(string name, Settings const& settings, Globals* outphicut.close(); ofstream outzcut; - outzcut.open(getName() + "_PSrcut.tab"); + outzcut.open(settings_.tablePath()+getName() + "_PSrcut.tab"); outzcut << "{" << endl; for (unsigned int seedindex = 0; seedindex < N_SEED; seedindex++) { if (seedindex != 0) @@ -113,7 +113,7 @@ MatchCalculator::MatchCalculator(string name, Settings const& settings, Globals* outzcut << endl << "};" << endl; outzcut.close(); - outzcut.open(getName() + "_2Srcut.tab"); + outzcut.open(settings_.tablePath()+getName() + "_2Srcut.tab"); outzcut << "{" << endl; for (unsigned int seedindex = 0; seedindex < N_SEED; seedindex++) { if (seedindex != 0) diff --git a/L1Trigger/TrackFindingTracklet/src/MatchEngine.cc b/L1Trigger/TrackFindingTracklet/src/MatchEngine.cc index 417e43c24f8f7..ac06839af2fad 100644 --- a/L1Trigger/TrackFindingTracklet/src/MatchEngine.cc +++ b/L1Trigger/TrackFindingTracklet/src/MatchEngine.cc @@ -50,7 +50,7 @@ MatchEngine::MatchEngine(string name, Settings const& settings, Globals* global, string fname = "METable_L"; fname += layer; fname += ".tab"; - out.open(fname.c_str()); + out.open(settings_.tablePath()+fname.c_str()); out << "{" << endl; for (unsigned int i = 0; i < table_.size(); i++) { if (i != 0) { diff --git a/L1Trigger/TrackFindingTracklet/src/MatchProcessor.cc b/L1Trigger/TrackFindingTracklet/src/MatchProcessor.cc index ff57ae646421b..7b69ba448a8fc 100644 --- a/L1Trigger/TrackFindingTracklet/src/MatchProcessor.cc +++ b/L1Trigger/TrackFindingTracklet/src/MatchProcessor.cc @@ -60,7 +60,7 @@ MatchProcessor::MatchProcessor(string name, Settings const& settings, Globals* g if (iSector_ == 0 && layer_ > 0 && settings_.writeTable()) { ofstream outphicut; - outphicut.open(getName() + "_phicut.tab"); + outphicut.open(settings_.tablePath()+getName() + "_phicut.tab"); outphicut << "{" << endl; for (unsigned int seedindex = 0; seedindex < 12; seedindex++) { if (seedindex != 0) @@ -71,7 +71,7 @@ MatchProcessor::MatchProcessor(string name, Settings const& settings, Globals* g outphicut.close(); ofstream outzcut; - outzcut.open(getName() + "_zcut.tab"); + outzcut.open(settings_.tablePath()+getName() + "_zcut.tab"); outzcut << "{" << endl; for (unsigned int seedindex = 0; seedindex < N_SEED; seedindex++) { if (seedindex != 0) @@ -105,7 +105,7 @@ MatchProcessor::MatchProcessor(string name, Settings const& settings, Globals* g string fname = "METable_L"; fname += layer; fname += ".tab"; - out.open(fname.c_str()); + out.open(settings_.tablePath()+fname.c_str()); out << "{" << endl; for (unsigned int i = 0; i < table_.size(); i++) { if (i != 0) { diff --git a/L1Trigger/TrackFindingTracklet/src/TrackDerTable.cc b/L1Trigger/TrackFindingTracklet/src/TrackDerTable.cc index a5d6668de19c1..3b12328bbe373 100644 --- a/L1Trigger/TrackFindingTracklet/src/TrackDerTable.cc +++ b/L1Trigger/TrackFindingTracklet/src/TrackDerTable.cc @@ -357,19 +357,19 @@ void TrackDerTable::fillTable() { } if (settings_.writeTable()) { - ofstream outL("FitDerTableNew_LayerMem.txt"); + ofstream outL(settings_.tablePath()+"FitDerTableNew_LayerMem.tab"); for (unsigned int i = 0; i < LayerMem_.size(); i++) { FPGAWord tmp; int tmp1 = LayerMem_[i]; if (tmp1 < 0) tmp1 = (1 << 6) - 1; - edm::LogVerbatim("Tracklet") << "i LayerMem_ : " << i << " " << tmp1; + //edm::LogVerbatim("Tracklet") << "i LayerMem_ : " << i << " " << tmp1; tmp.set(tmp1, 6, true, __LINE__, __FILE__); outL << tmp.str() << endl; } outL.close(); - ofstream outD("FitDerTableNew_DiskMem.txt"); + ofstream outD(settings_.tablePath()+"FitDerTableNew_DiskMem.tab"); for (int tmp1 : DiskMem_) { if (tmp1 < 0) tmp1 = (1 << 7) - 1; @@ -379,68 +379,68 @@ void TrackDerTable::fillTable() { } outD.close(); - ofstream outLD("FitDerTableNew_LayerDiskMem.txt"); + ofstream outLD(settings_.tablePath()+"FitDerTableNew_LayerDiskMem.tab"); for (int tmp1 : LayerDiskMem_) { if (tmp1 < 0) - tmp1 = (1 << 10) - 1; + tmp1 = (1 << 15) - 1; FPGAWord tmp; - tmp.set(tmp1, 10, true, __LINE__, __FILE__); + tmp.set(tmp1, 15, true, __LINE__, __FILE__); outLD << tmp.str() << endl; } outLD.close(); - unsigned int nderivatives = derivatives_.size(); - edm::LogVerbatim("Tracklet") << "nderivatives = " << nderivatives; + //unsigned int nderivatives = derivatives_.size(); + //edm::LogVerbatim("Tracklet") << "nderivatives = " << nderivatives; const std::array seedings = {{"L1L2", "L3L4", "L5L6", "D1D2", "D3D4", "D1L1", "D1L2"}}; - const string prefix = "FitDerTableNew_"; + const string prefix = settings_.tablePath()+"FitDerTableNew_"; // open files for derivative tables ofstream outrinvdphi[N_TRKLSEED]; for (unsigned int i = 0; i < N_TRKLSEED; ++i) { - const string fname = prefix + "Rinvdphi_" + seedings[i] + ".txt"; + const string fname = prefix + "Rinvdphi_" + seedings[i] + ".tab"; outrinvdphi[i].open(fname.c_str()); } ofstream outrinvdzordr[N_TRKLSEED]; for (unsigned int i = 0; i < N_TRKLSEED; ++i) { - const string fname = prefix + "Rinvdzordr_" + seedings[i] + ".txt"; + const string fname = prefix + "Rinvdzordr_" + seedings[i] + ".tab"; outrinvdzordr[i].open(fname.c_str()); } ofstream outphi0dphi[N_TRKLSEED]; for (unsigned int i = 0; i < N_TRKLSEED; ++i) { - const string fname = prefix + "Phi0dphi_" + seedings[i] + ".txt"; + const string fname = prefix + "Phi0dphi_" + seedings[i] + ".tab"; outphi0dphi[i].open(fname.c_str()); } ofstream outphi0dzordr[N_TRKLSEED]; for (unsigned int i = 0; i < N_TRKLSEED; ++i) { - const string fname = prefix + "Phi0dzordr_" + seedings[i] + ".txt"; + const string fname = prefix + "Phi0dzordr_" + seedings[i] + ".tab"; outphi0dzordr[i].open(fname.c_str()); } ofstream outtdphi[N_TRKLSEED]; for (unsigned int i = 0; i < N_TRKLSEED; ++i) { - const string fname = prefix + "Tdphi_" + seedings[i] + ".txt"; + const string fname = prefix + "Tdphi_" + seedings[i] + ".tab"; outtdphi[i].open(fname.c_str()); } ofstream outtdzordr[N_TRKLSEED]; for (unsigned int i = 0; i < N_TRKLSEED; ++i) { - const string fname = prefix + "Tdzordr_" + seedings[i] + ".txt"; + const string fname = prefix + "Tdzordr_" + seedings[i] + ".tab"; outtdzordr[i].open(fname.c_str()); } ofstream outz0dphi[N_TRKLSEED]; for (unsigned int i = 0; i < N_TRKLSEED; ++i) { - const string fname = prefix + "Z0dphi_" + seedings[i] + ".txt"; + const string fname = prefix + "Z0dphi_" + seedings[i] + ".tab"; outz0dphi[i].open(fname.c_str()); } ofstream outz0dzordr[N_TRKLSEED]; for (unsigned int i = 0; i < N_TRKLSEED; ++i) { - string fname = prefix + "Z0dzordr_" + seedings[i] + ".txt"; + string fname = prefix + "Z0dzordr_" + seedings[i] + ".tab"; outz0dzordr[i].open(fname.c_str()); } @@ -595,9 +595,9 @@ void TrackDerTable::fillTable() { FPGAWord tmprinvdphi[N_PROJ]; for (unsigned int j = 0; j < N_PROJ; ++j) { - if (itmprinvdphi[j] > (1 << 13)) - itmprinvdphi[j] = (1 << 13) - 1; - tmprinvdphi[j].set(itmprinvdphi[j], 14, false, __LINE__, __FILE__); + if (itmprinvdphi[j] > (1 << 16)) + itmprinvdphi[j] = (1 << 16) - 1; + tmprinvdphi[j].set(itmprinvdphi[j], 17, false, __LINE__, __FILE__); } outrinvdphi[i] << tmprinvdphi[0].str() << tmprinvdphi[1].str() << tmprinvdphi[2].str() << tmprinvdphi[3].str() << endl; @@ -631,9 +631,9 @@ void TrackDerTable::fillTable() { FPGAWord tmptdphi[N_PROJ]; for (unsigned int j = 0; j < N_PROJ; ++j) { - if (itmptdphi[j] > (1 << 13)) - itmptdphi[j] = (1 << 13) - 1; - tmptdphi[j].set(itmptdphi[j], 14, false, __LINE__, __FILE__); + if (itmptdphi[j] > (1 << 14)) + itmptdphi[j] = (1 << 14) - 1; + tmptdphi[j].set(itmptdphi[j], 15, false, __LINE__, __FILE__); } outtdphi[i] << tmptdphi[0].str() << tmptdphi[1].str() << tmptdphi[2].str() << tmptdphi[3].str() << endl; diff --git a/L1Trigger/TrackFindingTracklet/src/TrackletEngine.cc b/L1Trigger/TrackFindingTracklet/src/TrackletEngine.cc index dbc5bb62835f3..5ea8b6ca76d69 100644 --- a/L1Trigger/TrackFindingTracklet/src/TrackletEngine.cc +++ b/L1Trigger/TrackFindingTracklet/src/TrackletEngine.cc @@ -266,7 +266,7 @@ void TrackletEngine::setVMPhiBin() { void TrackletEngine::writeTETable() { ofstream outstubptinnercut; - outstubptinnercut.open(getName() + "_stubptinnercut.tab"); + outstubptinnercut.open(settings_.tablePath()+getName() + "_stubptinnercut.tab"); outstubptinnercut << "{" << endl; for (unsigned int i = 0; i < pttableinner_.size(); i++) { if (i != 0) @@ -277,7 +277,7 @@ void TrackletEngine::writeTETable() { outstubptinnercut.close(); ofstream outstubptoutercut; - outstubptoutercut.open(getName() + "_stubptoutercut.tab"); + outstubptoutercut.open(settings_.tablePath()+getName() + "_stubptoutercut.tab"); outstubptoutercut << "{" << endl; for (unsigned int i = 0; i < pttableouter_.size(); i++) { if (i != 0) diff --git a/L1Trigger/TrackFindingTracklet/src/TrackletProcessor.cc b/L1Trigger/TrackFindingTracklet/src/TrackletProcessor.cc index 17525fe60f085..5a5f589bc240d 100644 --- a/L1Trigger/TrackFindingTracklet/src/TrackletProcessor.cc +++ b/L1Trigger/TrackFindingTracklet/src/TrackletProcessor.cc @@ -916,7 +916,7 @@ void TrackletProcessor::setVMPhiBin() { void TrackletProcessor::writeTETable() { ofstream outptcut; - outptcut.open(getName() + "_ptcut.tab"); + outptcut.open(settings_.tablePath()+getName() + "_ptcut.tab"); outptcut << "{" << endl; //for(unsigned int i=0;i vmbendtable) { void VMStubsTEMemory::writeVMBendTable() { ofstream outvmbendcut; - outvmbendcut.open(getName() + "_vmbendcut.tab"); + outvmbendcut.open(settings_.tablePath()+getName() + "_vmbendcut.tab"); outvmbendcut << "{" << endl; unsigned int vmbendtableSize = vmbendtable_.size(); assert(vmbendtableSize == 16 || vmbendtableSize == 8); From 5e68827234fc36c8e202fa0ababa75c15a802adb Mon Sep 17 00:00:00 2001 From: Anders Ryd Date: Mon, 29 Jun 2020 22:44:12 -0400 Subject: [PATCH 2/9] Fix a few bugs for the combined modules - truncations used to fail --- .../interface/MatchEngineUnit.h | 2 + .../interface/TrackletProcessor.h | 1 - .../src/MatchEngineUnit.cc | 6 + .../src/MatchProcessor.cc | 17 +- .../src/TrackletProcessor.cc | 559 ++++++------------ 5 files changed, 193 insertions(+), 392 deletions(-) diff --git a/L1Trigger/TrackFindingTracklet/interface/MatchEngineUnit.h b/L1Trigger/TrackFindingTracklet/interface/MatchEngineUnit.h index b8bd055564db7..9e3186a455ec1 100644 --- a/L1Trigger/TrackFindingTracklet/interface/MatchEngineUnit.h +++ b/L1Trigger/TrackFindingTracklet/interface/MatchEngineUnit.h @@ -39,6 +39,8 @@ namespace trklet { bool idle() const { return idle_; } + void reset(); + void step(); private: diff --git a/L1Trigger/TrackFindingTracklet/interface/TrackletProcessor.h b/L1Trigger/TrackFindingTracklet/interface/TrackletProcessor.h index b8cb5601cf8c0..c4bc95bd7c450 100644 --- a/L1Trigger/TrackFindingTracklet/interface/TrackletProcessor.h +++ b/L1Trigger/TrackFindingTracklet/interface/TrackletProcessor.h @@ -47,7 +47,6 @@ namespace trklet { bool extra_; - std::map > phitable_; std::map > pttableinner_; std::map > pttableouter_; diff --git a/L1Trigger/TrackFindingTracklet/src/MatchEngineUnit.cc b/L1Trigger/TrackFindingTracklet/src/MatchEngineUnit.cc index c4b9a1275e6f0..babc54d571b3d 100644 --- a/L1Trigger/TrackFindingTracklet/src/MatchEngineUnit.cc +++ b/L1Trigger/TrackFindingTracklet/src/MatchEngineUnit.cc @@ -81,3 +81,9 @@ void MatchEngineUnit::step() { candmatches_.store(tmp); } } + +void MatchEngineUnit::reset() { + candmatches_.reset(); + idle_ = true; + istub_=0; +} diff --git a/L1Trigger/TrackFindingTracklet/src/MatchProcessor.cc b/L1Trigger/TrackFindingTracklet/src/MatchProcessor.cc index 7b69ba448a8fc..fa28cbffa336a 100644 --- a/L1Trigger/TrackFindingTracklet/src/MatchProcessor.cc +++ b/L1Trigger/TrackFindingTracklet/src/MatchProcessor.cc @@ -236,6 +236,13 @@ void MatchProcessor::execute() { inputProjBuffer_.reset(); + for (unsigned int iME = 0; iME < nMatchEngines_; iME++) { + matchengines_[iME].reset(); + } + + bool projdone=false; + bool medone=true; + for (unsigned int istep = 0; istep < settings_.maxStep("MP"); istep++) { //Step 1 //First step here checks if we have more input projections to put into @@ -304,6 +311,8 @@ void MatchProcessor::execute() { } } } + } else { + projdone=true; } //Step 2 @@ -340,6 +349,7 @@ void MatchProcessor::execute() { bool bestInPipeline = false; for (unsigned int iME = 0; iME < nMatchEngines_; iME++) { bool empty = matchengines_[iME].empty(); + medone=medone&&(empty&&matchengines_[iME].idle()); if (empty && matchengines_[iME].idle()) continue; int currentTCID = empty ? matchengines_[iME].currentProj()->TCID() : matchengines_[iME].peek().first->TCID(); @@ -361,7 +371,7 @@ void MatchProcessor::execute() { assert(oldTracklet->TCID() <= tracklet->TCID()); } oldTracklet = tracklet; - + bool match = matchCalculator(tracklet, fpgastub); if (settings_.debugTracklet() && match) { @@ -373,6 +383,7 @@ void MatchProcessor::execute() { countsel++; ; } + if (projdone&&medone) break; } if (settings_.writeMonitorData("MC")) { @@ -382,7 +393,7 @@ void MatchProcessor::execute() { bool MatchProcessor::matchCalculator(Tracklet* tracklet, const Stub* fpgastub) { const L1TStub* stub = fpgastub->l1tstub(); - + if (layer_ != 0) { int ir = fpgastub->r().value(); int iphi = tracklet->fpgaphiproj(layer_).value(); @@ -470,7 +481,7 @@ bool MatchProcessor::matchCalculator(Tracklet* tracklet, const Stub* fpgastub) { assert(std::abs(dphi) < 0.2); assert(std::abs(dphiapprox) < 0.2); - + if (imatch) { tracklet->addMatch(layer_, ideltaphi, diff --git a/L1Trigger/TrackFindingTracklet/src/TrackletProcessor.cc b/L1Trigger/TrackFindingTracklet/src/TrackletProcessor.cc index 5a5f589bc240d..c883efef8b5d1 100644 --- a/L1Trigger/TrackFindingTracklet/src/TrackletProcessor.cc +++ b/L1Trigger/TrackFindingTracklet/src/TrackletProcessor.cc @@ -231,40 +231,31 @@ void TrackletProcessor::execute() { for (unsigned int i = 0; i < innervmstubs_[ivmmem]->nVMStubs(); i++) { const VMStubTE& innervmstub = innervmstubs_[ivmmem]->getVMStubTE(i); - int lookupbits = innervmstub.vmbits().value(); - - int rdiffmax = (lookupbits >> 7); - int newbin = (lookupbits & 127); - int bin = newbin / 8; - - int rbinfirst = newbin & 7; - - int start = (bin >> 1); - int last = start + (bin & 1); - + FPGAWord lookupbits = innervmstub.vmbits(); + + unsigned int nbits = 7; + if (iSeed_ == 4 || iSeed_ == 5) + nbits = 6; + int rzdiffmax = lookupbits.bits(nbits, lookupbits.nbits() - nbits); + int rzbinfirst = lookupbits.bits(0, 3); + int start = lookupbits.bits(4, nbits - 4); + int next = lookupbits.bits(3, 1); + + if ((iSeed_ == 4 || iSeed_ == 5) && innervmstub.stub()->disk().value() < 0) { //TODO - need to store negative disk + start += 4; + } + int last = start + next; + for (int ibin = start; ibin <= last; ibin++) { if (settings_.debugTracklet()) { edm::LogVerbatim("Tracklet") << getName() << " looking for matching stub in bin " << ibin << " with " << outervmstubs_[ivmmem]->nVMStubsBinned(ibin) << " stubs"; } for (unsigned int j = 0; j < outervmstubs_[ivmmem]->nVMStubsBinned(ibin); j++) { - countall++; countteall++; const VMStubTE& outervmstub = outervmstubs_[ivmmem]->getVMStubTEBinned(ibin, j); - int rbin = (outervmstub.vmbits().value() & 7); - if (start != ibin) - rbin += 8; - if ((rbin < rbinfirst) || (rbin - rbinfirst > rdiffmax)) { - if (settings_.debugTracklet()) { - edm::LogVerbatim("Tracklet") - << getName() << " layer-disk stub pair rejected because rbin cut : " << rbin << " " << rbinfirst - << " " << rdiffmax; - } - continue; - } - - int ir = ((start & 3) << 3) + rbinfirst; + int rzbin = (outervmstub.vmbits().value() & 7); assert(innerphibits_ != -1); assert(outerphibits_ != -1); @@ -273,18 +264,27 @@ void TrackletProcessor::execute() { FPGAWord iphiouterbin = outervmstub.finephi(); assert(iphiouterbin == outervmstub.finephi()); - - unsigned int index = (((iphiinnerbin.value() << outerphibits_) + iphiouterbin.value()) << 5) + ir; - - assert(index < phitable_[phiindex].size()); - - if (!phitable_[phiindex][index]) { + + unsigned int index = (iphiinnerbin.value() << outerphibits_) + iphiouterbin.value(); + + + if (iSeed_ >= 4) { //Also use r-position + int ir = ((ibin & 3) << 1) + (rzbin >> 2); + index = (index << 3) + ir; + } + + if (start != ibin) + rzbin += 8; + if ((rzbin < rzbinfirst) || (rzbin - rzbinfirst > rzdiffmax)) { if (settings_.debugTracklet()) { - edm::LogVerbatim("Tracklet") << "Stub pair rejected because of tracklet pt cut"; + edm::LogVerbatim("Tracklet") + << getName() << " layer-disk stub pair rejected because rbin cut : " << rzbin << " " << rzbinfirst + << " " << rzdiffmax; } continue; } + FPGAWord innerbend = innervmstub.bend(); FPGAWord outerbend = outervmstub.bend(); @@ -310,7 +310,6 @@ void TrackletProcessor::execute() { stubpairs.addStubPair( innervmstub, outervmstub, 0, innervmstubs_[ivmmem]->getName() + " " + outervmstubs_[ivmmem]->getName()); counttepass++; - countall++; } } } @@ -349,7 +348,6 @@ void TrackletProcessor::execute() { } countteall++; - countall++; const VMStubTE& outervmstub = outervmstubs_[ivmmem]->getVMStubTEBinned(ibin, j); @@ -377,15 +375,6 @@ void TrackletProcessor::execute() { int index = (iphiinnerbin.value() << outerphibits_) + iphiouterbin.value(); - assert(index < (int)phitable_[phiindex].size()); - - if (!phitable_[phiindex][index]) { - if (settings_.debugTracklet()) { - edm::LogVerbatim("Tracklet") << "Stub pair rejected because of tracklet pt cut"; - } - continue; - } - FPGAWord innerbend = innervmstub.bend(); FPGAWord outerbend = outervmstub.bend(); @@ -414,7 +403,6 @@ void TrackletProcessor::execute() { 0, innervmstubs_[ivmmem]->getName() + " " + outervmstubs_[ivmmem]->getName()); counttepass++; - countall++; } } @@ -424,50 +412,48 @@ void TrackletProcessor::execute() { const VMStubTE& innervmstub = innervmstubs_[ivmmem]->getVMStubTE(i); - int lookupbits = (int)innervmstub.vmbits().value(); - bool negdisk = innervmstub.stub()->disk().value() < 0; //TODO - need to store negative disk - int rdiffmax = (lookupbits >> 6); - int newbin = (lookupbits & 63); - int bin = newbin / 8; + FPGAWord lookupbits = innervmstub.vmbits(); - int rbinfirst = newbin & 7; + unsigned int nbits = 6; + int rzdiffmax = lookupbits.bits(nbits, lookupbits.nbits() - nbits); + int rzbinfirst = lookupbits.bits(0, 3); + int start = lookupbits.bits(4, nbits - 4); + int next = lookupbits.bits(3, 1); - int start = (bin >> 1); - if (negdisk) - start += 4; - int last = start + (bin & 1); + if (innervmstub.stub()->disk().value() < 0) { //TODO - need to store negative disk + start += 4; + } + + int last = start + next; for (int ibin = start; ibin <= last; ibin++) { if (settings_.debugTracklet()) edm::LogVerbatim("Tracklet") << getName() << " looking for matching stub in bin " << ibin << " with " << outervmstubs_[ivmmem]->nVMStubsBinned(ibin) << " stubs"; for (unsigned int j = 0; j < outervmstubs_[ivmmem]->nVMStubsBinned(ibin); j++) { - countall++; countteall++; const VMStubTE& outervmstub = outervmstubs_[ivmmem]->getVMStubTEBinned(ibin, j); - int vmbits = (int)outervmstub.vmbits().value(); - int rbin = (vmbits & 7); - if (start != ibin) - rbin += 8; - if (rbin < rbinfirst) - continue; - if (rbin - rbinfirst > rdiffmax) - continue; - - int rzbin = outervmstub.vmbits().bits(0, 3); + int rzbin = outervmstub.vmbits().bits(0, 3); FPGAWord iphiinnerbin = innervmstub.finephi(); FPGAWord iphiouterbin = outervmstub.finephi(); - unsigned int index = (iphiinnerbin.value() << outerphibits_) + iphiouterbin.value(); + unsigned int index = (iphiinnerbin.value() << outervmstub.finephi().nbits()) + iphiouterbin.value(); constexpr unsigned int n_barrelseed = 3; if (iSeed_ > n_barrelseed) { //Also use r-position for disk/overlap seeds - int ir = ((ibin & n_barrelseed) << 1) + (rzbin >> 2); - index = (index << n_barrelseed) + ir; + int ir = ((ibin & 3) << 1) + (rzbin >> 2); + index = (index << 3) + ir; } + if (start != ibin) + rzbin += 8; + if (rzbin < rzbinfirst) + continue; + if (rzbin - rzbinfirst > rzdiffmax) + continue; + FPGAWord innerbend = innervmstub.bend(); FPGAWord outerbend = outervmstub.bend(); @@ -486,6 +472,7 @@ void TrackletProcessor::execute() { << " pass : " << pttableinner_[phiindex][ptinnerindex] << " " << pttableouter_[phiindex][ptouterindex]; } + continue; } if (settings_.debugTracklet()) @@ -500,7 +487,6 @@ void TrackletProcessor::execute() { outervmstub, 0, innervmstubs_[ivmmem]->getName() + " " + outervmstubs_[ivmmem]->getName()); - countall++; counttepass++; } } @@ -508,9 +494,9 @@ void TrackletProcessor::execute() { } } } - + if (settings_.writeMonitorData("TE")) { - globals_->ofstream("trackletprocessor.txt") << getName() << " " << countteall << " " << counttepass << endl; + globals_->ofstream("trackletprocessor.txt") << getName() << " " << countteall << " " << counttepass <= settings_.maxStep("TP")) { if (settings_.debugTracklet()) - edm::LogVerbatim("Tracklet") << "Will break on MAXTC 1"; + edm::LogVerbatim("Tracklet") << "Will break on MAXTC 1"; break; } + if (settings_.debugTracklet()) { edm::LogVerbatim("Tracklet") << "TrackletProcessor execute done"; } @@ -587,344 +574,140 @@ void TrackletProcessor::setVMPhiBin() { if (innervmstubs_.size() != outervmstubs_.size()) return; + innerphibits_ = settings_.nfinephi(0, iSeed_); + outerphibits_ = settings_.nfinephi(1, iSeed_); + for (unsigned int ivmmem = 0; ivmmem < innervmstubs_.size(); ivmmem++) { unsigned int innerphibin = innervmstubs_[ivmmem]->phibin(); unsigned int outerphibin = outervmstubs_[ivmmem]->phibin(); unsigned phiindex = 32 * innerphibin + outerphibin; - if (phitable_.find(phiindex) != phitable_.end()) + if (pttableinner_.find(phiindex) != pttableinner_.end()) continue; innervmstubs_[ivmmem]->setother(outervmstubs_[ivmmem]); outervmstubs_[ivmmem]->setother(innervmstubs_[ivmmem]); - if ((layer_ == 1 && disk_ == 0) || (layer_ == 2 && disk_ == 0) || (layer_ == 3 && disk_ == 0) || - (layer_ == 5 && disk_ == 0)) { - innerphibits_ = settings_.nfinephi(0, iSeed_); - outerphibits_ = settings_.nfinephi(1, iSeed_); - - int innerphibins = (1 << innerphibits_); - int outerphibins = (1 << outerphibits_); - - double innerphimin, innerphimax; - innervmstubs_[ivmmem]->getPhiRange(innerphimin, innerphimax, iSeed_, 0); - double rinner = settings_.rmean(layer_ - 1); - - double outerphimin, outerphimax; - outervmstubs_[ivmmem]->getPhiRange(outerphimin, outerphimax, iSeed_, 1); - double router = settings_.rmean(layer_); - - double phiinner[2]; - double phiouter[2]; - - std::vector vmbendinner; - std::vector vmbendouter; - unsigned int nbins1 = 8; - if (layer_ >= 4) - nbins1 = 16; - for (unsigned int i = 0; i < nbins1; i++) { - vmbendinner.push_back(false); - } + int outerrbits = 3; + if (iSeed_ < 4) { + outerrbits = 0; + } - unsigned int nbins2 = 8; - if (layer_ >= 3) - nbins2 = 16; - for (unsigned int i = 0; i < nbins2; i++) { - vmbendouter.push_back(false); - } + int outerrbins = (1 << outerrbits); + int innerphibins = (1 << innerphibits_); + int outerphibins = (1 << outerphibits_); + + double innerphimin, innerphimax; + innervmstubs_[ivmmem]->getPhiRange(innerphimin, innerphimax, iSeed_, 0); + + double outerphimin, outerphimax; + outervmstubs_[ivmmem]->getPhiRange(outerphimin, outerphimax, iSeed_, 1); + + double phiinner[2]; + double phiouter[2]; + double router[2]; + + unsigned int nbendbitsinner = 3; + unsigned int nbendbitsouter = 3; + if (iSeed_ == 2) { + nbendbitsouter = 4; + } + if (iSeed_ == 3) { + nbendbitsinner = 4; + nbendbitsouter = 4; + } - for (int iphiinnerbin = 0; iphiinnerbin < innerphibins; iphiinnerbin++) { - phiinner[0] = innerphimin + iphiinnerbin * (innerphimax - innerphimin) / innerphibins; - phiinner[1] = innerphimin + (iphiinnerbin + 1) * (innerphimax - innerphimin) / innerphibins; - for (int iphiouterbin = 0; iphiouterbin < outerphibins; iphiouterbin++) { - phiouter[0] = outerphimin + iphiouterbin * (outerphimax - outerphimin) / outerphibins; - phiouter[1] = outerphimin + (iphiouterbin + 1) * (outerphimax - outerphimin) / outerphibins; - - double bendinnermin = 20.0; - double bendinnermax = -20.0; - double bendoutermin = 20.0; - double bendoutermax = -20.0; - double rinvmin = 1.0; - for (int i1 = 0; i1 < 2; i1++) { - for (int i2 = 0; i2 < 2; i2++) { - double rinv1 = rinv(phiinner[i1], phiouter[i2], rinner, router); - double pitchinner = + std::vector vmbendinner((1 << nbendbitsinner), false); + std::vector vmbendouter((1 << nbendbitsouter), false); + + for (int iphiinnerbin = 0; iphiinnerbin < innerphibins; iphiinnerbin++) { + phiinner[0] = innerphimin + iphiinnerbin * (innerphimax - innerphimin) / innerphibins; + phiinner[1] = innerphimin + (iphiinnerbin + 1) * (innerphimax - innerphimin) / innerphibins; + for (int iphiouterbin = 0; iphiouterbin < outerphibins; iphiouterbin++) { + phiouter[0] = outerphimin + iphiouterbin * (outerphimax - outerphimin) / outerphibins; + phiouter[1] = outerphimin + (iphiouterbin + 1) * (outerphimax - outerphimin) / outerphibins; + for (int irouterbin = 0; irouterbin < outerrbins; irouterbin++) { + if (iSeed_ >= 4) { + router[0] = + settings_.rmindiskvm() + irouterbin * (settings_.rmaxdiskvm() - settings_.rmindiskvm()) / outerrbins; + router[1] = settings_.rmindiskvm() + + (irouterbin + 1) * (settings_.rmaxdiskvm() - settings_.rmindiskvm()) / outerrbins; + } else { + router[0] = settings_.rmean(layerdisk2_); + router[1] = settings_.rmean(layerdisk2_); + } + + double bendinnermin = 20.0; + double bendinnermax = -20.0; + double bendoutermin = 20.0; + double bendoutermax = -20.0; + double rinvmin = 1.0; + for (int i1 = 0; i1 < 2; i1++) { + for (int i2 = 0; i2 < 2; i2++) { + for (int i3 = 0; i3 < 2; i3++) { + double rinner = 0.0; + if (iSeed_ == 4 || iSeed_ == 5) { + rinner = router[i3] * settings_.zmean(layerdisk1_ - N_LAYER) / settings_.zmean(layerdisk2_ - N_LAYER); + } else { + rinner = settings_.rmean(layerdisk1_); + } + double rinv1 = rinv(phiinner[i1], phiouter[i2], rinner, router[i3]); + double pitchinner = (rinner < settings_.rcrit()) ? settings_.stripPitch(true) : settings_.stripPitch(false); - double pitchouter = - (router < settings_.rcrit()) ? settings_.stripPitch(true) : settings_.stripPitch(false); - double abendinner = -bend(rinner, rinv1, pitchinner); - double abendouter = -bend(router, rinv1, pitchouter); - if (abendinner < bendinnermin) - bendinnermin = abendinner; - if (abendinner > bendinnermax) - bendinnermax = abendinner; - if (abendouter < bendoutermin) - bendoutermin = abendouter; - if (abendouter > bendoutermax) - bendoutermax = abendouter; - if (std::abs(rinv1) < rinvmin) { - rinvmin = std::abs(rinv1); - } - } - } - - phitable_[phiindex].push_back(rinvmin < settings_.rinvcutte()); - - int nbins1 = 8; - if (layer_ >= 4) - nbins1 = 16; - for (int ibend = 0; ibend < nbins1; ibend++) { - double bend = benddecode(ibend, layer_ <= 3); - - bool passinner = bend - bendinnermin > -settings_.bendcutte(0, iSeed_) && - bend - bendinnermax < settings_.bendcutte(0, iSeed_); - if (passinner) - vmbendinner[ibend] = true; - pttableinner_[phiindex].push_back(passinner); - } - - int nbins2 = 8; - if (layer_ >= 3) - nbins2 = 16; - for (int ibend = 0; ibend < nbins2; ibend++) { - double bend = benddecode(ibend, layer_ <= 2); - - bool passouter = bend - bendoutermin > -settings_.bendcutte(1, iSeed_) && - bend - bendoutermax < settings_.bendcutte(1, iSeed_); - if (passouter) - vmbendouter[ibend] = true; - pttableouter_[phiindex].push_back(passouter); - } - } + double pitchouter = + (router[i3] < settings_.rcrit()) ? settings_.stripPitch(true) : settings_.stripPitch(false); + double abendinner = -bend(rinner, rinv1, pitchinner); + double abendouter = -bend(router[i3], rinv1, pitchouter); + if (abendinner < bendinnermin) + bendinnermin = abendinner; + if (abendinner > bendinnermax) + bendinnermax = abendinner; + if (abendouter < bendoutermin) + bendoutermin = abendouter; + if (abendouter > bendoutermax) + bendoutermax = abendouter; + if (std::abs(rinv1) < rinvmin) { + rinvmin = std::abs(rinv1); + } + } + } + } + + bool passptcut = rinvmin < settings_.rinvcutte(); + + for (int ibend = 0; ibend < (1 << nbendbitsinner); ibend++) { + double bend = benddecode(ibend, nbendbitsinner == 3); + + bool passinner = bend - bendinnermin > -settings_.bendcutte(0, iSeed_) && + bend - bendinnermax < settings_.bendcutte(0, iSeed_); + if (passinner) + vmbendinner[ibend] = true; + pttableinner_[phiindex].push_back(passinner && passptcut); + } + + for (int ibend = 0; ibend < (1 << nbendbitsouter); ibend++) { + double bend = benddecode(ibend, nbendbitsouter == 3); + + bool passouter = bend - bendoutermin > -settings_.bendcutte(1, iSeed_) && + bend - bendoutermax < settings_.bendcutte(1, iSeed_); + if (passouter) + vmbendouter[ibend] = true; + pttableouter_[phiindex].push_back(passouter && passptcut); + } + } } - - innervmstubs_[ivmmem]->setbendtable(vmbendinner); - outervmstubs_[ivmmem]->setbendtable(vmbendouter); - - if (iSector_ == 0 && settings_.writeTable()) - writeTETable(); } - if ((disk_ == 1 && layer_ == 0) || (disk_ == 3 && layer_ == 0)) { - innerphibits_ = settings_.nfinephi(0, iSeed_); - outerphibits_ = settings_.nfinephi(1, iSeed_); - - int outerrbits = 3; - - int outerrbins = (1 << outerrbits); - int innerphibins = (1 << innerphibits_); - int outerphibins = (1 << outerphibits_); - - double innerphimin, innerphimax; - innervmstubs_[ivmmem]->getPhiRange(innerphimin, innerphimax, iSeed_, 0); - - double outerphimin, outerphimax; - outervmstubs_[ivmmem]->getPhiRange(outerphimin, outerphimax, iSeed_, 1); - - double phiinner[2]; - double phiouter[2]; - double router[2]; - - std::vector vmbendinner; - std::vector vmbendouter; - - for (unsigned int i = 0; i < 8; i++) { - vmbendinner.push_back(false); - vmbendouter.push_back(false); - } - - for (int irouterbin = 0; irouterbin < outerrbins; irouterbin++) { - router[0] = - settings_.rmindiskvm() + irouterbin * (settings_.rmaxdiskvm() - settings_.rmindiskvm()) / outerrbins; - router[1] = - settings_.rmindiskvm() + (irouterbin + 1) * (settings_.rmaxdiskvm() - settings_.rmindiskvm()) / outerrbins; - for (int iphiinnerbin = 0; iphiinnerbin < innerphibins; iphiinnerbin++) { - phiinner[0] = innerphimin + iphiinnerbin * (innerphimax - innerphimin) / innerphibins; - phiinner[1] = innerphimin + (iphiinnerbin + 1) * (innerphimax - innerphimin) / innerphibins; - for (int iphiouterbin = 0; iphiouterbin < outerphibins; iphiouterbin++) { - phiouter[0] = outerphimin + iphiouterbin * (outerphimax - outerphimin) / outerphibins; - phiouter[1] = outerphimin + (iphiouterbin + 1) * (outerphimax - outerphimin) / outerphibins; - - double bendinnermin = 20.0; - double bendinnermax = -20.0; - double bendoutermin = 20.0; - double bendoutermax = -20.0; - double rinvmin = 1.0; - double rinvmax = -1.0; - for (int i1 = 0; i1 < 2; i1++) { - for (int i2 = 0; i2 < 2; i2++) { - for (int i3 = 0; i3 < 2; i3++) { - double rinner = router[i3] * settings_.zmean(disk_ - 1) / settings_.zmean(disk_); - double rinv1 = rinv(phiinner[i1], phiouter[i2], rinner, router[i3]); - double pitchinner = - (rinner < settings_.rcrit()) ? settings_.stripPitch(true) : settings_.stripPitch(false); - double pitchouter = - (router[i3] < settings_.rcrit()) ? settings_.stripPitch(true) : settings_.stripPitch(false); - double abendinner = bend(rinner, rinv1, pitchinner); - double abendouter = bend(router[i3], rinv1, pitchouter); - if (abendinner < bendinnermin) - bendinnermin = abendinner; - if (abendinner > bendinnermax) - bendinnermax = abendinner; - if (abendouter < bendoutermin) - bendoutermin = abendouter; - if (abendouter > bendoutermax) - bendoutermax = abendouter; - if (std::abs(rinv1) < rinvmin) { - rinvmin = std::abs(rinv1); - } - if (std::abs(rinv1) > rinvmax) { - rinvmax = std::abs(rinv1); - } - } - } - } - - phitable_[phiindex].push_back(rinvmin < settings_.rinvcutte()); - - for (int ibend = 0; ibend < 8; ibend++) { - double bend = benddecode(ibend, true); - - bool passinner = bend - bendinnermin > -settings_.bendcutte(0, iSeed_) && - bend - bendinnermax < settings_.bendcutte(0, iSeed_); - if (passinner) - vmbendinner[ibend] = true; - pttableinner_[phiindex].push_back(passinner); - } - - for (int ibend = 0; ibend < 8; ibend++) { - double bend = benddecode(ibend, true); - - bool passouter = bend - bendoutermin > -settings_.bendcutte(1, iSeed_) && - bend - bendoutermax < settings_.bendcutte(1, iSeed_); - if (passouter) - vmbendouter[ibend] = true; - pttableouter_[phiindex].push_back(passouter); - } - } - } - } - - innervmstubs_[ivmmem]->setbendtable(vmbendinner); - outervmstubs_[ivmmem]->setbendtable(vmbendouter); - - if (iSector_ == 0 && settings_.writeTable()) - writeTETable(); + innervmstubs_[ivmmem]->setbendtable(vmbendinner); + outervmstubs_[ivmmem]->setbendtable(vmbendouter); - } else if (disk_ == 1 && (layer_ == 1 || layer_ == 2)) { - innerphibits_ = settings_.nfinephi(0, iSeed_); - outerphibits_ = settings_.nfinephi(1, iSeed_); - unsigned int nrbits = 5; - - int innerphibins = (1 << innerphibits_); - int outerphibins = (1 << outerphibits_); - - double innerphimin, innerphimax; - innervmstubs_[ivmmem]->getPhiRange(innerphimin, innerphimax, iSeed_, 0); - - double outerphimin, outerphimax; - outervmstubs_[ivmmem]->getPhiRange(outerphimin, outerphimax, iSeed_, 1); - - double phiinner[2]; - double phiouter[2]; - double router[2]; - - std::vector vmbendinner; - std::vector vmbendouter; - - for (unsigned int i = 0; i < 8; i++) { - vmbendinner.push_back(false); - vmbendouter.push_back(false); - } - - double dr = (settings_.rmaxdiskvm() - settings_.rmindiskvm()) / (1 << nrbits); - - for (int iphiinnerbin = 0; iphiinnerbin < innerphibins; iphiinnerbin++) { - phiinner[0] = innerphimin + iphiinnerbin * (innerphimax - innerphimin) / innerphibins; - phiinner[1] = innerphimin + (iphiinnerbin + 1) * (innerphimax - innerphimin) / innerphibins; - for (int iphiouterbin = 0; iphiouterbin < outerphibins; iphiouterbin++) { - phiouter[0] = outerphimin + iphiouterbin * (outerphimax - outerphimin) / outerphibins; - phiouter[1] = outerphimin + (iphiouterbin + 1) * (outerphimax - outerphimin) / outerphibins; - for (int irbin = 0; irbin < (1 << nrbits); irbin++) { - router[0] = settings_.rmindiskvm() + dr * irbin; - router[1] = router[0] + dr; - double bendinnermin = 20.0; - double bendinnermax = -20.0; - double bendoutermin = 20.0; - double bendoutermax = -20.0; - double rinvmin = 1.0; - for (int i1 = 0; i1 < 2; i1++) { - for (int i2 = 0; i2 < 2; i2++) { - for (int i3 = 0; i3 < 2; i3++) { - double rinner = settings_.rmean(layer_ - 1); - double rinv1 = rinv(phiinner[i1], phiouter[i2], rinner, router[i3]); - double pitchinner = - (rinner < settings_.rcrit()) ? settings_.stripPitch(true) : settings_.stripPitch(false); - double pitchouter = - (router[i3] < settings_.rcrit()) ? settings_.stripPitch(true) : settings_.stripPitch(false); - double abendinner = bend(rinner, rinv1, pitchinner); - double abendouter = bend(router[i3], rinv1, pitchouter); - if (abendinner < bendinnermin) - bendinnermin = abendinner; - if (abendinner > bendinnermax) - bendinnermax = abendinner; - if (abendouter < bendoutermin) - bendoutermin = abendouter; - if (abendouter > bendoutermax) - bendoutermax = abendouter; - if (std::abs(rinv1) < rinvmin) { - rinvmin = std::abs(rinv1); - } - } - } - } - - phitable_[phiindex].push_back(rinvmin < settings_.rinvcutte()); - - for (int ibend = 0; ibend < 8; ibend++) { - double bend = benddecode(ibend, true); - - bool passinner = bend - bendinnermin > -settings_.bendcutte(0, iSeed_) && - bend - bendinnermax < settings_.bendcutte(0, iSeed_); - if (passinner) - vmbendinner[ibend] = true; - pttableinner_[phiindex].push_back(passinner); - } - - for (int ibend = 0; ibend < 8; ibend++) { - double bend = benddecode(ibend, true); - - bool passouter = bend - bendoutermin > -settings_.bendcutte(1, iSeed_) && - bend - bendoutermax < settings_.bendcutte(1, iSeed_); - if (passouter) - vmbendouter[ibend] = true; - pttableouter_[phiindex].push_back(passouter); - } - } - } - } - - innervmstubs_[ivmmem]->setbendtable(vmbendinner); - outervmstubs_[ivmmem]->setbendtable(vmbendouter); - - if (iSector_ == 0 && settings_.writeTable()) - writeTETable(); - } + if (iSector_ == 0 && settings_.writeTable()) + writeTETable(); } } void TrackletProcessor::writeTETable() { - ofstream outptcut; - outptcut.open(settings_.tablePath()+getName() + "_ptcut.tab"); - outptcut << "{" << endl; - //for(unsigned int i=0;i Date: Thu, 2 Jul 2020 14:59:26 -0400 Subject: [PATCH 3/9] Bug Fix in Stub.cc There is a problem with the rapprox implementation. Values for Stub->rapprox(); and Stub->r(); are 70cms apart for Disk 2S. The bug fix above will prevent this from happening. --- L1Trigger/TrackFindingTracklet/src/Stub.cc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/L1Trigger/TrackFindingTracklet/src/Stub.cc b/L1Trigger/TrackFindingTracklet/src/Stub.cc index 6fa8dc5b85753..a6ca684cc7151 100644 --- a/L1Trigger/TrackFindingTracklet/src/Stub.cc +++ b/L1Trigger/TrackFindingTracklet/src/Stub.cc @@ -211,6 +211,12 @@ double Stub::rapprox() const { int lr = 1 << (8 - settings_.nrbitsstub(layer_.value())); return r_.value() * settings_.kr() * lr + settings_.rmean(layer_.value()); } + if( !l1tstub_->isPSmodule()){ + if(abs(disk_.value())<=2) + return settings_.rDSSinner(r_.value()); + else + return settings_.rDSSouter(r_.value()); + } return r_.value() * settings_.kr(); } From 31fbb0ebf960159c99c3c4701ddb880a83ee9e04 Mon Sep 17 00:00:00 2001 From: Andrew Hart Date: Thu, 23 Jul 2020 20:35:52 -0400 Subject: [PATCH 4/9] Fixed hexFormat(). --- .../TrackFindingTracklet/interface/Util.h | 31 ++++++++++++------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/L1Trigger/TrackFindingTracklet/interface/Util.h b/L1Trigger/TrackFindingTracklet/interface/Util.h index 6d448d3109bff..a775426464663 100644 --- a/L1Trigger/TrackFindingTracklet/interface/Util.h +++ b/L1Trigger/TrackFindingTracklet/interface/Util.h @@ -4,6 +4,7 @@ #include #include #include +#include #include "FWCore/MessageLogger/interface/MessageLogger.h" #include "FWCore/Utilities/interface/Exception.h" @@ -12,21 +13,27 @@ namespace trklet { //Converts string in binary to hex (used in writing out memory content) inline std::string hexFormat(const std::string& binary) { - std::string tmp = ""; - - unsigned int value = 0; + std::stringstream ss; - for (unsigned int i = 0; i < binary.size(); i++) { - unsigned int slot = binary.size() - i - 1; - if (!(binary[slot] == '0' || binary[slot] == '1')) - continue; - value = value + (binary[slot] - '0'); + unsigned int radix = 1, value = 0; + for (int i = binary.length() - 1; i >= 0; i--) { + if (binary.at(i) != '0' && binary.at(i) != '1') + continue; + value += (binary.at(i) - '0') * radix; + if (radix == 8) { + ss << std::hex << value; + radix = 1; + value = 0; + } + else + radix <<= 1; } + if (radix != 1) + ss << std::hex << value; - std::stringstream ss; - ss << "0x" << std::hex << value; - - return ss.str(); + std::string str = ss.str() + "x0"; + std::reverse(str.begin(), str.end()); + return str; } //Should be optimized by layer - now first implementation to make sure it works OK From c74344250616757fc3869242787df3cb6d38dca6 Mon Sep 17 00:00:00 2001 From: Anders Ryd Date: Fri, 21 Aug 2020 00:12:19 -0400 Subject: [PATCH 5/9] Many modifications that affect the combined modules performance --- .../interface/LayerProjection.h | 3 +- .../interface/MatchEngineUnit.h | 2 + .../interface/MatchProcessor.h | 1 + .../interface/ProjectionTemp.h | 3 + .../TrackFindingTracklet/interface/Sector.h | 2 + .../TrackFindingTracklet/interface/Settings.h | 57 +- .../interface/TrackletCalculatorBase.h | 5 - .../interface/TrackletEngineUnit.h | 77 ++ .../interface/TrackletEventProcessor.h | 1 + .../interface/TrackletProcessor.h | 44 +- .../interface/VMRouterCM.h | 72 ++ .../interface/VMStubsMEMemory.h | 4 + .../interface/VMStubsTEMemory.h | 4 + .../src/LayerProjection.cc | 16 +- .../src/MatchEngineUnit.cc | 29 +- .../src/MatchProcessor.cc | 289 ++--- .../src/ProjectionTemp.cc | 3 + L1Trigger/TrackFindingTracklet/src/Sector.cc | 8 +- .../TrackFindingTracklet/src/Tracklet.cc | 3 +- .../src/TrackletCalculator.cc | 1 - .../src/TrackletCalculatorBase.cc | 24 +- .../src/TrackletEngineUnit.cc | 108 ++ .../src/TrackletEventProcessor.cc | 64 +- .../src/TrackletProcessor.cc | 991 ++++++++---------- .../TrackFindingTracklet/src/VMRouter.cc | 3 +- .../TrackFindingTracklet/src/VMRouterCM.cc | 279 +++++ .../src/VMStubsTEMemory.cc | 20 +- L1Trigger/TrackFindingTracklet/test/Makefile | 3 + 28 files changed, 1344 insertions(+), 772 deletions(-) create mode 100644 L1Trigger/TrackFindingTracklet/interface/TrackletEngineUnit.h create mode 100644 L1Trigger/TrackFindingTracklet/interface/VMRouterCM.h create mode 100644 L1Trigger/TrackFindingTracklet/src/TrackletEngineUnit.cc create mode 100644 L1Trigger/TrackFindingTracklet/src/VMRouterCM.cc diff --git a/L1Trigger/TrackFindingTracklet/interface/LayerProjection.h b/L1Trigger/TrackFindingTracklet/interface/LayerProjection.h index 1b55b4e0b5f8c..392665e3f43dc 100644 --- a/L1Trigger/TrackFindingTracklet/interface/LayerProjection.h +++ b/L1Trigger/TrackFindingTracklet/interface/LayerProjection.h @@ -27,7 +27,8 @@ namespace trklet { double phiprojapprox, double zprojapprox, double phiprojderapprox, - double zprojderapprox); + double zprojderapprox, + bool isPSseed=false); bool valid() const { return valid_; } diff --git a/L1Trigger/TrackFindingTracklet/interface/MatchEngineUnit.h b/L1Trigger/TrackFindingTracklet/interface/MatchEngineUnit.h index 9e3186a455ec1..cb84945be1865 100644 --- a/L1Trigger/TrackFindingTracklet/interface/MatchEngineUnit.h +++ b/L1Trigger/TrackFindingTracklet/interface/MatchEngineUnit.h @@ -26,6 +26,7 @@ namespace trklet { int projrinv, int projfinerz, int projfinephi, + bool usesecond, bool isPSseed, Tracklet* proj); @@ -54,6 +55,7 @@ namespace trklet { int projrinv_; int projfinerz_; int projfinephi_; + bool usesecond_; bool isPSseed_; Tracklet* proj_; diff --git a/L1Trigger/TrackFindingTracklet/interface/MatchProcessor.h b/L1Trigger/TrackFindingTracklet/interface/MatchProcessor.h index 1ecdaa08ac872..5758957ec555b 100644 --- a/L1Trigger/TrackFindingTracklet/interface/MatchProcessor.h +++ b/L1Trigger/TrackFindingTracklet/interface/MatchProcessor.h @@ -37,6 +37,7 @@ namespace trklet { private: int layer_; int disk_; + unsigned int layerdisk_; bool barrel_; unsigned int phiregion_; diff --git a/L1Trigger/TrackFindingTracklet/interface/ProjectionTemp.h b/L1Trigger/TrackFindingTracklet/interface/ProjectionTemp.h index 65970995ce7da..32bd3aa999a55 100644 --- a/L1Trigger/TrackFindingTracklet/interface/ProjectionTemp.h +++ b/L1Trigger/TrackFindingTracklet/interface/ProjectionTemp.h @@ -14,6 +14,7 @@ namespace trklet { int projfinerz, unsigned int projfinephi, unsigned int iphi, + bool usesecond, bool isPSseed); ProjectionTemp(); @@ -26,6 +27,7 @@ namespace trklet { int projfinerz() const { return projfinerz_; } unsigned int projfinephi() const { return projfinephi_; } unsigned int iphi() const { return iphi_; } + bool usesecond() const { return usesecond_; } bool isPSseed() const { return isPSseed_; } private: @@ -35,6 +37,7 @@ namespace trklet { unsigned int projfinerz_; unsigned int projfinephi_; unsigned int iphi_; + bool usesecond_; bool isPSseed_; }; }; // namespace trklet diff --git a/L1Trigger/TrackFindingTracklet/interface/Sector.h b/L1Trigger/TrackFindingTracklet/interface/Sector.h index 5d25f2996afd0..431fff4e30534 100644 --- a/L1Trigger/TrackFindingTracklet/interface/Sector.h +++ b/L1Trigger/TrackFindingTracklet/interface/Sector.h @@ -40,6 +40,7 @@ namespace trklet { //Processing modules class VMRouter; + class VMRouterCM; class TrackletEngine; class TrackletEngineDisplaced; class TripletEngine; @@ -153,6 +154,7 @@ namespace trklet { std::map > Processes_; std::vector VMR_; + std::vector VMRCM_; std::vector TE_; std::vector TED_; std::vector TRE_; diff --git a/L1Trigger/TrackFindingTracklet/interface/Settings.h b/L1Trigger/TrackFindingTracklet/interface/Settings.h index 9d20e34aab93f..477225538489d 100644 --- a/L1Trigger/TrackFindingTracklet/interface/Settings.h +++ b/L1Trigger/TrackFindingTracklet/interface/Settings.h @@ -74,8 +74,13 @@ namespace trklet { unsigned int nbendbitsmedisk() const { return nbendbitsmedisk_; } bool useSeed(unsigned int iSeed) const { return useseeding_.find(iSeed) != useseeding_.end(); } - unsigned int nbitsvmte(unsigned int inner, unsigned int iSeed) const { return nbitsvmte_[inner][iSeed]; } - unsigned int nvmte(unsigned int inner, unsigned int iSeed) const { return (1 << nbitsvmte_[inner][iSeed]); } + unsigned int nbitsvmte(unsigned int inner, unsigned int iSeed) const { + if (combined_) { + return nbitsvmtecm_[inner][iSeed]; + } + return nbitsvmte_[inner][iSeed]; + } + unsigned int nvmte(unsigned int inner, unsigned int iSeed) const { return (1 << nbitsvmte(inner,iSeed)); } unsigned int nbitsvmme(unsigned int layerdisk) const { return nbitsvmme_[layerdisk]; } unsigned int nvmme(unsigned int layerdisk) const { return (1 << nbitsvmme_[layerdisk]); } @@ -95,7 +100,7 @@ namespace trklet { throw cms::Exception("BadConfig") << __FILE__ << " " << __LINE__ << " maxStep module = " << module << " not known"; } - return maxstep_.at(module) + maxstepoffset_; + return maxstep_.at(module); } double zlength() const { return zlength_; } @@ -109,8 +114,13 @@ namespace trklet { double bendcutte(unsigned int inner, unsigned int iSeed) const { return bendcutte_[inner][iSeed]; } double bendcutme(unsigned int layerdisk) const { return bendcutme_[layerdisk]; } - double nfinephi(unsigned int inner, unsigned int iSeed) const { return nfinephi_[inner][iSeed]; } - double nphireg(unsigned int inner, unsigned int iSeed) const { return nphireg_[inner][iSeed]; } + int nfinephi(unsigned int inner, unsigned int iSeed) const { return nfinephi_[inner][iSeed]; } + double nphireg(unsigned int inner, unsigned int iSeed) const { + if (combined_) { + return nphiregcm_[inner][iSeed]; + } + return nphireg_[inner][iSeed]; + } double lutwidthtab(unsigned int inner, unsigned int iSeed) const { return lutwidthtab_[inner][iSeed]; } double lutwidthtabextended(unsigned int inner, unsigned int iSeed) const { return lutwidthtabextended_[inner][iSeed]; @@ -385,6 +395,11 @@ namespace trklet { {{3, 2, 3, 3, 2, 2, 2, 2, 3, 3, 2, 2}}, {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1}}}}; + std::array, 3> nbitsvmtecm_{ + {{{2, 2, 2, 2, 2, 2, 1, 1, 2, 2, 3, 2}}, // (3 = #stubs/triplet, only row 1+2 used for tracklet) + {{3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2}}, + {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1}}}}; + std::array, 2> bendcutte_{ {{{1.25, 1.25, 1.25, 1.25, 1.25, 1.25, 1.25, 1.25}}, //inner (2 = #stubs/tracklet) {{1.25, 1.25, 1.25, 1.25, 1.25, 1.25, 1.25, 1.25}}}}; //outer @@ -482,12 +497,19 @@ namespace trklet { {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3}}}}; //outermost (triplets only) //These are the number of bits used for the VM regions in the TE by seedindex + //FIXME not independed nbitsvmte std::array, 3> nphireg_{ {{{5, 4, 4, 4, 4, 4, 4, 3, 4, 4, 5, 4}}, //inner {{5, 4, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4}}, //outer {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4}}}}; //outermost (triplets only) - std::array, 3> lutwidthtab_{{{{10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 11, 0}}, + //For combined modules + std::array, 3> nphiregcm_{ + {{{5, 4, 4, 4, 4, 4, 4, 3, 4, 4, 5, 4}}, //inner + {{5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4}}, //outer + {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4}}}}; //outermost (triplets only) + + std::array, 3> lutwidthtab_{{{{10, 10, 10, 10, 9, 9, 10, 10, 0, 0, 11, 0}}, {{6, 6, 6, 6, 10, 10, 10, 10, 0, 0, 6, 0}}, {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 6}}}}; @@ -574,32 +596,29 @@ namespace trklet { {{3.6, 3.8, 0.0, 0.0, 3.6, 0.0, 3.5, 3.8, 0.0, 0.0, 3.0, 3.0}}, //disk 4 {{0.0, 0.0, 0.0, 0.0, 3.6, 3.4, 3.7, 0.0, 0.0, 0.0, 0.0, 3.0}}}}; //disk 5 - //Offset to the maximum number of steps in each processing step. Set to 0 for standard - //trunction. Set to large value, e.g. 10000 to remove truncation - unsigned int maxstepoffset_{10000}; - //Default number of processing steps for one event std::unordered_map maxstep_{{"Link", 108}, - {"MC", 108}, - {"ME", 108}, - {"MP", 108}, - {"PR", 108}, - {"TC", 108}, + {"VMR", 108}, {"TE", 108}, + {"TC", 108}, {"TP", 108}, - {"TRE", 108}, - {"VMR", 108}}; + {"PR", 108}, + {"ME", 108}, + {"MC", 108}, + {"MP", 108}, + {"TRE", 108}}; // If set to true this will generate debub printout in text files std::unordered_map writeMonitorData_{{"IL", false}, - {"TE", false}, + {"TE", true}, {"CT", false}, {"HitPattern", false}, {"ChiSq", false}, {"Seeds", false}, {"FT", false}, {"Residuals", false}, - {"MC", false}, + {"MC", false}, + {"MP", false}, {"ME", false}, {"AP", false}, {"VMP", false}, diff --git a/L1Trigger/TrackFindingTracklet/interface/TrackletCalculatorBase.h b/L1Trigger/TrackFindingTracklet/interface/TrackletCalculatorBase.h index 46bc10760ac1c..e58c5eb340adb 100644 --- a/L1Trigger/TrackFindingTracklet/interface/TrackletCalculatorBase.h +++ b/L1Trigger/TrackFindingTracklet/interface/TrackletCalculatorBase.h @@ -131,11 +131,6 @@ namespace trklet { int TCIndex_; - double phioffset_; - - int layer_; - int disk_; - TrackletParametersMemory* trackletpars_; //First index is layer/disk second is phi region diff --git a/L1Trigger/TrackFindingTracklet/interface/TrackletEngineUnit.h b/L1Trigger/TrackFindingTracklet/interface/TrackletEngineUnit.h new file mode 100644 index 0000000000000..e4b125a8ce32d --- /dev/null +++ b/L1Trigger/TrackFindingTracklet/interface/TrackletEngineUnit.h @@ -0,0 +1,77 @@ +#ifndef L1Trigger_TrackFindingTracklet_interface_TrackletEngineUnit_h +#define L1Trigger_TrackFindingTracklet_interface_TrackletEngineUnit_h + +#include "L1Trigger/TrackFindingTracklet/interface/VMStubsTEMemory.h" +#include "L1Trigger/TrackFindingTracklet/interface/CircularBuffer.h" + +#include +#include + + +namespace trklet { + + class Settings; + class Stub; + class L1TStub; + class FPGAWord; + + struct TEData{ + const Stub* stub_; + int start_; + int rzbinfirst_; + int rzdiffmax_; + int innerfinephi_; + FPGAWord innerbend_; + std::vector< std::tuple > regions_; // next z/r bin; phi-region; nstub + }; + + + class TrackletEngineUnit { + public: + TrackletEngineUnit(const Settings& settings, unsigned int nbitsfinephi, unsigned int layerdisk2, unsigned int iSeed, unsigned int nbitsfinephiediff, unsigned int iAllStub, std::vector pttableinner, std::vector pttableouter, VMStubsTEMemory* outervmstubs); + + ~TrackletEngineUnit() = default; + + void init(const TEData& tedata); + + bool empty() const { return candpairs_.empty(); } + + std::pair read() { return candpairs_.read(); } + + std::pair peek() const { return candpairs_.peek(); } + + bool idle() const { return idle_; } + + void reset(); + + void step(); + + private: + VMStubsTEMemory* outervmstubs_; + TEData tedata_; + const Settings& settings_; + unsigned int nbitsfinephi_; + unsigned int layerdisk2_; + unsigned int iSeed_; + unsigned int nbitsfinephidiff_; + + unsigned int iAllStub_; + + //unsigned int memory slot + unsigned int nreg_; + unsigned int istub_; + unsigned int ireg_; + unsigned int next_; + unsigned int nstub_; + + bool idle_; + + std::vector pttableinner_; + std::vector pttableouter_; + + //save the candidate matches + CircularBuffer > candpairs_; + }; // TrackletEngineUnit + +}; // namespace trklet +#endif diff --git a/L1Trigger/TrackFindingTracklet/interface/TrackletEventProcessor.h b/L1Trigger/TrackFindingTracklet/interface/TrackletEventProcessor.h index b22e775b89a07..e46685eaf563c 100644 --- a/L1Trigger/TrackFindingTracklet/interface/TrackletEventProcessor.h +++ b/L1Trigger/TrackFindingTracklet/interface/TrackletEventProcessor.h @@ -52,6 +52,7 @@ namespace trklet { Timer TETimer_; Timer TEDTimer_; Timer TRETimer_; + Timer TPTimer_; Timer TCTimer_; Timer TCDTimer_; Timer PRTimer_; diff --git a/L1Trigger/TrackFindingTracklet/interface/TrackletProcessor.h b/L1Trigger/TrackFindingTracklet/interface/TrackletProcessor.h index c4bc95bd7c450..2613d0cea82c6 100644 --- a/L1Trigger/TrackFindingTracklet/interface/TrackletProcessor.h +++ b/L1Trigger/TrackFindingTracklet/interface/TrackletProcessor.h @@ -4,12 +4,13 @@ #define L1Trigger_TrackFindingTracklet_interface_TrackletProcessor_h #include "L1Trigger/TrackFindingTracklet/interface/TrackletCalculatorBase.h" -#include "L1Trigger/TrackFindingTracklet/interface/VMStubsTEMemory.h" -#include "L1Trigger/TrackFindingTracklet/interface/StubPairsMemory.h" -#include "L1Trigger/TrackFindingTracklet/interface/TrackletProjectionsMemory.h" -#include "L1Trigger/TrackFindingTracklet/interface/AllStubsMemory.h" +#include "L1Trigger/TrackFindingTracklet/interface/VMRouterTable.h" +#include "L1Trigger/TrackFindingTracklet/interface/CircularBuffer.h" +#include "L1Trigger/TrackFindingTracklet/interface/TrackletEngineUnit.h" + #include +#include #include namespace trklet { @@ -17,6 +18,8 @@ namespace trklet { class Settings; class Globals; class MemoryBase; + class AllStubsMemory; + class VMStubsTEMemory; class TrackletProcessor : public TrackletCalculatorBase { public: @@ -32,26 +35,47 @@ namespace trklet { void execute(); - void setVMPhiBin(); - void writeTETable(); + void buildLUT(); + private: int iTC_; + int iAllStub_; + + VMStubsTEMemory* outervmstubs_; + + // istub imem start imem end imem + std::vector, unsigned int , unsigned int, unsigned int, unsigned int> > tedatabuffers_; - std::vector innervmstubs_; - std::vector outervmstubs_; + std::vector teunits_; + std::vector innerallstubs_; std::vector outerallstubs_; - bool extra_; - std::map > pttableinner_; std::map > pttableouter_; + std::vector pttableinnernew_; + std::vector pttableouternew_; + + std::vector > useregion_; + + int nbitsfinephi_; + int nbitsfinephidiff_; + int innerphibits_; int outerphibits_; + + unsigned int nbitszfinebintable_; + unsigned int nbitsrfinebintable_; + + unsigned int nbitsrzbin_; + + + VMRouterTable vmrtable_; + }; }; // namespace trklet diff --git a/L1Trigger/TrackFindingTracklet/interface/VMRouterCM.h b/L1Trigger/TrackFindingTracklet/interface/VMRouterCM.h new file mode 100644 index 0000000000000..564cd635c6364 --- /dev/null +++ b/L1Trigger/TrackFindingTracklet/interface/VMRouterCM.h @@ -0,0 +1,72 @@ +// VMRouter: sorts input stubs into smaller units in phi (and possibly z), referred to as "Virtual Modules" (VMs) - implementation for combined modules +#ifndef L1Trigger_TrackFindingTracklet_interface_VMRouterCM_h +#define L1Trigger_TrackFindingTracklet_interface_VMRouterCM_h + +#include "L1Trigger/TrackFindingTracklet/interface/ProcessBase.h" +#include "L1Trigger/TrackFindingTracklet/interface/FPGAWord.h" +#include "L1Trigger/TrackFindingTracklet/interface/VMRouterTable.h" + +#include +#include +#include + +namespace trklet { + + class Settings; + class Globals; + class MemoryBase; + class InputLinkMemory; + class AllStubsMemory; + class VMStubsMEMemory; + class VMStubsTEMemory; + + struct VMStubsTEPHICM { + VMStubsTEPHICM(unsigned int seednumber_, + std::vector vmstubmem_) + : seednumber(seednumber_), vmstubmem(vmstubmem_){}; + + unsigned int seednumber; //seed number [0,11] + std::vector vmstubmem; // m_vmstubmem[n] is the VMStubsTEMemory for the nth copy + }; + + class VMRouterCM : public ProcessBase { + public: + VMRouterCM(std::string name, Settings const& settings, Globals* global, unsigned int iSector); + + ~VMRouterCM() override = default; + + void addOutput(MemoryBase* memory, std::string output) override; + void addInput(MemoryBase* memory, std::string input) override; + + void execute(); + + private: + //0-5 are the layers and 6-10 are the disks + unsigned int layerdisk_; + + //overlapbits_ is the top bits of phicorr used to add or subtract one to see if stub should be added to + //two VMs. nextrabits_ is the number of bits beyond the bits for the phivm that is used by overlapbits_ + unsigned int overlapbits_; + unsigned int nextrabits_; + + int nbitszfinebintable_; + int nbitsrfinebintable_; + + unsigned int nvmmebins_; //number of long z/r bins in VM + + VMRouterTable vmrtable_; + + //The input stub memories + std::vector stubinputs_; + + //The all stub memories + std::vector > allstubs_; + + //The VM stubs memories used by the MEs + std::vector vmstubsMEPHI_; + + //The VM stubs memories used by the TEs (using structure defined above) + std::vector vmstubsTEPHI_; + }; +}; // namespace trklet +#endif diff --git a/L1Trigger/TrackFindingTracklet/interface/VMStubsMEMemory.h b/L1Trigger/TrackFindingTracklet/interface/VMStubsMEMemory.h index 57e7dcf085d41..a77c624af5f68 100644 --- a/L1Trigger/TrackFindingTracklet/interface/VMStubsMEMemory.h +++ b/L1Trigger/TrackFindingTracklet/interface/VMStubsMEMemory.h @@ -25,6 +25,10 @@ namespace trklet { } } + void resize(int nbins) { + binnedstubs_.resize(nbins); + } + unsigned int nStubsBin(unsigned int bin) const { assert(bin < binnedstubs_.size()); return binnedstubs_[bin].size(); diff --git a/L1Trigger/TrackFindingTracklet/interface/VMStubsTEMemory.h b/L1Trigger/TrackFindingTracklet/interface/VMStubsTEMemory.h index f16a0a35a10c4..0c396f793918e 100644 --- a/L1Trigger/TrackFindingTracklet/interface/VMStubsTEMemory.h +++ b/L1Trigger/TrackFindingTracklet/interface/VMStubsTEMemory.h @@ -19,6 +19,8 @@ namespace trklet { ~VMStubsTEMemory() override = default; + void resize(int nbins) {stubsbinnedvm_.resize(nbins);} + bool addVMStub(VMStubTE vmstub, int bin); bool addVMStub(VMStubTE vmstub); @@ -27,6 +29,8 @@ namespace trklet { unsigned int nVMStubsBinned(unsigned int bin) const { return stubsbinnedvm_[bin].size(); } + unsigned int nBin() const { return stubsbinnedvm_.size(); } + const VMStubTE& getVMStubTE(unsigned int i) const { return stubsvm_[i]; } const VMStubTE& getVMStubTEBinned(unsigned int bin, unsigned int i) const { return stubsbinnedvm_[bin][i]; } diff --git a/L1Trigger/TrackFindingTracklet/src/LayerProjection.cc b/L1Trigger/TrackFindingTracklet/src/LayerProjection.cc index e6480bc930f7d..19a4f9d145957 100644 --- a/L1Trigger/TrackFindingTracklet/src/LayerProjection.cc +++ b/L1Trigger/TrackFindingTracklet/src/LayerProjection.cc @@ -20,7 +20,8 @@ void LayerProjection::init(Settings const& settings, double phiprojapprox, double zprojapprox, double phiprojderapprox, - double zprojderapprox) { + double zprojderapprox, + bool isPSseed) { assert(projlayer > 0); assert(projlayer <= N_LAYER); @@ -62,12 +63,17 @@ void LayerProjection::init(Settings const& settings, ////This determines the central bin: ////int zbin=4+(zproj.value()>>(zproj.nbits()-3)); ////But we need some range (particularly for L5L6 seed projecting to L1-L3): + int offset=4; + if (isPSseed) { + offset=1; + } unsigned int zbin1 = (1 << (settings.MEBinsBits() - 1)) + - (((fpgazproj_.value() >> (fpgazproj_.nbits() - settings.MEBinsBits() - 2)) - 2) >> 2); + (((fpgazproj_.value() >> (fpgazproj_.nbits() - settings.MEBinsBits() - 3)) - offset) >> 3); unsigned int zbin2 = (1 << (settings.MEBinsBits() - 1)) + - (((fpgazproj_.value() >> (fpgazproj_.nbits() - settings.MEBinsBits() - 2)) + 2) >> 2); - if (zbin1 >= settings.MEBins()) + (((fpgazproj_.value() >> (fpgazproj_.nbits() - settings.MEBinsBits() - 3)) + offset) >> 3); + if (zbin1 >= settings.MEBins()){ zbin1 = 0; //note that zbin1 is unsigned + } if (zbin2 >= settings.MEBins()) zbin2 = settings.MEBins() - 1; assert(zbin1 <= zbin2); @@ -83,7 +89,7 @@ void LayerProjection::init(Settings const& settings, (fpgazproj_.value() >> (fpgazproj_.nbits() - (settings.MEBinsBits() + 3)))) - (zbin1 << 3); - fpgafinezvm_.set(finez, 4, true, __LINE__, __FILE__); // fine z postions starting at zbin1 + fpgafinezvm_.set(finez, 4, true, __LINE__, __FILE__); // fine z postions starting at zbin1 //FIXME using 3 bits phiproj_ = phiproj; zproj_ = zproj; diff --git a/L1Trigger/TrackFindingTracklet/src/MatchEngineUnit.cc b/L1Trigger/TrackFindingTracklet/src/MatchEngineUnit.cc index babc54d571b3d..183f94fac222e 100644 --- a/L1Trigger/TrackFindingTracklet/src/MatchEngineUnit.cc +++ b/L1Trigger/TrackFindingTracklet/src/MatchEngineUnit.cc @@ -18,6 +18,7 @@ void MatchEngineUnit::init(VMStubsMEMemory* vmstubsmemory, int projrinv, int projfinerz, int projfinephi, + bool usesecond, bool isPSseed, Tracklet* proj) { vmstubsmemory_ = vmstubsmemory; @@ -27,6 +28,7 @@ void MatchEngineUnit::init(VMStubsMEMemory* vmstubsmemory, projrinv_ = projrinv; projfinerz_ = projfinerz; projfinephi_ = projfinephi; + usesecond_ = usesecond; isPSseed_ = isPSseed; proj_ = proj; } @@ -37,10 +39,7 @@ void MatchEngineUnit::step() { const VMStubME& vmstub = vmstubsmemory_->getVMStubMEBin(slot_, istub_); - istub_++; - if (istub_ >= vmstubsmemory_->nStubsBin(slot_)) - idle_ = true; - + bool isPSmodule = vmstub.isPSmodule(); int stubfinerz = vmstub.finerz().value(); int stubfinephi = vmstub.finephi().value(); @@ -48,10 +47,6 @@ void MatchEngineUnit::step() { int deltaphi = stubfinephi - projfinephi_; bool dphicut = (abs(deltaphi) < 3) || (abs(deltaphi) > 5); //TODO - need better implementations - dphicut = true; //Not used until cuts cleaned up - - if (!barrel_) - dphicut = true; int nbits = isPSmodule ? 3 : 4; @@ -63,7 +58,7 @@ void MatchEngineUnit::step() { if (barrel_) { if (isPSseed_) { - pass = idrz >= -2 && idrz <= 2; + pass = idrz >= -1 && idrz <= 1; } else { pass = idrz >= -5 && idrz <= 5; } @@ -71,7 +66,7 @@ void MatchEngineUnit::step() { if (isPSmodule) { pass = idrz >= -1 && idrz <= 1; } else { - pass = idrz >= -5 && idrz <= 5; + pass = idrz >= -3 && idrz <= 3; } } @@ -80,6 +75,20 @@ void MatchEngineUnit::step() { std::pair tmp(proj_, vmstub.stub()); candmatches_.store(tmp); } + + istub_++; + if (istub_ >= vmstubsmemory_->nStubsBin(slot_)){ + if (usesecond_) { + usesecond_=false; + istub_=0; + slot_++; + projfinerz_-=8; + } else { + idle_ = true; + } + } + + } void MatchEngineUnit::reset() { diff --git a/L1Trigger/TrackFindingTracklet/src/MatchProcessor.cc b/L1Trigger/TrackFindingTracklet/src/MatchProcessor.cc index fa28cbffa336a..c30725ed3295b 100644 --- a/L1Trigger/TrackFindingTracklet/src/MatchProcessor.cc +++ b/L1Trigger/TrackFindingTracklet/src/MatchProcessor.cc @@ -18,6 +18,7 @@ MatchProcessor::MatchProcessor(string name, Settings const& settings, Globals* g phiregion_ = name[8] - 'A'; initLayerDisk(3, layer_, disk_); + layerdisk_=initLayerDisk(3); //TODO should sort out constants here icorrshift_ = 7; @@ -206,6 +207,9 @@ void MatchProcessor::addInput(MemoryBase* memory, string input) { } void MatchProcessor::execute() { + + assert(vmstubs_.size()==1); + if (globals_->projectionRouterBendTable() == nullptr) { // move to constructor?! auto* bendTablePtr = new ProjectionRouterBendTable(); bendTablePtr->init(settings_, globals_, nrbits_, nphiderbits_); @@ -228,164 +232,205 @@ void MatchProcessor::execute() { Tracklet* oldTracklet = nullptr; + unsigned int countme = 0; unsigned int countall = 0; unsigned int countsel = 0; + unsigned int countinputproj=0; unsigned int iprojmem = 0; unsigned int iproj = 0; inputProjBuffer_.reset(); + for (unsigned int i=0;inTracklets(); + } + for (unsigned int iME = 0; iME < nMatchEngines_; iME++) { matchengines_[iME].reset(); } - bool projdone=false; - bool medone=true; + unsigned int step2delay=0; + unsigned int step3delay=0; + - for (unsigned int istep = 0; istep < settings_.maxStep("MP"); istep++) { + for (unsigned int istep = 0; istep < settings_.maxStep("MP")+step3delay; istep++) { + bool projdone=false; + bool medone=true; //Step 1 //First step here checks if we have more input projections to put into //the input puffer for projections - if (iprojmem < inputprojs_.size()) { - TrackletProjectionsMemory* projMem = inputprojs_[iprojmem]; - if (projMem->nTracklets() == 0) { - iprojmem++; - } else if (iproj < projMem->nTracklets()) { - if (!inputProjBuffer_.almostfull()) { - if (settings_.debugTracklet()) { - edm::LogVerbatim("Tracklet") << getName() << " have projection in memory : " << projMem->getName(); - } - - Tracklet* proj = projMem->getTracklet(iproj); - FPGAWord fpgaphi = barrel_ ? proj->fpgaphiproj(layer_) : proj->fpgaphiprojdisk(disk_); - - int iphi = (fpgaphi.value() >> (fpgaphi.nbits() - nvmbits_)) & (nvmbins_ - 1); - - int projrinv = -1; - if (barrel_) { - projrinv = 16 + (proj->fpgarinv().value() >> (proj->fpgarinv().nbits() - 5)); - } else { - //The next lines looks up the predicted bend based on: - // 1 - r projections - // 2 - phi derivative - // 3 - the sign - i.e. if track is forward or backward - int rindex = (proj->fpgarprojdisk(disk_).value() >> (proj->fpgarprojdisk(disk_).nbits() - nrbits_)) & - ((1 << nrbits_) - 1); - - int phiderindex = + + if (istep < settings_.maxStep("MP")) { + if (iprojmem < inputprojs_.size()) { + TrackletProjectionsMemory* projMem = inputprojs_[iprojmem]; + if (projMem->nTracklets() == 0) { + iprojmem++; + } else if (iproj < projMem->nTracklets()) { + if (!inputProjBuffer_.almostfull()) { + if (settings_.debugTracklet()) { + edm::LogVerbatim("Tracklet") << getName() << " have projection in memory : "<getName(); + } + + Tracklet* proj = projMem->getTracklet(iproj); + FPGAWord fpgaphi = barrel_ ? proj->fpgaphiproj(layer_) : proj->fpgaphiprojdisk(disk_); + + int iphi = (fpgaphi.value() >> (fpgaphi.nbits() - nvmbits_)) & (nvmbins_ - 1); + + int projrinv = -1; + if (barrel_) { + projrinv = 16 + (proj->fpgarinv().value() >> (proj->fpgarinv().nbits() - 5)); + } else { + //The next lines looks up the predicted bend based on: + // 1 - r projections + // 2 - phi derivative + // 3 - the sign - i.e. if track is forward or backward + int rindex = (proj->fpgarprojdisk(disk_).value() >> (proj->fpgarprojdisk(disk_).nbits() - nrbits_)) & + ((1 << nrbits_) - 1); + + int phiderindex = (proj->fpgaphiprojderdisk(disk_).value() >> (proj->fpgaphiprojderdisk(disk_).nbits() - nphiderbits_)) & ((1 << nphiderbits_) - 1); - int signindex = (proj->fpgarprojderdisk(disk_).value() < 0); - - int bendindex = (signindex << (nphiderbits_ + nrbits_)) + (rindex << (nphiderbits_)) + phiderindex; - - projrinv = globals_->projectionRouterBendTable()->bendLoookup(abs(disk_) - 1, bendindex); - - proj->setBendIndex(projrinv, disk_); - } - assert(projrinv >= 0); - - unsigned int slot = barrel_ ? proj->zbin1projvm(layer_) : proj->rbin1projvm(disk_); - bool second = (barrel_ ? proj->zbin2projvm(layer_) : proj->rbin2projvm(disk_)) == 1; - - unsigned int projfinephi = fpgaphi.value() >> (fpgaphi.nbits() - (nvmbits_ + 3)) & 7; - int projfinerz = barrel_ ? proj->finezvm(layer_) : proj->finervm(disk_); - - bool isPSseed = proj->PSseed() == 1; - - VMStubsMEMemory* stubmem = vmstubs_[iphi]; - if (stubmem->nStubsBin(slot) != 0) { - ProjectionTemp tmpProj(proj, slot, projrinv, projfinerz, projfinephi, iphi, isPSseed); - inputProjBuffer_.store(tmpProj); - } - if (second && (stubmem->nStubsBin(slot + 1) != 0)) { - ProjectionTemp tmpProj(proj, slot + 1, projrinv, projfinerz - 8, projfinephi, iphi, isPSseed); - inputProjBuffer_.store(tmpProj); - } - iproj++; - if (iproj == projMem->nTracklets()) { - iproj = 0; - iprojmem++; - } - } + int signindex = (proj->fpgarprojderdisk(disk_).value() < 0); + + int bendindex = (signindex << (nphiderbits_ + nrbits_)) + (rindex << (nphiderbits_)) + phiderindex; + + projrinv = globals_->projectionRouterBendTable()->bendLoookup(abs(disk_) - 1, bendindex); + + proj->setBendIndex(projrinv, disk_); + } + assert(projrinv >= 0); + + unsigned int slot = barrel_ ? proj->zbin1projvm(layer_) : proj->rbin1projvm(disk_); + bool second = (barrel_ ? proj->zbin2projvm(layer_) : proj->rbin2projvm(disk_)); + + unsigned int projfinephi = (fpgaphi.value() >> (fpgaphi.nbits() - (nvmbits_ + 3))) & 7; + int projfinerz = barrel_ ? proj->finezvm(layer_) : proj->finervm(disk_); + + bool isPSseed = proj->PSseed() == 1; + + int nbins=8; + if (layerdisk_>=6) + nbins=16; + + VMStubsMEMemory* stubmem = vmstubs_[0]; + bool usefirst = stubmem->nStubsBin(iphi*nbins+slot) != 0; + bool usesecond = (second && (stubmem->nStubsBin(iphi*nbins+slot+1) != 0)); + + if (usefirst) { + ProjectionTemp tmpProj(proj, slot, projrinv, projfinerz, projfinephi, iphi, usesecond, isPSseed); + inputProjBuffer_.store(tmpProj); + } else if (usesecond) { + ProjectionTemp tmpProj(proj, slot + 1, projrinv, projfinerz - 8, projfinephi, iphi, false, isPSseed); + inputProjBuffer_.store(tmpProj); + } + //if (usefirst) { + // ProjectionTemp tmpProj(proj, slot, projrinv, projfinerz, projfinephi, iphi, false, isPSseed); + // inputProjBuffer_.store(tmpProj); + //} + //if (usesecond) { + // ProjectionTemp tmpProj(proj, slot + 1, projrinv, projfinerz - 8, projfinephi, iphi, false, isPSseed); + // inputProjBuffer_.store(tmpProj); + //} + iproj++; + if (iproj == projMem->nTracklets()) { + iproj = 0; + iprojmem++; + } + } + } + } else { + projdone=true; } - } else { - projdone=true; } //Step 2 //Check if we have ME that can process projection - bool addedProjection = false; - for (unsigned int iME = 0; iME < nMatchEngines_; iME++) { - matchengines_[iME].step(); - //if match engine empty and we have queued projections add to match engine - if ((!addedProjection) && matchengines_[iME].idle() && (!inputProjBuffer_.empty())) { - ProjectionTemp tmpProj = inputProjBuffer_.read(); - VMStubsMEMemory* stubmem = vmstubs_[tmpProj.iphi()]; - - if (settings_.debugTracklet()) { - edm::LogVerbatim("Tracklet") << getName() << " adding projection to match engine"; - } - - matchengines_[iME].init(stubmem, - tmpProj.slot(), - tmpProj.projrinv(), - tmpProj.projfinerz(), - tmpProj.projfinephi(), - tmpProj.isPSseed(), - tmpProj.proj()); - addedProjection = true; + if (istep >= step2delay && istep < settings_.maxStep("MP")+step2delay) { + bool addedProjection = false; + for (unsigned int iME = 0; iME < nMatchEngines_; iME++) { + if (!matchengines_[iME].idle()) countme++; + matchengines_[iME].step(); + //if match engine empty and we have queued projections add to match engine + if ((!addedProjection) && matchengines_[iME].idle() && (!inputProjBuffer_.empty())) { + ProjectionTemp tmpProj = inputProjBuffer_.read(); + VMStubsMEMemory* stubmem = vmstubs_[0]; + + if (settings_.debugTracklet()) { + edm::LogVerbatim("Tracklet") << getName()<<" adding projection to match engine"; + } + + int nbins=8; + if (layerdisk_>=6) + nbins=16; + + matchengines_[iME].init(stubmem, + tmpProj.iphi()*nbins+tmpProj.slot(), + tmpProj.projrinv(), + tmpProj.projfinerz(), + tmpProj.projfinephi(), + tmpProj.usesecond(), + tmpProj.isPSseed(), + tmpProj.proj()); + addedProjection = true; + } } } - + //Step 3 //Check if we have candidate match to process - - unsigned int iMEbest = nMatchEngines_; - int bestTCID = -1; - bool bestInPipeline = false; - for (unsigned int iME = 0; iME < nMatchEngines_; iME++) { - bool empty = matchengines_[iME].empty(); - medone=medone&&(empty&&matchengines_[iME].idle()); - if (empty && matchengines_[iME].idle()) - continue; - int currentTCID = empty ? matchengines_[iME].currentProj()->TCID() : matchengines_[iME].peek().first->TCID(); - if ((iMEbest == nMatchEngines_) || (currentTCID < bestTCID)) { - iMEbest = iME; - bestTCID = currentTCID; - bestInPipeline = empty; - } - } - - if (iMEbest != nMatchEngines_ && (!bestInPipeline)) { - std::pair candmatch = matchengines_[iMEbest].read(); - - const Stub* fpgastub = candmatch.second; - Tracklet* tracklet = candmatch.first; - - if (oldTracklet != nullptr) { - //allow equal here since we can have more than one cadidate match per tracklet projection - assert(oldTracklet->TCID() <= tracklet->TCID()); + + if (istep >= step3delay) { + unsigned int iMEbest = nMatchEngines_; + int bestTCID = -1; + bool bestInPipeline = false; + for (unsigned int iME = 0; iME < nMatchEngines_; iME++) { + bool empty = matchengines_[iME].empty(); + medone=medone&&(empty&&matchengines_[iME].idle()); + if (empty && matchengines_[iME].idle()) + continue; + int currentTCID = empty ? matchengines_[iME].currentProj()->TCID() : matchengines_[iME].peek().first->TCID(); + if ((iMEbest == nMatchEngines_) || (currentTCID < bestTCID)) { + iMEbest = iME; + bestTCID = currentTCID; + bestInPipeline = empty; + } } - oldTracklet = tracklet; - bool match = matchCalculator(tracklet, fpgastub); + if (iMEbest != nMatchEngines_ && (!bestInPipeline)) { + std::pair candmatch = matchengines_[iMEbest].read(); + + const Stub* fpgastub = candmatch.second; + Tracklet* tracklet = candmatch.first; + + if (oldTracklet != nullptr) { + //allow equal here since we can have more than one cadidate match per tracklet projection + assert(oldTracklet->TCID() <= tracklet->TCID()); + } + oldTracklet = tracklet; + + bool match = matchCalculator(tracklet, fpgastub); + + if (settings_.debugTracklet()&&match) { + edm::LogVerbatim("Tracklet") << getName() << " have match"; + } - if (settings_.debugTracklet() && match) { - edm::LogVerbatim("Tracklet") << getName() << " have match"; + + countall++; + if (match) + countsel++; } - - countall++; - if (match) - countsel++; - ; } - if (projdone&&medone) break; + if ((projdone&&medone)||(istep==settings_.maxStep("MP")+step3delay-1)) { + globals_->ofstream("matchprocessor.txt") << getName() << " " <ofstream("matchcalculator.txt") << getName() << " " << countall << " " << countsel << endl; } diff --git a/L1Trigger/TrackFindingTracklet/src/ProjectionTemp.cc b/L1Trigger/TrackFindingTracklet/src/ProjectionTemp.cc index 5287ffacceb7b..0e9a1ead567cc 100644 --- a/L1Trigger/TrackFindingTracklet/src/ProjectionTemp.cc +++ b/L1Trigger/TrackFindingTracklet/src/ProjectionTemp.cc @@ -9,6 +9,7 @@ ProjectionTemp::ProjectionTemp(Tracklet* proj, int projfinerz, unsigned int projfinephi, unsigned int iphi, + bool usesecond, bool isPSseed) { proj_ = proj; slot_ = slot; @@ -16,6 +17,7 @@ ProjectionTemp::ProjectionTemp(Tracklet* proj, projfinerz_ = projfinerz; projfinephi_ = projfinephi; iphi_ = iphi; + usesecond_ = usesecond; isPSseed_ = isPSseed; } @@ -26,5 +28,6 @@ ProjectionTemp::ProjectionTemp() { projfinerz_ = 0; projfinephi_ = 0; iphi_ = 0; + usesecond_=false; isPSseed_ = false; } diff --git a/L1Trigger/TrackFindingTracklet/src/Sector.cc b/L1Trigger/TrackFindingTracklet/src/Sector.cc index 0c383ed147360..118a5aee2174e 100644 --- a/L1Trigger/TrackFindingTracklet/src/Sector.cc +++ b/L1Trigger/TrackFindingTracklet/src/Sector.cc @@ -18,6 +18,7 @@ #include "L1Trigger/TrackFindingTracklet/interface/TrackFitMemory.h" #include "L1Trigger/TrackFindingTracklet/interface/CleanTrackMemory.h" +#include "L1Trigger/TrackFindingTracklet/interface/VMRouterCM.h" #include "L1Trigger/TrackFindingTracklet/interface/VMRouter.h" #include "L1Trigger/TrackFindingTracklet/interface/TrackletEngine.h" #include "L1Trigger/TrackFindingTracklet/interface/TrackletEngineDisplaced.h" @@ -128,6 +129,8 @@ void Sector::addMem(string memType, string memName) { void Sector::addProc(string procType, string procName) { if (procType == "VMRouter:") { addProcToVec(VMR_, new VMRouter(procName, settings_, globals_, isector_), procName); + } else if (procType == "VMRouterCM:") { + addProcToVec(VMRCM_, new VMRouterCM(procName, settings_, globals_, isector_), procName); } else if (procType == "TrackletEngine:") { addProcToVec(TE_, new TrackletEngine(procName, settings_, globals_, isector_), procName); } else if (procType == "TrackletEngineDisplaced:") { @@ -189,7 +192,7 @@ ProcessBase* Sector::getProc(string procName) { if (it != Processes_.end()) { return it->second.get(); } - throw cms::Exception("BadConfig") << __FILE__ << " " << __LINE__ << " Could not find process : " << procName; + throw cms::Exception("BadConfig") << __FILE__ << " " << __LINE__ << " Could not find process : " << procName<execute(); } + for (auto& i : VMRCM_) { + i->execute(); + } } void Sector::executeTE() { diff --git a/L1Trigger/TrackFindingTracklet/src/Tracklet.cc b/L1Trigger/TrackFindingTracklet/src/Tracklet.cc index 6488b8bc8a820..cc47893a07630 100644 --- a/L1Trigger/TrackFindingTracklet/src/Tracklet.cc +++ b/L1Trigger/TrackFindingTracklet/src/Tracklet.cc @@ -319,7 +319,8 @@ void Tracklet::addMatch(int layer, const trklet::Stub* stubptr) { assert(layer > 0 && layer <= N_LAYER); layerresid_[layer - 1].init( - settings_, layer, ideltaphi, ideltaz, stubid, dphi, dz, dphiapprox, dzapprox, rstub, stubptr); + settings_, layer, ideltaphi, ideltaz, stubid, dphi, dz, + dphiapprox, dzapprox, rstub, stubptr); } void Tracklet::addMatchDisk(int disk, diff --git a/L1Trigger/TrackFindingTracklet/src/TrackletCalculator.cc b/L1Trigger/TrackFindingTracklet/src/TrackletCalculator.cc index c7946901b6e2a..57de2ce35a5fd 100644 --- a/L1Trigger/TrackFindingTracklet/src/TrackletCalculator.cc +++ b/L1Trigger/TrackFindingTracklet/src/TrackletCalculator.cc @@ -14,7 +14,6 @@ using namespace trklet; TrackletCalculator::TrackletCalculator(string name, Settings const& settings, Globals* globals, unsigned int iSector) : TrackletCalculatorBase(name, settings, globals, iSector) { - phioffset_ = phimin_; for (unsigned int ilayer = 0; ilayer < N_LAYER; ilayer++) { vector tmp(settings.nallstubs(ilayer), nullptr); diff --git a/L1Trigger/TrackFindingTracklet/src/TrackletCalculatorBase.cc b/L1Trigger/TrackFindingTracklet/src/TrackletCalculatorBase.cc index 687ff3fdfac82..4f9fd4e47c860 100644 --- a/L1Trigger/TrackFindingTracklet/src/TrackletCalculatorBase.cc +++ b/L1Trigger/TrackFindingTracklet/src/TrackletCalculatorBase.cc @@ -403,8 +403,8 @@ bool TrackletCalculatorBase::barrelSeeding(const Stub* innerFPGAStub, ITC->r2.set_fval(r2 - settings_.rmean(layerdisk2_)); ITC->z1.set_fval(z1); ITC->z2.set_fval(z2); - double sphi1 = angle0to2pi::make0To2pi(phi1 - phioffset_); - double sphi2 = angle0to2pi::make0To2pi(phi2 - phioffset_); + double sphi1 = angle0to2pi::make0To2pi(phi1 - phimin_); + double sphi2 = angle0to2pi::make0To2pi(phi2 - phimin_); ITC->phi1.set_fval(sphi1); ITC->phi2.set_fval(sphi2); @@ -560,8 +560,9 @@ bool TrackletCalculatorBase::barrelSeeding(const Stub* innerFPGAStub, izproj[2] = ITC->zL_2_final.ival(); izproj[3] = ITC->zL_3_final.ival(); - if (!goodTrackPars(ITC->rinv_final.local_passes(), ITC->z0_final.local_passes())) + if (!goodTrackPars(ITC->rinv_final.local_passes(), ITC->z0_final.local_passes())){ return false; + } if (!inSector(iphi0, irinv, phi0approx, rinvapprox)) return false; @@ -600,7 +601,8 @@ bool TrackletCalculatorBase::barrelSeeding(const Stub* innerFPGAStub, phiprojapprox[i], zprojapprox[i], ITC->der_phiL_final.fval(), - ITC->der_zL_final.fval()); + ITC->der_zL_final.fval(), + !(iSeed_==1||iSeed_==2)); } iphiprojdisk[0] = ITC->phiD_0_final.ival(); @@ -835,8 +837,8 @@ bool TrackletCalculatorBase::diskSeeding(const Stub* innerFPGAStub, int signt = t > 0 ? 1 : -1; ITC->z1.set_fval(z1 - signt * settings_.zmean(layerdisk1_ - N_LAYER)); ITC->z2.set_fval(z2 - signt * settings_.zmean(layerdisk2_ - N_LAYER)); - double sphi1 = angle0to2pi::make0To2pi(phi1 - phioffset_); - double sphi2 = angle0to2pi::make0To2pi(phi2 - phioffset_); + double sphi1 = angle0to2pi::make0To2pi(phi1 - phimin_); + double sphi2 = angle0to2pi::make0To2pi(phi2 - phimin_); ITC->phi1.set_fval(sphi1); ITC->phi2.set_fval(sphi2); @@ -1001,7 +1003,8 @@ bool TrackletCalculatorBase::diskSeeding(const Stub* innerFPGAStub, phiprojapprox[i], zprojapprox[i], ITC->der_phiL_final.fval(), - ITC->der_zL_final.fval()); + ITC->der_zL_final.fval(), + true); } iphiprojdisk[0] = ITC->phiD_0_final.ival(); @@ -1191,8 +1194,8 @@ bool TrackletCalculatorBase::overlapSeeding(const Stub* innerFPGAStub, int signt = t > 0 ? 1 : -1; ITC->z1.set_fval(z2); ITC->z2.set_fval(z1 - signt * settings_.zmean(layerdisk2_ - N_LAYER)); - double sphi1 = angle0to2pi::make0To2pi(phi1 - phioffset_); - double sphi2 = angle0to2pi::make0To2pi(phi2 - phioffset_); + double sphi1 = angle0to2pi::make0To2pi(phi1 - phimin_); + double sphi2 = angle0to2pi::make0To2pi(phi2 - phimin_); ITC->phi1.set_fval(sphi2); ITC->phi2.set_fval(sphi1); @@ -1374,7 +1377,8 @@ bool TrackletCalculatorBase::overlapSeeding(const Stub* innerFPGAStub, phiprojapprox[i], zprojapprox[i], ITC->der_phiL_final.fval(), - ITC->der_zL_final.fval()); + ITC->der_zL_final.fval(), + true); } for (int i = 0; i < 4; ++i) { diff --git a/L1Trigger/TrackFindingTracklet/src/TrackletEngineUnit.cc b/L1Trigger/TrackFindingTracklet/src/TrackletEngineUnit.cc new file mode 100644 index 0000000000000..d6b4109afc548 --- /dev/null +++ b/L1Trigger/TrackFindingTracklet/src/TrackletEngineUnit.cc @@ -0,0 +1,108 @@ +#include "L1Trigger/TrackFindingTracklet/interface/TrackletEngineUnit.h" +#include "L1Trigger/TrackFindingTracklet/interface/VMStubsTEMemory.h" +#include "L1Trigger/TrackFindingTracklet/interface/Settings.h" + +using namespace std; +using namespace trklet; + + +TrackletEngineUnit::TrackletEngineUnit(const Settings& settings, unsigned int nbitsfinephi, unsigned int layerdisk2, unsigned int iSeed, unsigned int nbitsfinephidiff, unsigned int iAllStub, std::vector pttableinner, std::vector pttableouter, VMStubsTEMemory* outervmstubs) + : settings_(settings), candpairs_(5) { + idle_=true; + nbitsfinephi_=nbitsfinephi; + layerdisk2_=layerdisk2; + iSeed_=iSeed; + nbitsfinephidiff_=nbitsfinephidiff; + iAllStub_=iAllStub; + pttableinner_=pttableinner; + pttableouter_=pttableouter; + outervmstubs_=outervmstubs; +} + + +void TrackletEngineUnit::init(const TEData& tedata){ + tedata_=tedata; + nreg_=0; + istub_=0; + idle_=false; + assert(tedata_.regions_.size()>0); + std::tie(next_,ireg_,nstub_) = tedata_.regions_[0]; +} + +void TrackletEngineUnit::reset(){ + idle_=true; + candpairs_.reset(); +} + +void TrackletEngineUnit::step(){ + if (candpairs_.full()) + return; + + + int ibin=tedata_.start_+next_; + + int nbins=8; //FIXME + + assert(istub_nVMStubsBinned(ireg_*nbins+ibin)); + + const VMStubTE& outervmstub = outervmstubs_->getVMStubTEBinned(ireg_*nbins+ibin,istub_); + int rzbin = (outervmstub.vmbits().value() & 7); + + //assert(innerphibits_ != -1); + //assert(outerphibits_ != -1); + + FPGAWord iphiouterbin = outervmstub.finephi(); + + assert(iphiouterbin == outervmstub.finephi()); + + //New code to calculate lut value + int outerfinephi=iAllStub_*(1<<(nbitsfinephi_-settings_.nbitsallstubs(layerdisk2_)))+ireg_*(1<=-(1<<(nbitsfinephidiff_-1))); + //int idphiraw=idphi; + if (idphi<0) idphi=idphi+(1<= 4) { //Also use r-position + int ir = ((ibin & 3) << 1) + (rzbin >> 2); + idphi = (idphi << 3) + ir; + } + + if (next_!=0) + rzbin += 8; + if ((rzbin < tedata_.rzbinfirst_) || (rzbin - tedata_.rzbinfirst_ > tedata_.rzdiffmax_)) { + if (settings_.debugTracklet()) { + edm::LogVerbatim("Tracklet") + << " layer-disk stub pair rejected because rbin cut : " << rzbin << " " << tedata_.rzbinfirst_ + << " " << tedata_.rzdiffmax_; + } + } else { + + FPGAWord outerbend = outervmstub.bend(); + + int ptinnerindex = (idphi << tedata_.innerbend_.nbits()) + tedata_.innerbend_.value(); + int ptouterindex = (idphi << outerbend.nbits()) + outerbend.value(); + + if (!(inrange && pttableinner_[ptinnerindex] && pttableouter_[ptouterindex])) { + if (settings_.debugTracklet()) { + edm::LogVerbatim("Tracklet") <<" Stub pair rejected because of stub pt cut bends : " + << benddecode(tedata_.innerbend_.value(), tedata_.stub_->isPSmodule()) << " " + << benddecode(outerbend.value(), outervmstub.isPSmodule()); + } + } else { + candpairs_.store(pair(tedata_.stub_, outervmstub.stub())); + } + } + istub_++; + if (istub_>=nstub_) { + istub_=0; + nreg_++; + if (nreg_>=tedata_.regions_.size()) { + nreg_=0; + idle_=true; + } else { + std::tie(next_,ireg_,nstub_) = tedata_.regions_[nreg_]; + } + } + +} + diff --git a/L1Trigger/TrackFindingTracklet/src/TrackletEventProcessor.cc b/L1Trigger/TrackFindingTracklet/src/TrackletEventProcessor.cc index 8cbd7db3408ca..a265976fe1533 100644 --- a/L1Trigger/TrackFindingTracklet/src/TrackletEventProcessor.cc +++ b/L1Trigger/TrackFindingTracklet/src/TrackletEventProcessor.cc @@ -357,9 +357,11 @@ void TrackletEventProcessor::event(SLHCEvent& ev) { TRETimer_.stop(); // tracklet processor (alternative implementation to TE+TC) + TPTimer_.start(); for (unsigned int k = 0; k < N_SECTOR; k++) { sectors_[k]->executeTP(); } + TPTimer_.stop(); for (unsigned int k = 0; k < N_SECTOR; k++) { if (settings_->writeMem() && k == settings_->writememsect()) { @@ -508,33 +510,53 @@ void TrackletEventProcessor::printSummary() { } edm::LogVerbatim("Tracklet") - << "Process Times called Average time (ms) Total time (s) \n" - << "Cleaning " << setw(10) << cleanTimer_.ntimes() << setw(20) << setprecision(3) - << cleanTimer_.avgtime() * 1000.0 << setw(20) << setprecision(3) << cleanTimer_.tottime() << "\n" - << "Add Stubs " << setw(10) << addStubTimer_.ntimes() << setw(20) << setprecision(3) - << addStubTimer_.avgtime() * 1000.0 << setw(20) << setprecision(3) << addStubTimer_.tottime() << "\n" - << "VMRouter " << setw(10) << VMRouterTimer_.ntimes() << setw(20) << setprecision(3) - << VMRouterTimer_.avgtime() * 1000.0 << setw(20) << setprecision(3) << VMRouterTimer_.tottime() << "\n" + << "Process Times called Average time (ms) Total time (s)"; + edm::LogVerbatim("Tracklet") + << "Cleaning " << setw(10) << cleanTimer_.ntimes() << setw(20) << setprecision(3) + << cleanTimer_.avgtime() * 1000.0 << setw(20) << setprecision(3) << cleanTimer_.tottime(); + edm::LogVerbatim("Tracklet") + << "Add Stubs " << setw(10) << addStubTimer_.ntimes() << setw(20) << setprecision(3) + << addStubTimer_.avgtime() * 1000.0 << setw(20) << setprecision(3) << addStubTimer_.tottime(); + edm::LogVerbatim("Tracklet") + << "VMRouter " << setw(10) << VMRouterTimer_.ntimes() << setw(20) << setprecision(3) + << VMRouterTimer_.avgtime() * 1000.0 << setw(20) << setprecision(3) << VMRouterTimer_.tottime(); + if (settings_->combined()) { + edm::LogVerbatim("Tracklet") + << "TrackletProcessor " << setw(10) << TPTimer_.ntimes() << setw(20) << setprecision(3) + << TPTimer_.avgtime() * 1000.0 << setw(20) << setprecision(3) << TPTimer_.tottime(); + edm::LogVerbatim("Tracklet") + << "MatchProcessor " << setw(10) << MPTimer_.ntimes() << setw(20) << setprecision(3) + << MPTimer_.avgtime() * 1000.0 << setw(20) << setprecision(3) << MPTimer_.tottime(); + } else { + edm::LogVerbatim("Tracklet") << "TrackletEngine " << setw(10) << TETimer_.ntimes() << setw(20) << setprecision(3) - << TETimer_.avgtime() * 1000.0 << setw(20) << setprecision(3) << TETimer_.tottime() << "\n" + << TETimer_.avgtime() * 1000.0 << setw(20) << setprecision(3) << TETimer_.tottime(); + edm::LogVerbatim("Tracklet") << "TrackletEngineDisplaced" << setw(10) << TEDTimer_.ntimes() << setw(20) << setprecision(3) - << TEDTimer_.avgtime() * 1000.0 << setw(20) << setprecision(3) << TEDTimer_.tottime() << "\n" + << TEDTimer_.avgtime() * 1000.0 << setw(20) << setprecision(3) << TEDTimer_.tottime(); + edm::LogVerbatim("Tracklet") << "TripletEngine " << setw(10) << TRETimer_.ntimes() << setw(20) << setprecision(3) - << TRETimer_.avgtime() * 1000.0 << setw(20) << setprecision(3) << TRETimer_.tottime() << "\n" + << TRETimer_.avgtime() * 1000.0 << setw(20) << setprecision(3) << TRETimer_.tottime(); + edm::LogVerbatim("Tracklet") << "TrackletCalculator " << setw(10) << TCTimer_.ntimes() << setw(20) << setprecision(3) - << TCTimer_.avgtime() * 1000.0 << setw(20) << setprecision(3) << TCTimer_.tottime() << "\n" + << TCTimer_.avgtime() * 1000.0 << setw(20) << setprecision(3) << TCTimer_.tottime(); + edm::LogVerbatim("Tracklet") << "TrackletCalculatorDisplaced" << setw(10) << TCDTimer_.ntimes() << setw(20) << setprecision(3) - << TCDTimer_.avgtime() * 1000.0 << setw(20) << setprecision(3) << TCDTimer_.tottime() << "\n" + << TCDTimer_.avgtime() * 1000.0 << setw(20) << setprecision(3) << TCDTimer_.tottime(); + edm::LogVerbatim("Tracklet") << "ProjectionRouter " << setw(10) << PRTimer_.ntimes() << setw(20) << setprecision(3) - << PRTimer_.avgtime() * 1000.0 << setw(20) << setprecision(3) << PRTimer_.tottime() << "\n" + << PRTimer_.avgtime() * 1000.0 << setw(20) << setprecision(3) << PRTimer_.tottime(); + edm::LogVerbatim("Tracklet") << "MatchEngine " << setw(10) << METimer_.ntimes() << setw(20) << setprecision(3) - << METimer_.avgtime() * 1000.0 << setw(20) << setprecision(3) << METimer_.tottime() << "\n" + << METimer_.avgtime() * 1000.0 << setw(20) << setprecision(3) << METimer_.tottime(); + edm::LogVerbatim("Tracklet") << "MatchCalculator " << setw(10) << MCTimer_.ntimes() << setw(20) << setprecision(3) - << MCTimer_.avgtime() * 1000.0 << setw(20) << setprecision(3) << MCTimer_.tottime() << "\n" - << "MatchProcessor " << setw(10) << MPTimer_.ntimes() << setw(20) << setprecision(3) - << MPTimer_.avgtime() * 1000.0 << setw(20) << setprecision(3) << MPTimer_.tottime() << "\n" - << "FitTrack " << setw(10) << FTTimer_.ntimes() << setw(20) << setprecision(3) - << FTTimer_.avgtime() * 1000.0 << setw(20) << setprecision(3) << FTTimer_.tottime() << "\n" - << "PurgeDuplicate " << setw(10) << PDTimer_.ntimes() << setw(20) << setprecision(3) - << PDTimer_.avgtime() * 1000.0 << setw(20) << setprecision(3) << PDTimer_.tottime(); + << MCTimer_.avgtime() * 1000.0 << setw(20) << setprecision(3) << MCTimer_.tottime(); + } + edm::LogVerbatim("Tracklet") + << "FitTrack " << setw(10) << FTTimer_.ntimes() << setw(20) << setprecision(3) + << FTTimer_.avgtime() * 1000.0 << setw(20) << setprecision(3) << FTTimer_.tottime(); + edm::LogVerbatim("Tracklet") + << "PurgeDuplicate " << setw(10) << PDTimer_.ntimes() << setw(20) << setprecision(3) + << PDTimer_.avgtime() * 1000.0 << setw(20) << setprecision(3) << PDTimer_.tottime(); } diff --git a/L1Trigger/TrackFindingTracklet/src/TrackletProcessor.cc b/L1Trigger/TrackFindingTracklet/src/TrackletProcessor.cc index c883efef8b5d1..cd9ef75bf9190 100644 --- a/L1Trigger/TrackFindingTracklet/src/TrackletProcessor.cc +++ b/L1Trigger/TrackFindingTracklet/src/TrackletProcessor.cc @@ -1,6 +1,7 @@ #include "L1Trigger/TrackFindingTracklet/interface/TrackletProcessor.h" #include "L1Trigger/TrackFindingTracklet/interface/Settings.h" #include "L1Trigger/TrackFindingTracklet/interface/Globals.h" +#include "L1Trigger/TrackFindingTracklet/interface/AllStubsMemory.h" #include "L1Trigger/TrackFindingTracklet/interface/Util.h" #include "L1Trigger/TrackFindingTracklet/interface/IMATH_TrackletCalculator.h" @@ -8,22 +9,18 @@ #include "FWCore/Utilities/interface/Exception.h" #include "DataFormats/Math/interface/deltaPhi.h" +#include +#include + using namespace std; using namespace trklet; + + TrackletProcessor::TrackletProcessor(string name, Settings const& settings, Globals* globals, unsigned int iSector) - : TrackletCalculatorBase(name, settings, globals, iSector) { - double dphi = 2 * M_PI / N_SECTOR; - double dphiHG = 0.5 * settings_.dphisectorHG() - M_PI / N_SECTOR; - phimin_ = iSector_ * dphi - dphiHG; - phimax_ = phimin_ + dphi + 2 * dphiHG; - phimin_ -= M_PI / N_SECTOR; - phimax_ -= M_PI / N_SECTOR; - phimin_ = reco::reduceRange(phimin_); - phimax_ = reco::reduceRange(phimax_); - if (phimin_ > phimax_) - phimin_ -= 2 * M_PI; - phioffset_ = phimin_; + : TrackletCalculatorBase(name, settings, globals, iSector), vmrtable_(settings) { + + iAllStub_=-1; for (unsigned int ilayer = 0; ilayer < N_LAYER; ilayer++) { vector tmp(settings_.nallstubs(ilayer), nullptr); @@ -35,91 +32,30 @@ TrackletProcessor::TrackletProcessor(string name, Settings const& settings, Glob trackletprojdisks_.push_back(tmp); } + outervmstubs_=nullptr; + initLayerDisksandISeed(layerdisk1_, layerdisk2_, iSeed_); - layer_ = 0; - disk_ = 0; - - if (name_[3] == 'L') { - layer_ = name_[4] - '0'; - if (name_[5] == 'D') - disk_ = name_[6] - '0'; - } - if (name_[3] == 'D') - disk_ = name_[4] - '0'; + nbitszfinebintable_ = settings_.vmrlutzbits(layerdisk1_); + nbitsrfinebintable_ = settings_.vmrlutrbits(layerdisk1_); - extra_ = (layer_ == 2 && disk_ == 0); + vmrtable_.init(layerdisk1_); + nbitsrzbin_ = 3; + if (iSeed_ == 4 || iSeed_ == 5) + nbitsrzbin_ = 2; + + + innerphibits_ = settings_.nfinephi(0, iSeed_); + outerphibits_ = settings_.nfinephi(1, iSeed_); + // set TC index - if (name_[7] == 'A') - iTC_ = 0; - else if (name_[7] == 'B') - iTC_ = 1; - else if (name_[7] == 'C') - iTC_ = 2; - else if (name_[7] == 'D') - iTC_ = 3; - else if (name_[7] == 'E') - iTC_ = 4; - else if (name_[7] == 'F') - iTC_ = 5; - else if (name_[7] == 'G') - iTC_ = 6; - else if (name_[7] == 'H') - iTC_ = 7; - else if (name_[7] == 'I') - iTC_ = 8; - else if (name_[7] == 'J') - iTC_ = 9; - else if (name_[7] == 'K') - iTC_ = 10; - else if (name_[7] == 'L') - iTC_ = 11; - else if (name_[7] == 'M') - iTC_ = 12; - else if (name_[7] == 'N') - iTC_ = 13; - else if (name_[7] == 'O') - iTC_ = 14; - - assert(iTC_ != -1); - - iSeed_ = 99; - if (name_.substr(3, 4) == "L1L2") - iSeed_ = 0; - else if (name_.substr(3, 4) == "L3L4") - iSeed_ = 2; - else if (name_.substr(3, 4) == "L5L6") - iSeed_ = 3; - else if (name_.substr(3, 4) == "D1D2") - iSeed_ = 4; - else if (name_.substr(3, 4) == "D3D4") - iSeed_ = 5; - else if (name_.substr(3, 4) == "D1L1") - iSeed_ = 6; - else if (name_.substr(3, 4) == "D1L2") - iSeed_ = 7; - else if (name_.substr(3, 4) == "L1D1") - iSeed_ = 6; - else if (name_.substr(3, 4) == "L2D1") - iSeed_ = 7; - else if (name_.substr(3, 4) == "L2L3") - iSeed_ = 1; - - assert(iSeed_ != 99); + iTC_=name_[7] -'A'; + assert(iTC_ >=0 && iTC_<14); TCIndex_ = (iSeed_ << 4) + iTC_; assert(TCIndex_ >= 0 && TCIndex_ <= (int)settings_.ntrackletmax()); - assert((layer_ != 0) || (disk_ != 0)); - - if (settings_.usephicritapprox()) { - double phicritFactor = - 0.5 * settings_.rcrit() * globals_->ITC_L1L2()->rinv_final.K() / globals_->ITC_L1L2()->phi0_final.K(); - if (std::abs(phicritFactor - 2.) > 0.25) - edm::LogPrint("Tracklet") - << "TrackletProcessor::TrackletProcessor phicrit approximation may be invalid! Please check."; - } } void TrackletProcessor::addOutputProjection(TrackletProjectionsMemory*& outputProj, MemoryBase* memory) { @@ -175,24 +111,47 @@ void TrackletProcessor::addInput(MemoryBase* memory, string input) { << input; } - if (input == "innervmstubin") { - auto* tmp = dynamic_cast(memory); - assert(tmp != nullptr); - innervmstubs_.push_back(tmp); - setVMPhiBin(); - return; - } if (input == "outervmstubin") { auto* tmp = dynamic_cast(memory); assert(tmp != nullptr); - outervmstubs_.push_back(tmp); - setVMPhiBin(); + outervmstubs_=tmp; + iAllStub_=tmp->getName()[11]-'A'; + if (iSeed_==1) iAllStub_=tmp->getName()[11]-'I'; + if (iSeed_==6||iSeed_==7){ + if (tmp->getName()[11]=='X') + iAllStub_=0; + if (tmp->getName()[11]=='Y') + iAllStub_=1; + if (tmp->getName()[11]=='Z') + iAllStub_=2; + if (tmp->getName()[11]=='W') + iAllStub_=3; + } + buildLUT(); //need iAllStub_ set before building the table //FIXME should be in initiall + + TrackletEngineUnit teunit(settings_,nbitsfinephi_,layerdisk2_,iSeed_,nbitsfinephidiff_,iAllStub_,pttableinnernew_,pttableouternew_,outervmstubs_); + teunits_.resize(6,teunit); + return; } + if (input == "innerallstubin") { auto* tmp = dynamic_cast(memory); assert(tmp != nullptr); - innerallstubs_.push_back(tmp); + if (innerallstubs_.size()==2) { //FIXME this should be done with better logic with reading the input stubs + innerallstubs_.insert(innerallstubs_.begin(),tmp); + } else { + innerallstubs_.push_back(tmp); + } + + //FIXEM should be done once after all inputs are added + tedatabuffers_.clear(); + CircularBuffer tedatabuffertmp(5); + tedatabuffertmp.reset(); + + tedatabuffers_.emplace_back(tuple, unsigned int , unsigned int, unsigned int, unsigned int>(tedatabuffertmp,0,0,0,(innerallstubs_.size()+1)/2)); + tedatabuffers_.emplace_back(tuple, unsigned int , unsigned int, unsigned int, unsigned int>(tedatabuffertmp,0,(innerallstubs_.size()+1)/2,(innerallstubs_.size()+1)/2,innerallstubs_.size())); + return; } if (input == "outerallstubin") { @@ -201,511 +160,250 @@ void TrackletProcessor::addInput(MemoryBase* memory, string input) { outerallstubs_.push_back(tmp); return; } - throw cms::Exception("BadConfig") << __FILE__ << " " << __LINE__ << " Could not find input : " << input; + throw cms::Exception("BadConfig") << __FILE__ << " " << __LINE__ + << " Could not find input : " << input; } void TrackletProcessor::execute() { - unsigned int countall = 0; - unsigned int countsel = 0; - unsigned int countteall = 0; - unsigned int counttepass = 0; + if (!settings_.useSeed(iSeed_)) + return; - StubPairsMemory stubpairs("tmp", settings_, iSector_); //dummy arguments for now + //Consistency checks + assert(iAllStub_>=0); + assert(iAllStub_<(int)settings_.nallstubs(layerdisk2_)); + assert(outervmstubs_!=nullptr); - bool print = false; + //used to collect performance data + unsigned int countall = 0; + unsigned int countsel = 0; - assert(innervmstubs_.size() == outervmstubs_.size()); + unsigned int countteall = 0; + unsigned int stubpairs = 0; - if (!settings_.useSeed(iSeed_)) - return; + unsigned int ntedata = 0; + + unsigned int ninnerstubs=0; - for (unsigned int ivmmem = 0; ivmmem < innervmstubs_.size(); ivmmem++) { - unsigned int innerphibin = innervmstubs_[ivmmem]->phibin(); - unsigned int outerphibin = outervmstubs_[ivmmem]->phibin(); + //Actual implemenation statrs here + + //Reset the tebuffers + for(auto& tebuffer:tedatabuffers_) { + std::get<0>(tebuffer).reset(); + std::get<1>(tebuffer)=0; + std::get<2>(tebuffer)=std::get<3>(tebuffer); + } + + //Reset the teunits + for(auto& teunit:teunits_) { + teunit.reset(); + } - unsigned phiindex = 32 * innerphibin + outerphibin; + + for(unsigned int istep=0;istepnVMStubs(); i++) { - const VMStubTE& innervmstub = innervmstubs_[ivmmem]->getVMStubTE(i); + CircularBuffer& tedatabuffer=std::get<0>(tebuffer); + unsigned int& istub=std::get<1>(tebuffer); + unsigned int& imem=std::get<2>(tebuffer); + unsigned int imemend=std::get<4>(tebuffer); + + if ((!tedatabuffer.full()) && imem < imemend && istub < innerallstubs_[imem]->nStubs()) { - FPGAWord lookupbits = innervmstub.vmbits(); + ninnerstubs++; + + const Stub* stub = innerallstubs_[imem]->getStub(istub); + + bool negdisk = (stub->disk().value() < 0); //FIXME stub needs to contain bit for +/- z disk + + FPGAWord phicorr=stub->phicorr(); + int innerfinephi=phicorr.bits(phicorr.nbits()-nbitsfinephi_,nbitsfinephi_); + FPGAWord innerbend = stub->bend(); + - unsigned int nbits = 7; - if (iSeed_ == 4 || iSeed_ == 5) - nbits = 6; - int rzdiffmax = lookupbits.bits(nbits, lookupbits.nbits() - nbits); - int rzbinfirst = lookupbits.bits(0, 3); - int start = lookupbits.bits(4, nbits - 4); - int next = lookupbits.bits(3, 1); - - if ((iSeed_ == 4 || iSeed_ == 5) && innervmstub.stub()->disk().value() < 0) { //TODO - need to store negative disk - start += 4; + //Take the top nbitszfinebintable_ bits of the z coordinate + int indexz = (((1 << (stub->z().nbits() - 1)) + stub->z().value()) >> (stub->z().nbits() - nbitszfinebintable_)); + int indexr = -1; + if (layerdisk1_ > (N_LAYER - 1)) { + if (negdisk) { + indexz = (1 << nbitszfinebintable_) - indexz; + } + indexr = stub->r().value(); + if (stub->isPSmodule()) { + indexr = stub->r().value() >> (stub->r().nbits() - nbitsrfinebintable_); + } + } else { + //Take the top nbitsfinebintable_ bits of the z coordinate + indexr = (((1 << (stub->r().nbits() - 1)) + stub->r().value()) >> (stub->r().nbits() - nbitsrfinebintable_)); } - int last = start + next; - for (int ibin = start; ibin <= last; ibin++) { - if (settings_.debugTracklet()) { - edm::LogVerbatim("Tracklet") << getName() << " looking for matching stub in bin " << ibin << " with " - << outervmstubs_[ivmmem]->nVMStubsBinned(ibin) << " stubs"; - } - for (unsigned int j = 0; j < outervmstubs_[ivmmem]->nVMStubsBinned(ibin); j++) { - countteall++; - - const VMStubTE& outervmstub = outervmstubs_[ivmmem]->getVMStubTEBinned(ibin, j); - int rzbin = (outervmstub.vmbits().value() & 7); - - assert(innerphibits_ != -1); - assert(outerphibits_ != -1); - - FPGAWord iphiinnerbin = innervmstub.finephi(); - FPGAWord iphiouterbin = outervmstub.finephi(); - - assert(iphiouterbin == outervmstub.finephi()); - - unsigned int index = (iphiinnerbin.value() << outerphibits_) + iphiouterbin.value(); - - - if (iSeed_ >= 4) { //Also use r-position - int ir = ((ibin & 3) << 1) + (rzbin >> 2); - index = (index << 3) + ir; - } - - if (start != ibin) - rzbin += 8; - if ((rzbin < rzbinfirst) || (rzbin - rzbinfirst > rzdiffmax)) { - if (settings_.debugTracklet()) { - edm::LogVerbatim("Tracklet") - << getName() << " layer-disk stub pair rejected because rbin cut : " << rzbin << " " << rzbinfirst - << " " << rzdiffmax; - } - continue; - } - - - FPGAWord innerbend = innervmstub.bend(); - FPGAWord outerbend = outervmstub.bend(); - - int ptinnerindex = (index << innerbend.nbits()) + innerbend.value(); - int ptouterindex = (index << outerbend.nbits()) + outerbend.value(); - - if (!(pttableinner_[phiindex][ptinnerindex] && pttableouter_[phiindex][ptouterindex])) { - if (settings_.debugTracklet()) { - edm::LogVerbatim("Tracklet") << "Stub pair rejected because of stub pt cut bends : " - << benddecode(innervmstub.bend().value(), innervmstub.isPSmodule()) << " " - << benddecode(outervmstub.bend().value(), outervmstub.isPSmodule()); - } - continue; - } - - if (settings_.debugTracklet()) - edm::LogVerbatim("Tracklet") << "Adding layer-disk pair in " << getName(); - if (settings_.writeMonitorData("Seeds")) { - ofstream fout("seeds.txt", ofstream::app); - fout << __FILE__ << ":" << __LINE__ << " " << name_ << "_" << iSector_ << " " << iSeed_ << endl; - fout.close(); - } - stubpairs.addStubPair( - innervmstub, outervmstub, 0, innervmstubs_[ivmmem]->getName() + " " + outervmstubs_[ivmmem]->getName()); - counttepass++; - } - } - } - - } else { - for (unsigned int i = 0; i < innervmstubs_[ivmmem]->nVMStubs(); i++) { - if (settings_.debugTracklet()) { - edm::LogVerbatim("Tracklet") << "In " << getName() << " have inner stub"; - } - - if ((layer_ == 1 && disk_ == 0) || (layer_ == 2 && disk_ == 0) || (layer_ == 3 && disk_ == 0) || - (layer_ == 5 && disk_ == 0)) { - const VMStubTE& innervmstub = innervmstubs_[ivmmem]->getVMStubTE(i); - - int lookupbits = (int)innervmstub.vmbits().value(); - int zdiffmax = (lookupbits >> 7); - int newbin = (lookupbits & 127); - int bin = newbin / 8; - - int zbinfirst = newbin & 7; - - int start = (bin >> 1); - int last = start + (bin & 1); - - if (print) { - edm::LogVerbatim("Tracklet") << "start last : " << start << " " << last; - } - - if (settings_.debugTracklet()) { - edm::LogVerbatim("Tracklet") << "Will look in zbins " << start << " to " << last; - } - for (int ibin = start; ibin <= last; ibin++) { - for (unsigned int j = 0; j < outervmstubs_[ivmmem]->nVMStubsBinned(ibin); j++) { - if (settings_.debugTracklet()) { - edm::LogVerbatim("Tracklet") << "In " << getName() << " have outer stub"; - } - - countteall++; - - const VMStubTE& outervmstub = outervmstubs_[ivmmem]->getVMStubTEBinned(ibin, j); - - int zbin = (outervmstub.vmbits().value() & 7); - - if (start != ibin) - zbin += 8; - - if (zbin < zbinfirst || zbin - zbinfirst > zdiffmax) { - if (settings_.debugTracklet()) { - edm::LogVerbatim("Tracklet") << "Stubpair rejected because of wrong fine z"; - } - continue; - } - - if (print) { - edm::LogVerbatim("Tracklet") << "ibin j " << ibin << " " << j; - } - - assert(innerphibits_ != -1); - assert(outerphibits_ != -1); - - FPGAWord iphiinnerbin = innervmstub.finephi(); - FPGAWord iphiouterbin = outervmstub.finephi(); - - int index = (iphiinnerbin.value() << outerphibits_) + iphiouterbin.value(); - - FPGAWord innerbend = innervmstub.bend(); - FPGAWord outerbend = outervmstub.bend(); - - int ptinnerindex = (index << innerbend.nbits()) + innerbend.value(); - int ptouterindex = (index << outerbend.nbits()) + outerbend.value(); - - if (!(pttableinner_[phiindex][ptinnerindex] && pttableouter_[phiindex][ptouterindex])) { - if (settings_.debugTracklet()) { - edm::LogVerbatim("Tracklet") - << "Stub pair rejected because of stub pt cut bends : " - << benddecode(innervmstub.bend().value(), innervmstub.isPSmodule()) << " " - << benddecode(outervmstub.bend().value(), outervmstub.isPSmodule()); - } - continue; - } - - if (settings_.debugTracklet()) - edm::LogVerbatim("Tracklet") << "Adding layer-layer pair in " << getName(); - if (settings_.writeMonitorData("Seeds")) { - ofstream fout("seeds.txt", ofstream::app); - fout << __FILE__ << ":" << __LINE__ << " " << name_ << "_" << iSector_ << " " << iSeed_ << endl; - fout.close(); - } - stubpairs.addStubPair(innervmstub, - outervmstub, - 0, - innervmstubs_[ivmmem]->getName() + " " + outervmstubs_[ivmmem]->getName()); - counttepass++; - } - } - - } else if ((disk_ == 1 && layer_ == 0) || (disk_ == 3 && layer_ == 0)) { - if (settings_.debugTracklet()) - edm::LogVerbatim("Tracklet") << getName() << "[" << iSector_ << "] Disk-disk pair"; - - const VMStubTE& innervmstub = innervmstubs_[ivmmem]->getVMStubTE(i); - - FPGAWord lookupbits = innervmstub.vmbits(); - - unsigned int nbits = 6; - int rzdiffmax = lookupbits.bits(nbits, lookupbits.nbits() - nbits); - int rzbinfirst = lookupbits.bits(0, 3); - int start = lookupbits.bits(4, nbits - 4); - int next = lookupbits.bits(3, 1); - - if (innervmstub.stub()->disk().value() < 0) { //TODO - need to store negative disk + int lutval=-1; + if (iSeed_ < 6 ) { //FIXME should only be one table... + lutval = vmrtable_.lookupinner(indexz, indexr); + } else { + lutval = vmrtable_.lookupinneroverlap(indexz, indexr); + } + + if (lutval != -1) { + + unsigned int lutwidth = settings_.lutwidthtab(0, iSeed_); + FPGAWord lookupbits(lutval, lutwidth, true, __LINE__, __FILE__); + + int rzfinebinfirst = lookupbits.bits(0, 3); //finephi + int next = lookupbits.bits(3, 1); //next r/z bin + int start = lookupbits.bits(4, nbitsrzbin_); + int rzdiffmax = lookupbits.bits(lookupbits.nbits() - 3, 3); + + if ((iSeed_ == 4 || iSeed_ == 5) && negdisk) { //TODO - need to store negative disk start += 4; } + int last = start + next; + + int nbins=8; + + unsigned int useregindex=(innerfinephi << innerbend.nbits()) + innerbend.value(); + if (iSeed_>=4) { + //FIXME If the lookupbits were rationally organized this would be much simpler + int ir = ((start & 3) << 1) + (rzfinebinfirst >> 2); + useregindex=(useregindex<<3)+ir; + } + + assert(useregindex usereg=useregion_[useregindex]; + + TEData tedata; + tedata.stub_=stub; + tedata.rzbinfirst_=rzfinebinfirst; + tedata.start_=start; + tedata.innerfinephi_=innerfinephi; + tedata.rzdiffmax_=rzdiffmax; + tedata.innerbend_=innerbend; - int last = start + next; - for (int ibin = start; ibin <= last; ibin++) { - if (settings_.debugTracklet()) - edm::LogVerbatim("Tracklet") << getName() << " looking for matching stub in bin " << ibin << " with " - << outervmstubs_[ivmmem]->nVMStubsBinned(ibin) << " stubs"; - for (unsigned int j = 0; j < outervmstubs_[ivmmem]->nVMStubsBinned(ibin); j++) { - countteall++; - - const VMStubTE& outervmstub = outervmstubs_[ivmmem]->getVMStubTEBinned(ibin, j); - - int rzbin = outervmstub.vmbits().bits(0, 3); - - FPGAWord iphiinnerbin = innervmstub.finephi(); - FPGAWord iphiouterbin = outervmstub.finephi(); - - unsigned int index = (iphiinnerbin.value() << outervmstub.finephi().nbits()) + iphiouterbin.value(); - - constexpr unsigned int n_barrelseed = 3; - if (iSeed_ > n_barrelseed) { //Also use r-position for disk/overlap seeds - int ir = ((ibin & 3) << 1) + (rzbin >> 2); - index = (index << 3) + ir; - } - - if (start != ibin) - rzbin += 8; - if (rzbin < rzbinfirst) - continue; - if (rzbin - rzbinfirst > rzdiffmax) - continue; + for (unsigned int ireg = 0 ; ireg < settings_.nvmte(1,iSeed_) ; ireg++ ) { + + assert(iregnVMStubsBinned(ireg*nbins+ibin) << " stubs"; + } + assert(ireg*nbins+ibinnBin()); + int nstubs=outervmstubs_->nVMStubsBinned(ireg*nbins+ibin); + if (nstubs>0) { + tedata.regions_.emplace_back(tuple(ibin-start,ireg,nstubs)); + countteall+=nstubs; + } - FPGAWord innerbend = innervmstub.bend(); - FPGAWord outerbend = outervmstub.bend(); - - unsigned int ptinnerindex = (index << innerbend.nbits()) + innerbend.value(); - unsigned int ptouterindex = (index << outerbend.nbits()) + outerbend.value(); - - assert(ptinnerindex < pttableinner_[phiindex].size()); - assert(ptouterindex < pttableouter_[phiindex].size()); - - if (!(pttableinner_[phiindex][ptinnerindex] && pttableouter_[phiindex][ptouterindex])) { - if (settings_.debugTracklet()) { - edm::LogVerbatim("Tracklet") - << "Stub pair rejected because of stub pt cut bends : " - << benddecode(innervmstub.bend().value(), innervmstub.isPSmodule()) << " " - << benddecode(outervmstub.bend().value(), outervmstub.isPSmodule()) - << " pass : " << pttableinner_[phiindex][ptinnerindex] << " " - << pttableouter_[phiindex][ptouterindex]; - } - continue; - } - - if (settings_.debugTracklet()) - edm::LogVerbatim("Tracklet") << "Adding disk-disk pair in " << getName(); - - if (settings_.writeMonitorData("Seeds")) { - ofstream fout("seeds.txt", ofstream::app); - fout << __FILE__ << ":" << __LINE__ << " " << name_ << "_" << iSector_ << " " << iSeed_ << endl; - fout.close(); - } - stubpairs.addStubPair(innervmstub, - outervmstub, - 0, - innervmstubs_[ivmmem]->getName() + " " + outervmstubs_[ivmmem]->getName()); - counttepass++; - } - } - } + } + } + + if (tedata.regions_.size()>0) { + ntedata++; + //cout << getName() << " adding TE data" << endl; + tedatabuffer.store(tedata); + } + } + istub++; + if (istub >= innerallstubs_[imem]->nStubs()) { + istub=0; + imem++; + } } } - } - - if (settings_.writeMonitorData("TE")) { - globals_->ofstream("trackletprocessor.txt") << getName() << " " << countteall << " " << counttepass <nTracklets() >= settings_.ntrackletmax()) { - edm::LogVerbatim("Tracklet") << "Will break on too many tracklets in " << getName(); - break; + bool tedatabuffersdone=true; + for(auto& tebuffer:tedatabuffers_) { + CircularBuffer& tedatabuffer=std::get<0>(tebuffer); + tedatabuffersdone&=tedatabuffer.empty(); //buffer empty + tedatabuffersdone&=(std::get<2>(tebuffer)==std::get<4>(tebuffer)); //buffer processed all stubs + if (!tedatabuffer.empty()) { + for (auto& teunit:teunits_) { + if (teunit.empty()&&teunit.idle()) { + teunit.init(tedatabuffer.read()); + break; + } + } + } } - countall++; - const Stub* innerFPGAStub = stubpairs.getVMStub1(i).stub(); - const L1TStub* innerStub = innerFPGAStub->l1tstub(); - - const Stub* outerFPGAStub = stubpairs.getVMStub2(i).stub(); - const L1TStub* outerStub = outerFPGAStub->l1tstub(); - if (settings_.debugTracklet()) { - edm::LogVerbatim("Tracklet") << "TrackletProcessor execute " << getName() << "[" << iSector_ << "]"; + bool teunitsdone=true; + TrackletEngineUnit* teunitptr=nullptr; + for (auto& teunit:teunits_) { + if (!teunit.idle()){ + teunit.step(); + teunitsdone=false; + } + if (!teunit.empty()){ + teunitptr=&teunit; + teunitsdone=false; + } } - - bool accept = false; - - if (innerFPGAStub->isBarrel() && (getName() != "TC_D1L2A" && getName() != "TC_D1L2B")) { - if (outerFPGAStub->isDisk()) { - //overlap seeding - accept = overlapSeeding(outerFPGAStub, outerStub, innerFPGAStub, innerStub); - } else { - //barrel+barrel seeding - accept = barrelSeeding(innerFPGAStub, innerStub, outerFPGAStub, outerStub); + + if (teunitptr!=nullptr) { + auto stubpair=teunitptr->read(); + stubpairs++; + + if (trackletpars_->nTracklets() >= settings_.ntrackletmax()) { + edm::LogVerbatim("Tracklet") << "Will break on too many tracklets in " << getName(); + break; } - } else { - if (outerFPGAStub->isDisk()) { - //disk+disk seeding + countall++; + const Stub* innerFPGAStub = stubpair.first; + const L1TStub* innerStub = innerFPGAStub->l1tstub(); + + const Stub* outerFPGAStub = stubpair.second; + const L1TStub* outerStub = outerFPGAStub->l1tstub(); + + if (settings_.debugTracklet()) { + edm::LogVerbatim("Tracklet") << "TrackletProcessor execute " << getName() << "[" << iSector_ << "]"; + } + + bool accept = false; + + if (iSeed_<4) { + accept = barrelSeeding(innerFPGAStub, innerStub, outerFPGAStub, outerStub); + } else if (iSeed_<6) { accept = diskSeeding(innerFPGAStub, innerStub, outerFPGAStub, outerStub); - } else if (innerFPGAStub->isDisk()) { - //layer+disk seeding - accept = overlapSeeding(innerFPGAStub, innerStub, outerFPGAStub, outerStub); } else { - throw cms::Exception("LogicError") << __FILE__ << " " << __LINE__ << " Invalid seeding!"; + accept = overlapSeeding(outerFPGAStub, outerStub, innerFPGAStub, innerStub); } - } - if (accept) - countsel++; + if (accept) + countsel++; + + if (trackletpars_->nTracklets() >= settings_.ntrackletmax()) { + edm::LogVerbatim("Tracklet") << "Will break on number of tracklets in " << getName(); + break; + } + + if (settings_.debugTracklet()) { + edm::LogVerbatim("Tracklet") << "TrackletProcessor execute done"; + } + } if (settings_.writeMonitorData("TP")) { - globals_->ofstream("tc_seedpairs.txt") << stubpairs.getTEDName(i) << " " << accept << endl; + globals_->ofstream("trackletprocessor.txt") << getName() + << " " << ninnerstubs //# inner stubs + << " " << outervmstubs_->nVMStubs() //# outer stubs + << " " << countteall //# pairs tried in TE + << " " << stubpairs //# stubs pairs + << " " << countsel //# tracklets found + << endl; } - if (trackletpars_->nTracklets() >= settings_.ntrackletmax()) { - edm::LogVerbatim("Tracklet") << "Will break on number of tracklets in " << getName(); + if (teunitsdone&&tedatabuffersdone) { break; } - if (countall >= settings_.maxStep("TP")) { - if (settings_.debugTracklet()) - edm::LogVerbatim("Tracklet") << "Will break on MAXTC 1"; - break; - } - - if (settings_.debugTracklet()) { - edm::LogVerbatim("Tracklet") << "TrackletProcessor execute done"; - } - } - if (countall >= settings_.maxStep("TP")) { - if (settings_.debugTracklet()) - edm::LogVerbatim("Tracklet") << "Will break on MAXTC 2"; - //break; } - if (settings_.writeMonitorData("TP")) { - globals_->ofstream("trackletcalculator.txt") << getName() << " " << countall << " " << countsel << endl; - } + } -void TrackletProcessor::setVMPhiBin() { - if (innervmstubs_.size() != outervmstubs_.size()) - return; - - innerphibits_ = settings_.nfinephi(0, iSeed_); - outerphibits_ = settings_.nfinephi(1, iSeed_); - - for (unsigned int ivmmem = 0; ivmmem < innervmstubs_.size(); ivmmem++) { - unsigned int innerphibin = innervmstubs_[ivmmem]->phibin(); - unsigned int outerphibin = outervmstubs_[ivmmem]->phibin(); - - unsigned phiindex = 32 * innerphibin + outerphibin; - - if (pttableinner_.find(phiindex) != pttableinner_.end()) - continue; - - innervmstubs_[ivmmem]->setother(outervmstubs_[ivmmem]); - outervmstubs_[ivmmem]->setother(innervmstubs_[ivmmem]); - - int outerrbits = 3; - if (iSeed_ < 4) { - outerrbits = 0; - } - - int outerrbins = (1 << outerrbits); - int innerphibins = (1 << innerphibits_); - int outerphibins = (1 << outerphibits_); - - double innerphimin, innerphimax; - innervmstubs_[ivmmem]->getPhiRange(innerphimin, innerphimax, iSeed_, 0); - - double outerphimin, outerphimax; - outervmstubs_[ivmmem]->getPhiRange(outerphimin, outerphimax, iSeed_, 1); - - double phiinner[2]; - double phiouter[2]; - double router[2]; - - unsigned int nbendbitsinner = 3; - unsigned int nbendbitsouter = 3; - if (iSeed_ == 2) { - nbendbitsouter = 4; - } - if (iSeed_ == 3) { - nbendbitsinner = 4; - nbendbitsouter = 4; - } - - std::vector vmbendinner((1 << nbendbitsinner), false); - std::vector vmbendouter((1 << nbendbitsouter), false); - - for (int iphiinnerbin = 0; iphiinnerbin < innerphibins; iphiinnerbin++) { - phiinner[0] = innerphimin + iphiinnerbin * (innerphimax - innerphimin) / innerphibins; - phiinner[1] = innerphimin + (iphiinnerbin + 1) * (innerphimax - innerphimin) / innerphibins; - for (int iphiouterbin = 0; iphiouterbin < outerphibins; iphiouterbin++) { - phiouter[0] = outerphimin + iphiouterbin * (outerphimax - outerphimin) / outerphibins; - phiouter[1] = outerphimin + (iphiouterbin + 1) * (outerphimax - outerphimin) / outerphibins; - for (int irouterbin = 0; irouterbin < outerrbins; irouterbin++) { - if (iSeed_ >= 4) { - router[0] = - settings_.rmindiskvm() + irouterbin * (settings_.rmaxdiskvm() - settings_.rmindiskvm()) / outerrbins; - router[1] = settings_.rmindiskvm() + - (irouterbin + 1) * (settings_.rmaxdiskvm() - settings_.rmindiskvm()) / outerrbins; - } else { - router[0] = settings_.rmean(layerdisk2_); - router[1] = settings_.rmean(layerdisk2_); - } - - double bendinnermin = 20.0; - double bendinnermax = -20.0; - double bendoutermin = 20.0; - double bendoutermax = -20.0; - double rinvmin = 1.0; - for (int i1 = 0; i1 < 2; i1++) { - for (int i2 = 0; i2 < 2; i2++) { - for (int i3 = 0; i3 < 2; i3++) { - double rinner = 0.0; - if (iSeed_ == 4 || iSeed_ == 5) { - rinner = router[i3] * settings_.zmean(layerdisk1_ - N_LAYER) / settings_.zmean(layerdisk2_ - N_LAYER); - } else { - rinner = settings_.rmean(layerdisk1_); - } - double rinv1 = rinv(phiinner[i1], phiouter[i2], rinner, router[i3]); - double pitchinner = - (rinner < settings_.rcrit()) ? settings_.stripPitch(true) : settings_.stripPitch(false); - double pitchouter = - (router[i3] < settings_.rcrit()) ? settings_.stripPitch(true) : settings_.stripPitch(false); - double abendinner = -bend(rinner, rinv1, pitchinner); - double abendouter = -bend(router[i3], rinv1, pitchouter); - if (abendinner < bendinnermin) - bendinnermin = abendinner; - if (abendinner > bendinnermax) - bendinnermax = abendinner; - if (abendouter < bendoutermin) - bendoutermin = abendouter; - if (abendouter > bendoutermax) - bendoutermax = abendouter; - if (std::abs(rinv1) < rinvmin) { - rinvmin = std::abs(rinv1); - } - } - } - } - - bool passptcut = rinvmin < settings_.rinvcutte(); - - for (int ibend = 0; ibend < (1 << nbendbitsinner); ibend++) { - double bend = benddecode(ibend, nbendbitsinner == 3); - - bool passinner = bend - bendinnermin > -settings_.bendcutte(0, iSeed_) && - bend - bendinnermax < settings_.bendcutte(0, iSeed_); - if (passinner) - vmbendinner[ibend] = true; - pttableinner_[phiindex].push_back(passinner && passptcut); - } - - for (int ibend = 0; ibend < (1 << nbendbitsouter); ibend++) { - double bend = benddecode(ibend, nbendbitsouter == 3); - - bool passouter = bend - bendoutermin > -settings_.bendcutte(1, iSeed_) && - bend - bendoutermax < settings_.bendcutte(1, iSeed_); - if (passouter) - vmbendouter[ibend] = true; - pttableouter_[phiindex].push_back(passouter && passptcut); - } - } - } - } - - innervmstubs_[ivmmem]->setbendtable(vmbendinner); - outervmstubs_[ivmmem]->setbendtable(vmbendouter); - - if (iSector_ == 0 && settings_.writeTable()) - writeTETable(); - } -} void TrackletProcessor::writeTETable() { ofstream outstubptinnercut; @@ -728,3 +426,172 @@ void TrackletProcessor::writeTETable() { outstubptoutercut << endl << "};" << endl; outstubptoutercut.close(); } + +void TrackletProcessor::buildLUT() { + + //number of fine phi bins in sector + int nfinephibins=settings_.nallstubs(layerdisk2_)*settings_.nvmte(1,iSeed_)*(1<5) { + if (iSeed_==6) { + rmax=settings_.rmaxdiskl1overlapvm(); + } + if (iSeed_==7) { + rmax=settings_.rmaxdiskvm(); + } + rmin=settings_.rmean(layerdisk1_); + } else { + rmax=settings_.rmaxdiskvm(); + rmin=rmax*settings_.zmean(layerdisk2_-6-1)/settings_.zmean(layerdisk2_-6); + } + } + + double dphimax=asin(0.5*settings_.maxrinv()*rmax)-asin(0.5*settings_.maxrinv()*rmin); + + int nbins=2.0*(dphimax/dfinephi+1.0); + + nbitsfinephidiff_=log(nbins)/log(2.0)+1; + + nbitsfinephi_=settings_.nbitsallstubs(layerdisk2_)+settings_.nbitsvmte(1,iSeed_)+settings_.nfinephi(1,iSeed_); + + int outerrbits = 3; + if (iSeed_ < 4) { + outerrbits = 0; + } + + int outerrbins = (1 << outerrbits); + + double dphi[2]; + double router[2]; + + unsigned int nbendbitsinner = 3; + unsigned int nbendbitsouter = 3; + if (iSeed_ == 2) { + nbendbitsouter = 4; + } + if (iSeed_ == 3) { + nbendbitsinner = 4; + nbendbitsouter = 4; + } + + int nbinsfinephidiff = (1<=nbinsfinephidiff/2) { + iphidiff=iphibin-nbinsfinephidiff; + } + //min and max dphi + dphi[0] = (iphidiff-1.5)*dfinephi; + dphi[1] = (iphidiff+1.5)*dfinephi; + for (int irouterbin = 0; irouterbin < outerrbins; irouterbin++) { + if (iSeed_ >= 4) { + router[0] = settings_.rmindiskvm() + + irouterbin * (settings_.rmaxdiskvm() - settings_.rmindiskvm()) / outerrbins; + router[1] = settings_.rmindiskvm() + + (irouterbin + 1) * (settings_.rmaxdiskvm() - settings_.rmindiskvm()) / outerrbins; + } else { + router[0] = settings_.rmean(layerdisk2_); + router[1] = settings_.rmean(layerdisk2_); + } + + double bendinnermin = 20.0; + double bendinnermax = -20.0; + double bendoutermin = 20.0; + double bendoutermax = -20.0; + double rinvmin = 1.0; + for (int i2 = 0; i2 < 2; i2++) { + for (int i3 = 0; i3 < 2; i3++) { + double rinner = 0.0; + if (iSeed_ == 4 || iSeed_ == 5) { + rinner = router[i3] * settings_.zmean(layerdisk1_ - N_LAYER) / settings_.zmean(layerdisk2_ - N_LAYER); + } else { + rinner = settings_.rmean(layerdisk1_); + } + double rinv1 = rinv(0.0, dphi[i2], rinner, router[i3]); + double pitchinner = + (rinner < settings_.rcrit()) ? settings_.stripPitch(true) : settings_.stripPitch(false); + double pitchouter = + (router[i3] < settings_.rcrit()) ? settings_.stripPitch(true) : settings_.stripPitch(false); + double abendinner = -bend(rinner, rinv1, pitchinner); + double abendouter = -bend(router[i3], rinv1, pitchouter); + if (abendinner < bendinnermin) + bendinnermin = abendinner; + if (abendinner > bendinnermax) + bendinnermax = abendinner; + if (abendouter < bendoutermin) + bendoutermin = abendouter; + if (abendouter > bendoutermax) + bendoutermax = abendouter; + if (std::abs(rinv1) < rinvmin) { + rinvmin = std::abs(rinv1); + } + } + } + + bool passptcut = rinvmin < settings_.rinvcutte(); + + for (int ibend = 0; ibend < (1 << nbendbitsinner); ibend++) { + double bend = benddecode(ibend, nbendbitsinner == 3); + + bool passinner = bend - bendinnermin > -settings_.bendcutte(0, iSeed_) && + bend - bendinnermax < settings_.bendcutte(0, iSeed_); + pttableinnernew_.push_back(passinner && passptcut); + } + + for (int ibend = 0; ibend < (1 << nbendbitsouter); ibend++) { + double bend = benddecode(ibend, nbendbitsouter == 3); + + bool passouter = bend - bendoutermin > -settings_.bendcutte(1, iSeed_) && + bend - bendoutermax < settings_.bendcutte(1, iSeed_); + pttableouternew_.push_back(passouter && passptcut); + } + } + } + + int nirbits=0; + if (iSeed_>=4) + nirbits=3; + + int nregmax=0; + + for(unsigned int innerfinephi=0;innerfinephi<(1< usereg; + for (unsigned int ireg=0;ireg=-(1<<(nbitsfinephidiff_-1))); + if (idphi<0) idphi=idphi+(1<=4) + idphi1=(idphi<<3)+ir; + int ptinnerindexnew = (idphi1 << nbendbitsinner) + innerbend; + match=match||(inrange && pttableinnernew_[ptinnerindexnew]); + } + if (match&&ir<3) + nreg++; + usereg.push_back(match); + } + + useregion_.push_back(usereg); + if (nreg>nregmax) + nregmax=nreg; + } + } + } + +} diff --git a/L1Trigger/TrackFindingTracklet/src/VMRouter.cc b/L1Trigger/TrackFindingTracklet/src/VMRouter.cc index 52aa1d099a32b..27d44c6485c46 100644 --- a/L1Trigger/TrackFindingTracklet/src/VMRouter.cc +++ b/L1Trigger/TrackFindingTracklet/src/VMRouter.cc @@ -229,8 +229,7 @@ void VMRouter::execute() { VMStubME vmstub( stub, - stub->iphivmFineBins(iphi.nbits() - (settings_.nbitsallstubs(layerdisk_) + settings_.nbitsvmme(layerdisk_)), - settings_.nbitsvmme(layerdisk_)), + stub->iphivmFineBins(settings_.nbitsallstubs(layerdisk_) + settings_.nbitsvmme(layerdisk_),3), FPGAWord(rzfine, 3, true, __LINE__, __FILE__), FPGAWord(stub->bend().value(), nbendbits, true, __LINE__, __FILE__), allStubIndex); diff --git a/L1Trigger/TrackFindingTracklet/src/VMRouterCM.cc b/L1Trigger/TrackFindingTracklet/src/VMRouterCM.cc new file mode 100644 index 0000000000000..1b7ec6458abb4 --- /dev/null +++ b/L1Trigger/TrackFindingTracklet/src/VMRouterCM.cc @@ -0,0 +1,279 @@ +#include "L1Trigger/TrackFindingTracklet/interface/VMRouterCM.h" +#include "L1Trigger/TrackFindingTracklet/interface/Settings.h" +#include "L1Trigger/TrackFindingTracklet/interface/Globals.h" +#include "L1Trigger/TrackFindingTracklet/interface/VMStubTE.h" +#include "L1Trigger/TrackFindingTracklet/interface/InputLinkMemory.h" +#include "L1Trigger/TrackFindingTracklet/interface/AllStubsMemory.h" +#include "L1Trigger/TrackFindingTracklet/interface/VMStubsMEMemory.h" +#include "L1Trigger/TrackFindingTracklet/interface/VMStubsTEMemory.h" + +#include "FWCore/MessageLogger/interface/MessageLogger.h" +#include "FWCore/Utilities/interface/Exception.h" + +using namespace std; +using namespace trklet; + +VMRouterCM::VMRouterCM(string name, Settings const& settings, Globals* global, unsigned int iSector) + : ProcessBase(name, settings, global, iSector), vmrtable_(settings) { + layerdisk_ = initLayerDisk(4); + + vmstubsMEPHI_.resize(1, nullptr); + + overlapbits_ = 7; + nextrabits_ = overlapbits_ - (settings_.nbitsallstubs(layerdisk_) + settings_.nbitsvmme(layerdisk_)); + + vmrtable_.init(layerdisk_); + + nbitszfinebintable_ = settings_.vmrlutzbits(layerdisk_); + nbitsrfinebintable_ = settings_.vmrlutrbits(layerdisk_); + + nvmmebins_=settings_.NLONGVMBINS()*((layerdisk_>=6)?2:1); //number of long z/r bins in VM + +} + +void VMRouterCM::addOutput(MemoryBase* memory, string output) { + if (settings_.writetrace()) { + edm::LogVerbatim("Tracklet") << "In " << name_ << " adding output to " << memory->getName() << " to output " + << output; + } + + if (output.substr(0, 10) == "allstubout") { + AllStubsMemory* tmp = dynamic_cast(memory); + assert(tmp != nullptr); + char memtype=0; + if (output.size()>10) { + memtype=output[11]; + } + allstubs_.push_back(pair(memtype,tmp)); + return; + } + + if (output.substr(0, 9) == "vmstubout") { + unsigned int pos = 12; + int vmbin = memory->getName().substr(pos, 1)[0] - '0'; + pos++; + if (pos < memory->getName().size()) { + if (memory->getName().substr(pos, 1)[0] != 'n') { + vmbin = vmbin * 10 + memory->getName().substr(pos, 1)[0] - '0'; + pos++; + } + } + if (memory->getName().substr(3, 2) == "TE") { + VMStubsTEMemory* tmp = dynamic_cast(memory); + int iseed = output[output.size()-1]-'0'; + assert(iseed>=0); + assert(iseed<8); + + int seedindex = -1; + for (unsigned int k = 0; k < vmstubsTEPHI_.size(); k++) { + if (vmstubsTEPHI_[k].seednumber == (unsigned int)iseed) { + seedindex = k; + } + } + if (seedindex == -1) { + seedindex = vmstubsTEPHI_.size(); + vector vectmp; + VMStubsTEPHICM atmp(iseed, vectmp); + vmstubsTEPHI_.push_back(atmp); + } + tmp->resize(settings_.NLONGVMBINS()*settings_.nvmte(1,iseed)); + vmstubsTEPHI_[seedindex].vmstubmem.push_back(tmp); + + } else if (memory->getName().substr(3, 2) == "ME") { + VMStubsMEMemory* tmp = dynamic_cast(memory); + assert(tmp != nullptr); + tmp->resize(nvmmebins_*settings_.nvmme(layerdisk_)); + assert(vmstubsMEPHI_[0] == nullptr); + vmstubsMEPHI_[0] = tmp; + } else { + throw cms::Exception("LogicError") << __FILE__ << " " << __LINE__ << " should never get here!"; + } + + return; + } + + throw cms::Exception("BadConfig") << __FILE__ << " " << __LINE__ << " Could not find output : " << output; +} + +void VMRouterCM::addInput(MemoryBase* memory, string input) { + if (settings_.writetrace()) { + edm::LogVerbatim("Tracklet") << "In " << name_ << " adding input from " << memory->getName() << " to input " + << input; + } + if (input == "stubin") { + InputLinkMemory* tmp1 = dynamic_cast(memory); + assert(tmp1 != nullptr); + if (tmp1 != nullptr) { + stubinputs_.push_back(tmp1); + } + return; + } + throw cms::Exception("BadConfig") << __FILE__ << " " << __LINE__ << " Could not find input : " << input; +} + +void VMRouterCM::execute() { + + unsigned int allStubCounter = 0; + + //Loop over the input stubs + for (auto& stubinput : stubinputs_) { + for (unsigned int i = 0; i < stubinput->nStubs(); i++) { + if (allStubCounter > settings_.maxStep("VMR")) + continue; + if (allStubCounter > 127) + continue; + + Stub* stub = stubinput->getStub(i); + + //Note - below information is not part of the stub, but rather from which input memory + //we are reading + bool negdisk = (stub->disk().value() < 0); + + //use &127 to make sure we fit into the number of bits - + //though we should have protected against overflows above + FPGAWord allStubIndex(allStubCounter & 127, 7, true, __LINE__, __FILE__); + + //TODO - should not be needed - but need to migrate some other pieces of code before removing + stub->setAllStubIndex(allStubCounter); + //TODO - should not be needed - but need to migrate some other pieces of code before removing + stub->l1tstub()->setAllStubIndex(allStubCounter); + + allStubCounter++; + + FPGAWord iphi = stub->phicorr(); + unsigned int iphipos = iphi.bits(iphi.nbits() - (settings_.nbitsallstubs(layerdisk_) + 3),3); + + //Fill allstubs memories - in HLS this is the same write to multiple memories + for (auto& allstub : allstubs_) { + char memtype=allstub.first; + if (memtype=='R' && iphipos<5) continue; + if (memtype=='L' && iphipos>=3) continue; + if (memtype=='A' && iphipos<4) continue; + if (memtype=='B' && iphipos>=4) continue; + if (memtype=='E' && iphipos>=4) continue; + if (memtype=='F' && iphipos<4) continue; + if (memtype=='C' && iphipos>=4) continue; + if (memtype=='D' && iphipos<4) continue; + //cout << allstub.second->getName()<addStub(stub); + } + + //Fill all the ME VM memories + unsigned int ivm = + iphi.bits(iphi.nbits() - (settings_.nbitsallstubs(layerdisk_) + settings_.nbitsvmme(layerdisk_)), + settings_.nbitsvmme(layerdisk_)); + unsigned int extrabits = iphi.bits(iphi.nbits() - overlapbits_, nextrabits_); + + unsigned int ivmPlus = ivm; + + if (extrabits == ((1U << nextrabits_) - 1) && ivm != ((1U << settings_.nbitsvmme(layerdisk_)) - 1)) + ivmPlus++; + unsigned int ivmMinus = ivm; + if (extrabits == 0 && ivm != 0) + ivmMinus--; + + //Calculate the z and r position for the vmstub + + //Take the top nbitszfinebintable_ bits of the z coordinate + int indexz = (((1 << (stub->z().nbits() - 1)) + stub->z().value()) >> (stub->z().nbits() - nbitszfinebintable_)); + int indexr = -1; + if (layerdisk_ > (N_LAYER - 1)) { + if (negdisk) { + indexz = (1 << nbitszfinebintable_) - indexz; + } + indexr = stub->r().value(); + if (stub->isPSmodule()) { + indexr = stub->r().value() >> (stub->r().nbits() - nbitsrfinebintable_); + } + } else { + //Take the top nbitsfinebintable_ bits of the z coordinate. The & is to handle the negative z values. + indexr = (((1 << (stub->r().nbits() - 1)) + stub->r().value()) >> (stub->r().nbits() - nbitsrfinebintable_)); + } + + assert(indexz >= 0); + assert(indexr >= 0); + assert(indexz < (1 << nbitszfinebintable_)); + assert(indexr < (1 << nbitsrfinebintable_)); + + int melut = vmrtable_.lookup(indexz, indexr); + + assert(melut >= 0); + + int vmbin = melut >> 3; + if (negdisk) + vmbin += 8; + int rzfine = melut & 7; + + // pad disk PS bend word with a '0' in MSB so that all disk bends have 4 bits (for HLS compatibility) + int nbendbits = stub->bend().nbits(); + if (layerdisk_ >= N_LAYER) + nbendbits = settings_.nbendbitsmedisk(); + + VMStubME vmstub( + stub, + stub->iphivmFineBins(settings_.nbitsallstubs(layerdisk_) + settings_.nbitsvmme(layerdisk_),3), + FPGAWord(rzfine, 3, true, __LINE__, __FILE__), + FPGAWord(stub->bend().value(), nbendbits, true, __LINE__, __FILE__), + allStubIndex); + + assert(vmstubsMEPHI_[0] != nullptr); + vmstubsMEPHI_[0]->addStub(vmstub, ivmPlus*nvmmebins_+vmbin); + + if (ivmMinus != ivmPlus) { + vmstubsMEPHI_[0]->addStub(vmstub, ivmMinus*nvmmebins_+vmbin); + } + + //Fill the TE VM memories + if (layerdisk_>=6&&(!stub->isPSmodule())) + continue; + + for (auto& ivmstubTEPHI : vmstubsTEPHI_) { + + unsigned int iseed = ivmstubTEPHI.seednumber; + unsigned int lutwidth = settings_.lutwidthtab(1, iseed); + + int lutval = -999; + + if (layerdisk_ < N_LAYER) { + lutval = melut; + } else { + lutval = vmrtable_.lookupdisk(indexz, indexr); + } + if (lutval == -1) + continue; + + assert(lutval >= 0); + + FPGAWord binlookup(lutval, lutwidth, true, __LINE__, __FILE__); + + if (binlookup.value() < 0) + continue; + + unsigned int ivmte = + iphi.bits(iphi.nbits() - (settings_.nbitsallstubs(layerdisk_) + settings_.nbitsvmte(1, iseed)), + settings_.nbitsvmte(1, iseed)); + + int bin = binlookup.value() / 8; + unsigned int tmp = binlookup.value() & 7; //three bits in outer layers - this could be coded cleaner... + binlookup.set(tmp, 3, true, __LINE__, __FILE__); + + FPGAWord finephi = stub->iphivmFineBins(settings_.nphireg(1, iseed), settings_.nfinephi(1, iseed)); + + VMStubTE tmpstub(stub, finephi, stub->bend(), binlookup, allStubIndex); + + unsigned int nmem = ivmstubTEPHI.vmstubmem.size(); + assert(nmem > 0); + + for (unsigned int l = 0; l < nmem; l++) { + if (settings_.debugTracklet()) { + edm::LogVerbatim("Tracklet") << getName() << " try adding stub to " + << ivmstubTEPHI.vmstubmem[l]->getName() + << " bin=" << bin << " ivmte " << ivmte << " finephi " << finephi.value() + << " regions bits " << settings_.nphireg(1, iseed)<<" finephibits "<addVMStub(tmpstub, ivmte*settings_.NLONGVMBINS()+bin); + } + } + } + } +} diff --git a/L1Trigger/TrackFindingTracklet/src/VMStubsTEMemory.cc b/L1Trigger/TrackFindingTracklet/src/VMStubsTEMemory.cc index d605d0f055449..4cf69e8564ecd 100644 --- a/L1Trigger/TrackFindingTracklet/src/VMStubsTEMemory.cc +++ b/L1Trigger/TrackFindingTracklet/src/VMStubsTEMemory.cc @@ -56,11 +56,27 @@ VMStubsTEMemory::VMStubsTEMemory(string name, Settings const& settings, unsigned isinner_ = false; stubsbinnedvm_.resize(settings_.NLONGVMBINS()); + } bool VMStubsTEMemory::addVMStub(VMStubTE vmstub, int bin) { //If the pt of the stub is consistent with the allowed pt of tracklets //in that can be formed in this VM and the other VM used in the TE. + + + if (settings_.combined()){ + if (disk_>0) { + assert(vmstub.stub()->isPSmodule()); + } + bool negdisk = vmstub.stub()->disk().value() < 0.0; + if (negdisk) + bin+=4; + assert(bin<(int)stubsbinnedvm_.size()); + stubsbinnedvm_[bin].push_back(vmstub); + stubsvm_.push_back(vmstub); + return true; + } + bool pass = passbend(vmstub.bend().value()); if (!pass) { @@ -194,8 +210,8 @@ bool VMStubsTEMemory::addVMStub(VMStubTE vmstub) { void VMStubsTEMemory::clean() { stubsvm_.clear(); - for (unsigned int i = 0; i < settings_.NLONGVMBINS(); i++) { - stubsbinnedvm_[i].clear(); + for (auto& stubsbinnedvm : stubsbinnedvm_) { + stubsbinnedvm.clear(); } } diff --git a/L1Trigger/TrackFindingTracklet/test/Makefile b/L1Trigger/TrackFindingTracklet/test/Makefile index 634405731eac9..263ae484f31ac 100644 --- a/L1Trigger/TrackFindingTracklet/test/Makefile +++ b/L1Trigger/TrackFindingTracklet/test/Makefile @@ -242,4 +242,7 @@ clean: @rm -rf lib/ @rm -rf dummyIncl/ @rm -rf .deps/ + @rm -f *.pdf *.png + @rm -f allprojections.txt matchcalculator.txt matcheff.txt matchengine.txt matchprocessor.txt trackletcalculator.txt trackletengine.txt trackletprocessor.txt + From b4c3b346bb3aaaac78fb7b2700eed6b1f3157f60 Mon Sep 17 00:00:00 2001 From: Andrew Hart Date: Mon, 24 Aug 2020 12:04:34 -0400 Subject: [PATCH 6/9] Fixed a few bugs. --- .../interface/TrackletEngineUnit.h | 4 ++-- .../TrackFindingTracklet/src/TrackletEngineUnit.cc | 8 ++++---- .../TrackFindingTracklet/src/TrackletProcessor.cc | 10 +++++----- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/L1Trigger/TrackFindingTracklet/interface/TrackletEngineUnit.h b/L1Trigger/TrackFindingTracklet/interface/TrackletEngineUnit.h index e4b125a8ce32d..5f5ca387ecd6a 100644 --- a/L1Trigger/TrackFindingTracklet/interface/TrackletEngineUnit.h +++ b/L1Trigger/TrackFindingTracklet/interface/TrackletEngineUnit.h @@ -28,7 +28,7 @@ namespace trklet { class TrackletEngineUnit { public: - TrackletEngineUnit(const Settings& settings, unsigned int nbitsfinephi, unsigned int layerdisk2, unsigned int iSeed, unsigned int nbitsfinephiediff, unsigned int iAllStub, std::vector pttableinner, std::vector pttableouter, VMStubsTEMemory* outervmstubs); + TrackletEngineUnit(const Settings* const settings, unsigned int nbitsfinephi, unsigned int layerdisk2, unsigned int iSeed, unsigned int nbitsfinephiediff, unsigned int iAllStub, std::vector pttableinner, std::vector pttableouter, VMStubsTEMemory* outervmstubs); ~TrackletEngineUnit() = default; @@ -49,7 +49,7 @@ namespace trklet { private: VMStubsTEMemory* outervmstubs_; TEData tedata_; - const Settings& settings_; + const Settings* settings_; unsigned int nbitsfinephi_; unsigned int layerdisk2_; unsigned int iSeed_; diff --git a/L1Trigger/TrackFindingTracklet/src/TrackletEngineUnit.cc b/L1Trigger/TrackFindingTracklet/src/TrackletEngineUnit.cc index d6b4109afc548..fba18bca7308b 100644 --- a/L1Trigger/TrackFindingTracklet/src/TrackletEngineUnit.cc +++ b/L1Trigger/TrackFindingTracklet/src/TrackletEngineUnit.cc @@ -6,7 +6,7 @@ using namespace std; using namespace trklet; -TrackletEngineUnit::TrackletEngineUnit(const Settings& settings, unsigned int nbitsfinephi, unsigned int layerdisk2, unsigned int iSeed, unsigned int nbitsfinephidiff, unsigned int iAllStub, std::vector pttableinner, std::vector pttableouter, VMStubsTEMemory* outervmstubs) +TrackletEngineUnit::TrackletEngineUnit(const Settings* const settings, unsigned int nbitsfinephi, unsigned int layerdisk2, unsigned int iSeed, unsigned int nbitsfinephidiff, unsigned int iAllStub, std::vector pttableinner, std::vector pttableouter, VMStubsTEMemory* outervmstubs) : settings_(settings), candpairs_(5) { idle_=true; nbitsfinephi_=nbitsfinephi; @@ -56,7 +56,7 @@ void TrackletEngineUnit::step(){ assert(iphiouterbin == outervmstub.finephi()); //New code to calculate lut value - int outerfinephi=iAllStub_*(1<<(nbitsfinephi_-settings_.nbitsallstubs(layerdisk2_)))+ireg_*(1<nbitsallstubs(layerdisk2_)))+ireg_*(1<nfinephi(1,iSeed_))+iphiouterbin.value(); int idphi=outerfinephi-tedata_.innerfinephi_; bool inrange=(idphi<(1<<(nbitsfinephidiff_-1)))&&(idphi>=-(1<<(nbitsfinephidiff_-1))); //int idphiraw=idphi; @@ -70,7 +70,7 @@ void TrackletEngineUnit::step(){ if (next_!=0) rzbin += 8; if ((rzbin < tedata_.rzbinfirst_) || (rzbin - tedata_.rzbinfirst_ > tedata_.rzdiffmax_)) { - if (settings_.debugTracklet()) { + if (settings_->debugTracklet()) { edm::LogVerbatim("Tracklet") << " layer-disk stub pair rejected because rbin cut : " << rzbin << " " << tedata_.rzbinfirst_ << " " << tedata_.rzdiffmax_; @@ -83,7 +83,7 @@ void TrackletEngineUnit::step(){ int ptouterindex = (idphi << outerbend.nbits()) + outerbend.value(); if (!(inrange && pttableinner_[ptinnerindex] && pttableouter_[ptouterindex])) { - if (settings_.debugTracklet()) { + if (settings_->debugTracklet()) { edm::LogVerbatim("Tracklet") <<" Stub pair rejected because of stub pt cut bends : " << benddecode(tedata_.innerbend_.value(), tedata_.stub_->isPSmodule()) << " " << benddecode(outerbend.value(), outervmstub.isPSmodule()); diff --git a/L1Trigger/TrackFindingTracklet/src/TrackletProcessor.cc b/L1Trigger/TrackFindingTracklet/src/TrackletProcessor.cc index cd9ef75bf9190..0572974f8bfce 100644 --- a/L1Trigger/TrackFindingTracklet/src/TrackletProcessor.cc +++ b/L1Trigger/TrackFindingTracklet/src/TrackletProcessor.cc @@ -129,7 +129,7 @@ void TrackletProcessor::addInput(MemoryBase* memory, string input) { } buildLUT(); //need iAllStub_ set before building the table //FIXME should be in initiall - TrackletEngineUnit teunit(settings_,nbitsfinephi_,layerdisk2_,iSeed_,nbitsfinephidiff_,iAllStub_,pttableinnernew_,pttableouternew_,outervmstubs_); + TrackletEngineUnit teunit(&settings_,nbitsfinephi_,layerdisk2_,iSeed_,nbitsfinephidiff_,iAllStub_,pttableinnernew_,pttableouternew_,outervmstubs_); teunits_.resize(6,teunit); return; @@ -563,15 +563,15 @@ void TrackletProcessor::buildLUT() { int nregmax=0; - for(unsigned int innerfinephi=0;innerfinephi<(1< usereg; for (unsigned int ireg=0;ireg=-(1<<(nbitsfinephidiff_-1))); From 8bc8ab10a0ea19f96a4251d22509a614084a8f37 Mon Sep 17 00:00:00 2001 From: Cara Pesciotta Date: Fri, 28 Aug 2020 19:11:32 +0200 Subject: [PATCH 7/9] updated truncation numbers --- .../TrackFindingTracklet/interface/Settings.h | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/L1Trigger/TrackFindingTracklet/interface/Settings.h b/L1Trigger/TrackFindingTracklet/interface/Settings.h index 477225538489d..e3a5ab9d9b35d 100644 --- a/L1Trigger/TrackFindingTracklet/interface/Settings.h +++ b/L1Trigger/TrackFindingTracklet/interface/Settings.h @@ -598,15 +598,15 @@ namespace trklet { //Default number of processing steps for one event std::unordered_map maxstep_{{"Link", 108}, - {"VMR", 108}, - {"TE", 108}, - {"TC", 108}, - {"TP", 108}, - {"PR", 108}, + {"MC", 107}, {"ME", 108}, - {"MC", 108}, {"MP", 108}, - {"TRE", 108}}; + {"PR", 103}, + {"TC", 107}, + {"TE", 101}, + {"TP", 108}, + {"TRE", 108}, + {"VMR", 101}}; // If set to true this will generate debub printout in text files std::unordered_map writeMonitorData_{{"IL", false}, From 629fbfacf2d1c7e93aabeabb43fa4a0c6b51001d Mon Sep 17 00:00:00 2001 From: Louise Skinnari Date: Mon, 31 Aug 2020 20:35:09 +0200 Subject: [PATCH 8/9] clean up --- L1Trigger/TrackFindingTracklet/interface/Settings.h | 12 ++++++++---- L1Trigger/TrackFindingTracklet/test/fpga.cc | 5 +++++ 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/L1Trigger/TrackFindingTracklet/interface/Settings.h b/L1Trigger/TrackFindingTracklet/interface/Settings.h index e3a5ab9d9b35d..9f04527b2f38d 100644 --- a/L1Trigger/TrackFindingTracklet/interface/Settings.h +++ b/L1Trigger/TrackFindingTracklet/interface/Settings.h @@ -100,7 +100,7 @@ namespace trklet { throw cms::Exception("BadConfig") << __FILE__ << " " << __LINE__ << " maxStep module = " << module << " not known"; } - return maxstep_.at(module); + return maxstep_.at(module) + maxstepoffset_; } double zlength() const { return zlength_; } @@ -359,8 +359,8 @@ namespace trklet { std::string processingModulesFile_; std::string memoryModulesFile_; std::string wiresFile_; - std::string tableTEDFile_{"../data/table_TED/table_TED_Dummy.tx"}; - std::string tableTREFile_{"../data/table_TRE/table_TRE_Dummy.tx"}; + std::string tableTEDFile_; + std::string tableTREFile_; double rcrit_{55.0}; // critical radius for the hourglass configuration @@ -596,6 +596,10 @@ namespace trklet { {{3.6, 3.8, 0.0, 0.0, 3.6, 0.0, 3.5, 3.8, 0.0, 0.0, 3.0, 3.0}}, //disk 4 {{0.0, 0.0, 0.0, 0.0, 3.6, 3.4, 3.7, 0.0, 0.0, 0.0, 0.0, 3.0}}}}; //disk 5 + //Offset to the maximum number of steps in each processing step. Set to 0 for standard + //trunction. Set to large value, e.g. 10000 to remove truncation + unsigned int maxstepoffset_{10000}; + //Default number of processing steps for one event std::unordered_map maxstep_{{"Link", 108}, {"MC", 107}, @@ -610,7 +614,7 @@ namespace trklet { // If set to true this will generate debub printout in text files std::unordered_map writeMonitorData_{{"IL", false}, - {"TE", true}, + {"TE", false}, {"CT", false}, {"HitPattern", false}, {"ChiSq", false}, diff --git a/L1Trigger/TrackFindingTracklet/test/fpga.cc b/L1Trigger/TrackFindingTracklet/test/fpga.cc index eb435ceea7057..b9c1786f4549f 100644 --- a/L1Trigger/TrackFindingTracklet/test/fpga.cc +++ b/L1Trigger/TrackFindingTracklet/test/fpga.cc @@ -62,6 +62,11 @@ int main(const int argc, const char **argv) { settings.setMemoryModulesFile("../data/memorymodules_" + settings.geomext() + ".dat"); settings.setWiresFile("../data/wires_" + settings.geomext() + ".dat"); + if (settings.extended()) { + settings.setTableTEDFile("../data/table_TED/table_TED_Dummy.txt"); + settings.setTableTREFile("../data/table_TRE/table_TRE_Dummy.txt"); + } + edm::LogVerbatim("Tracklet") << "cabling DTC links : " << settings.DTCLinkFile(); edm::LogVerbatim("Tracklet") << "module cabling : " << settings.moduleCablingFile(); edm::LogVerbatim("Tracklet") << "DTC link layer disk : " << settings.DTCLinkLayerDiskFile(); From 44928715e5c7927313c1d4e4cf141f1e822faa4a Mon Sep 17 00:00:00 2001 From: Jack Li <43122048+Jingyan95@users.noreply.github.com> Date: Wed, 23 Sep 2020 18:14:05 +0200 Subject: [PATCH 9/9] Allow multiple stubs per layer when turing on FakeFit (#32) Co-authored-by: Jack Li --- L1Trigger/TrackFindingTracklet/src/HybridFit.cc | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/L1Trigger/TrackFindingTracklet/src/HybridFit.cc b/L1Trigger/TrackFindingTracklet/src/HybridFit.cc index 2867bb70a0dbd..b67499adcaab1 100644 --- a/L1Trigger/TrackFindingTracklet/src/HybridFit.cc +++ b/L1Trigger/TrackFindingTracklet/src/HybridFit.cc @@ -17,6 +17,11 @@ HybridFit::HybridFit(unsigned int iSector, Settings const& settings, Globals* gl void HybridFit::Fit(Tracklet* tracklet, std::vector& trackstublist) { if (settings_.fakefit()) { + vector l1stubsFromFitTrack; + for (unsigned int k = 0; k < trackstublist.size(); k++) { + const L1TStub* L1stub = trackstublist[k]->l1tstub(); + l1stubsFromFitTrack.push_back(L1stub); + } tracklet->setFitPars(tracklet->rinvapprox(), tracklet->phi0approx(), tracklet->d0approx(), @@ -38,7 +43,8 @@ void HybridFit::Fit(Tracklet* tracklet, std::vector& trackstublist) tracklet->fpgaz0().value(), 0, 0, - 0); + 0, + l1stubsFromFitTrack); return; }