CMS 3D CMS Logo

ElectronSeedGenerator.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: EgammaElectronAlgos
4 // Class: ElectronSeedGenerator.
5 //
13 //
14 // Original Author: Ursula Berthon, Claude Charlot
15 // Created: Mon Mar 27 13:22:06 CEST 2006
16 //
17 
20 
26 
27 //#include "DataFormats/EgammaReco/interface/EcalCluster.h"
29 
31 //#include "DataFormats/BeamSpot/interface/BeamSpot.h"
32 //#include "DataFormats/Common/interface/Handle.h"
33 
37 
41 
43 
45 
46 
47 #include <vector>
48 #include <utility>
49 
50 
51 #ifdef COUNT_ElectronSeeds
52 namespace {
53  struct Count {
54  long long s=0;
55  long long n=0;
56  ~Count() { std::cout << "ElectronSeeds res " << s<<'/'<<n << std::endl;}
57  };
58 
59  Count stcount;
60 }
61 #endif
62 
63 
64 
67  : dynamicphiroad_(pset.getParameter<bool>("dynamicPhiRoad")),
68  fromTrackerSeeds_(pset.getParameter<bool>("fromTrackerSeeds")),
69  useRecoVertex_(false),
70  verticesTag_(ts.token_vtx),
71  beamSpotTag_(ts.token_bs),
72  lowPtThreshold_(pset.getParameter<double>("LowPtThreshold")),
73  highPtThreshold_(pset.getParameter<double>("HighPtThreshold")),
74  nSigmasDeltaZ1_(pset.getParameter<double>("nSigmasDeltaZ1")),
75  deltaZ1WithVertex_(0.5),
76  sizeWindowENeg_(pset.getParameter<double>("SizeWindowENeg")),
77  deltaPhi1Low_(pset.getParameter<double>("DeltaPhi1Low")),
78  deltaPhi1High_(pset.getParameter<double>("DeltaPhi1High")),
79  deltaPhi1Coef1_(0.), deltaPhi1Coef2_(0.),
80  myMatchEle(nullptr), myMatchPos(nullptr),
81  thePropagator(nullptr),
82  theMeasurementTracker(nullptr),
83  theMeasurementTrackerEventTag(ts.token_measTrkEvt),
84  theSetup(nullptr),
85  cacheIDMagField_(0),/*cacheIDGeom_(0),*/cacheIDNavSchool_(0),cacheIDCkfComp_(0),cacheIDTrkGeom_(0)
86 {
87  // so that deltaPhi1 = deltaPhi1Coef1_ + deltaPhi1Coef2_/clusterEnergyT
88  if (dynamicphiroad_)
89  {
92  }
93 
94  theMeasurementTrackerName = pset.getParameter<std::string>("measurementTrackerName");
95 
96  // use of reco vertex
97  useRecoVertex_ = pset.getParameter<bool>("useRecoVertex");
98  deltaZ1WithVertex_ = pset.getParameter<double>("deltaZ1WithVertex");
99 
100  // new B/F configurables
101  deltaPhi2B_ = pset.getParameter<double>("DeltaPhi2B") ;
102  deltaPhi2F_ = pset.getParameter<double>("DeltaPhi2F") ;
103 
104  phiMin2B_ = pset.getParameter<double>("PhiMin2B") ;
105  phiMin2F_ = pset.getParameter<double>("PhiMin2F") ;
106 
107  phiMax2B_ = pset.getParameter<double>("PhiMax2B") ;
108  phiMax2F_ = pset.getParameter<double>("PhiMax2F") ;
109 
110  // Instantiate the pixel hit matchers
112  ( pset.getParameter<double>("ePhiMin1"),
113  pset.getParameter<double>("ePhiMax1"),
114  phiMin2B_, phiMax2B_, phiMin2F_, phiMax2F_,
115  pset.getParameter<double>("z2MinB"),
116  pset.getParameter<double>("z2MaxB"),
117  pset.getParameter<double>("r2MinF"),
118  pset.getParameter<double>("r2MaxF"),
119  pset.getParameter<double>("rMinI"),
120  pset.getParameter<double>("rMaxI"),
121  pset.getParameter<bool>("searchInTIDTEC") ) ;
122 
124  ( pset.getParameter<double>("pPhiMin1"),
125  pset.getParameter<double>("pPhiMax1"),
126  phiMin2B_, phiMax2B_, phiMin2F_, phiMax2F_,
127  pset.getParameter<double>("z2MinB"),
128  pset.getParameter<double>("z2MaxB"),
129  pset.getParameter<double>("r2MinF"),
130  pset.getParameter<double>("r2MaxF"),
131  pset.getParameter<double>("rMinI"),
132  pset.getParameter<double>("rMaxI"),
133  pset.getParameter<bool>("searchInTIDTEC") ) ;
134 
135  theUpdator = new KFUpdator() ;
136 }
137 
139  {
140  delete myMatchEle ;
141  delete myMatchPos ;
142  delete thePropagator ;
143  delete theUpdator ;
144  }
145 
147 
148  // get records if necessary (called once per event)
149  bool tochange=false;
150 
153  cacheIDMagField_=setup.get<IdealMagneticFieldRecord>().cacheIdentifier();
154  if (thePropagator) delete thePropagator;
156  tochange=true;
157  }
158 
160  edm::ESHandle<MeasurementTracker> measurementTrackerHandle;
161  setup.get<CkfComponentsRecord>().get(theMeasurementTrackerName,measurementTrackerHandle);
162  cacheIDCkfComp_=setup.get<CkfComponentsRecord>().cacheIdentifier();
163  theMeasurementTracker = measurementTrackerHandle.product();
164  tochange=true;
165  }
166 
167  //edm::ESHandle<TrackerGeometry> trackerGeometryHandle;
169  cacheIDTrkGeom_=setup.get<TrackerDigiGeometryRecord>().cacheIdentifier();
171  tochange=true; //FIXME
172  }
173 
174  if (tochange) {
177  }
178 
181  setup.get<NavigationSchoolRecord>().get("SimpleNavigationSchool", nav);
182  cacheIDNavSchool_=setup.get<NavigationSchoolRecord>().cacheIdentifier();
184  }
185 
186 // if (cacheIDGeom_!=setup.get<TrackerRecoGeometryRecord>().cacheIdentifier()) {
187 // setup.get<TrackerRecoGeometryRecord>().get( theGeomSearchTracker );
188 // cacheIDGeom_=setup.get<TrackerRecoGeometryRecord>().cacheIdentifier();
189 // }
190 
191 }
192 
193 void display_seed( const std::string & title1, const std::string & title2, const reco::ElectronSeed & seed, edm::ESHandle<TrackerGeometry> trackerGeometry )
194  {
195  const PTrajectoryStateOnDet & startingState = seed.startingState() ;
196  const LocalTrajectoryParameters & parameters = startingState.parameters() ;
197  std::cout<<title1
198  <<" ("<<seed.subDet2()<<"/"<<seed.dRz2()<<"/"<<seed.dPhi2()<<")"
199  <<" ("<<seed.direction()<<"/"<<startingState.detId()<<"/"<<startingState.surfaceSide()<<"/"<<parameters.charge()<<"/"<<parameters.position()<<"/"<<parameters.momentum()<<")"
200  <<std::endl ;
201  }
202 
203 bool equivalent( const TrajectorySeed & s1, const TrajectorySeed & s2 )
204  {
205  if (s1.nHits()!=s2.nHits()) return false ;
206 
207  unsigned int nHits ;
208  TrajectorySeed::range r1 = s1.recHits(), r2 = s2.recHits() ;
210  for ( i1=r1.first, i2=r2.first, nHits=0 ; i1!=r1.second ; ++i1, ++i2, ++nHits )
211  {
212  if ( !i1->isValid() || !i2->isValid() ) return false ;
213  if ( i1->geographicalId()!=i2->geographicalId() ) return false ;
214  if ( ! ( i1->localPosition()==i2->localPosition() ) ) return false ;
215  }
216 
217  return true ;
218  }
219 
222  const reco::SuperClusterRefVector & sclRefs, const std::vector<float> & hoe1s, const std::vector<float> & hoe2s,
223  const std::vector<const TrajectorySeedCollection *>& seedsV, reco::ElectronSeedCollection & out )
224  {
225  theInitialSeedCollV = &seedsV;
226 // bool duplicateTrajectorySeeds =false ;
227 // unsigned int i,j ;
228 // for (i=0;i<seeds->size();++i)
229 // for (j=i+1;j<seeds->size();++j)
230 // {
231 // const TrajectorySeed & s1 =(*seeds)[i] ;
232 // const TrajectorySeed & s2 =(*seeds)[j] ;
233 // if ( equivalent(s1,s2) )
234 // {
235 // const PTrajectoryStateOnDet & ss1 = s1.startingState() ;
236 // const LocalTrajectoryParameters & p1 = ss1.parameters() ;
237 // const PTrajectoryStateOnDet & ss2 = s2.startingState() ;
238 // const LocalTrajectoryParameters & p2 = ss2.parameters() ;
239 // duplicateTrajectorySeeds = true ;
240 // std::cout<<"Same hits for "
241 // <<"\n s["<<i<<"] ("<<s1.direction()<<"/"<<ss1.detId()<<"/"<<ss1.surfaceSide()<<"/"<<p1.charge()<<"/"<<p1.position()<<"/"<<p1.momentum()<<")"
242 // <<"\n s["<<j<<"] ("<<s2.direction()<<"/"<<ss2.detId()<<"/"<<ss2.surfaceSide()<<"/"<<p2.charge()<<"/"<<p2.position()<<"/"<<p2.momentum()<<")"
243 // <<std::endl ;
244 // }
245 // }
246 // if (duplicateTrajectorySeeds)
247 // { edm::LogWarning("ElectronSeedGenerator|DuplicateTrajectorySeeds")<<"We see several identical trajectory seeds." ; }
248 
249  //Retrieve tracker topology from geometry
251  setup.get<TrackerTopologyRcd>().get(tTopoHand);
252  const TrackerTopology *tTopo=tTopoHand.product();
253 
254  theSetup= &setup;
255 
256 
257  // Step A: set Event for the TrajectoryBuilder
260  myMatchEle->setEvent(*data);
261  myMatchPos->setEvent(*data);
262 
263  // get the beamspot from the Event:
264  //e.getByType(theBeamSpot);
266 
267  // if required get the vertices
269 
270  if (!fromTrackerSeeds_)
271  { throw cms::Exception("NotSupported") << "Here in ElectronSeedGenerator " << __FILE__ << ":" << __LINE__ << " I would like to do theMeasurementTracker->update(e); but that no longer makes sense.\n";
272  }
273 
274  for (unsigned int i=0;i<sclRefs.size();++i) {
275  // Find the seeds
276  recHits_.clear();
277 
278  LogDebug ("ElectronSeedGenerator") << "new cluster, calling seedsFromThisCluster";
279  seedsFromThisCluster(sclRefs[i],hoe1s[i],hoe2s[i],out,tTopo);
280  }
281 
282  LogDebug ("ElectronSeedGenerator") << ": For event "<<e.id();
283  LogDebug ("ElectronSeedGenerator") <<"Nr of superclusters after filter: "<<sclRefs.size()
284  <<", no. of ElectronSeeds found = " << out.size();
285 
286 #ifdef COUNT_ElectronSeeds
287  stcount.s+=sclRefs.size();
288  stcount.n+=out.size();
289 #endif
290 
291 }
292 
295  float hoe1, float hoe2,
296  reco::ElectronSeedCollection & out, const TrackerTopology *tTopo )
297 {
298  float clusterEnergy = seedCluster->energy() ;
299  GlobalPoint clusterPos
300  ( seedCluster->position().x(),
301  seedCluster->position().y(),
302  seedCluster->position().z() ) ;
303  reco::ElectronSeed::CaloClusterRef caloCluster(seedCluster) ;
304 
305  //LogDebug("") << "[ElectronSeedGenerator::seedsFromThisCluster] new supercluster with energy: " << clusterEnergy ;
306  //LogDebug("") << "[ElectronSeedGenerator::seedsFromThisCluster] and position: " << clusterPos ;
307 
308  if (dynamicphiroad_)
309  {
310  float clusterEnergyT = clusterEnergy / cosh( EleRelPoint(clusterPos,theBeamSpot->position()).eta() ) ;
311 
312  float deltaPhi1 ;
313  if (clusterEnergyT < lowPtThreshold_)
314  { deltaPhi1= deltaPhi1Low_ ; }
315  else if (clusterEnergyT > highPtThreshold_)
316  { deltaPhi1= deltaPhi1High_ ; }
317  else
318  { deltaPhi1 = deltaPhi1Coef1_ + deltaPhi1Coef2_/clusterEnergyT ; }
319 
320  float ephimin1 = -deltaPhi1*sizeWindowENeg_ ;
321  float ephimax1 = deltaPhi1*(1.-sizeWindowENeg_);
322  float pphimin1 = -deltaPhi1*(1.-sizeWindowENeg_);
323  float pphimax1 = deltaPhi1*sizeWindowENeg_;
324 
325  float phimin2B = -deltaPhi2B_/2. ;
326  float phimax2B = deltaPhi2B_/2. ;
327  float phimin2F = -deltaPhi2F_/2. ;
328  float phimax2F = deltaPhi2F_/2. ;
329 
330 
331  myMatchEle->set1stLayer(ephimin1,ephimax1);
332  myMatchPos->set1stLayer(pphimin1,pphimax1);
333  myMatchEle->set2ndLayer(phimin2B,phimax2B, phimin2F,phimax2F);
334  myMatchPos->set2ndLayer(phimin2B,phimax2B, phimin2F,phimax2F);
335  }
336 
338 
339  if (!useRecoVertex_) // here use the beam spot position
340  {
341  double sigmaZ=theBeamSpot->sigmaZ();
342  double sigmaZ0Error=theBeamSpot->sigmaZ0Error();
343  double sq=sqrt(sigmaZ*sigmaZ+sigmaZ0Error*sigmaZ0Error);
344  double myZmin1=theBeamSpot->position().z()-nSigmasDeltaZ1_*sq;
345  double myZmax1=theBeamSpot->position().z()+nSigmasDeltaZ1_*sq;
346 
347  GlobalPoint vertexPos ;
348  ele_convert(theBeamSpot->position(),vertexPos) ;
349 
350  myMatchEle->set1stLayerZRange(myZmin1,myZmax1);
351  myMatchPos->set1stLayerZRange(myZmin1,myZmax1);
352 
353  if (!fromTrackerSeeds_)
354  {
355  // try electron
356  std::vector<std::pair<RecHitWithDist,ConstRecHitPointer> > elePixelHits
357  = myMatchEle->compatibleHits(clusterPos,vertexPos,
358  clusterEnergy,-1., tTopo, *theNavigationSchool) ;
360  seedsFromRecHits(elePixelHits,dir,eleVertex,caloCluster,out,false) ;
361  // try positron
362  std::vector<std::pair<RecHitWithDist,ConstRecHitPointer> > posPixelHits
363  = myMatchPos->compatibleHits(clusterPos,vertexPos,clusterEnergy,1.,tTopo, *theNavigationSchool) ;
365  seedsFromRecHits(posPixelHits,dir,posVertex,caloCluster,out,true) ;
366  }
367  else
368  {
369  // try electron
370  std::vector<SeedWithInfo> elePixelSeeds
371  = myMatchEle->compatibleSeeds(*theInitialSeedCollV,clusterPos,vertexPos,clusterEnergy,-1.) ;
372  seedsFromTrajectorySeeds(elePixelSeeds,caloCluster,hoe1,hoe2,out,false) ;
373  // try positron
374  std::vector<SeedWithInfo> posPixelSeeds
375  = myMatchPos->compatibleSeeds(*theInitialSeedCollV,clusterPos,vertexPos,clusterEnergy,1.) ;
376  seedsFromTrajectorySeeds(posPixelSeeds,caloCluster,hoe1,hoe2,out,true) ;
377  }
378 
379  }
380  else // here we use the reco vertices
381  {
382 
383  myMatchEle->setUseRecoVertex(true) ; //Hit matchers need to know that the vertex is known
385 
386  const std::vector<reco::Vertex> * vtxCollection = theVertices.product() ;
387  std::vector<reco::Vertex>::const_iterator vtxIter ;
388  for (vtxIter = vtxCollection->begin(); vtxIter != vtxCollection->end() ; vtxIter++)
389  {
390 
391  GlobalPoint vertexPos(vtxIter->position().x(),vtxIter->position().y(),vtxIter->position().z());
392  double myZmin1, myZmax1 ;
393  if (vertexPos.z()==theBeamSpot->position().z())
394  { // in case vetex not found
395  double sigmaZ=theBeamSpot->sigmaZ();
396  double sigmaZ0Error=theBeamSpot->sigmaZ0Error();
397  double sq=sqrt(sigmaZ*sigmaZ+sigmaZ0Error*sigmaZ0Error);
398  myZmin1=theBeamSpot->position().z()-nSigmasDeltaZ1_*sq;
399  myZmax1=theBeamSpot->position().z()+nSigmasDeltaZ1_*sq;
400  }
401  else
402  { // a vertex has been recoed
403  myZmin1=vtxIter->position().z()-deltaZ1WithVertex_;
404  myZmax1=vtxIter->position().z()+deltaZ1WithVertex_;
405  }
406 
407  myMatchEle->set1stLayerZRange(myZmin1,myZmax1);
408  myMatchPos->set1stLayerZRange(myZmin1,myZmax1);
409 
410  if (!fromTrackerSeeds_)
411  {
412  // try electron
413  std::vector<std::pair<RecHitWithDist,ConstRecHitPointer> > elePixelHits
414  = myMatchEle->compatibleHits(clusterPos,vertexPos,clusterEnergy,-1.,tTopo, *theNavigationSchool) ;
415  seedsFromRecHits(elePixelHits,dir,vertexPos,caloCluster,out,false) ;
416  // try positron
417  std::vector<std::pair<RecHitWithDist,ConstRecHitPointer> > posPixelHits
418  = myMatchPos->compatibleHits(clusterPos,vertexPos,clusterEnergy,1.,tTopo, *theNavigationSchool) ;
419  seedsFromRecHits(posPixelHits,dir,vertexPos,caloCluster,out,true) ;
420  }
421  else
422  {
423  // try electron
424  std::vector<SeedWithInfo> elePixelSeeds
425  = myMatchEle->compatibleSeeds(*theInitialSeedCollV,clusterPos,vertexPos,clusterEnergy,-1.) ;
426  seedsFromTrajectorySeeds(elePixelSeeds,caloCluster,hoe1,hoe2,out,false) ;
427  // try positron
428  std::vector<SeedWithInfo> posPixelSeeds
429  = myMatchPos->compatibleSeeds(*theInitialSeedCollV,clusterPos,vertexPos,clusterEnergy,1.) ;
430  seedsFromTrajectorySeeds(posPixelSeeds,caloCluster,hoe1,hoe2,out,true) ;
431  }
432  }
433  }
434 
435  return ;
436  }
437 
439  ( std::vector<std::pair<RecHitWithDist,ConstRecHitPointer> > & pixelHits,
441  const GlobalPoint & vertexPos, const reco::ElectronSeed::CaloClusterRef & cluster,
443  bool positron )
444  {
445  if (!pixelHits.empty())
446  { LogDebug("ElectronSeedGenerator") << "Compatible "<<(positron?"positron":"electron")<<" hits found." ; }
447 
448  std::vector<std::pair<RecHitWithDist,ConstRecHitPointer> >::iterator v ;
449  for ( v = pixelHits.begin() ; v != pixelHits.end() ; v++ )
450  {
451  if (!positron)
452  { (*v).first.invert() ; }
453  if (!prepareElTrackSeed((*v).first.recHit(),(*v).second,vertexPos))
454  { continue ; }
456  seed.setCaloCluster(cluster) ;
457  addSeed(seed,nullptr,positron,out) ;
458  }
459  }
460 
462  ( const std::vector<SeedWithInfo> & pixelSeeds,
463  const reco::ElectronSeed::CaloClusterRef & cluster,
464  float hoe1, float hoe2,
466  bool positron )
467  {
468  if (!pixelSeeds.empty())
469  { LogDebug("ElectronSeedGenerator") << "Compatible "<<(positron?"positron":"electron")<<" seeds found." ; }
470 
471  std::vector<SeedWithInfo>::const_iterator s;
472  for ( s = pixelSeeds.begin() ; s != pixelSeeds.end() ; s++ )
473  {
474  reco::ElectronSeed seed(s->seed()) ;
475  seed.setCaloCluster(cluster);
476  seed.initTwoHitSeed(s->hitsMask());
477  addSeed(seed,&*s,positron,out) ;
478  }
479  }
480 
483  const SeedWithInfo * info,
484  bool positron,
486  {
487  if (!info)
488  { out.emplace_back(seed) ; return ; }
489 
490  if (positron)
491  { seed.setPosAttributes(info->dRz2(),info->dPhi2(),info->dRz1(),info->dPhi1()) ; }
492  else
493  { seed.setNegAttributes(info->dRz2(),info->dPhi2(),info->dRz1(),info->dPhi1()) ; }
494  reco::ElectronSeedCollection::iterator resItr ;
495  for ( resItr=out.begin() ; resItr!=out.end() ; ++resItr )
496  {
497  if ( (seed.caloCluster().key()==resItr->caloCluster().key()) &&
498  (seed.hitsMask()==resItr->hitsMask()) &&
499  equivalent(seed,*resItr) )
500  {
501  if (positron)
502  {
503  if ( resItr->dRz2Pos()==std::numeric_limits<float>::infinity() &&
504  resItr->dRz2()!=std::numeric_limits<float>::infinity() )
505  {
506  resItr->setPosAttributes(info->dRz2(),info->dPhi2(),info->dRz1(),info->dPhi1()) ;
507  seed.setNegAttributes(resItr->dRz2(),resItr->dPhi2(),resItr->dRz1(),resItr->dPhi1()) ;
508  break ;
509  }
510  else
511  {
512  if ( resItr->dRz2Pos()!=std::numeric_limits<float>::infinity() )
513  {
514  if ( resItr->dRz2Pos()!=seed.dRz2Pos() )
515  {
516  edm::LogWarning("ElectronSeedGenerator|BadValue")
517  <<"this similar old seed already has another dRz2Pos"
518  <<"\nold seed mask/dRz2/dPhi2/dRz2Pos/dPhi2Pos: "<<(unsigned int)resItr->hitsMask()<<"/"<<resItr->dRz2()<<"/"<<resItr->dPhi2()<<"/"<<resItr->dRz2Pos()<<"/"<<resItr->dPhi2Pos()
519  <<"\nnew seed mask/dRz2/dPhi2/dRz2Pos/dPhi2Pos: "<<(unsigned int)seed.hitsMask()<<"/"<<seed.dRz2()<<"/"<<seed.dPhi2()<<"/"<<seed.dRz2Pos()<<"/"<<seed.dPhi2Pos() ;
520  }
521 // else
522 // {
523 // edm::LogWarning("ElectronSeedGenerator|UnexpectedValue")
524 // <<"this old seed already knows its dRz2Pos, we suspect duplicates in input trajectry seeds"
525 // <<"\nold seed mask/dRz2/dPhi2/dRz2Pos/dPhi2Pos: "<<(unsigned int)resItr->hitsMask()<<"/"<<resItr->dRz2()<<"/"<<resItr->dPhi2()<<"/"<<resItr->dRz2Pos()<<"/"<<resItr->dPhi2Pos()
526 // <<"\nnew seed mask/dRz2/dPhi2/dRz2Pos/dPhi2Pos: "<<(unsigned int)seed.hitsMask()<<"/"<<seed.dRz2()<<"/"<<seed.dPhi2()<<"/"<<seed.dRz2Pos()<<"/"<<seed.dPhi2Pos() ;
527 // }
528  }
529 // if (resItr->dRz2()==std::numeric_limits<float>::infinity())
530 // {
531 // edm::LogWarning("ElectronSeedGenerator|BadValue")
532 // <<"this old seed has no dRz2, we suspect duplicates in input trajectry seeds"
533 // <<"\nold seed mask/dRz2/dPhi2/dRz2Pos/dPhi2Pos: "<<(unsigned int)resItr->hitsMask()<<"/"<<resItr->dRz2()<<"/"<<resItr->dPhi2()<<"/"<<resItr->dRz2Pos()<<"/"<<resItr->dPhi2Pos()
534 // <<"\nnew seed mask/dRz2/dPhi2/dRz2Pos/dPhi2Pos: "<<(unsigned int)seed.hitsMask()<<"/"<<seed.dRz2()<<"/"<<seed.dPhi2()<<"/"<<seed.dRz2Pos()<<"/"<<seed.dPhi2Pos() ;
535 // }
536  }
537  }
538  else
539  {
540  if ( resItr->dRz2()==std::numeric_limits<float>::infinity()
541  && resItr->dRz2Pos()!=std::numeric_limits<float>::infinity() )
542  {
543  resItr->setNegAttributes(info->dRz2(),info->dPhi2(),info->dRz1(),info->dPhi1()) ;
544  seed.setPosAttributes(resItr->dRz2Pos(),resItr->dPhi2Pos(),resItr->dRz1Pos(),resItr->dPhi1Pos()) ;
545  break ;
546  }
547  else
548  {
549  if ( resItr->dRz2()!=std::numeric_limits<float>::infinity() )
550  {
551  if (resItr->dRz2()!=seed.dRz2())
552  {
553  edm::LogWarning("ElectronSeedGenerator|BadValue")
554  <<"this old seed already has another dRz2"
555  <<"\nold seed mask/dRz2/dPhi2/dRz2Pos/dPhi2Pos: "<<(unsigned int)resItr->hitsMask()<<"/"<<resItr->dRz2()<<"/"<<resItr->dPhi2()<<"/"<<resItr->dRz2Pos()<<"/"<<resItr->dPhi2Pos()
556  <<"\nnew seed mask/dRz2/dPhi2/dRz2Pos/dPhi2Pos: "<<(unsigned int)seed.hitsMask()<<"/"<<seed.dRz2()<<"/"<<seed.dPhi2()<<"/"<<seed.dRz2Pos()<<"/"<<seed.dPhi2Pos() ;
557  }
558  // else
559  // {
560  // edm::LogWarning("ElectronSeedGenerator|UnexpectedValue")
561  // <<"this old seed already knows its dRz2, we suspect duplicates in input trajectry seeds"
562  // <<"\nold seed mask/dRz2/dPhi2/dRz2Pos/dPhi2Pos: "<<(unsigned int)resItr->hitsMask()<<"/"<<resItr->dRz2()<<"/"<<resItr->dPhi2()<<"/"<<resItr->dRz2Pos()<<"/"<<resItr->dPhi2Pos()
563  // <<"\nnew seed mask/dRz2/dPhi2/dRz2Pos/dPhi2Pos: "<<(unsigned int)seed.hitsMask()<<"/"<<seed.dRz2()<<"/"<<seed.dPhi2()<<"/"<<seed.dRz2Pos()<<"/"<<seed.dPhi2Pos() ;
564  // seed.setPosAttributes(resItr->dRz2Pos(),resItr->dPhi2Pos(),resItr->dRz1Pos(),resItr->dPhi1Pos()) ;
565  // }
566  }
567 // if (resItr->dRz2Pos()==std::numeric_limits<float>::infinity())
568 // {
569 // edm::LogWarning("ElectronSeedGenerator|BadValue")
570 // <<"this old seed has no dRz2Pos"
571 // <<"\nold seed mask/dRz2/dPhi2/dRz2Pos/dPhi2Pos: "<<(unsigned int)resItr->hitsMask()<<"/"<<resItr->dRz2()<<"/"<<resItr->dPhi2()<<"/"<<resItr->dRz2Pos()<<"/"<<resItr->dPhi2Pos()
572 // <<"\nnew seed mask/dRz2/dPhi2/dRz2Pos/dPhi2Pos: "<<(unsigned int)seed.hitsMask()<<"/"<<seed.dRz2()<<"/"<<seed.dPhi2()<<"/"<<seed.dRz2Pos()<<"/"<<seed.dPhi2Pos() ;
573 // }
574  }
575  }
576  }
577  }
578 
579  out.emplace_back(seed) ;
580  }
581 
583  ( ConstRecHitPointer innerhit,
584  ConstRecHitPointer outerhit,
585  const GlobalPoint& vertexPos )
586  {
587 
588  // debug prints
589  LogDebug("") <<"[ElectronSeedGenerator::prepareElTrackSeed] inner PixelHit x,y,z "<<innerhit->globalPosition();
590  LogDebug("") <<"[ElectronSeedGenerator::prepareElTrackSeed] outer PixelHit x,y,z "<<outerhit->globalPosition();
591 
592  recHits_.clear();
593 
594  SiPixelRecHit *pixhit=nullptr;
595  SiStripMatchedRecHit2D *striphit=nullptr;
596  const SiPixelRecHit* constpixhit = dynamic_cast <const SiPixelRecHit*> (innerhit->hit());
597  if (constpixhit) {
598  pixhit=new SiPixelRecHit(*constpixhit);
599  recHits_.push_back(pixhit);
600  } else return false;
601  constpixhit = dynamic_cast <const SiPixelRecHit *> (outerhit->hit());
602  if (constpixhit) {
603  pixhit=new SiPixelRecHit(*constpixhit);
604  recHits_.push_back(pixhit);
605  } else {
606  const SiStripMatchedRecHit2D * conststriphit=dynamic_cast <const SiStripMatchedRecHit2D *> (outerhit->hit());
607  if (conststriphit) {
608  striphit = new SiStripMatchedRecHit2D(*conststriphit);
609  recHits_.push_back(striphit);
610  } else return false;
611  }
612 
614 
615  // FIXME to be optimized outside the loop
617  theSetup->get<IdealMagneticFieldRecord>().get(bfield);
618  float nomField = bfield->nominalValue();
619 
620  // make a spiral
621  FastHelix helix(outerhit->globalPosition(),innerhit->globalPosition(),vertexPos,nomField,&*bfield);
622  if ( !helix.isValid()) {
623  return false;
624  }
625  FreeTrajectoryState fts(helix.stateAtVertex());
626  TSOS propagatedState = thePropagator->propagate(fts,innerhit->det()->surface()) ;
627  if (!propagatedState.isValid())
628  return false;
629  TSOS updatedState = theUpdator->update(propagatedState, *innerhit);
630 
631  TSOS propagatedState_out = thePropagator->propagate(updatedState,outerhit->det()->surface()) ;
632  if (!propagatedState_out.isValid())
633  return false;
634  TSOS updatedState_out = theUpdator->update(propagatedState_out, *outerhit);
635  // debug prints
636  LogDebug("") <<"[ElectronSeedGenerator::prepareElTrackSeed] final TSOS, position: "<<updatedState_out.globalPosition()<<" momentum: "<<updatedState_out.globalMomentum();
637  LogDebug("") <<"[ElectronSeedGenerator::prepareElTrackSeed] final TSOS Pt: "<<updatedState_out.globalMomentum().perp();
638  pts_ = trajectoryStateTransform::persistentState(updatedState_out, outerhit->geographicalId().rawId());
639 
640  return true;
641  }
#define LogDebug(id)
PropagationDirection direction() const
T getParameter(std::string const &) const
unsigned long long cacheIdentifier() const
unsigned long long cacheIDNavSchool_
double sigmaZ0Error() const
error on sigma z
Definition: BeamSpot.h:96
static const TGPicture * info(bool iBackgroundIsBlack)
T perp() const
Definition: PV3DBase.h:72
PixelHitMatcher * myMatchEle
void setupES(const edm::EventSetup &setup)
void setEvent(const MeasurementTrackerEvent &event)
void setPosAttributes(const float dRZ2=std::numeric_limits< float >::infinity(), const float dPhi2=std::numeric_limits< float >::infinity(), const float dRZ1=std::numeric_limits< float >::infinity(), const float dPhi1=std::numeric_limits< float >::infinity())
Definition: ElectronSeed.cc:99
int nominalValue() const
The nominal field value for this map in kGauss.
Definition: MagneticField.h:58
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:579
LocalPoint position() const
Local x and y position coordinates.
TransientTrackingRecHit::ConstRecHitPointer ConstRecHitPointer
void setES(const MagneticField *, const MeasurementTracker *theMeasurementTracker, const TrackerGeometry *trackerGeometry)
const NavigationSchool * theNavigationSchool
float dRz1() const
edm::EDGetTokenT< MeasurementTrackerEvent > theMeasurementTrackerEventTag
PTrajectoryStateOnDet persistentState(const TrajectoryStateOnSurface &ts, unsigned int detid)
const edm::EventSetup * theSetup
float dRz2() const
def setup(process, global_tag, zero_tesla=False)
Definition: GeneralSetup.py:2
GlobalPoint globalPosition() const
const CaloClusterRef & caloCluster() const
Definition: ElectronSeed.h:94
unsigned long long cacheIDMagField_
PropagationDirection
#define nullptr
edm::Handle< std::vector< reco::Vertex > > theVertices
unsigned long long cacheIDTrkGeom_
void set2ndLayer(float dummyphi2minB, float dummyphi2maxB, float dummyphi2minF, float dummyphi2maxF)
return((rh^lh)&mask)
void push_back(D *&d)
Definition: OwnVector.h:290
void set1stLayerZRange(float zmin1, float zmax1)
TrajectoryStateOnSurface update(const TrajectoryStateOnSurface &, const TrackingRecHit &) const override
Definition: KFUpdator.cc:169
float dPhi2() const
Definition: ElectronSeed.h:122
float dRz2Pos() const
Definition: ElectronSeed.h:127
const SurfaceType & surface() const
PTrajectoryStateOnDet pts_
edm::ESHandle< TrackerGeometry > theTrackerGeometry
void seedsFromThisCluster(edm::Ref< reco::SuperClusterCollection > seedCluster, float hoe1, float hoe2, reco::ElectronSeedCollection &out, const TrackerTopology *tTopo)
size_t key() const
Definition: RefToBase.h:250
recHitContainer::const_iterator const_iterator
T sqrt(T t)
Definition: SSEVec.h:18
void clear()
Definition: OwnVector.h:445
const double infinity
std::pair< const_iterator, const_iterator > range
unsigned int detId() const
PropagatorWithMaterial * thePropagator
edm::Handle< reco::BeamSpot > theBeamSpot
edm::EDGetTokenT< std::vector< reco::Vertex > > verticesTag_
LocalVector momentum() const
Momentum vector in the local frame.
std::vector< ElectronSeed > ElectronSeedCollection
collection of ElectronSeed objects
std::vector< SeedWithInfo > compatibleSeeds(const std::vector< const TrajectorySeedCollection * > &seedsV, const GlobalPoint &xmeas, const GlobalPoint &vprim, float energy, float charge)
PixelHitMatcher * myMatchPos
float dRz2() const
Definition: ElectronSeed.h:126
void seedsFromRecHits(std::vector< std::pair< RecHitWithDist, ConstRecHitPointer > > &elePixelHits, PropagationDirection &dir, const GlobalPoint &vertexPos, const reco::ElectronSeed::CaloClusterRef &cluster, reco::ElectronSeedCollection &out, bool positron)
float dPhi1() const
float dPhi2() const
bool prepareElTrackSeed(ConstRecHitPointer outerhit, ConstRecHitPointer innerhit, const GlobalPoint &vertexPos)
TrajectoryStateOnSurface TSOS
Definition: TestHits.cc:19
edm::EDGetTokenT< reco::BeamSpot > beamSpotTag_
PTrajectoryStateOnDet const & startingState() const
float dPhi2Pos() const
Definition: ElectronSeed.h:123
T const * product() const
Definition: Handle.h:81
void set1stLayer(float dummyphi1min, float dummyphi1max)
void addSeed(reco::ElectronSeed &seed, const SeedWithInfo *info, bool positron, reco::ElectronSeedCollection &out)
void setNegAttributes(const float dRZ2=std::numeric_limits< float >::infinity(), const float dPhi2=std::numeric_limits< float >::infinity(), const float dRZ1=std::numeric_limits< float >::infinity(), const float dPhi1=std::numeric_limits< float >::infinity())
Definition: ElectronSeed.cc:87
double sigmaZ() const
sigma z
Definition: BeamSpot.h:80
range recHits() const
ElectronSeedGenerator(const edm::ParameterSet &, const Tokens &)
void ele_convert(const Type1 &obj1, Type2 &obj2)
TrajectoryStateOnSurface propagate(STA const &state, SUR const &surface) const
Definition: Propagator.h:53
TrackCharge charge() const
Charge (-1, 0 or 1)
edm::ESHandle< MagneticField > theMagField
void setCaloCluster(const CaloClusterRef &clus)
Definition: ElectronSeed.h:89
edm::EventID id() const
Definition: EventBase.h:60
bool equivalent(const TrajectorySeed &s1, const TrajectorySeed &s2)
unsigned int nHits() const
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:82
GlobalVector globalMomentum() const
void display_seed(const std::string &title1, const std::string &title2, const reco::ElectronSeed &seed, edm::ESHandle< TrackerGeometry > trackerGeometry)
const MeasurementTracker * theMeasurementTracker
T get() const
Definition: EventSetup.h:62
unsigned int hitsMask() const
Definition: ElectronSeed.cc:44
size_type size() const
Size of the RefVector.
Definition: RefVector.h:107
int subDet2() const
Definition: ElectronSeed.h:129
const Point & position() const
position
Definition: BeamSpot.h:62
dbl *** dir
Definition: mlp_gen.cc:35
const std::vector< const TrajectorySeedCollection * > * theInitialSeedCollV
void run(edm::Event &, const edm::EventSetup &setup, const reco::SuperClusterRefVector &, const std::vector< float > &hoe1s, const std::vector< float > &hoe2s, const std::vector< const TrajectorySeedCollection * > &seedsV, reco::ElectronSeedCollection &)
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)
T const * product() const
Definition: ESHandle.h:86
void seedsFromTrajectorySeeds(const std::vector< SeedWithInfo > &elePixelSeeds, const reco::ElectronSeed::CaloClusterRef &cluster, float hoe1, float hoe2, reco::ElectronSeedCollection &out, bool positron)
const LocalTrajectoryParameters & parameters() const
Our base class.
Definition: SiPixelRecHit.h:23
unsigned long long cacheIDCkfComp_