File indexing completed on 2024-04-06 12:31:33
0001 #include "TrackingTools/MeasurementDet/interface/LayerMeasurements.h"
0002 #include "TrackingTools/PatternTools/interface/TrajectoryMeasurement.h"
0003 #include "TrackingTools/PatternTools/interface/TrajMeasLessEstim.h"
0004 #include "TrackingTools/GeomPropagators/interface/Propagator.h"
0005
0006 #include "TrackingTools/MeasurementDet/interface/MeasurementDetException.h"
0007 #include "TrackingTools/MeasurementDet/interface/MeasurementDetSystem.h"
0008 #include "TrackingTools/MeasurementDet/interface/MeasurementDet.h"
0009 #include "TrackingTools/MeasurementDet/interface/TrajectoryMeasurementGroup.h"
0010
0011 #include "TrackingTools/DetLayers/interface/GeometricSearchDet.h"
0012 #include "TrackingTools/DetLayers/interface/DetLayer.h"
0013 #include "TrackingTools/DetLayers/interface/DetGroup.h"
0014
0015 #include "TrackingTools/TransientTrackingRecHit/interface/InvalidTransientRecHit.h"
0016
0017 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0018 #include "FWCore/Utilities/interface/Likely.h"
0019
0020 #include <algorithm>
0021 #include <cstdlib>
0022
0023 using namespace std;
0024
0025 namespace {
0026 typedef GeometricSearchDet::DetWithState DetWithState;
0027 inline void addInvalidMeas(std::vector<TrajectoryMeasurement>& result,
0028 const TrajectoryStateOnSurface& ts,
0029 const GeomDet& det,
0030 const DetLayer& layer) {
0031 result.emplace_back(ts, std::make_shared<InvalidTrackingRecHit>(det, TrackingRecHit::missing), 0.F, &layer);
0032 }
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046 bool layerIsCompatibleWithTSOS(DetLayer const& , TrajectoryStateOnSurface const& tsos) {
0047 auto const& gp = tsos.globalPosition();
0048 auto const xa = std::abs(gp.x());
0049 auto const ya = std::abs(gp.y());
0050 auto const za = std::abs(gp.z());
0051 return xa < 1e3 and ya < 1e3 and za < 12e2;
0052 }
0053
0054
0055
0056
0057
0058
0059
0060
0061 inline std::vector<TrajectoryMeasurement> get(MeasurementDetSystem const& detSystem,
0062 MeasurementTrackerEvent const& data,
0063 const DetLayer& layer,
0064 std::vector<DetWithState> const& compatDets,
0065 const TrajectoryStateOnSurface& ts,
0066 const Propagator& prop,
0067 const MeasurementEstimator& est) {
0068 std::vector<TrajectoryMeasurement> result;
0069 typedef TrajectoryMeasurement TM;
0070
0071 tracking::TempMeasurements tmps;
0072
0073 for (auto const& ds : compatDets) {
0074 if (not layerIsCompatibleWithTSOS(layer, ds.second))
0075 continue;
0076
0077 MeasurementDetWithData mdet = detSystem.idToDet(ds.first->geographicalId(), data);
0078 if UNLIKELY (mdet.isNull()) {
0079 throw MeasurementDetException("MeasurementDet not found");
0080 }
0081
0082 if (mdet.measurements(ds.second, est, tmps))
0083 for (std::size_t i = 0; i != tmps.size(); ++i)
0084 result.emplace_back(ds.second, std::move(tmps.hits[i]), tmps.distances[i], &layer);
0085 tmps.clear();
0086 }
0087
0088
0089
0090
0091 if (result.size() > 1) {
0092 sort(result.begin(), result.end(), TrajMeasLessEstim());
0093 }
0094
0095 if (!result.empty()) {
0096
0097 addInvalidMeas(result, result.front().predictedState(), *(result.front().recHit()->det()), layer);
0098 } else {
0099
0100 addInvalidMeas(result, compatDets.front().second, *(compatDets.front().first), layer);
0101 }
0102
0103 return result;
0104 }
0105
0106 void addInvalidMeas(vector<TrajectoryMeasurement>& measVec, const DetGroup& group, const DetLayer& layer) {
0107 if (!measVec.empty()) {
0108
0109 auto const& ts = measVec.front().predictedState();
0110 auto toll = measVec.front().recHitR().det()->surface().bounds().significanceInside(
0111 ts.localPosition(), ts.localError().positionError());
0112 measVec.emplace_back(
0113 measVec.front().predictedState(),
0114 std::make_shared<InvalidTrackingRecHit>(*measVec.front().recHitR().det(), TrackingRecHit::missing),
0115 toll,
0116 &layer);
0117 } else if (!group.empty()) {
0118
0119 auto const& ts = group.front().trajectoryState();
0120 auto toll = group.front().det()->surface().bounds().significanceInside(ts.localPosition(),
0121 ts.localError().positionError());
0122 measVec.emplace_back(group.front().trajectoryState(),
0123 std::make_shared<InvalidTrackingRecHit>(*group.front().det(), TrackingRecHit::missing),
0124 toll,
0125 &layer);
0126 }
0127 }
0128
0129 }
0130
0131
0132 std::vector<BaseTrackerRecHit*> LayerMeasurements::recHits(const DetLayer& layer,
0133 const TrajectoryStateOnSurface& startingState,
0134 const Propagator& prop,
0135 const MeasurementEstimator& est) const {
0136 std::vector<BaseTrackerRecHit*> result;
0137 auto const& compatDets = layer.compatibleDets(startingState, prop, est);
0138 if (compatDets.empty())
0139 return result;
0140 for (auto const& ds : compatDets) {
0141 if (not layerIsCompatibleWithTSOS(layer, ds.second))
0142 continue;
0143
0144 auto mdet = detSystem_.idToDet(ds.first->geographicalId(), data_);
0145 mdet.recHits(result, ds.second, est);
0146 }
0147 return result;
0148 }
0149
0150 vector<TrajectoryMeasurement> LayerMeasurements::measurements(const DetLayer& layer,
0151 const TrajectoryStateOnSurface& startingState,
0152 const Propagator& prop,
0153 const MeasurementEstimator& est) const {
0154 typedef DetLayer::DetWithState DetWithState;
0155
0156 vector<DetWithState> const& compatDets = layer.compatibleDets(startingState, prop, est);
0157
0158 if (!compatDets.empty())
0159 return get(detSystem_, data_, layer, compatDets, startingState, prop, est);
0160
0161 vector<TrajectoryMeasurement> result;
0162 pair<bool, TrajectoryStateOnSurface> compat = layer.compatible(startingState, prop, est);
0163
0164 if (compat.first and layerIsCompatibleWithTSOS(layer, compat.second)) {
0165 result.push_back(
0166 TrajectoryMeasurement(compat.second,
0167 std::make_shared<InvalidTrackingRecHitNoDet>(layer.surface(), TrackingRecHit::inactive),
0168 0.F,
0169 &layer));
0170 LogDebug("LayerMeasurements") << "adding a missing hit.";
0171 } else
0172 LogDebug("LayerMeasurements") << "adding not measurement.";
0173
0174 return result;
0175 }
0176
0177 vector<TrajectoryMeasurementGroup> LayerMeasurements::groupedMeasurements(const DetLayer& layer,
0178 const TrajectoryStateOnSurface& startingState,
0179 const Propagator& prop,
0180 const MeasurementEstimator& est) const {
0181 vector<TrajectoryMeasurementGroup> result;
0182
0183 vector<DetGroup>&& groups = layer.groupedCompatibleDets(startingState, prop, est);
0184 result.reserve(groups.size());
0185
0186 tracking::TempMeasurements tmps;
0187 for (auto& grp : groups) {
0188 if (grp.empty())
0189 continue;
0190
0191 vector<TrajectoryMeasurement> tmpVec;
0192 for (auto const& det : grp) {
0193 auto const& detTS = det.trajectoryState();
0194
0195 if (not layerIsCompatibleWithTSOS(layer, detTS))
0196 continue;
0197
0198 MeasurementDetWithData mdet = detSystem_.idToDet(det.det()->geographicalId(), data_);
0199 if (mdet.isNull()) {
0200 throw MeasurementDetException("MeasurementDet not found");
0201 }
0202 if (mdet.measurements(detTS, est, tmps))
0203 for (std::size_t i = 0; i != tmps.size(); ++i)
0204 tmpVec.emplace_back(detTS, std::move(tmps.hits[i]), tmps.distances[i], &layer);
0205 tmps.clear();
0206 }
0207
0208
0209 LogDebug("LayerMeasurements") << "Sorting " << tmpVec.size() << " measurements in this grp.";
0210 sort(tmpVec.begin(), tmpVec.end(), TrajMeasLessEstim());
0211 addInvalidMeas(tmpVec, grp, layer);
0212 result.emplace_back(std::move(tmpVec), std::move(grp));
0213 }
0214
0215
0216 if (result.empty()) {
0217 pair<bool, TrajectoryStateOnSurface> compat = layer.compatible(startingState, prop, est);
0218 if (compat.first and layerIsCompatibleWithTSOS(layer, compat.second)) {
0219 vector<TrajectoryMeasurement> tmVec;
0220 tmVec.emplace_back(compat.second,
0221 std::make_shared<InvalidTrackingRecHitNoDet>(layer.surface(), TrackingRecHit::inactive),
0222 0.F,
0223 &layer);
0224 result.emplace_back(std::move(tmVec), DetGroup());
0225 }
0226 }
0227 return result;
0228 }