diff --git a/DataFormats/GeometrySurface/interface/Bounds.h b/DataFormats/GeometrySurface/interface/Bounds.h index dde787fe6e9a3..06f4f0d5f6ce7 100644 --- a/DataFormats/GeometrySurface/interface/Bounds.h +++ b/DataFormats/GeometrySurface/interface/Bounds.h @@ -65,6 +65,8 @@ class Bounds { return inside( Local3DPoint(p.x(), p.y(), 0), err, scale); } + virtual float significanceInside(const Local3DPoint&, const LocalError&) const; + virtual Bounds* clone() const = 0; std::pair const & phiSpan() const { return m_span.phiSpan(); } diff --git a/DataFormats/GeometrySurface/interface/RectangularPlaneBounds.h b/DataFormats/GeometrySurface/interface/RectangularPlaneBounds.h index 747a5152b6a99..30e2ad24d87e2 100644 --- a/DataFormats/GeometrySurface/interface/RectangularPlaneBounds.h +++ b/DataFormats/GeometrySurface/interface/RectangularPlaneBounds.h @@ -55,6 +55,9 @@ class RectangularPlaneBounds final : public Bounds { bool inside( const Local2DPoint& p, const LocalError& err, float scale=1.f) const override; + float significanceInside(const Local3DPoint&, const LocalError&) const override; + + // compatible of being inside or outside... std::pair inout( const Local3DPoint& p, const LocalError& err, float scale=1.f) const; diff --git a/DataFormats/GeometrySurface/interface/TrapezoidalPlaneBounds.h b/DataFormats/GeometrySurface/interface/TrapezoidalPlaneBounds.h index 23cb165206d9d..928106c2db1b8 100644 --- a/DataFormats/GeometrySurface/interface/TrapezoidalPlaneBounds.h +++ b/DataFormats/GeometrySurface/interface/TrapezoidalPlaneBounds.h @@ -51,6 +51,9 @@ class TrapezoidalPlaneBounds /* final */ : public Bounds { bool inside( const Local2DPoint& p, const LocalError& err, float scale) const override; + float significanceInside(const Local3DPoint&, const LocalError&) const override; + + /** returns the 4 parameters needed for construction, in the order * ( half bottom edge, half top edge, half thickness, half apothem). * Beware! This order is different from the one in the constructor! diff --git a/DataFormats/GeometrySurface/src/Bounds.cc b/DataFormats/GeometrySurface/src/Bounds.cc new file mode 100644 index 0000000000000..2db2f1f9b8543 --- /dev/null +++ b/DataFormats/GeometrySurface/src/Bounds.cc @@ -0,0 +1,7 @@ +#include "DataFormats/GeometrySurface/interface/Bounds.h" +#include "DataFormats/GeometrySurface/interface/GeomExceptions.h" + +float Bounds::significanceInside(const Local3DPoint&, const LocalError&) const { + throw GeometryError("howMuchInside not implemented"); +} + diff --git a/DataFormats/GeometrySurface/src/RectangularPlaneBounds.cc b/DataFormats/GeometrySurface/src/RectangularPlaneBounds.cc index f871a835eedf0..78f7396a9aa0a 100644 --- a/DataFormats/GeometrySurface/src/RectangularPlaneBounds.cc +++ b/DataFormats/GeometrySurface/src/RectangularPlaneBounds.cc @@ -25,6 +25,12 @@ bool RectangularPlaneBounds::inside( const Local2DPoint& p, const LocalError& er (std::abs(p.y()) < halfLength + std::sqrt(err.yy())*scale); } +float RectangularPlaneBounds::significanceInside(const Local3DPoint& p, const LocalError& err) const { + return std::max((std::abs(p.x()) - halfWidth )/std::sqrt(err.xx()), + (std::abs(p.y()) - halfLength)/std::sqrt(err.yy()) + ); +} + std::pair RectangularPlaneBounds::inout( const Local3DPoint& p, const LocalError& err, float scale) const { float xl = std::abs(p.x()) - std::sqrt(err.xx())*scale; diff --git a/DataFormats/GeometrySurface/src/TrapezoidalPlaneBounds.cc b/DataFormats/GeometrySurface/src/TrapezoidalPlaneBounds.cc index 424e6e853a728..c8eb88bf08d49 100644 --- a/DataFormats/GeometrySurface/src/TrapezoidalPlaneBounds.cc +++ b/DataFormats/GeometrySurface/src/TrapezoidalPlaneBounds.cc @@ -44,6 +44,15 @@ bool TrapezoidalPlaneBounds::inside( const Local2DPoint& p, const LocalError& er return Bounds::inside(p,err,scale); } +float TrapezoidalPlaneBounds::significanceInside(const Local3DPoint& p, const LocalError& err) const { + return std::max( + (std::abs(p.y())-hapothem)/std::sqrt(err.yy()), + (std::abs(p.x())-tan_a*std::abs(p.y()+offset))/std::sqrt(err.xx()) + ); +} + + + Bounds* TrapezoidalPlaneBounds::clone() const { return new TrapezoidalPlaneBounds(*this); } diff --git a/TrackingTools/MeasurementDet/src/LayerMeasurements.cc b/TrackingTools/MeasurementDet/src/LayerMeasurements.cc index 882c417ae182e..2834c0dd7b809 100644 --- a/TrackingTools/MeasurementDet/src/LayerMeasurements.cc +++ b/TrackingTools/MeasurementDet/src/LayerMeasurements.cc @@ -186,13 +186,17 @@ void LayerMeasurements::addInvalidMeas( vector& measVec, { if (!measVec.empty()) { // invalidMeas on Det of most compatible hit + auto const & ts = measVec.front().predictedState(); + auto toll = measVec.front().recHitR().det()->surface().bounds().significanceInside(ts.localPosition(),ts.localError().positionError()); measVec.emplace_back(measVec.front().predictedState(), - std::make_shared(*measVec.front().recHit()->det(), TrackingRecHit::missing), - 0.,&layer); + std::make_shared(*measVec.front().recHitR().det(), TrackingRecHit::missing), + toll,&layer); } else if (!group.empty()) { // invalid state on first compatible Det - measVec.emplace_back(group.front().trajectoryState(), - std::make_shared(*group.front().det(), TrackingRecHit::missing), 0.,&layer); + auto const & ts = group.front().trajectoryState(); + auto toll = group.front().det()->surface().bounds().significanceInside(ts.localPosition(),ts.localError().positionError()); + measVec.emplace_back(group.front().trajectoryState(), + std::make_shared(*group.front().det(), TrackingRecHit::missing), toll,&layer); } }