File indexing completed on 2025-06-03 00:12:22
0001
0002
0003
0004
0005 #include "L1Trigger/TrackFindingTracklet/interface/HitPatternHelper.h"
0006 #include "L1Trigger/TrackFindingTMTT/interface/KFbase.h"
0007 #include "L1Trigger/TrackFindingTMTT/interface/TrackerModule.h"
0008 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0009
0010 #include <vector>
0011 #include <algorithm>
0012 #include <cmath>
0013
0014 namespace hph {
0015
0016 Setup::Setup(const Config& iConfig,
0017 const tt::Setup& setupTT,
0018 const trackerTFP::DataFormats& dataFormats,
0019 const trackerTFP::LayerEncoding& layerEncoding)
0020 : setupTT_(&setupTT),
0021 layerEncoding_(&layerEncoding),
0022 hphDebug_(iConfig.hphDebug_),
0023 useNewKF_(iConfig.useNewKF_),
0024 chosenRofZNewKF_(setupTT_->chosenRofZ()),
0025 layermap_(),
0026 nEtaRegions_(tmtt::KFbase::nEta_ / 2),
0027 nKalmanLayers_(tmtt::KFbase::nKFlayer_) {
0028 if (useNewKF_) {
0029 chosenRofZ_ = chosenRofZNewKF_;
0030 etaRegions_ = etaRegionsNewKF_;
0031 } else {
0032 chosenRofZ_ = iConfig.chosenRofZ_;
0033 etaRegions_ = iConfig.etaRegions_;
0034 }
0035 static constexpr auto layerIds = {1, 2, 3, 4, 5, 6, 11, 12, 13, 14, 15};
0036
0037 for (int i = 0; i < nEtaRegions_; i++) {
0038 for (int j : layerIds) {
0039 int layer;
0040 if (j < 7) {
0041 layer = tmtt::KFbase::layerMap_[i][tmtt::TrackerModule::calcLayerIdReduced(j)].first;
0042 } else {
0043 layer = tmtt::KFbase::layerMap_[i][tmtt::TrackerModule::calcLayerIdReduced(j)].second;
0044 }
0045 if (layer < nKalmanLayers_) {
0046 layermap_[i][layer].push_back(j);
0047 }
0048 }
0049 }
0050 }
0051
0052 HitPatternHelper::HitPatternHelper(const Setup* setup, int hitpattern, double cot, double z0)
0053 : setup_(setup),
0054 hphDebug_(setup_->hphDebug()),
0055 useNewKF_(setup_->useNewKF()),
0056 etaRegions_(setup_->etaRegions()),
0057 layermap_(setup_->layermap()),
0058 nKalmanLayers_(setup_->nKalmanLayers()),
0059 zT_(z0 + cot * setup_->chosenRofZ()),
0060 layerEncoding_(setup->layerEncoding(zT_)),
0061 numExpLayer_(layerEncoding_.size()),
0062 hitpattern_(hitpattern),
0063 etaSector_(setup_->etaRegion(z0, cot, useNewKF_)),
0064 numMissingLayer_(0),
0065 numMissingPS_(0),
0066 numMissing2S_(0),
0067 numPS_(0),
0068 num2S_(0),
0069 numMissingInterior1_(0),
0070 numMissingInterior2_(0),
0071 binary_(11, 0),
0072 bonusFeatures_() {
0073 setup->analyze(hitpattern, cot, z0, numPS_, num2S_, numMissingPS_, numMissing2S_);
0074 int kf_eta_reg = etaSector_;
0075 if (kf_eta_reg < ((int)etaRegions_.size() - 1) / 2) {
0076 kf_eta_reg = ((int)etaRegions_.size() - 1) / 2 - 1 - kf_eta_reg;
0077 } else {
0078 kf_eta_reg = kf_eta_reg - (int)(etaRegions_.size() - 1) / 2;
0079 }
0080
0081 int nbits = floor(log2(hitpattern_)) + 1;
0082 int lay_i = 0;
0083 bool seq = false;
0084 for (int i = 0; i < nbits; i++) {
0085 lay_i = ((1 << i) & hitpattern_) >> i;
0086
0087 if (lay_i && !seq)
0088 seq = true;
0089 if (!lay_i && seq) {
0090 numMissingInterior1_++;
0091 }
0092 if (!lay_i) {
0093 bool realhit = false;
0094 if (layermap_[kf_eta_reg][i].empty())
0095 continue;
0096 for (int j : layermap_[kf_eta_reg][i]) {
0097 int k = findLayer(j);
0098 if (k > 0)
0099 realhit = true;
0100 }
0101 if (realhit)
0102 numMissingInterior2_++;
0103 }
0104 }
0105
0106 if (hphDebug_) {
0107 if (useNewKF_) {
0108 edm::LogVerbatim("TrackTriggerHPH") << "Running with New KF";
0109 } else {
0110 edm::LogVerbatim("TrackTriggerHPH") << "Running with Old KF";
0111 }
0112 edm::LogVerbatim("TrackTriggerHPH") << "======================================================";
0113 edm::LogVerbatim("TrackTriggerHPH")
0114 << "Looking at hitpattern " << std::bitset<7>(hitpattern_) << "; Looping over KF layers:";
0115 }
0116
0117 if (useNewKF_) {
0118
0119 for (int i = 0; i < numExpLayer_; i++) {
0120 if (hphDebug_) {
0121 edm::LogVerbatim("TrackTriggerHPH") << "--------------------------";
0122 edm::LogVerbatim("TrackTriggerHPH") << "Looking at KF layer " << i;
0123 if (layerEncoding_[i] < 10) {
0124 edm::LogVerbatim("TrackTriggerHPH") << "KF expects L" << layerEncoding_[i];
0125 } else {
0126 edm::LogVerbatim("TrackTriggerHPH") << "KF expects D" << layerEncoding_[i] - 10;
0127 }
0128 }
0129
0130 if (((1 << i) & hitpattern_) >> i) {
0131 if (hphDebug_) {
0132 edm::LogVerbatim("TrackTriggerHPH") << "Layer found in hitpattern";
0133 }
0134 binary_[reducedId(layerEncoding_[i])] = 1;
0135 } else {
0136 if (hphDebug_) {
0137 edm::LogVerbatim("TrackTriggerHPH") << "Layer missing in hitpattern";
0138 }
0139 }
0140 }
0141
0142 } else {
0143
0144 for (int i = 0; i < nKalmanLayers_; i++) {
0145
0146 if (hphDebug_) {
0147 edm::LogVerbatim("TrackTriggerHPH") << "--------------------------";
0148 edm::LogVerbatim("TrackTriggerHPH") << "Looking at KF layer " << i;
0149 }
0150
0151 if (layermap_[kf_eta_reg][i].empty()) {
0152 if (hphDebug_) {
0153 edm::LogVerbatim("TrackTriggerHPH") << "KF does not expect this layer";
0154 }
0155
0156 continue;
0157 }
0158
0159 for (int j :
0160 layermap_[kf_eta_reg][i]) {
0161
0162 if (hphDebug_) {
0163 if (j < 10) {
0164 edm::LogVerbatim("TrackTriggerHPH") << "KF expects L" << j;
0165 } else {
0166 edm::LogVerbatim("TrackTriggerHPH") << "KF expects D" << j - 10;
0167 }
0168 }
0169
0170 int k = findLayer(j);
0171 if (k < 0) {
0172
0173 if (hphDebug_) {
0174 edm::LogVerbatim("TrackTriggerHPH") << "Rejected by sensor modules";
0175 }
0176
0177 continue;
0178 }
0179
0180 if (hphDebug_) {
0181 edm::LogVerbatim("TrackTriggerHPH") << "Confirmed by sensor modules";
0182 }
0183
0184 if (((1 << i) & hitpattern_) >> i) {
0185 if (hphDebug_) {
0186 edm::LogVerbatim("TrackTriggerHPH") << "Layer found in hitpattern";
0187 }
0188 binary_[reducedId(j)] = 1;
0189 } else {
0190 if (hphDebug_) {
0191 edm::LogVerbatim("TrackTriggerHPH") << "Layer missing in hitpattern";
0192 }
0193 }
0194 }
0195 }
0196 }
0197
0198 if (hphDebug_) {
0199 edm::LogVerbatim("TrackTriggerHPH") << "------------------------------";
0200 edm::LogVerbatim("TrackTriggerHPH") << "numPS = " << numPS_ << ", num2S = " << num2S_
0201 << ", missingPS = " << numMissingPS_ << ", missing2S = " << numMissing2S_;
0202 edm::LogVerbatim("TrackTriggerHPH") << "======================================================";
0203 }
0204 }
0205
0206 int Setup::etaRegion(double z0, double cot, bool useNewKF) const {
0207
0208 double chosenRofZ;
0209 std::vector<double> etaRegions;
0210 if (useNewKF) {
0211 chosenRofZ = chosenRofZNewKF_;
0212 etaRegions = etaRegionsNewKF_;
0213 } else {
0214 chosenRofZ = chosenRofZ_;
0215 etaRegions = etaRegions_;
0216 }
0217 double kfzRef = z0 + chosenRofZ * cot;
0218 int kf_eta_reg = 0;
0219 for (int iEtaSec = 1; iEtaSec < ((int)etaRegions.size() - 1); iEtaSec++) {
0220 double etaMax = etaRegions[iEtaSec];
0221 double zRefMax = chosenRofZ / tan(2. * atan(exp(-etaMax)));
0222 if (kfzRef < zRefMax)
0223 break;
0224 kf_eta_reg = iEtaSec;
0225 }
0226 return kf_eta_reg;
0227 }
0228
0229 int HitPatternHelper::reducedId(int layerId) {
0230 if (hphDebug_ && (layerId > 15 || layerId < 1)) {
0231 edm::LogVerbatim("TrackTriggerHPH") << "Warning: invalid layer id !";
0232 }
0233 if (layerId <= 6) {
0234 layerId = layerId - 1;
0235 return layerId;
0236 } else {
0237 layerId = layerId - 5;
0238 return layerId;
0239 }
0240 }
0241
0242 int HitPatternHelper::findLayer(int layerId) {
0243 for (int i = 0; i < (int)layerEncoding_.size(); i++) {
0244 if (layerId == (int)layerEncoding_[i]) {
0245 return i;
0246 }
0247 }
0248 return -1;
0249 }
0250
0251 }