Back to home page

Project CMSSW displayed by LXR

 
 

    


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 // TripletEngineUnit
0007 //
0008 // This script sets a processing unit for the TrackletProcessorDisplaced
0009 // based on information from the middle stub and its projections in and out,
0010 // and a new triplet seed is checked and created for each processing step
0011 //
0012 // Author: Claire Savard, Nov. 2024
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   // get inner and outer projected stub for certain next value
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   // check if r/z of outer stub is within projection range
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   // go to next projection (looping through all inner stubs for each outer stub)
0086   istub_in_++;
0087   if (istub_in_ >= nstub_in_) {  // if gone through all in stubs, move to next in proj bin
0088     nproj_in_++;
0089     istub_in_ = 0;
0090     if (nproj_in_ >= trpdata_.projbin_in_.size()) {  // if gone through all in proj bins, move to next out stub
0091       istub_out_++;
0092       nproj_in_ = 0;
0093       if (istub_out_ >= nstub_out_) {  // if gone through all out stubs, move to next out proj bin
0094         nproj_out_++;
0095         istub_out_ = 0;
0096         if (nproj_out_ >=
0097             trpdata_.projbin_out_.size()) {  // if gone through all out proj bins, reset everything and stop engine unit
0098           istub_in_ = 0;
0099           istub_out_ = 0;
0100           nproj_in_ = 0;
0101           nproj_out_ = 0;
0102           idle_ = true;
0103           return;
0104         }
0105         // get next out proj bin
0106         std::tie(next_out_, outmem_, nstub_out_) = trpdata_.projbin_out_[nproj_out_];
0107       }
0108     }
0109     // get next in proj bin
0110     std::tie(next_in_, inmem_, nstub_in_) = trpdata_.projbin_in_[nproj_in_];
0111   }
0112 }