16 using namespace reco ;
20 (
float phi1min,
float phi1max,
21 float phi2minB,
float phi2maxB,
float phi2minF,
float phi2maxF,
22 float z2minB,
float z2maxB,
float r2minF,
float r2maxF,
25 meas1stBLayer(phi1min,phi1max,0.,0.), meas2ndBLayer(phi2minB,phi2maxB,z2minB,z2maxB),
26 meas1stFLayer(phi1min,phi1max,0.,0.), meas2ndFLayer(phi2minF,phi2maxF,r2minF,r2maxF),
28 prop1stLayer(0), prop2ndLayer(0),theGeometricSearchTracker(0),theTrackerEvent(0),theTracker(0),vertex_(0.),
29 searchInTIDTEC_(searchInTIDTEC), useRecoVertex_(
false)
31 meas1stFLayer.setRRangeI(rMinI,rMaxI) ;
32 meas2ndFLayer.setRRangeI(rMinI,rMaxI) ;
43 meas1stBLayer.setPhiRange(dummyphi1min,dummyphi1max) ;
44 meas1stFLayer.setPhiRange(dummyphi1min,dummyphi1max) ;
49 meas1stBLayer.setZRange(zmin1,zmax1) ;
50 meas1stFLayer.setRRange(zmin1,zmax1) ;
55 meas2ndBLayer.setPhiRange(dummyphi2minB,dummyphi2maxB) ;
56 meas2ndFLayer.setPhiRange(dummyphi2minF,dummyphi2maxF) ;
60 { useRecoVertex_ =
val ; }
64 theTrackerEvent = & trackerData;
72 if (theMeasurementTracker)
74 theTracker = theMeasurementTracker;
75 theGeometricSearchTracker=theMeasurementTracker->geometricSearchTracker() ;
76 startLayers.setup(theGeometricSearchTracker) ;
79 theMagField = magField ;
80 theTrackerGeometry = trackerGeometry ;
82 if (prop1stLayer)
delete prop1stLayer ;
84 if (prop2ndLayer)
delete prop2ndLayer ;
89 {
return pred1Meas ; }
92 {
return pred2Meas ; }
98 std::vector<SeedWithInfo>
101 const GlobalPoint & vprim,
float energy,
float fcharge )
103 typedef std::unordered_map<const GeomDet *, TrajectoryStateOnSurface> DetTsosAssoc;
108 auto xmeas_r = xmeas.
perp();
117 std::vector<SeedWithInfo>
result ;
120 mapTsos2_fast_.clear();
122 mapTsos2_fast_.reserve(seeds->size()) ;
127 auto ndets = theTrackerGeometry->dets().size();
130 for (
auto &
i : iTsos)
i=-1;
131 std::vector<TrajectoryStateOnSurface> vTsos; vTsos.reserve(seeds->size());
133 for(
const auto&
seed : *seeds) {
135 if(
seed.nHits() > 9 ) {
136 edm::LogWarning(
"GsfElectronAlgo|UnexpectedSeed") <<
"We cannot deal with seeds having more than 9 hits." ;
143 for(
auto it = hits.first; it != hits.second; ++it ) {
144 hit_gp_map_.emplace_back(it->globalPosition());
148 auto he = hits.second -1;
149 for(
auto it1 = hits.first; it1 <
he; ++it1 ) {
150 if( !it1->isValid() )
continue;
152 const DetId id1 = it1->geographicalId();
153 const GeomDet *geomdet1 = it1->det();
163 auto dt = hit1Pos.
x()*xmeas.
x()+hit1Pos.
y()*xmeas.
y();
165 if (
dt<phicut*(xmeas_r*hit1Pos.
perp()))
continue;
168 iTsos[ix1] = vTsos.size();
169 vTsos.push_back(prop1stLayer->propagate(tsos,geomdet1->
surface()));
171 auto tsos1 = &vTsos[iTsos[ix1]];
173 if( !tsos1->isValid() )
continue;
174 std::pair<bool, double> est = ( id1.
subdetId() % 2 ?
175 meas1stBLayer.estimate(vprim, *tsos1, hit1Pos) :
176 meas1stFLayer.estimate(vprim, *tsos1, hit1Pos) );
177 if( !est.first )
continue;
178 EleRelPointPair pp1(hit1Pos,tsos1->globalParameters().position(),vprim);
179 const math::XYZPoint relHit1Pos(hit1Pos-vprim), relTSOSPos(tsos1->globalParameters().position() - vprim);
181 const float dRz1 = ( id1.
subdetId()%2 ? pp1.dZ() : pp1.dPerp() );
182 const float dPhi1 = pp1.dPhi();
185 if (!useRecoVertex_) {
188 const double pxHit1z = hit1Pos.
z();
189 const double pxHit1x = hit1Pos.
x();
190 const double pxHit1y = hit1Pos.
y();
191 const double r1diff =
std::sqrt( (pxHit1x-vprim.
x())*(pxHit1x-vprim.
x()) +
192 (pxHit1y-vprim.
y())*(pxHit1y-vprim.
y()) );
193 const double r2diff =
std::sqrt( (xmeas.
x()-pxHit1x)*(xmeas.
x()-pxHit1x) +
194 (xmeas.
y()-pxHit1y)*(xmeas.
y()-pxHit1y) );
195 zVertex = pxHit1z - r1diff*(xmeas.
z()-pxHit1z)/r2diff;
203 for(
auto it2 = it1+1; it2 != hits.second; ++it2 ) {
204 if( !it2->isValid() )
continue;
206 const DetId id2 = it2->geographicalId();
207 const GeomDet *geomdet2 = it2->det();
208 const std::pair<const GeomDet *,GlobalPoint> det_key(geomdet2,hit1Pos);
210 auto tsos2_itr = mapTsos2_fast_.find(det_key);
211 if( tsos2_itr != mapTsos2_fast_.end() ) {
212 tsos2 = &(tsos2_itr->second);
215 mapTsos2_fast_.emplace(det_key,prop2ndLayer->propagate(fts2,geomdet2->
surface()));
216 tsos2 = &(empl_result.first->second);
218 if( !tsos2->
isValid() )
continue;
220 std::pair<bool,double> est2 = ( id2.
subdetId()%2 ?
221 meas2ndBLayer.estimate(vertex, *tsos2,hit2Pos) :
222 meas2ndFLayer.estimate(vertex, *tsos2,hit2Pos) );
226 const float dRz2 = (subDet2%2==1)?pp2.dZ():pp2.dPerp();
227 const float dPhi2 = pp2.dPhi();
228 const unsigned char hitsMask = (1<<idx1)|(1<<idx2);
229 result.push_back(
SeedWithInfo(
seed,hitsMask,subDet2,dRz2,dPhi2,subDet1,dRz1,dPhi1)) ;
235 mapTsos2_fast_.clear() ;
242 vector< pair< RecHitWithDist, PixelHitMatcher::ConstRecHitPointer > >
246 float energy,
float fcharge,
250 float SCl_phi = xmeas.
phi();
254 vector<pair<RecHitWithDist, ConstRecHitPointer> >
result;
255 LogDebug(
"") <<
"[PixelHitMatcher::compatibleHits] entering .. ";
257 vector<TrajectoryMeasurement> validMeasurements;
258 vector<TrajectoryMeasurement> invalidMeasurements;
260 typedef vector<TrajectoryMeasurement>::const_iterator aMeas;
265 typedef vector<const BarrelDetLayer*>::const_iterator BarrelLayerIterator;
266 BarrelLayerIterator firstLayer = startLayers.firstBLayer();
274 vector<TrajectoryMeasurement> pixelMeasurements =
275 theLayerMeasurements.measurements(**firstLayer,tsos,
276 *prop1stLayer, meas1stBLayer);
278 LogDebug(
"") <<
"[PixelHitMatcher::compatibleHits] nbr of hits compatible with extrapolation to first layer: " << pixelMeasurements.size();
279 for (aMeas
m=pixelMeasurements.begin();
m!=pixelMeasurements.end();
m++){
280 if (
m->recHit()->isValid()) {
281 float localDphi =
normalized_phi(SCl_phi-
m->forwardPredictedState().globalPosition().barePhi()) ;
282 if(
std::abs(localDphi)>2.5)
continue;
283 CLHEP::Hep3Vector prediction(
m->forwardPredictedState().globalPosition().x(),
284 m->forwardPredictedState().globalPosition().y(),
285 m->forwardPredictedState().globalPosition().z());
286 LogDebug(
"") <<
"[PixelHitMatcher::compatibleHits] compatible hit position " <<
m->recHit()->globalPosition();
287 LogDebug(
"") <<
"[PixelHitMatcher::compatibleHits] predicted position " <<
m->forwardPredictedState().globalPosition();
288 pred1Meas.push_back( prediction);
290 validMeasurements.push_back(*
m);
292 LogDebug(
"") <<
"[PixelHitMatcher::compatibleHits] Found a rechit in layer ";
297 else LogDebug(
"") <<
"Could not downcast!!";
305 vector<TrajectoryMeasurement> pixel2Measurements =
306 theLayerMeasurements.measurements(**firstLayer,tsos,
307 *prop1stLayer, meas1stBLayer);
309 for (aMeas
m=pixel2Measurements.begin();
m!=pixel2Measurements.end();
m++){
310 if (
m->recHit()->isValid()) {
311 float localDphi =
normalized_phi(SCl_phi-
m->forwardPredictedState().globalPosition().barePhi()) ;
312 if(
std::abs(localDphi)>2.5)
continue;
313 CLHEP::Hep3Vector prediction(
m->forwardPredictedState().globalPosition().x(),
314 m->forwardPredictedState().globalPosition().y(),
315 m->forwardPredictedState().globalPosition().z());
316 pred1Meas.push_back( prediction);
317 LogDebug(
"") <<
"[PixelHitMatcher::compatibleHits] compatible hit position " <<
m->recHit()->globalPosition() << endl;
318 LogDebug(
"") <<
"[PixelHitMatcher::compatibleHits] predicted position " <<
m->forwardPredictedState().globalPosition() << endl;
320 validMeasurements.push_back(*
m);
321 LogDebug(
"") <<
"[PixelHitMatcher::compatibleHits] Found a rechit in layer ";
326 else LogDebug(
"") <<
"Could not downcast!!";
334 typedef vector<const ForwardDetLayer*>::const_iterator ForwardLayerIterator;
335 ForwardLayerIterator flayer;
340 for (
int i=0;
i<2;
i++) {
341 i == 0 ? flayer = startLayers.pos1stFLayer() : flayer = startLayers.neg1stFLayer();
343 if (
i==0 && xmeas.
z() < -100. )
continue;
344 if (
i==1 && xmeas.
z() > 100. )
continue;
346 vector<TrajectoryMeasurement> pixelMeasurements =
347 theLayerMeasurements.measurements(**flayer, tsosfwd,
348 *prop1stLayer, meas1stFLayer);
350 for (aMeas
m=pixelMeasurements.begin();
m!=pixelMeasurements.end();
m++){
351 if (
m->recHit()->isValid()) {
352 float localDphi =
normalized_phi(SCl_phi-
m->forwardPredictedState().globalPosition().barePhi());
353 if(
std::abs(localDphi)>2.5)
continue;
354 CLHEP::Hep3Vector prediction(
m->forwardPredictedState().globalPosition().x(),
355 m->forwardPredictedState().globalPosition().y(),
356 m->forwardPredictedState().globalPosition().z());
357 pred1Meas.push_back( prediction);
359 validMeasurements.push_back(*
m);
364 if (searchInTIDTEC_) {
367 vector<TrajectoryMeasurement> pixel2Measurements =
368 theLayerMeasurements.measurements(**flayer, tsosfwd,
369 *prop1stLayer, meas1stFLayer);
371 for (aMeas
m=pixel2Measurements.begin();
m!=pixel2Measurements.end();
m++){
372 if (
m->recHit()->isValid()) {
373 float localDphi =
normalized_phi(SCl_phi-
m->forwardPredictedState().globalPosition().barePhi()) ;
374 if(
std::abs(localDphi)>2.5)
continue;
375 CLHEP::Hep3Vector prediction(
m->forwardPredictedState().globalPosition().x(),
376 m->forwardPredictedState().globalPosition().y(),
377 m->forwardPredictedState().globalPosition().z());
378 pred1Meas.push_back( prediction);
380 validMeasurements.push_back(*
m);
389 for (
unsigned i=0;
i<validMeasurements.size();
i++){
391 const DetLayer * newLayer = theGeometricSearchTracker->detLayer(validMeasurements[
i].
recHit()->det()->geographicalId());
398 double pxHit1z = validMeasurements[
i].recHit()->det()->surface().toGlobal(
399 validMeasurements[
i].
recHit()->localPosition()).z();
400 double pxHit1x = validMeasurements[
i].recHit()->det()->surface().toGlobal(
401 validMeasurements[
i].
recHit()->localPosition()).x();
402 double pxHit1y = validMeasurements[
i].recHit()->det()->surface().toGlobal(
403 validMeasurements[
i].
recHit()->localPosition()).y();
404 double r1diff = (pxHit1x-vprim.
x())*(pxHit1x-vprim.
x()) + (pxHit1y-vprim.
y())*(pxHit1y-vprim.
y());
406 double r2diff = (xmeas.
x()-pxHit1x)*(xmeas.
x()-pxHit1x) + (xmeas.
y()-pxHit1y)*(xmeas.
y()-pxHit1y);
408 zVertex = pxHit1z - r1diff*(xmeas.
z()-pxHit1z)/r2diff;
420 GlobalPoint hitPos( validMeasurements[
i].
recHit()->det()->surface().toGlobal( validMeasurements[
i].
recHit()->localPosition() ) ) ;
425 prop2ndLayer, &meas2ndBLayer,&meas2ndFLayer,
426 tTopo,navigationSchool,searchInTIDTEC_);
429 for (
unsigned it = 0; it < predictions.size(); it++) pred2Meas.push_back(predictions[it]);
447 pair<RecHitWithDist,ConstRecHitPointer> compatiblePair = pair<RecHitWithDist,ConstRecHitPointer>(rh,pxrh) ;
448 result.push_back(compatiblePair);
static FreeTrajectoryState get(MagneticField const &magField, GlobalPoint const &xmeas, GlobalPoint const &xvert, float momentum, TrackCharge charge)
void setEvent(const MeasurementTrackerEvent &event)
void setES(const MagneticField *, const MeasurementTracker *theMeasurementTracker, const TrackerGeometry *trackerGeometry)
Geom::Phi< T > phi() const
std::vector< CLHEP::Hep3Vector > predictionInNextLayers() const
virtual const BoundCylinder & specificSurface() const final
Extension of the interface.
const Plane & surface() const
The nominal surface of the GeomDet.
TransientTrackingRecHit::ConstRecHitPointer ConstRecHitPointer
void set2ndLayer(float dummyphi2minB, float dummyphi2maxB, float dummyphi2minF, float dummyphi2maxF)
void set1stLayerZRange(float zmin1, float zmax1)
PixelHitMatcher(float phi1min, float phi1max, float phi2minB, float phi2maxB, float phi2minF, float phi2maxF, float z2minB, float z2maxB, float r2minF, float r2maxF, float rMinI, float rMaxI, bool searchInTIDTEC)
std::vector< TrajectorySeed > TrajectorySeedCollection
RealType normalized_phi(RealType phi)
rMaxI
intermediate region SC in EB and 2nd hits in PXF
Cos< T >::type cos(const T &t)
Abs< T >::type abs(const T &t)
std::pair< const_iterator, const_iterator > range
std::vector< CLHEP::Hep3Vector > predicted1Hits()
int subdetId() const
get the contents of the subdetector field (not cast into any detector's numbering enum) ...
GlobalVector momentum() const
GlobalPoint position() const
GlobalPoint position() const
std::vector< TrajectoryMeasurement > measurementsInNextLayers() const
const GlobalTrajectoryParameters & globalParameters() const
void set1stLayer(float dummyphi1min, float dummyphi1max)
XYZPointD XYZPoint
point in space with cartesian internal representation
virtual ~PixelHitMatcher()
std::vector< SeedWithInfo > compatibleSeeds(TrajectorySeedCollection *seeds, const GlobalPoint &xmeas, const GlobalPoint &vprim, float energy, float charge)
std::vector< CLHEP::Hep3Vector > predicted2Hits()
std::vector< std::pair< RecHitWithDist, ConstRecHitPointer > > compatibleHits(const GlobalPoint &xmeas, const GlobalPoint &vprim, float energy, float charge, const TrackerTopology *tTopo, const NavigationSchool &navigationSchool)
void setUseRecoVertex(bool val)