38 double delta = gluedPlane.localZ( hitPlane.position());
41 LocalPoint projectedHitPos = lhitPos - ldir * delta/ldir.
z();
45 if (gluedPlane.normalVector().dot( hitPlane.normalVector()) < 0) {
51 return std::make_pair(projectedHitPos, rotatedError);
56 std::pair<LocalPoint,LocalError> projectedPos(
const TrackingRecHit& hit,
60 return projectedPos(hit, det, gdir, cpe);
73 theMatcher(matcher), theCPE(cpe),
83 throw MeasurementDetException(
"TkGluedMeasurementDet ERROR: Trying to glue a det which is not a TkStripMeasurementDet");
103 auto oldSize = result.size();
107 return result.size()>oldSize;
125 auto oldSize = result.
size();
131 if (result.
size()>oldSize)
return true;
162 template<
typename Collector>
169 template<
typename Collector>
183 if (monoHits.empty()) {
188 std::vector<SiStripRecHit2D> simpleSteroHitsByValue;
191 if (simpleSteroHitsByValue.empty()) {
197 vsStereoHits.resize(simpleSteroHitsByValue.size());
201 for (RecHitContainer::const_iterator monoHit = monoHits.begin();
202 monoHit != monoHits.end(); ++monoHit) {
205 theMatcher->
match( verySpecificMonoHit, vsStereoHits.begin(), vsStereoHits.end(),
208 if (collector.hasNewMatchedHits()) {
209 collector.clearNewMatchedHitsFlag();
211 collector.addProjected( **monoHit, glbDir );
252 if(fm!=0&&fs!=0) ++matchF;
253 if(fm!=0||fs!=0) ++singleF;
257 printf(
"Matches:%d/%d/%d/%d/%d/%d : %f/%f/%f/%f/%f/%f/%f\n",
258 int(totCall),
int(matchF),
int(singleF-matchF),
int(matchT),
int(zeroM),
int(zeroS),
259 totMono/totCall,totStereo/totCall,totComb/totCall,totMatched/matchT,
260 filtMono/totCall,filtStereo/totCall,filtComb/matchF);
275 for (
auto const & hit : hits) {
277 auto && phit = std::make_shared<ProjectedSiStripRecHit2D> (vl.first,vl.second,
fastGeomDet(),
static_cast<SiStripRecHit2D const &
>(*hit));
283 template<
typename Collector>
289 for ( RecHitContainer::const_iterator ihit = hits.begin(); ihit!=hits.end(); ihit++) {
290 collector.addProjected( **ihit, gdir );
299 for (
auto const & hit : hits) {
301 auto && phit = std::make_shared<ProjectedSiStripRecHit2D> (vl.first,vl.second,
fastGeomDet(),
static_cast<SiStripRecHit2D const &
>(hit));
307 template<
typename Collector>
310 std::vector<SiStripRecHit2D>
const & hits,
313 for (
auto const & hit : hits)
314 collector.addProjected(hit, gdir );
325 for (RecHitContainer::const_iterator
i=monoHits.begin();
i != monoHits.end(); ++
i) {
328 for (RecHitContainer::const_iterator
i=stereoHits.begin();
i != stereoHits.end(); ++
i) {
343 if ((projectedHit.localPosition()-propState.
localPosition()).
mag() > 0.0001f) {
344 std::cout <<
"PROBLEM: projected and propagated hit positions differ by "
345 << (projectedHit.localPosition()-propState.
localPosition()).
mag() << std::endl;
348 LocalError le1 = projectedHit.localPositionError();
351 double cutoff = 1.e-4;
353 fabs(le1.
xy() - le2.
xy())/(cutoff+fabs(le1.
xy()))),
354 fabs(le1.
yy() - le2.
yy())/(cutoff+le1.
xx()));
356 std::cout <<
"PROBLEM: projected and propagated hit errors differ by "
357 << maxdiff << std::endl;
389 if (stripPlane.normalVector().dot( gluedPlane.normalVector()) < 0) {
413 #include<boost/bind.hpp>
417 geomDet_(geomDet), matcher_(matcher), cpe_(cpe),target_(target),
430 geomDet_(geomDet), matcher_(matcher), cpe_(cpe),stateOnThisDet_(stateOnThisDet), est_(est), target_(target),
441 auto && vl = projectedPos(hit,*geomDet_, gdir, cpe_);
442 auto && phit = std::make_shared<ProjectedSiStripRecHit2D> (vl.first,vl.second,*geomDet_,
static_cast<SiStripRecHit2D const &
>(hit));
454 std::pair<bool,double> diffEst = est_.estimate( stateOnThisDet_, hit2d);
469 auto && vl = projectedPos(hit,*geomDet_, gdir, cpe_);
470 std::unique_ptr<ProjectedSiStripRecHit2D> phit(
new ProjectedSiStripRecHit2D(vl.first,vl.second,*geomDet_, static_cast<SiStripRecHit2D const &>(hit)));
471 std::pair<bool,double> diffEst = est_.estimate( stateOnThisDet_, *phit);
472 if ( diffEst.first) {
473 target_.emplace_back(phit.release());
486 geomDet_(geomDet), matcher_(matcher), cpe_(cpe),stateOnThisDet_(stateOnThisDet), est_(est), target_(target),
500 std::pair<bool,double> diffEst = est_.estimate( stateOnThisDet_, hit2d);
515 auto && vl = projectedPos(hit,*geomDet_, gdir, cpe_);
516 auto && phit = std::make_shared<ProjectedSiStripRecHit2D> (vl.first,vl.second,*geomDet_,
static_cast<SiStripRecHit2D const &
>(hit));
518 std::pair<bool,double> diffEst = est_.estimate( stateOnThisDet_, *phit);
519 if ( diffEst.first) {
520 target_.add(phit, diffEst.second);
527 #include "doubleMatch.icc"
virtual RecHitContainer recHits(const TrajectoryStateOnSurface &, const MeasurementTrackerEvent &data) const
bool testStrips(const TrajectoryStateOnSurface &tsos, const BoundPlane &gluedPlane, const TkStripMeasurementDet &mdet) const
Test the strips on one of the two dets with projection.
const TkStripMeasurementDet * theMonoDet
void init(const MeasurementDet *monoDet, const MeasurementDet *stereoDet)
void add(SiStripMatchedRecHit2D const &hit)
void checkProjection(const TrajectoryStateOnSurface &ts, const RecHitContainer &monoHits, const RecHitContainer &stereoHits) const
T mag() const
The vector magnitude. Equivalent to sqrt(vec.mag2())
SiStripCluster const & monoCluster() const
LocalVector localDirection() const
LocalPoint localPosition() const
virtual const GeomDet & geomDet() const
Global3DPoint GlobalPoint
GlobalPoint globalPosition() const
void add(const std::vector< const T * > &source, std::vector< const T * > &dest)
const TkStripMeasurementDet * monoDet() const
void simpleRecHits(const TrajectoryStateOnSurface &ts, const MeasurementTrackerEvent &data, std::vector< SiStripRecHit2D > &result) const
const Surface & surface() const
void addProjected(const TrackingRecHit &hit, const GlobalVector &gdir)
virtual GlobalPoint globalPosition() const
virtual const StripTopology & specificTopology() const
Returns a reference to the strip proxy topology.
const Plane & surface() const
The nominal surface of the GeomDet.
LocalError positionError() const
void addProjected(const TrackingRecHit &hit, const GlobalVector &gdir)
TkGluedMeasurementDet(const GluedGeomDet *gdet, const SiStripRecHitMatcher *matcher, const StripClusterParameterEstimator *cpe)
TrackingRecHit::ConstRecHitPointer theMissingHit
const GeomDet & fastGeomDet() const
virtual RecHitContainer recHits(const TrajectoryStateOnSurface &, const MeasurementTrackerEvent &data) const
virtual MeasurementError measurementError(const LocalPoint &, const LocalError &) const =0
TrajectoryStateOnSurface propagate(const TrackingRecHit &hit, const Plane &plane, const TrajectoryStateOnSurface &ts) const
virtual RecHitPointer cloneSH() const
const GeomDet * det() const
LocalPoint toLocal(const GlobalPoint &gp) const
void add(ConstRecHitPointer const &h, float d)
const GluedGeomDet & specificGeomDet() const
GlobalVector momentum() const
virtual bool measurements(const TrajectoryStateOnSurface &stateOnThisDet, const MeasurementEstimator &est, const MeasurementTrackerEvent &data, TempMeasurements &result) const
HitCollectorForSimpleHits(const GeomDet *geomDet, const SiStripRecHitMatcher *matcher, const StripClusterParameterEstimator *cpe, const TrajectoryStateOnSurface &stateOnThisDet, const MeasurementEstimator &est, SimpleHitContainer &target)
virtual MeasurementPoint measurementPosition(const LocalPoint &) const =0
const LocalTrajectoryError & localError() const
bool hasAllGoodChannels() const
does this module have at least one bad strip, APV or channel?
void collectRecHits(const TrajectoryStateOnSurface &, const MeasurementTrackerEvent &data, Collector &coll) const
const T * operator()(const T &val) const
const Surface::PositionType & position() const
void doubleMatch(const TrajectoryStateOnSurface &ts, const MeasurementTrackerEvent &data, Collector &collector) const
void add(SiStripMatchedRecHit2D const &hit)
RecHitContainer projectOnGluedDet(const std::vector< SiStripRecHit2D > &hits, const TrajectoryStateOnSurface &ts) const
const SiStripRecHitMatcher * theMatcher
virtual TrackingRecHit const * hit() const
HitCollectorForFastMeasurements(const GeomDet *geomDet, const SiStripRecHitMatcher *matcher, const StripClusterParameterEstimator *cpe, const TrajectoryStateOnSurface &stateOnThisDet, const MeasurementEstimator &est, TempMeasurements &target)
unsigned long long uint64_t
const GlobalTrajectoryParameters & globalParameters() const
std::vector< const SiStripRecHit2D * > SimpleHitCollection
TrackingRecHit::ConstRecHitPointer theInactiveHit
virtual LocalError localPositionError() const =0
void checkHitProjection(const TrackingRecHit &hit, const TrajectoryStateOnSurface &ts, const GeomDet &det) const
std::unique_ptr< SiStripMatchedRecHit2D > match(const SiStripRecHit2D *monoRH, const SiStripRecHit2D *stereoRH, const GluedGeomDet *gluedDet, LocalVector trackdirection, bool force=false) const
bool isActive(const MeasurementTrackerEvent &data) const
Is this module active in reconstruction? It must be both 'setActiveThisEvent' and 'setActive'...
const TkStripMeasurementDet * theStereoDet
const StripGeomDetUnit & specificGeomDet() const
tuple MeasurementTrackerEvent
TrackingRecHit::ConstRecHitContainer RecHitContainer
SiStripCluster const & stereoCluster() const
std::vector< BaseTrackerRecHit * > SimpleHitContainer
void addProjected(const TrackingRecHit &hit, const GlobalVector &gdir)
bool testStrips(float utraj, float uerr) const
return true if there are 'enough' good strips in the utraj +/- 3 uerr range.
std::pair< typename Association::data_type::first_type, double > match(Reference key, Association association, bool bestMatchByMaxValue)
Generic matching function.
const TkStripMeasurementDet * stereoDet() const
DetId geographicalId() const
volatile std::atomic< bool > shutdown_flag false
static uInt32 F(BLOWFISH_CTX *ctx, uInt32 x)
LocalError rotate(float x, float y) const
Return a new LocalError, rotated by an angle defined by the direction (x,y)
const StripClusterParameterEstimator * theCPE
HitCollectorForRecHits(const GeomDet *geomDet, const SiStripRecHitMatcher *matcher, const StripClusterParameterEstimator *cpe, RecHitContainer &target)