CMS 3D CMS Logo

LayerMeasurements.cc
Go to the documentation of this file.
5 
10 
14 
16 
18 
19 #include <algorithm>
20 
21 using namespace std;
22 
23 namespace {
25  inline void addInvalidMeas(std::vector<TrajectoryMeasurement>& result,
26  const TrajectoryStateOnSurface& ts,
27  const GeomDet& det,
28  const DetLayer& layer) {
29  result.emplace_back(ts, std::make_shared<InvalidTrackingRecHit>(det, TrackingRecHit::missing), 0.F, &layer);
30  }
31 
39  inline std::vector<TrajectoryMeasurement> get(MeasurementDetSystem const& detSystem,
41  const DetLayer& layer,
42  std::vector<DetWithState> const& compatDets,
43  const TrajectoryStateOnSurface& ts,
44  const Propagator& prop,
45  const MeasurementEstimator& est) {
46  std::vector<TrajectoryMeasurement> result;
47  typedef TrajectoryMeasurement TM;
48 
50 
51  for (auto const& ds : compatDets) {
52  MeasurementDetWithData mdet = detSystem.idToDet(ds.first->geographicalId(), data);
53  if
54  UNLIKELY(mdet.isNull()) { throw MeasurementDetException("MeasurementDet not found"); }
55 
56  if (mdet.measurements(ds.second, est, tmps))
57  for (std::size_t i = 0; i != tmps.size(); ++i)
58  result.emplace_back(ds.second, std::move(tmps.hits[i]), tmps.distances[i], &layer);
59  tmps.clear();
60  }
61  // WARNING: we might end up with more than one invalid hit of type 'inactive' in result
62  // to be fixed in order to avoid usless double traj candidates.
63 
64  // sort the final result
65  if (result.size() > 1) {
66  sort(result.begin(), result.end(), TrajMeasLessEstim());
67  }
68 
69  if (!result.empty()) {
70  // invalidMeas on Det of most compatible hit
71  addInvalidMeas(result, result.front().predictedState(), *(result.front().recHit()->det()), layer);
72  } else {
73  // invalid state on first compatible Det
74  addInvalidMeas(result, compatDets.front().second, *(compatDets.front().first), layer);
75  }
76 
77  return result;
78  }
79 
80  void addInvalidMeas(vector<TrajectoryMeasurement>& measVec, const DetGroup& group, const DetLayer& layer) {
81  if (!measVec.empty()) {
82  // invalidMeas on Det of most compatible hit
83  auto const& ts = measVec.front().predictedState();
84  auto toll = measVec.front().recHitR().det()->surface().bounds().significanceInside(
85  ts.localPosition(), ts.localError().positionError());
86  measVec.emplace_back(
87  measVec.front().predictedState(),
88  std::make_shared<InvalidTrackingRecHit>(*measVec.front().recHitR().det(), TrackingRecHit::missing),
89  toll,
90  &layer);
91  } else if (!group.empty()) {
92  // invalid state on first compatible Det
93  auto const& ts = group.front().trajectoryState();
94  auto toll = group.front().det()->surface().bounds().significanceInside(ts.localPosition(),
95  ts.localError().positionError());
96  measVec.emplace_back(group.front().trajectoryState(),
97  std::make_shared<InvalidTrackingRecHit>(*group.front().det(), TrackingRecHit::missing),
98  toll,
99  &layer);
100  }
101  }
102 
103 } // namespace
104 
105 // return just valid hits, no sorting (for seeding mostly)
106 std::vector<BaseTrackerRecHit*> LayerMeasurements::recHits(const DetLayer& layer,
107  const TrajectoryStateOnSurface& startingState,
108  const Propagator& prop,
109  const MeasurementEstimator& est) const {
110  std::vector<BaseTrackerRecHit*> result;
111  auto const& compatDets = layer.compatibleDets(startingState, prop, est);
112  if (compatDets.empty())
113  return result;
114  for (auto const& ds : compatDets) {
115  auto mdet = detSystem_.idToDet(ds.first->geographicalId(), data_);
116  mdet.recHits(result, ds.second, est);
117  }
118  return result;
119 }
120 
121 vector<TrajectoryMeasurement> LayerMeasurements::measurements(const DetLayer& layer,
122  const TrajectoryStateOnSurface& startingState,
123  const Propagator& prop,
124  const MeasurementEstimator& est) const {
126 
127  vector<DetWithState> const& compatDets = layer.compatibleDets(startingState, prop, est);
128 
129  if (!compatDets.empty())
130  return get(detSystem_, data_, layer, compatDets, startingState, prop, est);
131 
132  vector<TrajectoryMeasurement> result;
133  pair<bool, TrajectoryStateOnSurface> compat = layer.compatible(startingState, prop, est);
134 
135  if (compat.first) {
136  result.push_back(
137  TrajectoryMeasurement(compat.second,
138  std::make_shared<InvalidTrackingRecHitNoDet>(layer.surface(), TrackingRecHit::inactive),
139  0.F,
140  &layer));
141  LogDebug("LayerMeasurements") << "adding a missing hit.";
142  } else
143  LogDebug("LayerMeasurements") << "adding not measurement.";
144 
145  return result;
146 }
147 
148 vector<TrajectoryMeasurementGroup> LayerMeasurements::groupedMeasurements(const DetLayer& layer,
149  const TrajectoryStateOnSurface& startingState,
150  const Propagator& prop,
151  const MeasurementEstimator& est) const {
152  vector<TrajectoryMeasurementGroup> result;
153 
154  vector<DetGroup>&& groups = layer.groupedCompatibleDets(startingState, prop, est);
155  result.reserve(groups.size());
156 
158  for (auto& grp : groups) {
159  if (grp.empty())
160  continue;
161 
162  vector<TrajectoryMeasurement> tmpVec;
163  for (auto const& det : grp) {
164  MeasurementDetWithData mdet = detSystem_.idToDet(det.det()->geographicalId(), data_);
165  if (mdet.isNull()) {
166  throw MeasurementDetException("MeasurementDet not found");
167  }
168  if (mdet.measurements(det.trajectoryState(), est, tmps))
169  for (std::size_t i = 0; i != tmps.size(); ++i)
170  tmpVec.emplace_back(det.trajectoryState(), std::move(tmps.hits[i]), tmps.distances[i], &layer);
171  tmps.clear();
172  }
173 
174  // sort the final result
175  LogDebug("LayerMeasurements") << "Sorting " << tmpVec.size() << " measurements in this grp.";
176  sort(tmpVec.begin(), tmpVec.end(), TrajMeasLessEstim());
177  addInvalidMeas(tmpVec, grp, layer);
178  result.emplace_back(std::move(tmpVec), std::move(grp));
179  }
180 
181  // if the result is empty check if the layer is compatible (for invalid measurement)
182  if (result.empty()) {
183  pair<bool, TrajectoryStateOnSurface> compat = layer.compatible(startingState, prop, est);
184  if (compat.first) {
185  vector<TrajectoryMeasurement> tmVec;
186  tmVec.emplace_back(compat.second,
187  std::make_shared<InvalidTrackingRecHitNoDet>(layer.surface(), TrackingRecHit::inactive),
188  0.F,
189  &layer);
190  result.emplace_back(std::move(tmVec), DetGroup());
191  }
192  }
193  return result;
194 }
#define LogDebug(id)
std::vector< TrajectoryMeasurement > measurements(const DetLayer &layer, const TrajectoryStateOnSurface &startingState, const Propagator &prop, const MeasurementEstimator &est) const
std::size_t size() const
virtual std::vector< DetGroup > groupedCompatibleDets(const TrajectoryStateOnSurface &startingState, const Propagator &prop, const MeasurementEstimator &est) const
std::vector< BaseTrackerRecHit * > recHits(const DetLayer &layer, const TrajectoryStateOnSurface &startingState, const Propagator &prop, const MeasurementEstimator &est) const
virtual std::vector< DetWithState > compatibleDets(const TrajectoryStateOnSurface &startingState, const Propagator &prop, const MeasurementEstimator &est) const
RecHitContainer recHits(const TrajectoryStateOnSurface &tsos) const
std::pair< const GeomDet *, TrajectoryStateOnSurface > DetWithState
virtual const BoundSurface & surface() const =0
The surface of the GeometricSearchDet.
DetId geographicalId() const
The label of this GeomDet.
Definition: GeomDet.h:64
virtual std::pair< bool, TrajectoryStateOnSurface > compatible(const TrajectoryStateOnSurface &ts, const Propagator &, const MeasurementEstimator &) const =0
std::vector< TrajectoryMeasurementGroup > groupedMeasurements(const DetLayer &layer, const TrajectoryStateOnSurface &startingState, const Propagator &prop, const MeasurementEstimator &est) const
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:79
std::pair< const GeomDet *, TrajectoryStateOnSurface > DetWithState
#define UNLIKELY(x)
Definition: Likely.h:21
static uInt32 F(BLOWFISH_CTX *ctx, uInt32 x)
Definition: blowfish.cc:163
bool measurements(const TrajectoryStateOnSurface &stateOnThisDet, const MeasurementEstimator &est, TempMeasurements &result) const
def move(src, dest)
Definition: eostools.py:511