CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
LayerMeasurements.cc
Go to the documentation of this file.
5 
10 
14 
16 
17 
19 
20 #include <algorithm>
21 
22 using namespace std;
23 
24 
25 namespace {
27  inline
28  void addInvalidMeas( std::vector<TrajectoryMeasurement>& result,
29  const TrajectoryStateOnSurface& ts, const GeomDet* det, const DetLayer& layer) {
30  result.emplace_back(ts, InvalidTransientRecHit::build(det, TrackingRecHit::missing), 0.F,&layer);
31  }
32 
33 
34 
42  inline
43  std::vector<TrajectoryMeasurement>
44  get(const MeasurementDetSystem* theDetSystem,
45  const MeasurementTrackerEvent* theData,
46  const DetLayer& layer,
47  std::vector<DetWithState> const& compatDets,
48  const TrajectoryStateOnSurface& ts,
49  const Propagator& prop,
50  const MeasurementEstimator& est) {
51  std::vector<TrajectoryMeasurement> result;
52  typedef TrajectoryMeasurement TM;
53 
55 
56  for ( auto const & ds : compatDets) {
57  MeasurementDetWithData mdet = theDetSystem->idToDet(ds.first->geographicalId(), *theData);
58  if unlikely(mdet.isNull()) {
59  throw MeasurementDetException( "MeasurementDet not found");
60  }
61 
62  if (mdet.measurements(ds.second, est,tmps))
63  for (std::size_t i=0; i!=tmps.size(); ++i)
64  result.emplace_back(ds.second,std::move(tmps.hits[i]),tmps.distances[i],&layer);
65  tmps.clear();
66  }
67  // WARNING: we might end up with more than one invalid hit of type 'inactive' in result
68  // to be fixed in order to avoid usless double traj candidates.
69 
70  // sort the final result
71  if ( result.size() > 1) {
72  sort( result.begin(), result.end(), TrajMeasLessEstim());
73  }
74 
75 
76  if ( !result.empty()) {
77  // invalidMeas on Det of most compatible hit
78  addInvalidMeas( result, result.front().predictedState(), result.front().recHit()->det(),layer);
79  }
80  else {
81  // invalid state on first compatible Det
82  addInvalidMeas( result, compatDets.front().second, compatDets.front().first,layer);
83  }
84 
85  return result;
86  }
87 
88 }
89 
90 vector<TrajectoryMeasurement>
92  const TrajectoryStateOnSurface& startingState,
93  const Propagator& prop,
94  const MeasurementEstimator& est) const {
95 
97 
98  vector<DetWithState> const & compatDets = layer.compatibleDets( startingState, prop, est);
99 
100  if (!compatDets.empty()) return get(theDetSystem, theData, layer, compatDets, startingState, prop, est);
101 
102  vector<TrajectoryMeasurement> result;
103  pair<bool, TrajectoryStateOnSurface> compat = layer.compatible( startingState, prop, est);
104 
105  if ( compat.first) {
106  result.push_back( TrajectoryMeasurement( compat.second,
108  &layer));
109  LogDebug("LayerMeasurements")<<"adding a missing hit.";
110  }else LogDebug("LayerMeasurements")<<"adding not measurement.";
111 
112 
113  return result;
114 
115 }
116 
117 
118 vector<TrajectoryMeasurementGroup>
120  const TrajectoryStateOnSurface& startingState,
121  const Propagator& prop,
122  const MeasurementEstimator& est) const {
123  vector<TrajectoryMeasurementGroup> result;
124 
125  vector<DetGroup> && groups = layer.groupedCompatibleDets( startingState, prop, est);
126  result.reserve(groups.size());
127 
129  for (auto& grp : groups) {
130  if ( grp.empty() ) continue;
131 
132  vector<TrajectoryMeasurement> tmpVec;
133  for (auto const & det : grp) {
134  MeasurementDetWithData mdet = theDetSystem->idToDet(det.det()->geographicalId(), *theData);
135  if (mdet.isNull()) {
136  throw MeasurementDetException( "MeasurementDet not found");
137  }
138  if (mdet.measurements( det.trajectoryState(), est,tmps))
139  for (std::size_t i=0; i!=tmps.size(); ++i)
140  tmpVec.emplace_back(det.trajectoryState(),std::move(tmps.hits[i]),tmps.distances[i],&layer);
141  tmps.clear();
142  }
143 
144  // sort the final result
145  sort( tmpVec.begin(), tmpVec.end(), TrajMeasLessEstim());
146  addInvalidMeas( tmpVec, grp,layer);
147  result.emplace_back(std::move(tmpVec), std::move(grp));
148  }
149 
150 
151  // if the result is empty check if the layer is compatible (for invalid measurement)
152  if (result.empty()) {
153  pair<bool, TrajectoryStateOnSurface> compat = layer.compatible( startingState, prop, est);
154  if ( compat.first) {
155  vector<TrajectoryMeasurement> tmVec;
156  tmVec.emplace_back(compat.second, InvalidTransientRecHit::build(nullptr, TrackingRecHit::inactive,&layer), 0.F,&layer);
157  result.emplace_back(std::move(tmVec), DetGroup());
158  }
159  }
160  return result;
161 }
162 
163 void LayerMeasurements::addInvalidMeas( vector<TrajectoryMeasurement>& measVec,
164  const DetGroup& group,
165  const DetLayer& layer) const
166 {
167  if (!measVec.empty()) {
168  // invalidMeas on Det of most compatible hit
169  measVec.emplace_back(measVec.front().predictedState(),
170  InvalidTransientRecHit::build(measVec.front().recHit()->det(), TrackingRecHit::missing),
171  0.,&layer);
172  }
173  else if (!group.empty()) {
174  // invalid state on first compatible Det
175  measVec.emplace_back(group.front().trajectoryState(),
176  InvalidTransientRecHit::build(group.front().det(), TrackingRecHit::missing), 0.,&layer);
177  }
178 }
#define LogDebug(id)
virtual std::pair< bool, TrajectoryStateOnSurface > compatible(const TrajectoryStateOnSurface &ts, const Propagator &, const MeasurementEstimator &) const =0
std::vector< TrajectoryMeasurement > measurements(const DetLayer &layer, const TrajectoryStateOnSurface &startingState, const Propagator &prop, const MeasurementEstimator &est) const
int i
Definition: DBlmapReader.cc:9
std::size_t size() const
virtual std::vector< DetGroup > groupedCompatibleDets(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
#define unlikely(x)
Definition: Likely.h:21
tuple result
Definition: query.py:137
DetId geographicalId() const
The label of this GeomDet.
Definition: GeomDet.h:72
std::pair< const GeomDet *, TrajectoryStateOnSurface > DetWithState
void addInvalidMeas(std::vector< TrajectoryMeasurement > &measVec, const DetGroup &group, const DetLayer &layer) const
std::vector< TrajectoryMeasurementGroup > groupedMeasurements(const DetLayer &layer, const TrajectoryStateOnSurface &startingState, const Propagator &prop, const MeasurementEstimator &est) const
std::pair< const GeomDet *, TrajectoryStateOnSurface > DetWithState
static uInt32 F(BLOWFISH_CTX *ctx, uInt32 x)
Definition: blowfish.cc:281
bool measurements(const TrajectoryStateOnSurface &stateOnThisDet, const MeasurementEstimator &est, TempMeasurements &result) const