Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add method to return the significance of a track inside a Det #21147

Merged
merged 13 commits into from Nov 15, 2017
2 changes: 2 additions & 0 deletions DataFormats/GeometrySurface/interface/Bounds.h
Expand Up @@ -65,6 +65,8 @@ class Bounds {
return inside( Local3DPoint(p.x(), p.y(), 0), err, scale);
}

virtual float howMuchInside(const Local3DPoint&, const LocalError&) const;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

significanceInside or similar seems more descriptive.


virtual Bounds* clone() const = 0;

std::pair<float,float> const & phiSpan() const { return m_span.phiSpan(); }
Expand Down
Expand Up @@ -55,6 +55,9 @@ class RectangularPlaneBounds final : public Bounds {

bool inside( const Local2DPoint& p, const LocalError& err, float scale=1.f) const override;

float howMuchInside(const Local3DPoint&, const LocalError&) const override;


// compatible of being inside or outside...
std::pair<bool,bool> inout( const Local3DPoint& p, const LocalError& err, float scale=1.f) const;

Expand Down
Expand Up @@ -51,6 +51,9 @@ class TrapezoidalPlaneBounds /* final */ : public Bounds {

bool inside( const Local2DPoint& p, const LocalError& err, float scale) const override;

float howMuchInside(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!
Expand Down
7 changes: 7 additions & 0 deletions DataFormats/GeometrySurface/src/Bounds.cc
@@ -0,0 +1,7 @@
#include "DataFormats/GeometrySurface/interface/Bounds.h"
#include "DataFormats/GeometrySurface/interface/GeomExceptions.h"

float Bounds::howMuchInside(const Local3DPoint&, const LocalError&) const {
throw GeometryError("howMuchInside not implemented");
}

6 changes: 6 additions & 0 deletions DataFormats/GeometrySurface/src/RectangularPlaneBounds.cc
Expand Up @@ -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::howMuchInside(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<bool,bool> RectangularPlaneBounds::inout( const Local3DPoint& p, const LocalError& err, float scale) const {
float xl = std::abs(p.x()) - std::sqrt(err.xx())*scale;
Expand Down
9 changes: 9 additions & 0 deletions DataFormats/GeometrySurface/src/TrapezoidalPlaneBounds.cc
Expand Up @@ -44,6 +44,15 @@ bool TrapezoidalPlaneBounds::inside( const Local2DPoint& p, const LocalError& er
return Bounds::inside(p,err,scale);
}

float TrapezoidalPlaneBounds::howMuchInside(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);
}
Expand Down
12 changes: 8 additions & 4 deletions TrackingTools/MeasurementDet/src/LayerMeasurements.cc
Expand Up @@ -186,13 +186,17 @@ void LayerMeasurements::addInvalidMeas( vector<TrajectoryMeasurement>& 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().howMuchInside(ts.localPosition(),ts.localError().positionError());
measVec.emplace_back(measVec.front().predictedState(),
std::make_shared<InvalidTrackingRecHit>(*measVec.front().recHit()->det(), TrackingRecHit::missing),
0.,&layer);
std::make_shared<InvalidTrackingRecHit>(*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<InvalidTrackingRecHit>(*group.front().det(), TrackingRecHit::missing), 0.,&layer);
auto const & ts = group.front().trajectoryState();
auto toll = group.front().det()->surface().bounds().howMuchInside(ts.localPosition(),ts.localError().positionError());
measVec.emplace_back(group.front().trajectoryState(),
std::make_shared<InvalidTrackingRecHit>(*group.front().det(), TrackingRecHit::missing), toll,&layer);
}
}