File indexing completed on 2023-10-25 09:56:25
0001 #include "L1Trigger/TrackFindingTracklet/interface/ProjectionRouter.h"
0002 #include "L1Trigger/TrackFindingTracklet/interface/Settings.h"
0003 #include "L1Trigger/TrackFindingTracklet/interface/Globals.h"
0004 #include "L1Trigger/TrackFindingTracklet/interface/Tracklet.h"
0005 #include "L1Trigger/TrackFindingTracklet/interface/FPGAWord.h"
0006 #include "L1Trigger/TrackFindingTracklet/interface/IMATH_TrackletCalculator.h"
0007
0008 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0009 #include "FWCore/Utilities/interface/Exception.h"
0010
0011 using namespace std;
0012 using namespace trklet;
0013
0014 ProjectionRouter::ProjectionRouter(string name, Settings const& settings, Globals* global)
0015 : ProcessBase(name, settings, global), rinvbendlut_(settings) {
0016 layerdisk_ = initLayerDisk(3);
0017
0018 vmprojs_.resize(settings_.nvmme(layerdisk_), nullptr);
0019
0020 nrbits_ = 5;
0021 nphiderbits_ = 6;
0022
0023 if (layerdisk_ >= N_LAYER) {
0024 rinvbendlut_.initProjectionBend(
0025 global->ITC_L1L2()->der_phiD_final.K(), layerdisk_ - N_LAYER, nrbits_, nphiderbits_);
0026 }
0027 }
0028
0029 void ProjectionRouter::addOutput(MemoryBase* memory, string output) {
0030 if (settings_.writetrace()) {
0031 edm::LogVerbatim("Tracklet") << "In " << name_ << " adding output to " << memory->getName() << " to output "
0032 << output;
0033 }
0034 if (output == "allprojout") {
0035 auto* tmp = dynamic_cast<AllProjectionsMemory*>(memory);
0036 assert(tmp != nullptr);
0037 allproj_ = tmp;
0038 return;
0039 }
0040
0041 unsigned int nproj = settings_.nallstubs(layerdisk_);
0042 unsigned int nprojvm = settings_.nvmme(layerdisk_);
0043
0044 for (unsigned int iproj = 0; iproj < nproj; iproj++) {
0045 for (unsigned int iprojvm = 0; iprojvm < nprojvm; iprojvm++) {
0046 std::string name = "vmprojoutPHI";
0047 name += char(iproj + 'A');
0048 name += std::to_string(iproj * nprojvm + iprojvm + 1);
0049 if (output == name) {
0050 auto* tmp = dynamic_cast<VMProjectionsMemory*>(memory);
0051 assert(tmp != nullptr);
0052 vmprojs_[iprojvm] = tmp;
0053 return;
0054 }
0055 }
0056 }
0057
0058 throw cms::Exception("BadConfig") << __FILE__ << " " << __LINE__ << " could not find output: " << output;
0059 }
0060
0061 void ProjectionRouter::addInput(MemoryBase* memory, string input) {
0062 if (settings_.writetrace()) {
0063 edm::LogVerbatim("Tracklet") << "In " << name_ << " adding input from " << memory->getName() << " to input "
0064 << input;
0065 }
0066 if (input.substr(0, 4) == "proj" && input.substr(input.size() - 2, 2) == "in") {
0067 auto* tmp = dynamic_cast<TrackletProjectionsMemory*>(memory);
0068 assert(tmp != nullptr);
0069 inputproj_.push_back(tmp);
0070 return;
0071 }
0072 throw cms::Exception("BadConfig") << __FILE__ << " " << __LINE__ << " could not find input: " << input;
0073 }
0074
0075 void ProjectionRouter::execute() {
0076 unsigned int allprojcount = 0;
0077
0078
0079
0080 int lastTCID = -1;
0081
0082 for (auto& iproj : inputproj_) {
0083 for (unsigned int i = 0; i < iproj->nTracklets(); i++) {
0084 if (allprojcount >= settings_.maxStep("PR"))
0085 continue;
0086
0087 Tracklet* tracklet = iproj->getTracklet(i);
0088
0089 FPGAWord fpgaphi;
0090
0091 if (layerdisk_ < N_LAYER) {
0092 fpgaphi = tracklet->proj(layerdisk_).fpgaphiproj();
0093 } else {
0094 Projection& proj = tracklet->proj(layerdisk_);
0095 fpgaphi = proj.fpgaphiproj();
0096
0097
0098
0099
0100
0101
0102 int rindex = (proj.fpgarzproj().value() >> (proj.fpgarzproj().nbits() - nrbits_)) & ((1 << nrbits_) - 1);
0103
0104 int phiderindex = (proj.fpgaphiprojder().value() >> (proj.fpgaphiprojder().nbits() - nphiderbits_)) &
0105 ((1 << nphiderbits_) - 1);
0106
0107 int signindex = (proj.fpgarzprojder().value() < 0);
0108
0109 int bendindex = (signindex << (nphiderbits_ + nrbits_)) + (rindex << (nphiderbits_)) + phiderindex;
0110
0111 int ibendproj = rinvbendlut_.lookup(bendindex);
0112
0113 proj.setBendIndex(ibendproj);
0114 }
0115
0116 unsigned int iphivm =
0117 fpgaphi.bits(fpgaphi.nbits() - settings_.nbitsallstubs(layerdisk_) - settings_.nbitsvmme(layerdisk_),
0118 settings_.nbitsvmme(layerdisk_));
0119
0120
0121 if (lastTCID >= tracklet->TCID()) {
0122 edm::LogPrint("Tracklet") << "Wrong TCID ordering for projections in " << getName();
0123 } else {
0124 lastTCID = tracklet->TCID();
0125 }
0126
0127 allproj_->addTracklet(tracklet);
0128
0129 vmprojs_[iphivm]->addTracklet(tracklet, allprojcount);
0130
0131 if (settings_.debugTracklet()) {
0132 edm::LogVerbatim("Tracklet") << getName() << " projection to " << vmprojs_[iphivm]->getName() << " iphivm "
0133 << iphivm;
0134 }
0135
0136 allprojcount++;
0137 }
0138 }
0139
0140 if (settings_.writeMonitorData("AP")) {
0141 globals_->ofstream("allprojections.txt") << getName() << " " << allproj_->nTracklets() << endl;
0142 }
0143
0144 if (settings_.writeMonitorData("VMP")) {
0145 ofstream& out = globals_->ofstream("chisq.txt");
0146 for (unsigned int i = 0; i < 8; i++) {
0147 if (vmprojs_[i] != nullptr) {
0148 out << vmprojs_[i]->getName() << " " << vmprojs_[i]->nTracklets() << endl;
0149 }
0150 }
0151 }
0152 }