From d5921238ba3eaa690ed7825029ff0416908c909b Mon Sep 17 00:00:00 2001 From: Ian Tomalin Date: Mon, 22 Dec 2025 13:38:27 +0000 Subject: [PATCH 01/11] Added two extra functions returning info --- .../TrackFindingTracklet/interface/HitPatternHelper.h | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/L1Trigger/TrackFindingTracklet/interface/HitPatternHelper.h b/L1Trigger/TrackFindingTracklet/interface/HitPatternHelper.h index 7d142cc7dbbd9..67db4556004a1 100644 --- a/L1Trigger/TrackFindingTracklet/interface/HitPatternHelper.h +++ b/L1Trigger/TrackFindingTracklet/interface/HitPatternHelper.h @@ -16,6 +16,9 @@ // considers truncaton effect and is bit/clock cycle accurate. // With this version of the KF, HitPatternHelper makes predictions based on the spatial coordinates of tracks and detector modules. // +// WARNING: This code needs major revision. There is several bugs, and half the functions here only work +// correctly for HYBRID_NEWKF, and the other half only work correctly for HYBRID. +// // Created by J.Li on 1/23/21. // @@ -66,9 +69,8 @@ namespace hph { int etaRegion(double z0, double cot, bool useNewKF) const; const std::vector& layerEncoding(double zT) const { return layerEncoding_->layerEncoding(zT); } // LayerEncoding call filling numPS, num2S, numMissingPS and numMissingPS for given hitPattern and trajectory - void analyze( - int hitpattern, double cot, double z0, int& numPS, int& num2S, int& numMissingPS, int& numMissing2S) const { - layerEncoding_->analyze(hitpattern, cot, z0, numPS, num2S, numMissingPS, numMissing2S); + void analyze(int hitpattern, double cot, double z0, int& rzSect, int& numPS, int& num2S, int& numMissingPS, int& numMissing2S) const { + layerEncoding_->analyze(hitpattern, cot, z0, rzSect, numPS, num2S, numMissingPS, numMissing2S); } private: @@ -117,6 +119,7 @@ namespace hph { int reducedId( int layerId); //Converts layer ID (1~6->L1~L6;11~15->D1~D5) to reduced layer ID (0~5->L1~L6;6~10->D1~D5) int findLayer(int layerId); //Search for a layer ID from sensor modules + bool newKF() const {return useNewKF_;} private: const Setup* setup_; From a66757517554c12b4d276327ba826db9386825af Mon Sep 17 00:00:00 2001 From: Ian Tomalin Date: Mon, 22 Dec 2025 13:39:28 +0000 Subject: [PATCH 02/11] Added protection against memory overwriting + other stuff --- .../src/HitPatternHelper.cc | 60 ++++++++++--------- 1 file changed, 33 insertions(+), 27 deletions(-) diff --git a/L1Trigger/TrackFindingTracklet/src/HitPatternHelper.cc b/L1Trigger/TrackFindingTracklet/src/HitPatternHelper.cc index 8f3ca57a62443..ba968726c6cea 100644 --- a/L1Trigger/TrackFindingTracklet/src/HitPatternHelper.cc +++ b/L1Trigger/TrackFindingTracklet/src/HitPatternHelper.cc @@ -27,7 +27,7 @@ namespace hph { nKalmanLayers_(tmtt::KFbase::nKFlayer_) { if (useNewKF_) { chosenRofZ_ = chosenRofZNewKF_; - etaRegions_ = etaRegionsNewKF_; + etaRegions_ = etaRegionsNewKF_; // TO FIX: Not defined } else { chosenRofZ_ = iConfig.chosenRofZ_; etaRegions_ = iConfig.etaRegions_; @@ -60,7 +60,7 @@ namespace hph { layerEncoding_(setup->layerEncoding(zT_)), numExpLayer_(layerEncoding_.size()), hitpattern_(hitpattern), - etaSector_(setup_->etaRegion(z0, cot, useNewKF_)), + etaSector_(setup_->etaRegion(z0, cot, useNewKF_)), // Only works for old KF numMissingLayer_(0), numMissingPS_(0), numMissing2S_(0), @@ -70,14 +70,16 @@ namespace hph { numMissingInterior2_(0), binary_(11, 0), //there are 11 unique layer IDs, as defined in variable "layerIds" bonusFeatures_() { - setup->analyze(hitpattern, cot, z0, numPS_, num2S_, numMissingPS_, numMissing2S_); + // FIX: Function analyze is only designed to work correctly for NEWKF. + int rzSect = 0; + setup->analyze(hitpattern, cot, z0, rzSect, numPS_, num2S_, numMissingPS_, numMissing2S_); + if (useNewKF_) etaSector_ = rzSect; int kf_eta_reg = etaSector_; if (kf_eta_reg < ((int)etaRegions_.size() - 1) / 2) { kf_eta_reg = ((int)etaRegions_.size() - 1) / 2 - 1 - kf_eta_reg; } else { kf_eta_reg = kf_eta_reg - (int)(etaRegions_.size() - 1) / 2; } - int nbits = floor(log2(hitpattern_)) + 1; int lay_i = 0; bool seq = false; @@ -105,12 +107,12 @@ namespace hph { if (hphDebug_) { if (useNewKF_) { - edm::LogVerbatim("TrackTriggerHPH") << "Running with New KF"; + edm::LogVerbatim("Tracklet") << "Running with New KF"; } else { - edm::LogVerbatim("TrackTriggerHPH") << "Running with Old KF"; + edm::LogVerbatim("Tracklet") << "Running with Old KF"; } - edm::LogVerbatim("TrackTriggerHPH") << "======================================================"; - edm::LogVerbatim("TrackTriggerHPH") + edm::LogVerbatim("Tracklet") << "======================================================"; + edm::LogVerbatim("Tracklet") << "Looking at hitpattern " << std::bitset<7>(hitpattern_) << "; Looping over KF layers:"; } @@ -118,23 +120,27 @@ namespace hph { //New KF uses sensor modules to determine the hitmask already for (int i = 0; i < numExpLayer_; i++) { if (hphDebug_) { - edm::LogVerbatim("TrackTriggerHPH") << "--------------------------"; - edm::LogVerbatim("TrackTriggerHPH") << "Looking at KF layer " << i; + edm::LogVerbatim("Tracklet") << "--------------------------"; + edm::LogVerbatim("Tracklet") << "Looking at KF layer " << i; if (layerEncoding_[i] < 10) { - edm::LogVerbatim("TrackTriggerHPH") << "KF expects L" << layerEncoding_[i]; + edm::LogVerbatim("Tracklet") << "KF expects L" << layerEncoding_[i]; } else { - edm::LogVerbatim("TrackTriggerHPH") << "KF expects D" << layerEncoding_[i] - 10; + edm::LogVerbatim("Tracklet") << "KF expects D" << layerEncoding_[i] - 10; } } if (((1 << i) & hitpattern_) >> i) { if (hphDebug_) { - edm::LogVerbatim("TrackTriggerHPH") << "Layer found in hitpattern"; + edm::LogVerbatim("Tracklet") << "Layer found in hitpattern"; + } + if (layerEncoding_[i] < 0) { + edm::LogError("Tracklet") << "Track's hit-pattern shows stub in non-traversed layer"; + continue; } binary_[reducedId(layerEncoding_[i])] = 1; } else { if (hphDebug_) { - edm::LogVerbatim("TrackTriggerHPH") << "Layer missing in hitpattern"; + edm::LogVerbatim("Tracklet") << "Layer missing in hitpattern"; } } } @@ -144,13 +150,13 @@ namespace hph { for (int i = 0; i < nKalmanLayers_; i++) { //Loop over each digit of hitpattern if (hphDebug_) { - edm::LogVerbatim("TrackTriggerHPH") << "--------------------------"; - edm::LogVerbatim("TrackTriggerHPH") << "Looking at KF layer " << i; + edm::LogVerbatim("Tracklet") << "--------------------------"; + edm::LogVerbatim("Tracklet") << "Looking at KF layer " << i; } if (layermap_[kf_eta_reg][i].empty()) { if (hphDebug_) { - edm::LogVerbatim("TrackTriggerHPH") << "KF does not expect this layer"; + edm::LogVerbatim("Tracklet") << "KF does not expect this layer"; } continue; @@ -161,9 +167,9 @@ namespace hph { if (hphDebug_) { if (j < 10) { - edm::LogVerbatim("TrackTriggerHPH") << "KF expects L" << j; + edm::LogVerbatim("Tracklet") << "KF expects L" << j; } else { - edm::LogVerbatim("TrackTriggerHPH") << "KF expects D" << j - 10; + edm::LogVerbatim("Tracklet") << "KF expects D" << j - 10; } } @@ -171,24 +177,24 @@ namespace hph { if (k < 0) { //k<0 means even though layer j is predicted by Old KF, this prediction is rejected because it contradicts if (hphDebug_) { //a more accurate prediction made with the help of information from sensor modules - edm::LogVerbatim("TrackTriggerHPH") << "Rejected by sensor modules"; + edm::LogVerbatim("Tracklet") << "Rejected by sensor modules"; } continue; } if (hphDebug_) { - edm::LogVerbatim("TrackTriggerHPH") << "Confirmed by sensor modules"; + edm::LogVerbatim("Tracklet") << "Confirmed by sensor modules"; } //prediction is accepted if (((1 << i) & hitpattern_) >> i) { if (hphDebug_) { - edm::LogVerbatim("TrackTriggerHPH") << "Layer found in hitpattern"; + edm::LogVerbatim("Tracklet") << "Layer found in hitpattern"; } binary_[reducedId(j)] = 1; } else { if (hphDebug_) { - edm::LogVerbatim("TrackTriggerHPH") << "Layer missing in hitpattern"; + edm::LogVerbatim("Tracklet") << "Layer missing in hitpattern"; } } } @@ -196,10 +202,10 @@ namespace hph { } if (hphDebug_) { - edm::LogVerbatim("TrackTriggerHPH") << "------------------------------"; - edm::LogVerbatim("TrackTriggerHPH") << "numPS = " << numPS_ << ", num2S = " << num2S_ + edm::LogVerbatim("Tracklet") << "------------------------------"; + edm::LogVerbatim("Tracklet") << "numPS = " << numPS_ << ", num2S = " << num2S_ << ", missingPS = " << numMissingPS_ << ", missing2S = " << numMissing2S_; - edm::LogVerbatim("TrackTriggerHPH") << "======================================================"; + edm::LogVerbatim("Tracklet") << "======================================================"; } } @@ -228,7 +234,7 @@ namespace hph { int HitPatternHelper::reducedId(int layerId) { if (hphDebug_ && (layerId > 15 || layerId < 1)) { - edm::LogVerbatim("TrackTriggerHPH") << "Warning: invalid layer id !"; + edm::LogVerbatim("Tracklet") << "Warning: invalid layer id !"; } if (layerId <= 6) { layerId = layerId - 1; From d57e6547031bd12b739bcdca57eb0933b8388c5b Mon Sep 17 00:00:00 2001 From: Ian Tomalin Date: Mon, 22 Dec 2025 13:40:05 +0000 Subject: [PATCH 03/11] Fixed bugs in creation of hit pattern --- L1Trigger/TrackFindingTracklet/src/TrackFindingProcessor.cc | 5 ++++- L1Trigger/TrackFindingTracklet/src/TrackQuality.cc | 5 +++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/L1Trigger/TrackFindingTracklet/src/TrackFindingProcessor.cc b/L1Trigger/TrackFindingTracklet/src/TrackFindingProcessor.cc index 05292f933f3ff..a6578a5a8ca77 100644 --- a/L1Trigger/TrackFindingTracklet/src/TrackFindingProcessor.cc +++ b/L1Trigger/TrackFindingTracklet/src/TrackFindingProcessor.cc @@ -80,8 +80,11 @@ namespace trklet { if (!valid_) return; // create bit vectors + + // hitpattern() returns a TTBV object, with bitset data member. str() does not flip this. std::string s = trackTQ.hitPattern().str(); - s.resize(TTTrack_TrackWord::TrackBitWidths::kHitPatternSize); + // Drop outermost (8th) track layer, as data format foresees only 7 bits. + s.erase(0,1); hitPattern_ = TTBV(s); const TTBV other = TTBV(0, 2 * TTTrack_TrackWord::TrackBitWidths::kMVAQualitySize); const TTBV chi2bend = TTBV(0, TTTrack_TrackWord::TrackBitWidths::kBendChi2Size); diff --git a/L1Trigger/TrackFindingTracklet/src/TrackQuality.cc b/L1Trigger/TrackFindingTracklet/src/TrackQuality.cc index 4728551903b0a..1e555217ffd4e 100644 --- a/L1Trigger/TrackFindingTracklet/src/TrackQuality.cc +++ b/L1Trigger/TrackFindingTracklet/src/TrackQuality.cc @@ -89,8 +89,10 @@ namespace trklet { // transform double to AP_FIXED_BDT static const double d = std::pow(2., 10); const std::vector features({nStubs, zT / d, cot / d, chi20 / d, chi21 / d, nGaps}); - // BDT Inference + + // Run the Track Quality BDT calculation const AP_FIXED_BDT mvaFixed = bdt_->decision_function(features).at(0); + const AP_INT_BDT mvaInt = mvaFixed.range(mvaFixed.width - 1, 0); // bin mva const std::vector& binEdges = channelAssignment_->tqBinEdges(); @@ -100,7 +102,6 @@ namespace trklet { break; // build output Track std::string s = hitPattern.str(); - std::reverse(s.begin(), s.end()); TrackTQ trackTQ(*frame.track_, s, mva, chi20F, chi21F); // store result output.push_back(trackTQ.frame()); From a2915083218f5f2e460aaacbb3377790a13d5b7a Mon Sep 17 00:00:00 2001 From: Ian Tomalin Date: Mon, 22 Dec 2025 13:40:49 +0000 Subject: [PATCH 04/11] Added summary stats to MessageLogger --- L1Trigger/TrackFindingTracklet/test/L1TrackNtupleMaker_cfg.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/L1Trigger/TrackFindingTracklet/test/L1TrackNtupleMaker_cfg.py b/L1Trigger/TrackFindingTracklet/test/L1TrackNtupleMaker_cfg.py index 010b65bc4c341..8e489f55e660f 100644 --- a/L1Trigger/TrackFindingTracklet/test/L1TrackNtupleMaker_cfg.py +++ b/L1Trigger/TrackFindingTracklet/test/L1TrackNtupleMaker_cfg.py @@ -40,8 +40,8 @@ process.load('FWCore.MessageService.MessageLogger_cfi') process.MessageLogger.L1track = dict(limit = -1) process.MessageLogger.Tracklet = dict(limit = -1) -process.MessageLogger.TrackTriggerHPH = dict(limit = -1) - +process.MessageLogger.cout.enableStatistics = True +process.MessageLogger.cerr.enableStatistics = True print("using geometry " + GEOMETRY + " (tilted)") process.load('Configuration.Geometry.GeometryExtendedRun4' + GEOMETRY + 'Reco_cff') From b9b6539bf13256459979c8369b8c3d141fcdd32a Mon Sep 17 00:00:00 2001 From: Ian Tomalin Date: Mon, 22 Dec 2025 13:42:26 +0000 Subject: [PATCH 05/11] Add option to return rz sector --- L1Trigger/TrackerTFP/interface/LayerEncoding.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/L1Trigger/TrackerTFP/interface/LayerEncoding.h b/L1Trigger/TrackerTFP/interface/LayerEncoding.h index 7e7c74855c26f..354f58ffbbd0d 100644 --- a/L1Trigger/TrackerTFP/interface/LayerEncoding.h +++ b/L1Trigger/TrackerTFP/interface/LayerEncoding.h @@ -32,9 +32,10 @@ namespace trackerTFP { int maybePS(int zT) const; // encoded layer id which may be PS or 2S for given zT in cm int maybePS(double zT) const; - // fills numPS, num2S, numMissingPS and numMissingPS for given hitPattern and trajectory - void analyze( - int hitpattern, double cot, double z0, int& numPS, int& num2S, int& numMissingPS, int& numMissing2S) const; + // sector in r-z plane + int rzSector(double zT) const {return zT_->integer(zT);} + // fills r-z sector, numPS, num2S, numMissingPS and numMissingPS for given hitPattern and trajectory + void analyze(int hitpattern, double cot, double z0, int& rzSect, int& numPS, int& num2S, int& numMissingPS, int& numMissing2S) const; private: // helper class providing run-time constants From e2c0224d692a6f19789aef64891e5720c149c273 Mon Sep 17 00:00:00 2001 From: Ian Tomalin Date: Mon, 22 Dec 2025 13:43:04 +0000 Subject: [PATCH 06/11] Fixed bug in PS r boundary --- L1Trigger/TrackerTFP/src/LayerEncoding.cc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/L1Trigger/TrackerTFP/src/LayerEncoding.cc b/L1Trigger/TrackerTFP/src/LayerEncoding.cc index fd093ea243a40..3d8e0e56238e4 100644 --- a/L1Trigger/TrackerTFP/src/LayerEncoding.cc +++ b/L1Trigger/TrackerTFP/src/LayerEncoding.cc @@ -160,10 +160,10 @@ namespace trackerTFP { } // fills numPS, num2S, numMissingPS and numMissingPS for given hitPattern and trajectory - void LayerEncoding::analyze( - int hitpattern, double cot, double z0, int& numPS, int& num2S, int& numMissingPS, int& numMissing2S) const { + void LayerEncoding::analyze(int hitpattern, double cot, double z0, int& rzSect, int& numPS, int& num2S, int& numMissingPS, int& numMissing2S) const { // look up layer encoding nad maybe pattern const double zT = z0 + setup_->chosenRofZ() * cot; + rzSect = this->rzSector(zT); const std::vector& le = this->layerEncoding(zT); const TTBV& mp = this->maybePattern(zT); const TTBV hp(hitpattern, setup_->numLayers()); @@ -180,8 +180,8 @@ namespace trackerTFP { // avergae disk z position const double z = setup_->hybridDiskZ(diskId) * (cot < 0. ? -1. : 1.); // innermost edge of 2S modules - const double rLimit = setup_->disk2SR(diskId, 0) - setup_->pitchCol2S(); - // trajectory radius at avergae disk z position + double rLimit = setup_->disk2SR(diskId, 0) - 0.5*setup_->pitchCol2S(); + // trajectory radius at average disk z position const double r = (z - z0) / cot; // compare with innermost edge of 2S modules to identify PS if (r < rLimit) @@ -189,7 +189,7 @@ namespace trackerTFP { } if (hp.test(layerIdKF)) // layer is hit ps ? numPS++ : num2S++; - else if (!mp.test(layerIdKF)) // layer is not hit but should have been hitted (roughly by) trajectory + else if (!mp.test(layerIdKF)) // layer is not hit but should have been hit (roughly) by trajectory ps ? numMissingPS++ : numMissing2S++; } } From 9aa5e1cecf1ce2603c6c9d31b8a82d6007a2ae01 Mon Sep 17 00:00:00 2001 From: Ian Tomalin Date: Mon, 22 Dec 2025 13:43:35 +0000 Subject: [PATCH 07/11] Added check of hit pattern info --- .../test/L1TrackNtupleMaker.cc | 37 ++++++++++++++++++- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/L1Trigger/TrackFindingTracklet/test/L1TrackNtupleMaker.cc b/L1Trigger/TrackFindingTracklet/test/L1TrackNtupleMaker.cc index bcae2d3db83e6..a4342c5e99c99 100644 --- a/L1Trigger/TrackFindingTracklet/test/L1TrackNtupleMaker.cc +++ b/L1Trigger/TrackFindingTracklet/test/L1TrackNtupleMaker.cc @@ -177,6 +177,7 @@ class L1TrackNtupleMaker : public one::EDAnalyzer* m_trk_lhits; std::vector* m_trk_dhits; std::vector* m_trk_seed; + // WARNING - info unpacked from the hit pattern is unrelable due to bugs in HitPatternHelper std::vector* m_trk_hitpattern; std::vector* m_trk_lhits_hitpattern; // 6-digit hit mask (barrel layer only) dervied from hitpattern std::vector* m_trk_dhits_hitpattern; // disk only @@ -1101,6 +1102,7 @@ void L1TrackNtupleMaker::analyze(const edm::Event& iEvent, const edm::EventSetup int tmp_trk_hitpattern = 0; tmp_trk_hitpattern = (int)iterL1Track->hitPattern(); + // TO FIX -- The HitPatternHelper code contains several bugs & design flaws. hph::HitPatternHelper hph(hphSetup, tmp_trk_hitpattern, tmp_trk_tanL, tmp_trk_z0); std::vector hitpattern_expanded_binary = hph.binary(); int tmp_trk_lhits_hitpattern = 0; @@ -1165,6 +1167,8 @@ void L1TrackNtupleMaker::analyze(const edm::Event& iEvent, const edm::EventSetup //float tmp_trk_bend_chi2 = 0; int tmp_trk_dhits = 0; int tmp_trk_lhits = 0; + set hitLayPS; + set hitLay2S; if (true) { // loop over stubs @@ -1181,13 +1185,14 @@ void L1TrackNtupleMaker::analyze(const edm::Event& iEvent, const edm::EventSetup double z = posStub.z(); int layer = -999999; - if (detIdStub.subdetId() == StripSubdetector::TOB) { + bool barrel = (detIdStub.subdetId() == StripSubdetector::TOB); + if (barrel) { layer = static_cast(tTopo->layer(detIdStub)); if (DebugMode) edm::LogVerbatim("Tracklet") << " stub in layer " << layer << " at position x y z = " << x << " " << y << " " << z; tmp_trk_lhits += pow(10, layer - 1); - } else if (detIdStub.subdetId() == StripSubdetector::TID) { + } else { layer = static_cast(tTopo->layer(detIdStub)); if (DebugMode) edm::LogVerbatim("Tracklet") @@ -1195,8 +1200,36 @@ void L1TrackNtupleMaker::analyze(const edm::Event& iEvent, const edm::EventSetup tmp_trk_dhits += pow(10, layer - 1); } + bool psMod = (theTrackerGeom->getDetectorType(detIdStub) == TrackerGeometry::ModuleType::Ph2PSP); + int layerdisk = barrel ? layer : 10 + layer; + if (psMod) { + hitLayPS.insert(layerdisk); + } else { + hitLay2S.insert(layerdisk); + } } //end loop over stubs } + + // Check accuracy of hit pattern info. + if (DebugMode && hph.newKF()) { + // Only bother for New KF, as HitPatternHelper buggy for Old KF. + if (hph.numPS() != int(hitLayPS.size()) || hph.num2S() != int(hitLay2S.size())) { + // Some inaccuracy expected, as estimating number of PS stubs from hit pattern is approximate, + // due to r-boundary of PS-2S not being well defined, and due to truncation of hit pattern + // from 8 to 7 bits. + std::stringstream ss; + ss <<"Number of layers with stubs estimated from hit pattern is inaccurate: (PS,2S) = (" + < Date: Mon, 22 Dec 2025 13:44:31 +0000 Subject: [PATCH 08/11] auto code format --- .../interface/HitPatternHelper.h | 11 ++++++-- .../src/HitPatternHelper.cc | 13 +++++----- .../src/TrackFindingProcessor.cc | 2 +- .../TrackFindingTracklet/src/TrackQuality.cc | 4 +-- .../test/L1TrackNtupleMaker.cc | 26 ++++++++++--------- .../TrackerTFP/interface/LayerEncoding.h | 11 ++++++-- L1Trigger/TrackerTFP/src/LayerEncoding.cc | 11 ++++++-- 7 files changed, 51 insertions(+), 27 deletions(-) diff --git a/L1Trigger/TrackFindingTracklet/interface/HitPatternHelper.h b/L1Trigger/TrackFindingTracklet/interface/HitPatternHelper.h index 67db4556004a1..16d8d9acb4d05 100644 --- a/L1Trigger/TrackFindingTracklet/interface/HitPatternHelper.h +++ b/L1Trigger/TrackFindingTracklet/interface/HitPatternHelper.h @@ -69,7 +69,14 @@ namespace hph { int etaRegion(double z0, double cot, bool useNewKF) const; const std::vector& layerEncoding(double zT) const { return layerEncoding_->layerEncoding(zT); } // LayerEncoding call filling numPS, num2S, numMissingPS and numMissingPS for given hitPattern and trajectory - void analyze(int hitpattern, double cot, double z0, int& rzSect, int& numPS, int& num2S, int& numMissingPS, int& numMissing2S) const { + void analyze(int hitpattern, + double cot, + double z0, + int& rzSect, + int& numPS, + int& num2S, + int& numMissingPS, + int& numMissing2S) const { layerEncoding_->analyze(hitpattern, cot, z0, rzSect, numPS, num2S, numMissingPS, numMissing2S); } @@ -119,7 +126,7 @@ namespace hph { int reducedId( int layerId); //Converts layer ID (1~6->L1~L6;11~15->D1~D5) to reduced layer ID (0~5->L1~L6;6~10->D1~D5) int findLayer(int layerId); //Search for a layer ID from sensor modules - bool newKF() const {return useNewKF_;} + bool newKF() const { return useNewKF_; } private: const Setup* setup_; diff --git a/L1Trigger/TrackFindingTracklet/src/HitPatternHelper.cc b/L1Trigger/TrackFindingTracklet/src/HitPatternHelper.cc index ba968726c6cea..ecd6a69843bec 100644 --- a/L1Trigger/TrackFindingTracklet/src/HitPatternHelper.cc +++ b/L1Trigger/TrackFindingTracklet/src/HitPatternHelper.cc @@ -27,7 +27,7 @@ namespace hph { nKalmanLayers_(tmtt::KFbase::nKFlayer_) { if (useNewKF_) { chosenRofZ_ = chosenRofZNewKF_; - etaRegions_ = etaRegionsNewKF_; // TO FIX: Not defined + etaRegions_ = etaRegionsNewKF_; // TO FIX: Not defined } else { chosenRofZ_ = iConfig.chosenRofZ_; etaRegions_ = iConfig.etaRegions_; @@ -60,7 +60,7 @@ namespace hph { layerEncoding_(setup->layerEncoding(zT_)), numExpLayer_(layerEncoding_.size()), hitpattern_(hitpattern), - etaSector_(setup_->etaRegion(z0, cot, useNewKF_)), // Only works for old KF + etaSector_(setup_->etaRegion(z0, cot, useNewKF_)), // Only works for old KF numMissingLayer_(0), numMissingPS_(0), numMissing2S_(0), @@ -73,7 +73,8 @@ namespace hph { // FIX: Function analyze is only designed to work correctly for NEWKF. int rzSect = 0; setup->analyze(hitpattern, cot, z0, rzSect, numPS_, num2S_, numMissingPS_, numMissing2S_); - if (useNewKF_) etaSector_ = rzSect; + if (useNewKF_) + etaSector_ = rzSect; int kf_eta_reg = etaSector_; if (kf_eta_reg < ((int)etaRegions_.size() - 1) / 2) { kf_eta_reg = ((int)etaRegions_.size() - 1) / 2 - 1 - kf_eta_reg; @@ -112,8 +113,8 @@ namespace hph { edm::LogVerbatim("Tracklet") << "Running with Old KF"; } edm::LogVerbatim("Tracklet") << "======================================================"; - edm::LogVerbatim("Tracklet") - << "Looking at hitpattern " << std::bitset<7>(hitpattern_) << "; Looping over KF layers:"; + edm::LogVerbatim("Tracklet") << "Looking at hitpattern " << std::bitset<7>(hitpattern_) + << "; Looping over KF layers:"; } if (useNewKF_) { @@ -204,7 +205,7 @@ namespace hph { if (hphDebug_) { edm::LogVerbatim("Tracklet") << "------------------------------"; edm::LogVerbatim("Tracklet") << "numPS = " << numPS_ << ", num2S = " << num2S_ - << ", missingPS = " << numMissingPS_ << ", missing2S = " << numMissing2S_; + << ", missingPS = " << numMissingPS_ << ", missing2S = " << numMissing2S_; edm::LogVerbatim("Tracklet") << "======================================================"; } } diff --git a/L1Trigger/TrackFindingTracklet/src/TrackFindingProcessor.cc b/L1Trigger/TrackFindingTracklet/src/TrackFindingProcessor.cc index a6578a5a8ca77..5f5e267c277fb 100644 --- a/L1Trigger/TrackFindingTracklet/src/TrackFindingProcessor.cc +++ b/L1Trigger/TrackFindingTracklet/src/TrackFindingProcessor.cc @@ -84,7 +84,7 @@ namespace trklet { // hitpattern() returns a TTBV object, with bitset data member. str() does not flip this. std::string s = trackTQ.hitPattern().str(); // Drop outermost (8th) track layer, as data format foresees only 7 bits. - s.erase(0,1); + s.erase(0, 1); hitPattern_ = TTBV(s); const TTBV other = TTBV(0, 2 * TTTrack_TrackWord::TrackBitWidths::kMVAQualitySize); const TTBV chi2bend = TTBV(0, TTTrack_TrackWord::TrackBitWidths::kBendChi2Size); diff --git a/L1Trigger/TrackFindingTracklet/src/TrackQuality.cc b/L1Trigger/TrackFindingTracklet/src/TrackQuality.cc index 1e555217ffd4e..da43a3de38416 100644 --- a/L1Trigger/TrackFindingTracklet/src/TrackQuality.cc +++ b/L1Trigger/TrackFindingTracklet/src/TrackQuality.cc @@ -89,10 +89,10 @@ namespace trklet { // transform double to AP_FIXED_BDT static const double d = std::pow(2., 10); const std::vector features({nStubs, zT / d, cot / d, chi20 / d, chi21 / d, nGaps}); - + // Run the Track Quality BDT calculation const AP_FIXED_BDT mvaFixed = bdt_->decision_function(features).at(0); - + const AP_INT_BDT mvaInt = mvaFixed.range(mvaFixed.width - 1, 0); // bin mva const std::vector& binEdges = channelAssignment_->tqBinEdges(); diff --git a/L1Trigger/TrackFindingTracklet/test/L1TrackNtupleMaker.cc b/L1Trigger/TrackFindingTracklet/test/L1TrackNtupleMaker.cc index a4342c5e99c99..5b8cc9007497b 100644 --- a/L1Trigger/TrackFindingTracklet/test/L1TrackNtupleMaker.cc +++ b/L1Trigger/TrackFindingTracklet/test/L1TrackNtupleMaker.cc @@ -1185,7 +1185,7 @@ void L1TrackNtupleMaker::analyze(const edm::Event& iEvent, const edm::EventSetup double z = posStub.z(); int layer = -999999; - bool barrel = (detIdStub.subdetId() == StripSubdetector::TOB); + bool barrel = (detIdStub.subdetId() == StripSubdetector::TOB); if (barrel) { layer = static_cast(tTopo->layer(detIdStub)); if (DebugMode) @@ -1201,7 +1201,7 @@ void L1TrackNtupleMaker::analyze(const edm::Event& iEvent, const edm::EventSetup } bool psMod = (theTrackerGeom->getDetectorType(detIdStub) == TrackerGeometry::ModuleType::Ph2PSP); - int layerdisk = barrel ? layer : 10 + layer; + int layerdisk = barrel ? layer : 10 + layer; if (psMod) { hitLayPS.insert(layerdisk); } else { @@ -1218,18 +1218,20 @@ void L1TrackNtupleMaker::analyze(const edm::Event& iEvent, const edm::EventSetup // due to r-boundary of PS-2S not being well defined, and due to truncation of hit pattern // from 8 to 7 bits. std::stringstream ss; - ss <<"Number of layers with stubs estimated from hit pattern is inaccurate: (PS,2S) = (" - <integer(zT);} + int rzSector(double zT) const { return zT_->integer(zT); } // fills r-z sector, numPS, num2S, numMissingPS and numMissingPS for given hitPattern and trajectory - void analyze(int hitpattern, double cot, double z0, int& rzSect, int& numPS, int& num2S, int& numMissingPS, int& numMissing2S) const; + void analyze(int hitpattern, + double cot, + double z0, + int& rzSect, + int& numPS, + int& num2S, + int& numMissingPS, + int& numMissing2S) const; private: // helper class providing run-time constants diff --git a/L1Trigger/TrackerTFP/src/LayerEncoding.cc b/L1Trigger/TrackerTFP/src/LayerEncoding.cc index 3d8e0e56238e4..6c4c19d589eeb 100644 --- a/L1Trigger/TrackerTFP/src/LayerEncoding.cc +++ b/L1Trigger/TrackerTFP/src/LayerEncoding.cc @@ -160,7 +160,14 @@ namespace trackerTFP { } // fills numPS, num2S, numMissingPS and numMissingPS for given hitPattern and trajectory - void LayerEncoding::analyze(int hitpattern, double cot, double z0, int& rzSect, int& numPS, int& num2S, int& numMissingPS, int& numMissing2S) const { + void LayerEncoding::analyze(int hitpattern, + double cot, + double z0, + int& rzSect, + int& numPS, + int& num2S, + int& numMissingPS, + int& numMissing2S) const { // look up layer encoding nad maybe pattern const double zT = z0 + setup_->chosenRofZ() * cot; rzSect = this->rzSector(zT); @@ -180,7 +187,7 @@ namespace trackerTFP { // avergae disk z position const double z = setup_->hybridDiskZ(diskId) * (cot < 0. ? -1. : 1.); // innermost edge of 2S modules - double rLimit = setup_->disk2SR(diskId, 0) - 0.5*setup_->pitchCol2S(); + double rLimit = setup_->disk2SR(diskId, 0) - 0.5 * setup_->pitchCol2S(); // trajectory radius at average disk z position const double r = (z - z0) / cot; // compare with innermost edge of 2S modules to identify PS From 86bbc7cd1096fcf85b432786a4b46bdc0d0573bd Mon Sep 17 00:00:00 2001 From: tschuh Date: Sat, 3 Jan 2026 10:35:21 +0000 Subject: [PATCH 09/11] tschuh 0 --- .../TrackFindingTracklet/src/TrackFindingProcessor.cc | 3 +-- L1Trigger/TrackFindingTracklet/src/TrackQuality.cc | 3 +-- L1Trigger/TrackerTFP/interface/LayerEncoding.h | 6 ++---- L1Trigger/TrackerTFP/src/LayerEncoding.cc | 8 ++++---- 4 files changed, 8 insertions(+), 12 deletions(-) diff --git a/L1Trigger/TrackFindingTracklet/src/TrackFindingProcessor.cc b/L1Trigger/TrackFindingTracklet/src/TrackFindingProcessor.cc index 5f5e267c277fb..cc82d0617a941 100644 --- a/L1Trigger/TrackFindingTracklet/src/TrackFindingProcessor.cc +++ b/L1Trigger/TrackFindingTracklet/src/TrackFindingProcessor.cc @@ -80,9 +80,8 @@ namespace trklet { if (!valid_) return; // create bit vectors - - // hitpattern() returns a TTBV object, with bitset data member. str() does not flip this. std::string s = trackTQ.hitPattern().str(); + std::reverse(s.begin(), s.end()); // Drop outermost (8th) track layer, as data format foresees only 7 bits. s.erase(0, 1); hitPattern_ = TTBV(s); diff --git a/L1Trigger/TrackFindingTracklet/src/TrackQuality.cc b/L1Trigger/TrackFindingTracklet/src/TrackQuality.cc index da43a3de38416..b57a52fd7a8f6 100644 --- a/L1Trigger/TrackFindingTracklet/src/TrackQuality.cc +++ b/L1Trigger/TrackFindingTracklet/src/TrackQuality.cc @@ -89,10 +89,8 @@ namespace trklet { // transform double to AP_FIXED_BDT static const double d = std::pow(2., 10); const std::vector features({nStubs, zT / d, cot / d, chi20 / d, chi21 / d, nGaps}); - // Run the Track Quality BDT calculation const AP_FIXED_BDT mvaFixed = bdt_->decision_function(features).at(0); - const AP_INT_BDT mvaInt = mvaFixed.range(mvaFixed.width - 1, 0); // bin mva const std::vector& binEdges = channelAssignment_->tqBinEdges(); @@ -102,6 +100,7 @@ namespace trklet { break; // build output Track std::string s = hitPattern.str(); + std::reverse(s.begin(), s.end()); TrackTQ trackTQ(*frame.track_, s, mva, chi20F, chi21F); // store result output.push_back(trackTQ.frame()); diff --git a/L1Trigger/TrackerTFP/interface/LayerEncoding.h b/L1Trigger/TrackerTFP/interface/LayerEncoding.h index 078219f48b4e7..c0e1c0b45569d 100644 --- a/L1Trigger/TrackerTFP/interface/LayerEncoding.h +++ b/L1Trigger/TrackerTFP/interface/LayerEncoding.h @@ -32,13 +32,11 @@ namespace trackerTFP { int maybePS(int zT) const; // encoded layer id which may be PS or 2S for given zT in cm int maybePS(double zT) const; - // sector in r-z plane - int rzSector(double zT) const { return zT_->integer(zT); } - // fills r-z sector, numPS, num2S, numMissingPS and numMissingPS for given hitPattern and trajectory + // fills binZT (unsigned), numPS, num2S, numMissingPS and numMissingPS for given hitPattern and trajectory void analyze(int hitpattern, double cot, double z0, - int& rzSect, + int& binZT, int& numPS, int& num2S, int& numMissingPS, diff --git a/L1Trigger/TrackerTFP/src/LayerEncoding.cc b/L1Trigger/TrackerTFP/src/LayerEncoding.cc index 6c4c19d589eeb..b3e562071e270 100644 --- a/L1Trigger/TrackerTFP/src/LayerEncoding.cc +++ b/L1Trigger/TrackerTFP/src/LayerEncoding.cc @@ -159,18 +159,18 @@ namespace trackerTFP { return maybePS(binZT); } - // fills numPS, num2S, numMissingPS and numMissingPS for given hitPattern and trajectory + // fills binZT (unsigned), numPS, num2S, numMissingPS and numMissingPS for given hitPattern and trajectory void LayerEncoding::analyze(int hitpattern, double cot, double z0, - int& rzSect, + int& binZT, int& numPS, int& num2S, int& numMissingPS, int& numMissing2S) const { // look up layer encoding nad maybe pattern const double zT = z0 + setup_->chosenRofZ() * cot; - rzSect = this->rzSector(zT); + binZT = zT_->toUnsigned(zT_->integer(zT)); const std::vector& le = this->layerEncoding(zT); const TTBV& mp = this->maybePattern(zT); const TTBV hp(hitpattern, setup_->numLayers()); @@ -187,7 +187,7 @@ namespace trackerTFP { // avergae disk z position const double z = setup_->hybridDiskZ(diskId) * (cot < 0. ? -1. : 1.); // innermost edge of 2S modules - double rLimit = setup_->disk2SR(diskId, 0) - 0.5 * setup_->pitchCol2S(); + double rLimit = setup_->disk2SR(diskId, 0) - setup_->pitchCol2S(); // trajectory radius at average disk z position const double r = (z - z0) / cot; // compare with innermost edge of 2S modules to identify PS From 98716dac96b3f2f1e0bd68f0c9f05983494619bb Mon Sep 17 00:00:00 2001 From: tschuh Date: Sat, 3 Jan 2026 10:51:04 +0000 Subject: [PATCH 10/11] code format --- L1Trigger/TrackerTFP/src/LayerEncoding.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/L1Trigger/TrackerTFP/src/LayerEncoding.cc b/L1Trigger/TrackerTFP/src/LayerEncoding.cc index b3e562071e270..1b77a448b5497 100644 --- a/L1Trigger/TrackerTFP/src/LayerEncoding.cc +++ b/L1Trigger/TrackerTFP/src/LayerEncoding.cc @@ -159,7 +159,7 @@ namespace trackerTFP { return maybePS(binZT); } - // fills binZT (unsigned), numPS, num2S, numMissingPS and numMissingPS for given hitPattern and trajectory + // fills binZT (unsigned), numPS, num2S, numMissingPS and numMissingPS for given hitPattern and trajectory void LayerEncoding::analyze(int hitpattern, double cot, double z0, From dc4a21dd55d09837dcfef53897b96dfd9b4ad72a Mon Sep 17 00:00:00 2001 From: tschuh Date: Sat, 3 Jan 2026 10:57:48 +0000 Subject: [PATCH 11/11] move critical radius to distinguish between ps and 2s stubs. --- L1Trigger/TrackerTFP/src/LayerEncoding.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/L1Trigger/TrackerTFP/src/LayerEncoding.cc b/L1Trigger/TrackerTFP/src/LayerEncoding.cc index 1b77a448b5497..124cc8dcb9d6a 100644 --- a/L1Trigger/TrackerTFP/src/LayerEncoding.cc +++ b/L1Trigger/TrackerTFP/src/LayerEncoding.cc @@ -186,8 +186,8 @@ namespace trackerTFP { const int diskId = layerId - setup_->offsetLayerDisks() - setup_->offsetLayerId(); // avergae disk z position const double z = setup_->hybridDiskZ(diskId) * (cot < 0. ? -1. : 1.); - // innermost edge of 2S modules - double rLimit = setup_->disk2SR(diskId, 0) - setup_->pitchCol2S(); + // smallest stub radii from 2S disks + double rLimit = setup_->disk2SR(diskId, 0) - .5 * setup_->pitchCol2S(); // trajectory radius at average disk z position const double r = (z - z0) / cot; // compare with innermost edge of 2S modules to identify PS