File indexing completed on 2024-04-06 12:21:52
0001 #include "L1Trigger/TrackFindingTMTT/interface/StubWindowSuggest.h"
0002 #include "L1Trigger/TrackFindingTMTT/interface/Stub.h"
0003 #include "L1Trigger/TrackFindingTMTT/interface/TrackerModule.h"
0004 #include "L1Trigger/TrackFindingTMTT/interface/PrintL1trk.h"
0005
0006 #include "DataFormats/DetId/interface/DetId.h"
0007 #include "FWCore/Utilities/interface/Exception.h"
0008
0009 #include <sstream>
0010 #include <mutex>
0011
0012 using namespace std;
0013
0014 namespace tmtt {
0015
0016
0017
0018 void StubWindowSuggest::setFEWindows(const StubFEWindows* sw) {
0019 static std::mutex myMutex;
0020 std::lock_guard<std::mutex> myGuard(myMutex);
0021
0022 if (not sw_) {
0023 sw_ = std::make_unique<StubFEWindows>(*sw);
0024 sw_->setZero();
0025 }
0026 }
0027
0028
0029
0030 void StubWindowSuggest::process(const TrackerTopology* trackerTopo, const Stub* stub) {
0031 static std::mutex myMutex;
0032 std::lock_guard<std::mutex> myGuard(myMutex);
0033
0034
0035 const double invPtMax = 1 / ptMin_;
0036 double bendHalfWind = invPtMax / std::abs(stub->qOverPtOverBend());
0037
0038 bendHalfWind += stub->bendCutInFrontend();
0039
0040 bendHalfWind = int(2 * bendHalfWind) / 2.;
0041
0042
0043 this->updateStoredWindow(trackerTopo, stub, bendHalfWind);
0044 }
0045
0046
0047
0048 void StubWindowSuggest::updateStoredWindow(const TrackerTopology* trackerTopo,
0049 const Stub* stub,
0050 double bendHalfWind) {
0051
0052
0053 DetId stDetId(stub->trackerModule()->detId());
0054
0055 double* storedHalfWindow = sw_->storedWindowSize(trackerTopo, stDetId);
0056
0057 if (*storedHalfWindow < bendHalfWind)
0058 *storedHalfWindow = bendHalfWind;
0059 }
0060
0061
0062
0063 void StubWindowSuggest::printResults() const {
0064 PrintL1trk(1) << "==============================================================================";
0065 PrintL1trk(1) << " Stub window sizes that TMTT suggests putting inside ";
0066 PrintL1trk(1) << " /L1Trigger/TrackTrigger/python/TTStubAlgorithmRegister_cfi.py";
0067 PrintL1trk(1) << " (These should give good efficiency, but tighter windows may be needed to";
0068 PrintL1trk(1) << " limit the data rate from the FE tracker electronics).";
0069 PrintL1trk(1) << "==============================================================================";
0070
0071 std::stringstream text;
0072 string div;
0073
0074 text << "BarrelCut = cms.vdouble( ";
0075 div = "";
0076 for (const auto& cut : sw_->windowSizeBarrelLayers()) {
0077 text << div << cut;
0078 div = ", ";
0079 }
0080 text << "),";
0081 PrintL1trk(1) << text.str();
0082
0083 PrintL1trk(1) << "TiltedBarrelCutSet = cms.VPSET( ";
0084 for (const auto& cutVec : sw_->windowSizeTiltedLayersRings()) {
0085 text.str("");
0086 text << " cms.PSet( TiltedCut = cms.vdouble(";
0087 if (cutVec.empty())
0088 text << "0";
0089 div = "";
0090 for (const auto& cut : cutVec) {
0091 text << div << cut;
0092 div = ", ";
0093 }
0094 text << "), ),";
0095 PrintL1trk(1) << text.str();
0096 }
0097 PrintL1trk(1) << "),";
0098
0099 PrintL1trk(1) << "EndcapCutSet = cms.VPSET( ";
0100 for (const auto& cutVec : sw_->windowSizeEndcapDisksRings()) {
0101 text.str("");
0102 text << " cms.PSet( EndcapCut = cms.vdouble(";
0103 if (cutVec.empty())
0104 text << "0";
0105 div = "";
0106 for (const auto& cut : cutVec) {
0107 text << div << cut;
0108 div = ", ";
0109 }
0110 text << "), ),";
0111 PrintL1trk(1) << text.str();
0112 }
0113 PrintL1trk(1) << ")";
0114
0115 PrintL1trk(1) << "==============================================================================";
0116 }
0117
0118 }