File indexing completed on 2025-06-03 00:12:19
0001 #include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h"
0002 #include "DataFormats/TrackerCommon/interface/TrackerTopology.h"
0003 #include "Geometry/CommonTopologies/interface/PixelGeomDetUnit.h"
0004 #include "Geometry/CommonTopologies/interface/PixelTopology.h"
0005 #include "DataFormats/Math/interface/deltaPhi.h"
0006 #include "FWCore/Utilities/interface/Exception.h"
0007
0008 #include "L1Trigger/TrackFindingTMTT/interface/Stub.h"
0009 #include "L1Trigger/TrackFindingTMTT/interface/TP.h"
0010 #include "L1Trigger/TrackFindingTMTT/interface/StubKiller.h"
0011 #include "L1Trigger/TrackFindingTMTT/interface/PrintL1trk.h"
0012
0013 #include <iostream>
0014
0015 using namespace std;
0016
0017 namespace tmtt {
0018
0019
0020
0021 Stub::Stub(const Settings* settings,
0022 unsigned int idStub,
0023 double phi,
0024 double r,
0025 double z,
0026 double bend,
0027 unsigned int iphi,
0028 double alpha,
0029 unsigned int layerId,
0030 unsigned int iPhiSec,
0031 bool psModule,
0032 bool barrel,
0033 bool tiltedBarrel,
0034 float stripPitch,
0035 float stripLength,
0036 unsigned int nStrips)
0037 : index_in_vStubs_(idStub),
0038 phi_(phi),
0039 r_(r),
0040 z_(z),
0041 bend_(bend),
0042 iphi_(iphi),
0043 alpha_(alpha),
0044 digitalStub_(std::make_unique<DigitalStub>(settings, r, phi, z, iPhiSec)),
0045 layerId_(layerId),
0046 layerIdReduced_(TrackerModule::calcLayerIdReduced(layerId)),
0047 stripPitch_(stripPitch),
0048 stripLength_(stripLength),
0049 nStrips_(nStrips),
0050 psModule_(psModule),
0051 barrel_(barrel),
0052 tiltedBarrel_(tiltedBarrel) {}
0053
0054
0055
0056 Stub::Stub(const TTStubRef& ttStubRef,
0057 unsigned int index_in_vStubs,
0058 const Settings* settings,
0059 const TrackerTopology* trackerTopology,
0060 const TrackerModule* trackerModule,
0061 const DegradeBend* degradeBend,
0062 const StubKiller* stubKiller)
0063 : ttStubRef_(ttStubRef),
0064 settings_(settings),
0065 index_in_vStubs_(index_in_vStubs),
0066 assocTP_(nullptr),
0067 lastDigiStep_(Stub::DigiStage::NONE),
0068 digitizeWarningsOn_(true),
0069 trackerModule_(trackerModule),
0070 degradeBend_(degradeBend),
0071
0072 layerId_(trackerModule->layerId()),
0073 layerIdReduced_(trackerModule->layerIdReduced()),
0074 tiltAngle_(trackerModule->tiltAngle()),
0075 stripPitch_(trackerModule->stripPitch()),
0076 stripLength_(trackerModule->stripLength()),
0077 nStrips_(trackerModule->nStrips()),
0078 psModule_(trackerModule->psModule()),
0079 barrel_(trackerModule->barrel()),
0080 tiltedBarrel_(trackerModule->tiltedBarrel()) {
0081
0082 const TTStub<Ref_Phase2TrackerDigi_>* ttStubP = ttStubRef_.get();
0083
0084 const PixelGeomDetUnit* specDet = trackerModule_->specDet();
0085 const PixelTopology* specTopol = trackerModule_->specTopol();
0086 MeasurementPoint measurementPoint = ttStubRef_->clusterRef(0)->findAverageLocalCoordinatesCentered();
0087 LocalPoint clustlp = specTopol->localPosition(measurementPoint);
0088 GlobalPoint pos = specDet->surface().toGlobal(clustlp);
0089
0090 phi_ = pos.phi();
0091 r_ = pos.perp();
0092 z_ = pos.z();
0093
0094
0095
0096 for (unsigned int iClus = 0; iClus <= 1; iClus++) {
0097 localU_cluster_[iClus] = ttStubP->clusterRef(iClus)->findAverageLocalCoordinatesCentered().x();
0098 localV_cluster_[iClus] = ttStubP->clusterRef(iClus)->findAverageLocalCoordinatesCentered().y();
0099 }
0100
0101
0102
0103
0104 iphi_ = localU_cluster_[0];
0105
0106
0107
0108 alpha_ = 0.;
0109 if ((not barrel()) && (not psModule())) {
0110 float fracPosInModule = (float(iphi_) - 0.5 * float(nStrips())) / float(nStrips());
0111 float phiRelToModule = trackerModule_->sensorWidth() * fracPosInModule / r_;
0112 if (z_ < 0)
0113 phiRelToModule *= -1;
0114 if (trackerModule_->outerModuleAtSmallerR())
0115 phiRelToModule *= -1;
0116
0117 alpha_ = -phiRelToModule / r_;
0118 }
0119
0120
0121 this->calcDphiOverBend();
0122
0123
0124
0125 bendInFrontend_ = ttStubRef_->bendFE();
0126 if ((not barrel()) && pos.z() > 0)
0127 bendInFrontend_ *= -1;
0128 if (barrel())
0129 bendInFrontend_ *= -1;
0130
0131
0132
0133 numMergedBend_ = 1;
0134 if (settings->degradeBendRes() == 2) {
0135 float degradedBend;
0136
0137 this->degradeResolution(bendInFrontend_, degradedBend, numMergedBend_);
0138 bend_ = degradedBend;
0139 } else if (settings->degradeBendRes() == 1) {
0140 bend_ = ttStubRef_->bendBE();
0141 if ((not barrel()) && pos.z() > 0)
0142 bend_ *= -1;
0143 if (barrel())
0144 bend_ *= -1;
0145 } else {
0146 bend_ = bendInFrontend_;
0147 }
0148
0149
0150 this->setFrontend(stubKiller);
0151
0152
0153 this->calcQoverPtrange();
0154
0155
0156 for (unsigned int iClus = 0; iClus <= 1; iClus++) {
0157 assocTPofCluster_[iClus] = nullptr;
0158 }
0159 }
0160
0161
0162 Stub::Stub(const TTStubRef& ttStubRef,
0163 double r,
0164 double phi,
0165 double z,
0166 int layerId,
0167 int layerIdReduced,
0168 double stripPitch,
0169 double stripLength,
0170 bool psModule,
0171 bool barrel,
0172 bool tiltedBarrel)
0173 : ttStubRef_(ttStubRef),
0174 settings_(nullptr),
0175 index_in_vStubs_(0),
0176 phi_(phi),
0177 r_(r),
0178 z_(z),
0179 bend_(0.),
0180 dphiOverBend_(0.),
0181 min_qOverPt_bin_(0),
0182 max_qOverPt_bin_(0),
0183 localU_cluster_({{0., 0.}}),
0184 localV_cluster_({{0., 0.}}),
0185 iphi_(0),
0186 alpha_(0.),
0187 frontendPass_(false),
0188 stubFailedDegradeWindow_(false),
0189 bendInFrontend_(0),
0190 numMergedBend_(0),
0191 assocTP_(nullptr),
0192 assocTPs_(set<const TP*>()),
0193 assocTPofCluster_({{nullptr, nullptr}}),
0194 digitalStub_(nullptr),
0195 lastDigiStep_(DigiStage()),
0196 digitizeWarningsOn_(false),
0197 trackerModule_(nullptr),
0198 degradeBend_(nullptr),
0199 layerId_(layerId),
0200 layerIdReduced_(layerIdReduced),
0201 stripPitch_(stripPitch),
0202 stripLength_(stripLength),
0203 nStrips_(0),
0204 psModule_(psModule),
0205 barrel_(barrel),
0206 tiltedBarrel_(tiltedBarrel) {}
0207
0208
0209
0210 void Stub::calcQoverPtrange() {
0211
0212
0213 const int nbinsPt = (int)settings_->houghNbinsPt();
0214 const int min_array_bin = 0;
0215 const int max_array_bin = nbinsPt - 1;
0216
0217 float qOverPtMin = this->qOverPtOverBend() * (this->bend() - this->bendCut());
0218 float qOverPtMax = this->qOverPtOverBend() * (this->bend() + this->bendCut());
0219 int houghNbinsPt = settings_->houghNbinsPt();
0220 const float houghMaxInvPt = 1. / settings_->houghMinPt();
0221 float qOverPtBinSize = (2. * houghMaxInvPt) / houghNbinsPt;
0222 if (settings_->shape() == 2 || settings_->shape() == 1 || settings_->shape() == 3)
0223 qOverPtBinSize = 2. * houghMaxInvPt / (houghNbinsPt - 1);
0224
0225
0226
0227
0228
0229
0230 float tmp = (settings_->shape() == 2 || settings_->shape() == 1 || settings_->shape() == 3) ? 1. : 0.;
0231 int min_bin = std::floor(-tmp + (qOverPtMin + houghMaxInvPt) / qOverPtBinSize);
0232 int max_bin = std::floor(tmp + (qOverPtMax + houghMaxInvPt) / qOverPtBinSize);
0233
0234
0235 min_bin = max(min_bin, min_array_bin);
0236 max_bin = min(max_bin, max_array_bin);
0237
0238
0239 if (min_bin > max_bin) {
0240 min_bin = max_array_bin;
0241 max_bin = min_array_bin;
0242 }
0243 min_qOverPt_bin_ = (unsigned int)min_bin;
0244 max_qOverPt_bin_ = (unsigned int)max_bin;
0245 }
0246
0247
0248
0249
0250 void Stub::digitize(unsigned int iPhiSec, Stub::DigiStage digiStep) {
0251 if (settings_->enableDigitize()) {
0252 bool updated = true;
0253 if (not digitalStub_) {
0254
0255 digitalStub_ =
0256 std::make_unique<DigitalStub>(settings_, phi_, r_, z_, min_qOverPt_bin_, max_qOverPt_bin_, bend_, iPhiSec);
0257 } else {
0258
0259 updated = digitalStub_->changePhiSec(iPhiSec);
0260 }
0261
0262
0263 if (updated || digiStep != lastDigiStep_) {
0264 lastDigiStep_ = digiStep;
0265
0266
0267 if (digiStep == DigiStage::GP) {
0268 phi_ = digitalStub_->phi_GP();
0269 } else {
0270 phi_ = digitalStub_->phi_HT_TF();
0271 }
0272 if (digiStep == DigiStage::GP || digiStep == DigiStage::HT) {
0273 r_ = digitalStub_->r_GP_HT();
0274 } else {
0275 r_ = digitalStub_->r_SF_TF();
0276 }
0277 z_ = digitalStub_->z();
0278 bend_ = digitalStub_->bend();
0279
0280
0281
0282 digitizeWarningsOn_ = false;
0283 if (digiStep == DigiStage::GP)
0284 this->calcDphiOverBend();
0285 if (digiStep == DigiStage::HT)
0286 this->calcQoverPtrange();
0287 digitizeWarningsOn_ = true;
0288 }
0289 }
0290 }
0291
0292
0293
0294
0295 void Stub::degradeResolution(float bend, float& degradedBend, unsigned int& num) const {
0296
0297 float windowFE;
0298 if (settings_->killLowPtStubs()) {
0299
0300 float invPtMax = 1. / (settings_->houghMinPt());
0301 windowFE = invPtMax / std::abs(this->qOverPtOverBend());
0302
0303 windowFE += this->bendCutInFrontend();
0304 } else {
0305 windowFE = rejectedStubBend_;
0306 }
0307
0308 degradeBend_->degrade(bend, psModule(), trackerModule_->detId(), windowFE, degradedBend, num);
0309 }
0310
0311
0312
0313
0314 void Stub::setFrontend(const StubKiller* stubKiller) {
0315 frontendPass_ = true;
0316 stubFailedDegradeWindow_ = false;
0317
0318 if (std::abs(this->eta()) > settings_->maxStubEta())
0319 frontendPass_ = false;
0320
0321 const float qOverPtCut = 1. / settings_->houghMinPt();
0322 if (settings_->killLowPtStubs()) {
0323
0324 if (std::abs(this->bendInFrontend()) - this->bendCutInFrontend() > qOverPtCut / this->qOverPtOverBend())
0325 frontendPass_ = false;
0326 }
0327
0328 if (frontendPass_ && this->bend() == rejectedStubBend_) {
0329 throw cms::Exception(
0330 "BadConfig: FE stub bend window sizes provided in cfg ES source are tighter than those to make the stubs. "
0331 "Please fix them");
0332 }
0333
0334 if (settings_->killLowPtStubs()) {
0335
0336
0337 if (std::abs(this->bend()) - this->bendCut() > qOverPtCut / this->qOverPtOverBend())
0338 frontendPass_ = false;
0339 }
0340
0341
0342 StubKiller::KillOptions killScenario = static_cast<StubKiller::KillOptions>(settings_->killScenario());
0343 if (killScenario != StubKiller::KillOptions::none) {
0344 bool kill = stubKiller->killStub(ttStubRef_.get());
0345 if (kill)
0346 frontendPass_ = false;
0347 }
0348 }
0349
0350
0351 double Stub::approxB() {
0352 if (tiltedBarrel()) {
0353 return settings_->bApprox_gradient() * std::abs(z_) / r_ + settings_->bApprox_intercept();
0354 } else {
0355 return barrel() ? 1 : std::abs(z_) / r_;
0356 }
0357 }
0358
0359
0360
0361 void Stub::calcDphiOverBend() {
0362
0363 if (settings_->useApproxB()) {
0364 float dphiOverBendCorrection_approx_ = approxB();
0365 dphiOverBend_ = trackerModule_->pitchOverSep() * dphiOverBendCorrection_approx_;
0366 } else {
0367 float dphiOverBendCorrection_ = std::abs(cos(this->theta() - trackerModule_->tiltAngle()) / sin(this->theta()));
0368 dphiOverBend_ = trackerModule_->pitchOverSep() * dphiOverBendCorrection_;
0369 }
0370 }
0371
0372
0373
0374
0375 void Stub::fillTruth(const map<edm::Ptr<TrackingParticle>, const TP*>& translateTP,
0376 const edm::Handle<TTStubAssMap>& mcTruthTTStubHandle,
0377 const edm::Handle<TTClusterAssMap>& mcTruthTTClusterHandle) {
0378
0379
0380 bool genuine = mcTruthTTStubHandle->isGenuine(ttStubRef_);
0381 assocTP_ = nullptr;
0382
0383
0384 if (genuine) {
0385 edm::Ptr<TrackingParticle> tpPtr = mcTruthTTStubHandle->findTrackingParticlePtr(ttStubRef_);
0386 if (translateTP.find(tpPtr) != translateTP.end()) {
0387 assocTP_ = translateTP.at(tpPtr);
0388
0389 }
0390 }
0391
0392
0393
0394 if (settings_->stubMatchStrict()) {
0395
0396 if (assocTP_ != nullptr)
0397 assocTPs_.insert(assocTP_);
0398
0399 } else {
0400
0401
0402 for (unsigned int iClus = 0; iClus <= 1; iClus++) {
0403 const TTClusterRef& ttClusterRef = ttStubRef_->clusterRef(iClus);
0404
0405
0406 vector<edm::Ptr<TrackingParticle> > vecTpPtr = mcTruthTTClusterHandle->findTrackingParticlePtrs(ttClusterRef);
0407
0408 for (const edm::Ptr<TrackingParticle>& tpPtr : vecTpPtr) {
0409 if (translateTP.find(tpPtr) != translateTP.end()) {
0410 assocTPs_.insert(translateTP.at(tpPtr));
0411
0412 }
0413 }
0414 }
0415 }
0416
0417
0418
0419 for (unsigned int iClus = 0; iClus <= 1; iClus++) {
0420 const TTClusterRef& ttClusterRef = ttStubRef_->clusterRef(iClus);
0421
0422 bool genuineCluster = mcTruthTTClusterHandle->isGenuine(ttClusterRef);
0423 assocTPofCluster_[iClus] = nullptr;
0424
0425
0426 if (genuineCluster) {
0427 edm::Ptr<TrackingParticle> tpPtr = mcTruthTTClusterHandle->findTrackingParticlePtr(ttClusterRef);
0428
0429 if (translateTP.find(tpPtr) != translateTP.end()) {
0430 assocTPofCluster_[iClus] = translateTP.at(tpPtr);
0431
0432 }
0433 }
0434 }
0435 }
0436 }