File indexing completed on 2024-04-06 12:28:12
0001 #include "TkStripMeasurementDet.h"
0002 #include "TrackingTools/TransientTrackingRecHit/interface/InvalidTransientRecHit.h"
0003 #include "Geometry/CommonTopologies/interface/StripTopology.h"
0004 #include "TrackingTools/MeasurementDet/interface/MeasurementDetException.h"
0005 #include "TrackingTools/PatternTools/interface/TrajectoryMeasurement.h"
0006 #include "RecoTracker/TransientTrackingRecHit/interface/TSiStripRecHit2DLocalPos.h"
0007 #include "DataFormats/TrackerRecHit2D/interface/SiStripRecHit2D.h"
0008 #include "TrackingTools/DetLayers/interface/MeasurementEstimator.h"
0009 #include "TrackingTools/PatternTools/interface/TrajMeasLessEstim.h"
0010
0011 #include <typeinfo>
0012 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0013 #include "DataFormats/SiStripDetId/interface/SiStripDetId.h"
0014 #include <cassert>
0015
0016 TkStripMeasurementDet::TkStripMeasurementDet(const GeomDet* gdet, StMeasurementConditionSet& conditions)
0017 : MeasurementDet(gdet), index_(-1), theDetConditions(&conditions) {
0018 if (dynamic_cast<const StripGeomDetUnit*>(gdet) == nullptr) {
0019 throw MeasurementDetException("TkStripMeasurementDet constructed with a GeomDet which is not a StripGeomDetUnit");
0020 }
0021 }
0022
0023
0024 bool TkStripMeasurementDet::empty(const MeasurementTrackerEvent& data) const {
0025 if UNLIKELY ((!isActive(data)) || isEmpty(data.stripData()))
0026 return true;
0027
0028 const detset& detSet = data.stripData().detSet(index());
0029 for (auto ci = detSet.begin(); ci != detSet.end(); ++ci) {
0030 if (isMasked(*ci))
0031 continue;
0032 SiStripClusterRef cluster = detSet.makeRefTo(data.stripData().handle(), ci);
0033 if (accept(cluster, data.stripClustersToSkip()))
0034 return false;
0035 }
0036 return true;
0037 }
0038
0039 TkStripMeasurementDet::RecHitContainer TkStripMeasurementDet::recHits(const TrajectoryStateOnSurface& ts,
0040 const MeasurementTrackerEvent& data) const {
0041 RecHitContainer result;
0042 if UNLIKELY ((!isActive(data)) || isEmpty(data.stripData()))
0043 return result;
0044 const detset& detSet = data.stripData().detSet(index());
0045 result.reserve(detSet.size());
0046 for (new_const_iterator ci = detSet.begin(); ci != detSet.end(); ++ci) {
0047 if (isMasked(*ci))
0048 continue;
0049
0050 SiStripClusterRef cluster = detSet.makeRefTo(data.stripData().handle(), ci);
0051 if (accept(cluster, data.stripClustersToSkip()))
0052 result.push_back(buildRecHit(cluster, ts));
0053 else
0054 LogDebug("TkStripMeasurementDet") << "skipping this str from last iteration on" << rawId()
0055 << " key: " << cluster.key();
0056 }
0057 return result;
0058 }
0059
0060
0061 bool TkStripMeasurementDet::recHits(SimpleHitContainer& result,
0062 const TrajectoryStateOnSurface& stateOnThisDet,
0063 const MeasurementEstimator& est,
0064 const MeasurementTrackerEvent& data) const {
0065 if UNLIKELY ((!isActive(data)) || isEmpty(data.stripData()))
0066 return false;
0067 auto oldSize = result.size();
0068
0069 int utraj = specificGeomDet().specificTopology().measurementPosition(stateOnThisDet.localPosition()).x();
0070 const detset& detSet = data.stripData().detSet(index());
0071 auto const& cpepar = cpe()->getAlgoParam(specificGeomDet(), stateOnThisDet.localParameters());
0072
0073 auto rightCluster = std::find_if(
0074 detSet.begin(), detSet.end(), [utraj](const SiStripCluster& hit) { return hit.firstStrip() > utraj; });
0075
0076 std::vector<SiStripRecHit2D> tmp;
0077 if (rightCluster != detSet.begin()) {
0078
0079 auto leftCluster = rightCluster;
0080 while (--leftCluster >= detSet.begin()) {
0081 SiStripClusterRef clusterref = detSet.makeRefTo(data.stripData().handle(), leftCluster);
0082 bool isCompatible = filteredRecHits(clusterref, cpepar, stateOnThisDet, est, data.stripClustersToSkip(), tmp);
0083 if (!isCompatible)
0084 break;
0085 for (auto&& h : tmp)
0086 result.push_back(new SiStripRecHit2D(h));
0087 tmp.clear();
0088 }
0089 }
0090 for (; rightCluster != detSet.end(); rightCluster++) {
0091 SiStripClusterRef clusterref = detSet.makeRefTo(data.stripData().handle(), rightCluster);
0092 bool isCompatible = filteredRecHits(clusterref, cpepar, stateOnThisDet, est, data.stripClustersToSkip(), tmp);
0093 if (!isCompatible)
0094 break;
0095 for (auto&& h : tmp)
0096 result.push_back(new SiStripRecHit2D(h));
0097 tmp.clear();
0098 }
0099
0100 return result.size() > oldSize;
0101 }
0102
0103 bool TkStripMeasurementDet::simpleRecHits(const TrajectoryStateOnSurface& stateOnThisDet,
0104 const MeasurementEstimator& est,
0105 const MeasurementTrackerEvent& data,
0106 std::vector<SiStripRecHit2D>& result) const {
0107 if UNLIKELY ((!isActive(data)) || isEmpty(data.stripData()))
0108 return false;
0109
0110 auto oldSize = result.size();
0111
0112 int utraj = specificGeomDet().specificTopology().measurementPosition(stateOnThisDet.localPosition()).x();
0113 const detset& detSet = data.stripData().detSet(index());
0114 auto const& cpepar = cpe()->getAlgoParam(specificGeomDet(), stateOnThisDet.localParameters());
0115
0116 auto rightCluster = std::find_if(
0117 detSet.begin(), detSet.end(), [utraj](const SiStripCluster& hit) { return hit.firstStrip() > utraj; });
0118
0119 if (rightCluster != detSet.begin()) {
0120
0121 auto leftCluster = rightCluster;
0122 while (--leftCluster >= detSet.begin()) {
0123 SiStripClusterRef clusterref = detSet.makeRefTo(data.stripData().handle(), leftCluster);
0124 bool isCompatible = filteredRecHits(clusterref, cpepar, stateOnThisDet, est, data.stripClustersToSkip(), result);
0125 if (!isCompatible)
0126 break;
0127 }
0128 }
0129 for (; rightCluster != detSet.end(); rightCluster++) {
0130 SiStripClusterRef clusterref = detSet.makeRefTo(data.stripData().handle(), rightCluster);
0131 bool isCompatible = filteredRecHits(clusterref, cpepar, stateOnThisDet, est, data.stripClustersToSkip(), result);
0132 if (!isCompatible)
0133 break;
0134 }
0135
0136 return result.size() > oldSize;
0137 }
0138
0139 bool TkStripMeasurementDet::recHits(const TrajectoryStateOnSurface& stateOnThisDet,
0140 const MeasurementEstimator& est,
0141 const MeasurementTrackerEvent& data,
0142 RecHitContainer& result,
0143 std::vector<float>& diffs) const {
0144 if UNLIKELY ((!isActive(data)) || isEmpty(data.stripData()))
0145 return false;
0146
0147 auto oldSize = result.size();
0148 auto const& cpepar = cpe()->getAlgoParam(specificGeomDet(), stateOnThisDet.localParameters());
0149
0150 int utraj = specificGeomDet().specificTopology().measurementPosition(stateOnThisDet.localPosition()).x();
0151
0152 const detset& detSet = data.stripData().detSet(index());
0153 auto rightCluster = std::find_if(
0154 detSet.begin(), detSet.end(), [utraj](const SiStripCluster& hit) { return hit.firstStrip() > utraj; });
0155
0156 if (rightCluster != detSet.begin()) {
0157
0158 auto leftCluster = rightCluster;
0159 while (--leftCluster >= detSet.begin()) {
0160 SiStripClusterRef clusterref = detSet.makeRefTo(data.stripData().handle(), leftCluster);
0161 bool isCompatible =
0162 filteredRecHits(clusterref, cpepar, stateOnThisDet, est, data.stripClustersToSkip(), result, diffs);
0163 if (!isCompatible)
0164 break;
0165 }
0166 }
0167 for (; rightCluster != detSet.end(); rightCluster++) {
0168 SiStripClusterRef clusterref = detSet.makeRefTo(data.stripData().handle(), rightCluster);
0169 bool isCompatible =
0170 filteredRecHits(clusterref, cpepar, stateOnThisDet, est, data.stripClustersToSkip(), result, diffs);
0171 if (!isCompatible)
0172 break;
0173 }
0174
0175 return result.size() > oldSize;
0176 }
0177
0178 bool TkStripMeasurementDet::measurements(const TrajectoryStateOnSurface& stateOnThisDet,
0179 const MeasurementEstimator& est,
0180 const MeasurementTrackerEvent& data,
0181 TempMeasurements& result) const {
0182 if (!isActive(data)) {
0183 LogDebug("TkStripMeasurementDet") << " found an inactive module " << rawId();
0184 result.add(theInactiveHit, 0.F);
0185 return true;
0186 }
0187
0188 if (!isEmpty(data.stripData())) {
0189 LogDebug("TkStripMeasurementDet") << " found hit on this module " << rawId();
0190 RecHitContainer rechits;
0191 std::vector<float> diffs;
0192 if (recHits(stateOnThisDet, est, data, result.hits, result.distances))
0193 return true;
0194 }
0195
0196
0197
0198 if (!stateOnThisDet.hasError()) {
0199 result.add(theMissingHit, 0.F);
0200 return false;
0201 }
0202
0203 float utraj = specificGeomDet().specificTopology().measurementPosition(stateOnThisDet.localPosition()).x();
0204 float uerr = sqrt(specificGeomDet()
0205 .specificTopology()
0206 .measurementError(stateOnThisDet.localPosition(), stateOnThisDet.localError().positionError())
0207 .uu());
0208 if (testStrips(utraj, uerr)) {
0209
0210 result.add(theMissingHit, 0.F);
0211 return false;
0212 }
0213
0214
0215 result.add(theInactiveHit, 0.F);
0216 return true;
0217 }
0218
0219 void TkStripMeasurementDet::simpleRecHits(const TrajectoryStateOnSurface& ts,
0220 const MeasurementTrackerEvent& data,
0221 std::vector<SiStripRecHit2D>& result) const {
0222 if (isEmpty(data.stripData()) || !isActive(data))
0223 return;
0224
0225 const detset& detSet = data.stripData().detSet(index());
0226 unInitDynArray(AClusters::value_type, detSet.size(), clusters);
0227 assert(clusters.empty());
0228 for (auto const& ci : detSet) {
0229 if (isMasked(ci))
0230 continue;
0231 if (accept(detSet.makeKeyOf(&ci), data.stripClustersToSkip()))
0232 clusters.push_back(&ci);
0233 else
0234 LogDebug("TkStripMeasurementDet") << "skipping this str from last iteration on" << rawId()
0235 << " key: " << detSet.makeKeyOf(&ci);
0236 }
0237 if (!clusters.empty())
0238 buildSimpleRecHits(clusters, data, detSet, ts, result);
0239 }
0240
0241 std::tuple<TkStripRecHitIter, TkStripRecHitIter> TkStripMeasurementDet::hitRange(
0242 const TrajectoryStateOnSurface& ts, const MeasurementTrackerEvent& data) const {
0243 if (isEmpty(data.stripData()) || !isActive(data))
0244 return std::tuple<TkStripRecHitIter, TkStripRecHitIter>();
0245 const detset& detSet = data.stripData().detSet(index());
0246 return std::make_tuple(TkStripRecHitIter(detSet.begin(), detSet.end(), *this, ts, data),
0247 TkStripRecHitIter(detSet.end(), detSet.end(), *this, ts, data));
0248 }
0249
0250 void TkStripMeasurementDet::advance(TkStripRecHitIter& hi) const {
0251 while (!hi.empty()) {
0252 auto ci = hi.clusterI;
0253 auto const& data = *hi.data;
0254 if (isMasked(*ci))
0255 continue;
0256 SiStripClusterRef cluster = edmNew::makeRefTo(data.stripData().handle(), ci);
0257 if (accept(cluster, data.stripClustersToSkip()))
0258 return;
0259 ++hi.clusterI;
0260 }
0261 }
0262
0263 SiStripRecHit2D TkStripMeasurementDet::hit(TkStripRecHitIter const& hi) const {
0264 const GeomDetUnit& gdu(specificGeomDet());
0265 auto ci = hi.clusterI;
0266 auto const& data = *hi.data;
0267 auto const& ltp = *hi.tsos;
0268
0269 SiStripClusterRef cluster = edmNew::makeRefTo(data.stripData().handle(), ci);
0270 LocalValues lv = cpe()->localParameters(*cluster, gdu, ltp);
0271 return SiStripRecHit2D(lv.first, lv.second, gdu, cluster);
0272 }
0273
0274 bool TkStripMeasurementDet::testStrips(float utraj, float uerr) const {
0275 int16_t start = (int16_t)std::max<float>(utraj - 3.f * uerr, 0);
0276 int16_t end = (int16_t)std::min<float>(utraj + 3.f * uerr, totalStrips());
0277
0278 if (start >= end) {
0279
0280
0281
0282
0283
0284 return true;
0285
0286 }
0287
0288 typedef std::vector<BadStripBlock>::const_iterator BSBIT;
0289
0290 int16_t bad = 0, largestBadBlock = 0;
0291 for (BSBIT bsbc = badStripBlocks().begin(), bsbe = badStripBlocks().end(); bsbc != bsbe; ++bsbc) {
0292 if (bsbc->last < start)
0293 continue;
0294 if (bsbc->first > end)
0295 break;
0296 int16_t thisBad = std::min(bsbc->last, end) - std::max(bsbc->first, start);
0297 if (thisBad > largestBadBlock)
0298 largestBadBlock = thisBad;
0299 bad += thisBad;
0300 }
0301
0302 bool ok = (bad < (end - start)) && (uint16_t(bad) <= badStripCuts().maxBad) &&
0303 (uint16_t(largestBadBlock) <= badStripCuts().maxConsecutiveBad);
0304
0305
0306
0307
0308
0309
0310
0311
0312
0313 return ok;
0314 }