File indexing completed on 2025-06-03 00:12:25
0001 #include "L1Trigger/TrackFindingTracklet/interface/TripletEngineUnit.h"
0002 #include "L1Trigger/TrackFindingTracklet/interface/Settings.h"
0003
0004 using namespace trklet;
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014 TripletEngineUnit::TripletEngineUnit(const Settings* const settings,
0015 unsigned int layerdisk1,
0016 unsigned int layerdisk2,
0017 unsigned int layerdisk3,
0018 unsigned int iSeed,
0019 std::vector<VMStubsTEMemory*> innervmstubs,
0020 std::vector<VMStubsTEMemory*> outervmstubs)
0021 : settings_(settings), candtriplets_(3) {
0022 idle_ = true;
0023 layerdisk1_ = layerdisk1;
0024 layerdisk2_ = layerdisk2;
0025 layerdisk3_ = layerdisk3;
0026 iSeed_ = iSeed;
0027 innervmstubs_ = innervmstubs;
0028 outervmstubs_ = outervmstubs;
0029 }
0030
0031 void TripletEngineUnit::init(const TrpEData& trpdata) {
0032 trpdata_ = trpdata;
0033 istub_out_ = 0;
0034 istub_in_ = 0;
0035 nproj_out_ = 0;
0036 nproj_in_ = 0;
0037 idle_ = false;
0038
0039 assert(!trpdata_.projbin_out_.empty() && !trpdata_.projbin_in_.empty());
0040 std::tie(next_out_, outmem_, nstub_out_) = trpdata_.projbin_out_[0];
0041 std::tie(next_in_, inmem_, nstub_in_) = trpdata_.projbin_in_[0];
0042 }
0043
0044 void TripletEngineUnit::reset() {
0045 idle_ = true;
0046 goodtriplet_ = false;
0047 goodtriplet__ = false;
0048 candtriplets_.reset();
0049 }
0050
0051 void TripletEngineUnit::step() {
0052 if (goodtriplet__) {
0053 candtriplets_.store(candtriplet__);
0054 }
0055
0056 goodtriplet__ = goodtriplet_;
0057 candtriplet__ = candtriplet_;
0058
0059 goodtriplet_ = false;
0060
0061 if (idle_ || nearfull_) {
0062 return;
0063 }
0064
0065
0066 int ibin_out = trpdata_.start_out_ + next_out_;
0067 int ibin_in = trpdata_.start_in_ + next_in_;
0068 const VMStubTE& outervmstub = outervmstubs_[outmem_]->getVMStubTEBinned(ibin_out, istub_out_);
0069 const VMStubTE& innervmstub = innervmstubs_[inmem_]->getVMStubTEBinned(ibin_in, istub_in_);
0070
0071
0072 int rzbin = (outervmstub.vmbits().value() & (settings_->NLONGVMBINS() - 1));
0073 if (trpdata_.start_out_ != ibin_out)
0074 rzbin += 8;
0075 if (rzbin < trpdata_.rzbinfirst_out_ || rzbin - trpdata_.rzbinfirst_out_ > trpdata_.rzdiffmax_out_) {
0076 if (settings_->debugTracklet()) {
0077 edm::LogVerbatim("Tracklet") << "Outer stub rejected because of wrong r/z bin";
0078 }
0079 } else {
0080 candtriplet_ =
0081 std::tuple<const Stub*, const Stub*, const Stub*>(innervmstub.stub(), trpdata_.stub_, outervmstub.stub());
0082 goodtriplet_ = true;
0083 }
0084
0085
0086 istub_in_++;
0087 if (istub_in_ >= nstub_in_) {
0088 nproj_in_++;
0089 istub_in_ = 0;
0090 if (nproj_in_ >= trpdata_.projbin_in_.size()) {
0091 istub_out_++;
0092 nproj_in_ = 0;
0093 if (istub_out_ >= nstub_out_) {
0094 nproj_out_++;
0095 istub_out_ = 0;
0096 if (nproj_out_ >=
0097 trpdata_.projbin_out_.size()) {
0098 istub_in_ = 0;
0099 istub_out_ = 0;
0100 nproj_in_ = 0;
0101 nproj_out_ = 0;
0102 idle_ = true;
0103 return;
0104 }
0105
0106 std::tie(next_out_, outmem_, nstub_out_) = trpdata_.projbin_out_[nproj_out_];
0107 }
0108 }
0109
0110 std::tie(next_in_, inmem_, nstub_in_) = trpdata_.projbin_in_[nproj_in_];
0111 }
0112 }