Skip to content

Commit 11c4533

Browse files
committed
Merge pull request cms-sw#2581 from VinInn/FastMatch
RecoLocalTracker -- Fast match
2 parents bb373ea + 36b4f2e commit 11c4533

File tree

7 files changed

+77
-40
lines changed

7 files changed

+77
-40
lines changed

RecoLocalTracker/SiStripRecHitConverter/interface/SiStripRecHitMatcher.h

+3-2
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@ class SiStripRecHitMatcher {
3737

3838
SiStripRecHitMatcher(const edm::ParameterSet& conf);
3939
SiStripRecHitMatcher(const double theScale);
40-
40+
41+
bool preFilter() const { return preFilter_;}
4142

4243
// optimized matching iteration (the algo is the same, just recoded)
4344
template<typename MonoIterator, typename StereoIterator, typename CollectorHelper>
@@ -98,7 +99,7 @@ class SiStripRecHitMatcher {
9899

99100

100101
float scale_;
101-
102+
bool preFilter_=false;
102103
};
103104

104105

RecoLocalTracker/SiStripRecHitConverter/python/SiStripRecHitMatcher_cfi.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22

33
SiStripRecHitMatcherESProducer = cms.ESProducer("SiStripRecHitMatcherESProducer",
44
ComponentName = cms.string('StandardMatcher'),
5-
NSigmaInside = cms.double(3.0)
5+
NSigmaInside = cms.double(3.0),
6+
PreFilter = cms.bool(False)
67
)
78

89

RecoLocalTracker/SiStripRecHitConverter/src/SiStripRecHitMatcher.cc

+7-6
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,14 @@
1515

1616

1717

18-
SiStripRecHitMatcher::SiStripRecHitMatcher(const edm::ParameterSet& conf){
19-
scale_=conf.getParameter<double>("NSigmaInside");
20-
}
18+
SiStripRecHitMatcher::SiStripRecHitMatcher(const edm::ParameterSet& conf):
19+
scale_(conf.getParameter<double>("NSigmaInside")),
20+
preFilter_(conf.existsAs<bool>("PreFilter") ? conf.getParameter<bool>("PreFilter") : false)
21+
{}
22+
23+
SiStripRecHitMatcher::SiStripRecHitMatcher(const double theScale):
24+
scale_(theScale){}
2125

22-
SiStripRecHitMatcher::SiStripRecHitMatcher(const double theScale){
23-
scale_=theScale;
24-
}
2526

2627

2728
namespace {

RecoTracker/MeasurementDet/plugins/TkGluedMeasurementDet.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ class TkGluedMeasurementDet GCC11_FINAL : public MeasurementDet {
106106
SiStripRecHitMatcher::Collector & collector() { return collector_; }
107107
bool hasNewMatchedHits() const { return hasNewHits_; }
108108
void clearNewMatchedHitsFlag() { hasNewHits_ = false; }
109-
static bool filter() { return false;} // if true mono-colection will been filter using the estimator before matching
109+
bool filter() const { return matcher_->preFilter();} // if true mono-colection will been filter using the estimator before matching
110110
size_t size() const { return target_.size();}
111111
const MeasurementEstimator & estimator() { return est_;}
112112
private:

RecoTracker/MeasurementDet/plugins/TkStripMeasurementDet.cc

+29-2
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,38 @@ TkStripMeasurementDet::TkStripMeasurementDet( const GeomDet* gdet, StMeasurement
2121
}
2222
}
2323

24+
25+
// fast check if the det contains any useful cluster
26+
bool TkStripMeasurementDet::empty(const MeasurementTrackerEvent & data) const {
27+
if unlikely( (!isActive(data)) || isEmpty(data.stripData())) return true;
28+
29+
if(!isRegional()){// standard implemetation with DetSet
30+
const detset & detSet = data.stripData().detSet(index());
31+
for ( auto ci = detSet.begin(); ci != detSet.end(); ++ ci ) {
32+
if (isMasked(*ci)) continue;
33+
SiStripClusterRef cluster = edmNew::makeRefTo( data.stripData().handle(), ci );
34+
if (accept(cluster, data.stripClustersToSkip()))
35+
return false;
36+
}
37+
return true;
38+
}
39+
// on demand
40+
unsigned int ci = beginClusterI(data.stripData()), ce = endClusterI(data.stripData());
41+
for (; ci != ce; ++ci){
42+
SiStripRegionalClusterRef clusterRef = edm::makeRefToLazyGetter(data.stripData().regionalHandle(),ci);
43+
if (isMasked(*clusterRef)) continue;
44+
if (accept(clusterRef, data.stripClustersToSkip()))
45+
return false;
46+
}
47+
return true;
48+
}
49+
50+
2451
TkStripMeasurementDet::RecHitContainer
2552
TkStripMeasurementDet::recHits( const TrajectoryStateOnSurface& ts, const MeasurementTrackerEvent & data) const
2653
{
2754
RecHitContainer result;
28-
if ( (!isActive(data)) || isEmpty(data.stripData())) return result;
55+
if unlikely( (!isActive(data)) || isEmpty(data.stripData())) return result;
2956
if(!isRegional()){//old implemetation with DetSet
3057
const detset & detSet = data.stripData().detSet(index());
3158
result.reserve(detSet.size());
@@ -56,7 +83,7 @@ TkStripMeasurementDet::recHits( const TrajectoryStateOnSurface& ts, const Measur
5683
bool
5784
TkStripMeasurementDet::recHits( const TrajectoryStateOnSurface& stateOnThisDet, const MeasurementEstimator& est, const MeasurementTrackerEvent & data,
5885
RecHitContainer & result, std::vector<float> & diffs ) const {
59-
if ( (!isActive(data)) || isEmpty(data.stripData())) return false;
86+
if unlikely( (!isActive(data)) || isEmpty(data.stripData())) return false;
6087

6188
auto oldSize = result.size();
6289

RecoTracker/MeasurementDet/plugins/TkStripMeasurementDet.h

+1
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@ class TkStripMeasurementDet GCC11_FINAL : public MeasurementDet {
155155
virtual RecHitContainer recHits( const TrajectoryStateOnSurface&, const MeasurementTrackerEvent & data) const;
156156

157157

158+
bool empty(const MeasurementTrackerEvent & data) const;
158159

159160
void simpleRecHits( const TrajectoryStateOnSurface& ts, const MeasurementTrackerEvent & data, std::vector<SiStripRecHit2D> &result) const ;
160161

RecoTracker/MeasurementDet/plugins/doubleMatch.icc

+34-28
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ namespace {
4242
#include "DataFormats/GeometrySurface/interface/LocalError.h"
4343

4444
namespace {
45+
inline
4546
void print(const char* where, const TrajectoryStateOnSurface& t1,const TrajectoryStateOnSurface& t2) {
4647
std::cout << where<< std::endl;
4748
std::cout << t1.localParameters().vector() << std::endl;
@@ -50,8 +51,6 @@ namespace {
5051
std::cout << t2.localError().positionError() << std::endl;
5152

5253
}
53-
54-
5554
}
5655

5756

@@ -72,55 +71,62 @@ void TkGluedMeasurementDet::doubleMatch(const TrajectoryStateOnSurface& ts, cons
7271
auto mf = monoHits.size();
7372
auto sf = stereoHits.size();
7473

75-
// mono does not require "projection"
74+
bool emptyMono = false;
75+
bool emptyStereo = false;
76+
77+
// mono does require "projection" for precise estimate
7678
if (collector.filter()) {
77-
//TrajectoryStateOnSurface mts = fastProp(ts,geomDet().surface(),theMonoDet->geomDet().surface());
78-
theMonoDet->recHits(ts,collector.estimator(),data,monoHits,diffs);
79+
emptyMono = theMonoDet->empty(data);
80+
if likely(!emptyMono) {
81+
TrajectoryStateOnSurface mts = fastProp(ts,geomDet().surface(),theMonoDet->geomDet().surface());
82+
theMonoDet->recHits(mts,collector.estimator(),data,monoHits,diffs);
83+
}
7984
// print("mono", mts,ts);
8085
mf = monoHits.size();
8186
}
82-
else
87+
else {
8388
monoHits = theMonoDet->recHits(ts, data);
89+
emptyMono = monoHits.empty();
90+
}
8491

85-
// stereo in principle requires "projection"
86-
TrajectoryStateOnSurface pts = ts;
92+
// stereo requires "projection" for precision and change in coordinates
8793
diffs.clear();
8894
if (collector.filter()) {
89-
TrajectoryStateOnSurface pts = fastProp(ts,geomDet().surface(),theStereoDet->geomDet().surface());
90-
theStereoDet->recHits(pts,collector.estimator(),data,stereoHits,diffs);
91-
// print("stereo", pts,ts);
95+
emptyStereo = theStereoDet->empty(data);
96+
if likely(!emptyStereo) {
97+
TrajectoryStateOnSurface pts = fastProp(ts,geomDet().surface(),theStereoDet->geomDet().surface());
98+
theStereoDet->recHits(pts,collector.estimator(),data,stereoHits,diffs);
99+
// print("stereo", pts,ts);
100+
}
92101
sf = stereoHits.size();
93102
}
94-
else
95-
stereoHits= theStereoDet->recHits(pts,data);
96-
103+
else {
104+
stereoHits= theStereoDet->recHits(ts,data);
105+
emptyStereo = stereoHits.empty();
106+
}
97107

98108
if (collector.filter()) {
99109
auto mh = monoHits.size();
100110
auto sh = stereoHits.size();
101111
stat(mh,sh,mf,sf);
102112
}
103113

104-
if (stereoHits.empty()&&monoHits.empty()) return;
114+
if unlikely( emptyMono & emptyStereo) return;
105115

106-
if( (!theStereoDet->isActive(data)) ||
107-
((!collector.filter())&&stereoHits.empty())
108-
) {
109-
// make mono TTRHs and project them
110-
projectOnGluedDet( collector, monoHits, glbDir);
111-
return;
112-
}
116+
if unlikely(emptyStereo) {
117+
// make mono TTRHs and project them
118+
projectOnGluedDet( collector, monoHits, glbDir);
119+
return;
120+
}
113121

114-
if ( (!theMonoDet->isActive(data)) ||
115-
((!collector.filter())&&monoHits.empty())
116-
) {
117-
// make stereo TTRHs and project them
122+
if unlikely( emptyMono ) {
123+
// make stereo TTRHs and project them
118124
projectOnGluedDet( collector, stereoHits, glbDir);
119125
return;
120-
}
126+
}
121127

122128

123-
if ((!stereoHits.empty())&&(!monoHits.empty())) {
129+
if ((!monoHits.empty()) & (!stereoHits.empty()) ) {
124130

125131
const GluedGeomDet* gluedDet = &specificGeomDet();
126132
LocalVector trdir = (ts.isValid() ? ts.localDirection() : surface().toLocal( position()-GlobalPoint(0,0,0)));

0 commit comments

Comments
 (0)