15 using namespace reco ;
19 (
float phi1min,
float phi1max,
20 float phi2minB,
float phi2maxB,
float phi2minF,
float phi2maxF,
21 float z2minB,
float z2maxB,
float r2minF,
float r2maxF,
22 float rMinI,
float rMaxI,
bool searchInTIDTEC)
24 meas1stBLayer(phi1min,phi1max,0.,0.), meas2ndBLayer(phi2minB,phi2maxB,z2minB,z2maxB),
25 meas1stFLayer(phi1min,phi1max,0.,0.), meas2ndFLayer(phi2minF,phi2maxF,r2minF,r2maxF),
27 prop1stLayer(0), prop2ndLayer(0),theGeometricSearchTracker(0),theLayerMeasurements(0),vertex_(0.),
28 searchInTIDTEC_(searchInTIDTEC), useRecoVertex_(
false)
30 meas1stFLayer.setRRangeI(rMinI,rMaxI) ;
31 meas2ndFLayer.setRRangeI(rMinI,rMaxI) ;
38 delete theLayerMeasurements ;
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 ; }
67 if (theMeasurementTracker)
69 theGeometricSearchTracker=theMeasurementTracker->geometricSearchTracker() ;
70 startLayers.setup(theGeometricSearchTracker) ;
71 if (theLayerMeasurements )
delete theLayerMeasurements ;
75 theMagField = magField ;
76 theTrackerGeometry = trackerGeometry ;
78 if (prop1stLayer)
delete prop1stLayer ;
80 if (prop2ndLayer)
delete prop2ndLayer ;
85 {
return pred1Meas ; }
88 {
return pred2Meas ; }
96 std::vector<SeedWithInfo>
101 int charge = int(fcharge) ;
107 std::vector<SeedWithInfo>
result ;
110 mapTsos_.reserve(seeds->size()) ;
111 mapTsos2_.reserve(seeds->size()) ;
113 for (
unsigned int i=0;
i<seeds->size();++
i)
115 if ((*seeds)[
i].nHits()>9)
117 edm::LogWarning(
"GsfElectronAlgo|UnexpectedSeed") <<
"We cannot deal with seeds having more than 9 hits." ;
123 unsigned char rank1, rank2, hitsMask ;
125 for ( rank1=0, it1=rhits.first ; it1!=rhits.second ; rank1++, it1++ )
127 for ( rank2=rank1+1, it2=it1+1 ; it2!=rhits.second ; rank2++, it2++ )
133 if (!(*it).isValid())
continue;
134 DetId id=(*it).geographicalId();
135 const GeomDet *geomdet=theTrackerGeometry->idToDet((*it).geographicalId());
141 std::vector<std::pair<const GeomDet *, TrajectoryStateOnSurface> >::iterator itTsos ;
142 for (itTsos=mapTsos_.begin();itTsos!=mapTsos_.end();++itTsos)
144 if ((*itTsos).first==geomdet)
145 { found=
true ; break ; }
149 tsos1 = prop1stLayer->propagate(tsos,geomdet->
surface()) ;
150 mapTsos_.push_back(std::pair<const GeomDet *, TrajectoryStateOnSurface>(geomdet,tsos1));
153 { tsos1=(*itTsos).second ; }
157 std::pair<bool,double> est;
158 if (
id.subdetId()%2==1) est=meas1stBLayer.estimate(vprim, tsos1,hitPos);
159 else est=meas1stFLayer.estimate(vprim, tsos1,hitPos);
160 if (!est.first) continue ;
164 int subDet1 =
id.subdetId() ;
165 float dRz1 = (subDet1%2==1)?pp1.
dZ():pp1.dPerp() ;
166 float dPhi1 = pp1.dPhi() ;
172 if (!(*it).isValid())
continue ;
174 DetId id2=(*it).geographicalId();
175 const GeomDet *geomdet2=theTrackerGeometry->idToDet((*it).geographicalId());
182 double pxHit1z = hitPos.
z();
183 double pxHit1x = hitPos.
x();
184 double pxHit1y = hitPos.
y();
185 double r1diff = (pxHit1x-vprim.
x())*(pxHit1x-vprim.
x()) + (pxHit1y-vprim.
y())*(pxHit1y-vprim.
y()) ;
186 r1diff=
sqrt(r1diff) ;
187 double r2diff = (xmeas.
x()-pxHit1x)*(xmeas.
x()-pxHit1x) + (xmeas.
y()-pxHit1y)*(xmeas.
y()-pxHit1y) ;
189 zVertex = pxHit1z - r1diff*(xmeas.
z()-pxHit1z)/r2diff;
192 { zVertex = vprim.
z() ; }
199 for (itTsos2=mapTsos2_.begin();itTsos2!=mapTsos2_.end();++itTsos2)
201 if (((*itTsos2).first).first==geomdet2 &&
202 (((*itTsos2).first).
second).x()==hitPos.
x() &&
203 (((*itTsos2).first).
second).y()==hitPos.
y() &&
204 (((*itTsos2).first).
second).z()==hitPos.
z() )
212 tsos2 = prop2ndLayer->propagate(fts2,geomdet2->
surface()) ;
213 std::pair<const GeomDet *,GlobalPoint> pair(geomdet2,hitPos);
217 { tsos2=(*itTsos2).second ; }
223 std::pair<bool,double> est2 ;
224 if (id2.
subdetId()%2==1) est2=meas2ndBLayer.estimate(vertex, tsos2,hitPos2) ;
225 else est2=meas2ndFLayer.estimate(vertex, tsos2,hitPos2) ;
230 float dRz2 = (subDet2%2==1)?pp2.dZ():pp2.dPerp() ;
231 float dPhi2 = pp2.dPhi() ;
232 hitsMask = (1<<rank1)|(1<<rank2) ;
233 result.push_back(
SeedWithInfo((*seeds)[
i],hitsMask,subDet2,dRz2,dPhi2,subDet1,dRz1,dPhi1)) ;
249 vector< pair< RecHitWithDist, PixelHitMatcher::ConstRecHitPointer > >
253 float energy,
float fcharge )
255 float SCl_phi = xmeas.
phi();
257 int charge = int(fcharge);
259 vector<pair<RecHitWithDist, ConstRecHitPointer> >
result;
260 LogDebug(
"") <<
"[PixelHitMatcher::compatibleHits] entering .. ";
262 vector<TrajectoryMeasurement> validMeasurements;
263 vector<TrajectoryMeasurement> invalidMeasurements;
265 typedef vector<TrajectoryMeasurement>::const_iterator aMeas;
270 typedef vector<BarrelDetLayer*>::const_iterator BarrelLayerIterator;
271 BarrelLayerIterator firstLayer = startLayers.firstBLayer();
280 vector<TrajectoryMeasurement> pixelMeasurements =
281 theLayerMeasurements->measurements(**firstLayer,tsos,
282 *prop1stLayer, meas1stBLayer);
284 LogDebug(
"") <<
"[PixelHitMatcher::compatibleHits] nbr of hits compatible with extrapolation to first layer: " << pixelMeasurements.size();
285 for (aMeas
m=pixelMeasurements.begin();
m!=pixelMeasurements.end();
m++){
286 if (
m->recHit()->isValid()) {
287 float localDphi =
normalized_phi(SCl_phi-
m->forwardPredictedState().globalPosition().phi()) ;
288 if(
std::abs(localDphi)>2.5)
continue;
289 CLHEP::Hep3Vector prediction(
m->forwardPredictedState().globalPosition().x(),
290 m->forwardPredictedState().globalPosition().y(),
291 m->forwardPredictedState().globalPosition().z());
292 LogDebug(
"") <<
"[PixelHitMatcher::compatibleHits] compatible hit position " <<
m->recHit()->globalPosition();
293 LogDebug(
"") <<
"[PixelHitMatcher::compatibleHits] predicted position " <<
m->forwardPredictedState().globalPosition();
294 pred1Meas.push_back( prediction);
296 validMeasurements.push_back(*
m);
298 LogDebug(
"") <<
"[PixelHitMatcher::compatibleHits] Found a rechit in layer ";
303 else LogDebug(
"") <<
"Could not downcast!!";
311 vector<TrajectoryMeasurement> pixel2Measurements =
312 theLayerMeasurements->measurements(**firstLayer,tsos,
313 *prop1stLayer, meas1stBLayer);
315 for (aMeas
m=pixel2Measurements.begin();
m!=pixel2Measurements.end();
m++){
316 if (
m->recHit()->isValid()) {
317 float localDphi =
normalized_phi(SCl_phi-
m->forwardPredictedState().globalPosition().phi()) ;
318 if(
std::abs(localDphi)>2.5)
continue;
319 CLHEP::Hep3Vector prediction(
m->forwardPredictedState().globalPosition().x(),
320 m->forwardPredictedState().globalPosition().y(),
321 m->forwardPredictedState().globalPosition().z());
322 pred1Meas.push_back( prediction);
323 LogDebug(
"") <<
"[PixelHitMatcher::compatibleHits] compatible hit position " <<
m->recHit()->globalPosition() << endl;
324 LogDebug(
"") <<
"[PixelHitMatcher::compatibleHits] predicted position " <<
m->forwardPredictedState().globalPosition() << endl;
326 validMeasurements.push_back(*
m);
327 LogDebug(
"") <<
"[PixelHitMatcher::compatibleHits] Found a rechit in layer ";
332 else LogDebug(
"") <<
"Could not downcast!!";
340 typedef vector<ForwardDetLayer*>::const_iterator ForwardLayerIterator;
341 ForwardLayerIterator flayer;
346 for (
int i=0;
i<2;
i++) {
347 i == 0 ? flayer = startLayers.pos1stFLayer() : flayer = startLayers.neg1stFLayer();
349 if (
i==0 && xmeas.
z() < -100. )
continue;
350 if (
i==1 && xmeas.
z() > 100. )
continue;
352 vector<TrajectoryMeasurement> pixelMeasurements =
353 theLayerMeasurements->measurements(**flayer, tsosfwd,
354 *prop1stLayer, meas1stFLayer);
356 for (aMeas
m=pixelMeasurements.begin();
m!=pixelMeasurements.end();
m++){
357 if (
m->recHit()->isValid()) {
358 float localDphi =
normalized_phi(SCl_phi-
m->forwardPredictedState().globalPosition().phi());
359 if(
std::abs(localDphi)>2.5)
continue;
360 CLHEP::Hep3Vector prediction(
m->forwardPredictedState().globalPosition().x(),
361 m->forwardPredictedState().globalPosition().y(),
362 m->forwardPredictedState().globalPosition().z());
363 pred1Meas.push_back( prediction);
365 validMeasurements.push_back(*
m);
370 if (searchInTIDTEC_) {
373 vector<TrajectoryMeasurement> pixel2Measurements =
374 theLayerMeasurements->measurements(**flayer, tsosfwd,
375 *prop1stLayer, meas1stFLayer);
377 for (aMeas
m=pixel2Measurements.begin();
m!=pixel2Measurements.end();
m++){
378 if (
m->recHit()->isValid()) {
379 float localDphi =
normalized_phi(SCl_phi-
m->forwardPredictedState().globalPosition().phi()) ;
380 if(
std::abs(localDphi)>2.5)
continue;
381 CLHEP::Hep3Vector prediction(
m->forwardPredictedState().globalPosition().x(),
382 m->forwardPredictedState().globalPosition().y(),
383 m->forwardPredictedState().globalPosition().z());
384 pred1Meas.push_back( prediction);
386 validMeasurements.push_back(*
m);
395 for (
unsigned i=0;
i<validMeasurements.size();
i++){
397 const DetLayer * newLayer = theGeometricSearchTracker->detLayer(validMeasurements[
i].recHit()->det()->geographicalId());
405 validMeasurements[
i].recHit()->localPosition()).
z();
406 double pxHit1x = validMeasurements[
i].recHit()->det()->surface().toGlobal(
407 validMeasurements[
i].recHit()->localPosition()).x();
408 double pxHit1y = validMeasurements[
i].recHit()->det()->surface().toGlobal(
409 validMeasurements[
i].recHit()->localPosition()).y();
410 double r1diff = (pxHit1x-vprim.
x())*(pxHit1x-vprim.
x()) + (pxHit1y-vprim.
y())*(pxHit1y-vprim.
y());
412 double r2diff = (xmeas.
x()-pxHit1x)*(xmeas.
x()-pxHit1x) + (xmeas.
y()-pxHit1y)*(xmeas.
y()-pxHit1y);
414 zVertex = pxHit1z - r1diff*(xmeas.
z()-pxHit1z)/r2diff;
423 { vertex_ = zVertex; }
426 GlobalPoint hitPos( validMeasurements[
i].recHit()->det()->surface().toGlobal( validMeasurements[
i].recHit()->localPosition() ) ) ;
431 prop2ndLayer, &meas2ndBLayer,&meas2ndFLayer,searchInTIDTEC_);
434 for (
unsigned it = 0; it < predictions.size(); it++) pred2Meas.push_back(predictions[it]);
452 pair<RecHitWithDist,ConstRecHitPointer> compatiblePair = pair<RecHitWithDist,ConstRecHitPointer>(rh,pxrh) ;
453 result.push_back(compatiblePair);
GlobalPoint toGlobal(const Point2DBase< Scalar, LocalTag > lp) const
virtual const BoundSurface & surface() const =0
The surface of the GeometricSearchDet.
std::vector< std::pair< RecHitWithDist, ConstRecHitPointer > > compatibleHits(const GlobalPoint &xmeas, const GlobalPoint &vprim, float energy, float charge)
void setES(const MagneticField *, const MeasurementTracker *theMeasurementTracker, const TrackerGeometry *trackerGeometry)
Geom::Phi< T > phi() const
std::vector< CLHEP::Hep3Vector > predictionInNextLayers() const
void set2ndLayer(float dummyphi2minB, float dummyphi2maxB, float dummyphi2minF, float dummyphi2maxF)
U second(std::pair< T, U > const &p)
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)
Scalar radius() const
Radius of the cylinder.
std::vector< TrajectorySeed > TrajectorySeedCollection
recHitContainer::const_iterator const_iterator
RealType normalized_phi(RealType phi)
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)
virtual const BoundCylinder & specificSurface() const
Extension of the interface.
virtual ~PixelHitMatcher()
const BoundPlane & surface() const
The nominal surface of the GeomDet.
std::vector< SeedWithInfo > compatibleSeeds(TrajectorySeedCollection *seeds, const GlobalPoint &xmeas, const GlobalPoint &vprim, float energy, float charge)
std::vector< CLHEP::Hep3Vector > predicted2Hits()
void setUseRecoVertex(bool val)