CMS 3D CMS Logo

TkGluedMeasurementDet.cc
Go to the documentation of this file.
10 #include "RecHitPropagator.h"
13 
15 
16 #include <functional>
17 #include <iostream>
18 #include <memory>
19 #include <typeinfo>
20 
21 namespace {
22  inline std::pair<LocalPoint, LocalError> projectedPos(const TrackingRecHit& hit,
23  const GeomDet& det,
24  const GlobalVector& gdir,
25  const StripClusterParameterEstimator* cpe) {
26  const BoundPlane& gluedPlane = det.surface();
27  const BoundPlane& hitPlane = hit.det()->surface();
28 
29  // check if the planes are parallel
30  //const float epsilon = 1.e-7; // corresponds to about 0.3 miliradian but cannot be reduced
31  // because of float precision
32 
33  //if (fabs(gluedPlane.normalVector().dot( hitPlane.normalVector())) < 1-epsilon) {
34  // std::cout << "TkGluedMeasurementDet plane not parallel to DetUnit plane: dot product is "
35  // << gluedPlane.normalVector().dot( hitPlane.normalVector()) << endl;
36  // FIXME: throw the appropriate exception here...
37  //throw MeasurementDetException("TkGluedMeasurementDet plane not parallel to DetUnit plane");
38  //}
39 
40  double delta = gluedPlane.localZ(hitPlane.position());
41  LocalVector ldir = gluedPlane.toLocal(gdir);
42  LocalPoint lhitPos = gluedPlane.toLocal(hit.globalPosition());
43  LocalPoint projectedHitPos = lhitPos - ldir * delta / ldir.z();
44 
45  LocalVector hitXAxis = gluedPlane.toLocal(hitPlane.toGlobal(LocalVector(1, 0, 0)));
46  LocalError hitErr = hit.localPositionError();
47  if (gluedPlane.normalVector().dot(hitPlane.normalVector()) < 0) {
48  // the two planes are inverted, and the correlation element must change sign
49  hitErr = LocalError(hitErr.xx(), -hitErr.xy(), hitErr.yy());
50  }
51  LocalError rotatedError = hitErr.rotate(hitXAxis.x(), hitXAxis.y());
52 
53  return std::make_pair(projectedHitPos, rotatedError);
54  }
55 } // namespace
56 
57 // #include "TrackingTools/KalmanUpdators/interface/Chi2MeasurementEstimator.h"
59 
60 using namespace std;
61 
63  const SiStripRecHitMatcher* matcher,
65  : MeasurementDet(gdet),
66  theMatcher(matcher),
67  theCPE(cpe),
68  theMonoDet(nullptr),
69  theStereoDet(nullptr),
70  theTopology(nullptr) {}
71 
73  const MeasurementDet* stereoDet,
74  const TrackerTopology* tTopo) {
75  theMonoDet = dynamic_cast<const TkStripMeasurementDet*>(monoDet);
76  theStereoDet = dynamic_cast<const TkStripMeasurementDet*>(stereoDet);
77  theTopology = tTopo;
78 
79  if ((theMonoDet == nullptr) || (theStereoDet == nullptr)) {
81  "TkGluedMeasurementDet ERROR: Trying to glue a det which is not a TkStripMeasurementDet");
82  }
83 }
84 
86  const MeasurementTrackerEvent& data) const {
89  collectRecHits(ts, data, collector);
90  return result;
91 }
92 
93 // simple hits
95  const TrajectoryStateOnSurface& stateOnThisDet,
96  const MeasurementEstimator& est,
97  const MeasurementTrackerEvent& data) const {
99  return false;
100  auto oldSize = result.size();
101  HitCollectorForSimpleHits collector(&fastGeomDet(), theMatcher, theCPE, stateOnThisDet, est, result);
102  collectRecHits(stateOnThisDet, data, collector);
103 
104  return result.size() > oldSize;
105 }
106 
108  const MeasurementEstimator& est,
110  TempMeasurements& result) const {
112  // LogDebug("TkStripMeasurementDet") << " DetID " << geomDet().geographicalId().rawId() << " (glued) fully inactive";
113  result.add(theInactiveHit, 0.F);
114  return true;
115  }
116 
117  auto oldSize = result.size();
118 
119  HitCollectorForFastMeasurements collector(&fastGeomDet(), theMatcher, theCPE, stateOnThisDet, est, result);
120  collectRecHits(stateOnThisDet, data, collector);
121 
122  if (result.size() > oldSize)
123  return true;
124 
125  auto id = geomDet().geographicalId().subdetId() - 3;
126  auto l = theTopology->tobLayer(geomDet().geographicalId());
127  bool killHIP = (1 == l) && (2 == id); //TOB1
128  killHIP &= stateOnThisDet.globalMomentum().perp2() > est.minPt2ForHitRecoveryInGluedDet();
129  if (killHIP) {
130  result.add(theInactiveHit, 0.F);
131  return true;
132  }
133 
134  //LogDebug("TkStripMeasurementDet") << "No hit found on TkGlued. Testing strips... ";
135  const BoundPlane& gluedPlane = geomDet().surface();
136  if ( // sorry for the big IF, but I want to exploit short-circuiting of logic
137  stateOnThisDet.hasError() &&
138  (/* do this only if the state has uncertainties, otherwise it will throw
139  (states without uncertainties are passed to this code from seeding */
140  (theMonoDet->isActive(data) &&
141  (theMonoDet->hasAllGoodChannels() || testStrips(stateOnThisDet, gluedPlane, *theMonoDet))) /*Mono OK*/
142  && // was ||
144  (theStereoDet->hasAllGoodChannels() || testStrips(stateOnThisDet, gluedPlane, *theStereoDet))) /*Stereo OK*/
145  ) /* State has errors */
146  ) {
147  result.add(theMissingHit, 0.F);
148  return false;
149  }
150  result.add(theInactiveHit, 0.F);
151  return true;
152 }
153 
154 struct take_address {
155  template <typename T>
156  const T* operator()(const T& val) const {
157  return &val;
158  }
159 };
160 
161 #ifdef DOUBLE_MATCH
162 template <typename Collector>
165  Collector& collector) const {
166  doubleMatch(ts, data, collector);
167 }
168 #else
169 template <typename Collector>
172  Collector& collector) const {
173  //------ WARNING: here ts is used as it is on the mono/stereo surface.
174  //----- A further propagation is necessary.
175  //----- To limit the problem, the SimpleCPE should be used
176  RecHitContainer monoHits = theMonoDet->recHits(ts, data);
177  GlobalVector glbDir = (ts.isValid() ? ts.globalParameters().momentum() : position() - GlobalPoint(0, 0, 0));
178 
179  //edm::LogWarning("TkGluedMeasurementDet::recHits") << "Query-for-detid-" << theGeomDet->geographicalId().rawId();
180 
181  //checkProjection(ts, monoHits, stereoHits);
182 
183  if (monoHits.empty()) {
184  // make stereo TTRHs and project them
185  projectOnGluedDet(collector, theStereoDet->recHits(ts, data), glbDir);
186  } else {
187  // collect simple stereo hits
188  std::vector<SiStripRecHit2D> simpleSteroHitsByValue;
189  theStereoDet->simpleRecHits(ts, data, simpleSteroHitsByValue);
190 
191  if (simpleSteroHitsByValue.empty()) {
192  projectOnGluedDet(collector, monoHits, glbDir);
193  } else {
194  LocalVector tkDir = (ts.isValid() ? ts.localDirection() : surface().toLocal(position() - GlobalPoint(0, 0, 0)));
196  vsStereoHits.resize(simpleSteroHitsByValue.size());
198  simpleSteroHitsByValue.begin(), simpleSteroHitsByValue.end(), vsStereoHits.begin(), take_address());
199 
200  // convert mono hits to type expected by matcher
201  for (RecHitContainer::const_iterator monoHit = monoHits.begin(); monoHit != monoHits.end(); ++monoHit) {
202  const TrackingRecHit* tkhit = (**monoHit).hit();
203  const SiStripRecHit2D* verySpecificMonoHit = reinterpret_cast<const SiStripRecHit2D*>(tkhit);
204  theMatcher->match(verySpecificMonoHit,
205  vsStereoHits.begin(),
206  vsStereoHits.end(),
207  collector.collector(),
208  &specificGeomDet(),
209  tkDir);
210 
211  if (collector.hasNewMatchedHits()) {
212  collector.clearNewMatchedHitsFlag();
213  } else {
214  collector.addProjected(**monoHit, glbDir);
215  }
216  } // loop on mono hit
217  }
218  //GIO// std::cerr << "TkGluedMeasurementDet hits " << monoHits.size() << "/" << stereoHits.size() << " => " << result.size() << std::endl;
219  }
220 }
221 #endif
222 
223 #include <cstdint>
224 #ifdef VI_STAT
225 #include <cstdio>
226 #endif
227 namespace {
228  struct Stat {
229 #ifdef VI_STAT
230  double totCall = 0;
231  double totMono = 0;
232  double totStereo = 0;
233  double totComb = 0;
234  double totMatched = 0;
235  double filtMono = 0;
236  double filtStereo = 0;
237  double filtComb = 0;
238  double matchT = 0;
239  double matchF = 0;
240  double singleF = 0;
241  double zeroM = 0;
242  double zeroS = 0;
243 
244  void match(uint64_t t) {
245  if (t != 0)
246  ++matchT;
247  totMatched += t;
248  }
249  void operator()(uint64_t m, uint64_t s, uint64_t fm, uint64_t fs) {
250  ++totCall;
251  totMono += m;
252  totStereo += s;
253  totComb += m * s;
254  filtMono += fm;
255  filtStereo += fs;
256  filtComb += fm * fs;
257  if (fm == 0)
258  ++zeroM;
259  if (fs == 0)
260  ++zeroS;
261  if (fm != 0 && fs != 0)
262  ++matchF;
263  if (fm != 0 || fs != 0)
264  ++singleF;
265  }
266  ~Stat() {
267  if (totCall > 0)
268  printf("Matches:%d/%d/%d/%d/%d/%d : %f/%f/%f/%f/%f/%f/%f\n",
269  int(totCall),
270  int(matchF),
271  int(singleF - matchF),
272  int(matchT),
273  int(zeroM),
274  int(zeroS),
275  totMono / totCall,
276  totStereo / totCall,
277  totComb / totCall,
278  totMatched / matchT,
279  filtMono / totCall,
280  filtStereo / totCall,
281  filtComb / matchF);
282  }
283 #else
284  Stat() {}
285  void match(uint64_t) const {}
286  void operator()(uint64_t, uint64_t, uint64_t, uint64_t) const {}
287 #endif
288  };
289 #ifndef VI_STAT
290  const
291 #endif
292  Stat stat;
293 } // namespace
294 
296  const RecHitContainer& hits, const TrajectoryStateOnSurface& ts) const {
298  for (auto const& hit : hits) {
299  auto&& vl = projectedPos(*hit, fastGeomDet(), ts.globalParameters().momentum(), theCPE);
300  auto&& phit = std::make_shared<ProjectedSiStripRecHit2D>(
301  vl.first, vl.second, fastGeomDet(), static_cast<SiStripRecHit2D const&>(*hit));
302  result.push_back(std::move(phit));
303  }
304  return result;
305 }
306 
307 template <typename Collector>
309  const RecHitContainer& hits,
310  const GlobalVector& gdir) const {
311  for (RecHitContainer::const_iterator ihit = hits.begin(); ihit != hits.end(); ihit++) {
312  collector.addProjected(**ihit, gdir);
313  }
314 }
315 
317  std::vector<SiStripRecHit2D> const& hits, const TrajectoryStateOnSurface& ts) const {
319  for (auto const& hit : hits) {
320  auto&& vl = projectedPos(hit, fastGeomDet(), ts.globalParameters().momentum(), theCPE);
321  auto&& phit = std::make_shared<ProjectedSiStripRecHit2D>(
322  vl.first, vl.second, fastGeomDet(), static_cast<SiStripRecHit2D const&>(hit));
323  result.push_back(std::move(phit));
324  }
325  return result;
326 }
327 
328 template <typename Collector>
330  std::vector<SiStripRecHit2D> const& hits,
331  const GlobalVector& gdir) const {
332  for (auto const& hit : hits)
333  collector.addProjected(hit, gdir);
334 }
335 
337  const RecHitContainer& monoHits,
338  const RecHitContainer& stereoHits) const {
339  for (RecHitContainer::const_iterator i = monoHits.begin(); i != monoHits.end(); ++i) {
340  checkHitProjection(**i, ts, fastGeomDet());
341  }
342  for (RecHitContainer::const_iterator i = stereoHits.begin(); i != stereoHits.end(); ++i) {
343  checkHitProjection(**i, ts, fastGeomDet());
344  }
345 }
346 
348  const TrajectoryStateOnSurface& ts,
349  const GeomDet& det) const {
350  auto&& vl = projectedPos(hit, det, ts.globalParameters().momentum(), theCPE);
351  ProjectedSiStripRecHit2D projectedHit(vl.first, vl.second, det, static_cast<SiStripRecHit2D const&>(hit));
352 
353  RecHitPropagator prop;
354  TrajectoryStateOnSurface propState = prop.propagate(hit, det.surface(), ts);
355 
356  if ((projectedHit.localPosition() - propState.localPosition()).mag() > 0.0001f) {
357  std::cout << "PROBLEM: projected and propagated hit positions differ by "
358  << (projectedHit.localPosition() - propState.localPosition()).mag() << std::endl;
359  }
360 
361  LocalError le1 = projectedHit.localPositionError();
362  LocalError le2 = propState.localError().positionError();
363  double eps = 1.e-5;
364  double cutoff = 1.e-4; // if element below cutoff, use absolute instead of relative accuracy
365  double maxdiff = std::max(
366  std::max(fabs(le1.xx() - le2.xx()) / (cutoff + le1.xx()), fabs(le1.xy() - le2.xy()) / (cutoff + fabs(le1.xy()))),
367  fabs(le1.yy() - le2.yy()) / (cutoff + le1.xx()));
368  if (maxdiff > eps) {
369  std::cout << "PROBLEM: projected and propagated hit errors differ by " << maxdiff << std::endl;
370  }
371 }
372 
374  const BoundPlane& gluedPlane,
375  const TkStripMeasurementDet& mdet) const {
376  // from TrackingRecHitProjector
377  const GeomDet& det = mdet.fastGeomDet();
378  const BoundPlane& stripPlane = det.surface();
379 
380  //LocalPoint glp = tsos.localPosition();
382  /*LogDebug("TkStripMeasurementDet") <<
383  "Testing local pos glued: " << glp <<
384  " local err glued: " << tsos.localError().positionError() <<
385  " in? " << gluedPlane.bounds().inside(glp) <<
386  " in(3s)? " << gluedPlane.bounds().inside(glp, err, 3.0f);*/
387 
388  GlobalVector gdir = tsos.globalParameters().momentum();
389 
390  LocalPoint slp = stripPlane.toLocal(tsos.globalPosition());
391  LocalVector sld = stripPlane.toLocal(gdir);
392 
393  double delta = stripPlane.localZ(tsos.globalPosition());
394  LocalPoint pos = slp - sld * delta / sld.z();
395 
396  // now the error
397  LocalVector hitXAxis = stripPlane.toLocal(gluedPlane.toGlobal(LocalVector(1, 0, 0)));
398  if (stripPlane.normalVector().dot(gluedPlane.normalVector()) < 0) {
399  // the two planes are inverted, and the correlation element must change sign
400  err = LocalError(err.xx(), -err.xy(), err.yy());
401  }
402  LocalError rotatedError = err.rotate(hitXAxis.x(), hitXAxis.y());
403 
404  /* // This is probably meaningless
405  LogDebug("TkStripMeasurementDet") <<
406  "Testing local pos on strip (SLP): " << slp <<
407  " in? :" << stripPlane.bounds().inside(slp) <<
408  " in(3s)? :" << stripPlane.bounds().inside(slp, rotatedError, 3.0f);
409  // but it helps to test bugs in the formula for POS */
410  /*LogDebug("TkStripMeasurementDet") <<
411  "Testing local pos strip: " << pos <<
412  " in? " << stripPlane.bounds().inside(pos) <<
413  " in(3s)? " << stripPlane.bounds().inside(pos, rotatedError, 3.0f);*/
414 
415  // now we need to convert to MeasurementFrame
416  const StripTopology& topo = mdet.specificGeomDet().specificTopology();
417  float utraj = topo.measurementPosition(pos).x();
418  float uerr = std::sqrt(topo.measurementError(pos, rotatedError).uu());
419  return mdet.testStrips(utraj, uerr);
420 }
421 
423  const SiStripRecHitMatcher* matcher,
426  : geomDet_(geomDet),
427  matcher_(matcher),
428  cpe_(cpe),
429  target_(target),
430  collector_(std::bind(&HitCollectorForRecHits::add, std::ref(*this), std::placeholders::_1)),
431  hasNewHits_(false) {}
432 
434  const GeomDet* geomDet,
435  const SiStripRecHitMatcher* matcher,
437  const TrajectoryStateOnSurface& stateOnThisDet,
438  const MeasurementEstimator& est,
440  : geomDet_(geomDet),
441  matcher_(matcher),
442  cpe_(cpe),
443  stateOnThisDet_(stateOnThisDet),
444  est_(est),
445  target_(target),
446  collector_(std::bind(&HitCollectorForSimpleHits::add, std::ref(*this), std::placeholders::_1)),
447  hasNewHits_(false) {}
448 
450  auto&& vl = projectedPos(hit, *geomDet_, gdir, cpe_);
451  auto&& phit = std::make_shared<ProjectedSiStripRecHit2D>(
452  vl.first, vl.second, *geomDet_, static_cast<SiStripRecHit2D const&>(hit));
453  target_.push_back(std::move(phit));
454 }
455 
457  hasNewHits_ = true; //FIXME: see also what happens moving this within testAndPush // consistent with previous code
458  if (!est_.preFilter(stateOnThisDet_,
459  ClusterFilterPayload(hit2d.geographicalId(), &hit2d.monoCluster(), &hit2d.stereoCluster())))
460  return;
461  hasNewHits_ = true; //FIXME: see also what happens moving this within testAndPush
462 
463  std::pair<bool, double> diffEst = est_.estimate(stateOnThisDet_, hit2d);
464  if (diffEst.first)
465  target_.emplace_back(new SiStripMatchedRecHit2D(hit2d)); // fix to use move (really needed???)
466 }
467 
469  const GlobalVector& gdir) {
470  auto const& thit = reinterpret_cast<TrackerSingleRecHit const&>(hit);
471  if (!est_.preFilter(stateOnThisDet_, ClusterFilterPayload(hit.geographicalId(), &thit.stripCluster())))
472  return;
473 
474  // here we're ok with some extra casual new's and delete's
475  auto&& vl = projectedPos(hit, *geomDet_, gdir, cpe_);
476  std::unique_ptr<ProjectedSiStripRecHit2D> phit(
477  new ProjectedSiStripRecHit2D(vl.first, vl.second, *geomDet_, static_cast<SiStripRecHit2D const&>(hit)));
478  std::pair<bool, double> diffEst = est_.estimate(stateOnThisDet_, *phit);
479  if (diffEst.first) {
480  target_.emplace_back(phit.release());
481  }
482 }
483 
485  const GeomDet* geomDet,
486  const SiStripRecHitMatcher* matcher,
488  const TrajectoryStateOnSurface& stateOnThisDet,
489  const MeasurementEstimator& est,
491  : geomDet_(geomDet),
492  matcher_(matcher),
493  cpe_(cpe),
494  stateOnThisDet_(stateOnThisDet),
495  est_(est),
496  target_(target),
497  collector_(std::bind(&HitCollectorForFastMeasurements::add, std::ref(*this), std::placeholders::_1)),
498  hasNewHits_(false) {}
499 
501  //FIXME: see also what happens moving this within testAndPush // consistent with previous code...
502  hasNewHits_ = true;
503  if (!est_.preFilter(stateOnThisDet_,
504  ClusterFilterPayload(hit2d.geographicalId(), &hit2d.monoCluster(), &hit2d.stereoCluster())))
505  return;
506  hasNewHits_ = true; //FIXME: see also what happens moving this within testAndPush
507 
508  std::pair<bool, double> diffEst = est_.estimate(stateOnThisDet_, hit2d);
509  if (diffEst.first)
510  target_.add(hit2d.cloneSH(), diffEst.second);
511 }
512 
514  const GlobalVector& gdir) {
515  auto const& thit = reinterpret_cast<TrackerSingleRecHit const&>(hit);
516  if (!est_.preFilter(stateOnThisDet_, ClusterFilterPayload(hit.geographicalId(), &thit.stripCluster())))
517  return;
518 
519  // here we're ok with some extra casual new's and delete's
520  auto&& vl = projectedPos(hit, *geomDet_, gdir, cpe_);
521  auto&& phit = std::make_shared<ProjectedSiStripRecHit2D>(
522  vl.first, vl.second, *geomDet_, static_cast<SiStripRecHit2D const&>(hit));
523 
524  std::pair<bool, double> diffEst = est_.estimate(stateOnThisDet_, *phit);
525  if (diffEst.first) {
526  target_.add(phit, diffEst.second);
527  }
528 }
529 
530 #ifdef DOUBLE_MATCH
531 #include "doubleMatch.icc"
532 #endif
void collectRecHits(const TrajectoryStateOnSurface &, const MeasurementTrackerEvent &data, Collector &coll) const
float uu() const
const TkStripMeasurementDet * theMonoDet
unsigned int tobLayer(const DetId &id) const
bool isActive(const MeasurementTrackerEvent &data) const override
Is this module active in reconstruction? It must be both &#39;setActiveThisEvent&#39; and &#39;setActive&#39;...
void add(SiStripMatchedRecHit2D const &hit)
bool testStrips(float utraj, float uerr) const
return true if there are &#39;enough&#39; good strips in the utraj +/- 3 uerr range.
const StripGeomDetUnit & specificGeomDet() const
const LocalTrajectoryError & localError() const
LocalError rotate(float x, float y) const
Return a new LocalError, rotated by an angle defined by the direction (x,y)
Definition: LocalError.h:37
virtual const GeomDet & geomDet() const
T z() const
Definition: PV3DBase.h:61
RecHitPointer cloneSH() const override
std::unique_ptr< SiStripMatchedRecHit2D > match(const SiStripRecHit2D *monoRH, const SiStripRecHit2D *stereoRH, const GluedGeomDet *gluedDet, LocalVector trackdirection, bool force) const
const TkStripMeasurementDet * stereoDet() const
void doubleMatch(const TrajectoryStateOnSurface &ts, const MeasurementTrackerEvent &data, Collector &collector) const
const GlobalTrajectoryParameters & globalParameters() const
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
RecHitContainer recHits(const TrajectoryStateOnSurface &, const MeasurementTrackerEvent &data) const override
void simpleRecHits(const TrajectoryStateOnSurface &ts, const MeasurementTrackerEvent &data, std::vector< SiStripRecHit2D > &result) const
const GluedGeomDet & specificGeomDet() const
void addProjected(const TrackingRecHit &hit, const GlobalVector &gdir)
T x() const
Definition: PV2DBase.h:43
LocalError positionError() const
LocalPoint toLocal(const GlobalPoint &gp) const
void addProjected(const TrackingRecHit &hit, const GlobalVector &gdir)
TrajectoryStateOnSurface propagate(const TrackingRecHit &hit, const Plane &plane, const TrajectoryStateOnSurface &ts) const
TkGluedMeasurementDet(const GluedGeomDet *gdet, const SiStripRecHitMatcher *matcher, const StripClusterParameterEstimator *cpe)
TrackingRecHit::ConstRecHitPointer theMissingHit
float yy() const
Definition: LocalError.h:24
T x() const
Definition: PV3DBase.h:59
T y() const
Definition: PV3DBase.h:60
const Surface::PositionType & position() const
GlobalPoint globalPosition() const
virtual MeasurementError measurementError(const LocalPoint &, const LocalError &) const =0
bool hasAllGoodChannels() const
does this module have at least one bad strip, APV or channel?
SiStripCluster const & monoCluster() const
T sqrt(T t)
Definition: SSEVec.h:19
float minPt2ForHitRecoveryInGluedDet() const
RecHitContainer recHits(const TrajectoryStateOnSurface &, const MeasurementTrackerEvent &data) const override
LocalVector localDirection() const
virtual const StripTopology & specificTopology() const
Returns a reference to the strip proxy topology.
RecHitContainer projectOnGluedDet(const std::vector< SiStripRecHit2D > &hits, const TrajectoryStateOnSurface &ts) const
HitCollectorForSimpleHits(const GeomDet *geomDet, const SiStripRecHitMatcher *matcher, const StripClusterParameterEstimator *cpe, const TrajectoryStateOnSurface &stateOnThisDet, const MeasurementEstimator &est, SimpleHitContainer &target)
constexpr int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:48
virtual MeasurementPoint measurementPosition(const LocalPoint &) const =0
void checkHitProjection(const TrackingRecHit &hit, const TrajectoryStateOnSurface &ts, const GeomDet &det) const
DetId geographicalId() const
The label of this GeomDet.
Definition: GeomDet.h:64
const SiStripRecHitMatcher * theMatcher
float xy() const
Definition: LocalError.h:23
const Plane & surface() const
The nominal surface of the GeomDet.
Definition: GeomDet.h:37
T mag() const
The vector magnitude. Equivalent to sqrt(vec.mag2())
DetId geographicalId() const
HitCollectorForFastMeasurements(const GeomDet *geomDet, const SiStripRecHitMatcher *matcher, const StripClusterParameterEstimator *cpe, const TrajectoryStateOnSurface &stateOnThisDet, const MeasurementEstimator &est, TempMeasurements &target)
std::vector< const SiStripRecHit2D * > SimpleHitCollection
unsigned long long uint64_t
Definition: Time.h:13
TrackingRecHit::ConstRecHitPointer theInactiveHit
const GeomDet & fastGeomDet() const
bool measurements(const TrajectoryStateOnSurface &stateOnThisDet, const MeasurementEstimator &est, const MeasurementTrackerEvent &data, TempMeasurements &result) const override
const TkStripMeasurementDet * theStereoDet
GlobalVector globalMomentum() const
SiStripCluster const & stereoCluster() const
const T * operator()(const T &val) const
T perp2() const
Definition: PV3DBase.h:68
const Surface & surface() const
void init(const MeasurementDet *monoDet, const MeasurementDet *stereoDet, const TrackerTopology *tTopo)
TrackingRecHit::ConstRecHitContainer RecHitContainer
void add(std::map< std::string, TH1 *> &h, TH1 *hist)
void addProjected(const TrackingRecHit &hit, const GlobalVector &gdir)
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:79
virtual TrackingRecHit const * hit() const
std::pair< typename Association::data_type::first_type, double > match(Reference key, Association association, bool bestMatchByMaxValue)
Generic matching function.
Definition: Utils.h:10
std::vector< BaseTrackerRecHit * > SimpleHitContainer
const TrackerTopology * theTopology
#define UNLIKELY(x)
Definition: Likely.h:21
static uInt32 F(BLOWFISH_CTX *ctx, uInt32 x)
Definition: blowfish.cc:163
const StripClusterParameterEstimator * theCPE
long double T
const TkStripMeasurementDet * monoDet() const
bool testStrips(const TrajectoryStateOnSurface &tsos, const BoundPlane &gluedPlane, const TkStripMeasurementDet &mdet) const
Test the strips on one of the two dets with projection.
float xx() const
Definition: LocalError.h:22
def move(src, dest)
Definition: eostools.py:511
HitCollectorForRecHits(const GeomDet *geomDet, const SiStripRecHitMatcher *matcher, const StripClusterParameterEstimator *cpe, RecHitContainer &target)
void checkProjection(const TrajectoryStateOnSurface &ts, const RecHitContainer &monoHits, const RecHitContainer &stereoHits) const
unsigned transform(const HcalDetId &id, unsigned transformCode)