CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
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 
36 
40 
42 
43 #include <vector>
44 #include <utility>
45 
47  : dynamicphiroad_(pset.getParameter<bool>("dynamicPhiRoad")),
48  fromTrackerSeeds_(pset.getParameter<bool>("fromTrackerSeeds")),
49  useRecoVertex_(false),
50  verticesTag_("offlinePrimaryVerticesWithBS"),
51  beamSpotTag_("offlineBeamSpot"),
52  lowPtThreshold_(pset.getParameter<double>("LowPtThreshold")),
53  highPtThreshold_(pset.getParameter<double>("HighPtThreshold")),
54  nSigmasDeltaZ1_(pset.getParameter<double>("nSigmasDeltaZ1")),
55  deltaZ1WithVertex_(0.5),
56  sizeWindowENeg_(pset.getParameter<double>("SizeWindowENeg")),
57  deltaPhi1Low_(pset.getParameter<double>("DeltaPhi1Low")),
58  deltaPhi1High_(pset.getParameter<double>("DeltaPhi1High")),
59  deltaPhi1Coef1_(0.), deltaPhi1Coef2_(0.),
60  myMatchEle(0), myMatchPos(0),
61  thePropagator(0),
62  theMeasurementTracker(0),
63  theSetup(0),
64  cacheIDMagField_(0),/*cacheIDGeom_(0),*/cacheIDNavSchool_(0),cacheIDCkfComp_(0),cacheIDTrkGeom_(0)
65  {
66  // so that deltaPhi1 = deltaPhi1Coef1_ + deltaPhi1Coef2_/clusterEnergyT
67  if (dynamicphiroad_)
68  {
71  }
72 
73  // use of a theMeasurementTrackerName
74  if (pset.exists("measurementTrackerName"))
75  { theMeasurementTrackerName = pset.getParameter<std::string>("measurementTrackerName") ; }
76 
77  // use of reco vertex
78  if (pset.exists("useRecoVertex"))
79  { useRecoVertex_ = pset.getParameter<bool>("useRecoVertex") ; }
80  if (pset.exists("vertices"))
81  { verticesTag_ = pset.getParameter<edm::InputTag>("vertices") ; }
82  if (pset.exists("deltaZ1WithVertex"))
83  { deltaZ1WithVertex_ = pset.getParameter<double>("deltaZ1WithVertex") ; }
84 
85  // new beamSpot tag
86  if (pset.exists("beamSpot"))
87  { beamSpotTag_ = pset.getParameter<edm::InputTag>("beamSpot") ; }
88 
89  // new B/F configurables
90  if (pset.exists("DeltaPhi2"))
91  { deltaPhi2B_ = deltaPhi2F_ = pset.getParameter<double>("DeltaPhi2") ; }
92  else
93  {
94  deltaPhi2B_ = pset.getParameter<double>("DeltaPhi2B") ;
95  deltaPhi2F_ = pset.getParameter<double>("DeltaPhi2F") ;
96  }
97  if (pset.exists("PhiMin2"))
98  { phiMin2B_ = phiMin2F_ = pset.getParameter<double>("PhiMin2") ; }
99  else
100  {
101  phiMin2B_ = pset.getParameter<double>("PhiMin2B") ;
102  phiMin2F_ = pset.getParameter<double>("PhiMin2F") ;
103  }
104  if (pset.exists("PhiMax2"))
105  { phiMax2B_ = phiMax2F_ = pset.getParameter<double>("PhiMax2") ; }
106  else
107  {
108  phiMax2B_ = pset.getParameter<double>("PhiMax2B") ;
109  phiMax2F_ = pset.getParameter<double>("PhiMax2F") ;
110  }
111 
112  // Instantiate the pixel hit matchers
114  ( pset.getParameter<double>("ePhiMin1"),
115  pset.getParameter<double>("ePhiMax1"),
117  pset.getParameter<double>("z2MinB"),
118  pset.getParameter<double>("z2MaxB"),
119  pset.getParameter<double>("r2MinF"),
120  pset.getParameter<double>("r2MaxF"),
121  pset.getParameter<double>("rMinI"),
122  pset.getParameter<double>("rMaxI"),
123  pset.getParameter<bool>("searchInTIDTEC") ) ;
124 
126  ( pset.getParameter<double>("pPhiMin1"),
127  pset.getParameter<double>("pPhiMax1"),
129  pset.getParameter<double>("z2MinB"),
130  pset.getParameter<double>("z2MaxB"),
131  pset.getParameter<double>("r2MinF"),
132  pset.getParameter<double>("r2MaxF"),
133  pset.getParameter<double>("rMinI"),
134  pset.getParameter<double>("rMaxI"),
135  pset.getParameter<bool>("searchInTIDTEC") ) ;
136 
137  theUpdator = new KFUpdator() ;
138  }
139 
141  {
142  delete myMatchEle ;
143  delete myMatchPos ;
144  delete thePropagator ;
145  delete theUpdator ;
146  }
147 
149 
150  // get records if necessary (called once per event)
151  bool tochange=false;
152 
155  cacheIDMagField_=setup.get<IdealMagneticFieldRecord>().cacheIdentifier();
156  if (thePropagator) delete thePropagator;
158  tochange=true;
159  }
160 
162  edm::ESHandle<MeasurementTracker> measurementTrackerHandle;
163  setup.get<CkfComponentsRecord>().get(theMeasurementTrackerName,measurementTrackerHandle);
164  cacheIDCkfComp_=setup.get<CkfComponentsRecord>().cacheIdentifier();
165  theMeasurementTracker = measurementTrackerHandle.product();
166  tochange=true;
167  }
168 
169  //edm::ESHandle<TrackerGeometry> trackerGeometryHandle;
171  cacheIDTrkGeom_=setup.get<TrackerDigiGeometryRecord>().cacheIdentifier();
173  tochange=true; //FIXME
174  }
175 
176  if (tochange) {
179  }
180 
183  setup.get<NavigationSchoolRecord>().get("SimpleNavigationSchool", nav);
184  cacheIDNavSchool_=setup.get<NavigationSchoolRecord>().cacheIdentifier();
186  }
187 
188 // if (cacheIDGeom_!=setup.get<TrackerRecoGeometryRecord>().cacheIdentifier()) {
189 // setup.get<TrackerRecoGeometryRecord>().get( theGeomSearchTracker );
190 // cacheIDGeom_=setup.get<TrackerRecoGeometryRecord>().cacheIdentifier();
191 // }
192 
193 }
194 
195 void display_seed( const std::string & title1, const std::string & title2, const reco::ElectronSeed & seed, edm::ESHandle<TrackerGeometry> trackerGeometry )
196  {
197  const PTrajectoryStateOnDet & startingState = seed.startingState() ;
198  const LocalTrajectoryParameters & parameters = startingState.parameters() ;
199  std::cout<<title1
200  <<" ("<<seed.subDet2()<<"/"<<seed.dRz2()<<"/"<<seed.dPhi2()<<")"
201  <<" ("<<seed.direction()<<"/"<<startingState.detId()<<"/"<<startingState.surfaceSide()<<"/"<<parameters.charge()<<"/"<<parameters.position()<<"/"<<parameters.momentum()<<")"
202  <<std::endl ;
203  }
204 
205 bool equivalent( const TrajectorySeed & s1, const TrajectorySeed & s2 )
206  {
207  if (s1.nHits()!=s2.nHits()) return false ;
208 
209  unsigned int nHits ;
210  TrajectorySeed::range r1 = s1.recHits(), r2 = s2.recHits() ;
212  for ( i1=r1.first, i2=r2.first, nHits=0 ; i1!=r1.second ; ++i1, ++i2, ++nHits )
213  {
214  if ( !i1->isValid() || !i2->isValid() ) return false ;
215  if ( i1->geographicalId()!=i2->geographicalId() ) return false ;
216  if ( ! ( i1->localPosition()==i2->localPosition() ) ) return false ;
217  }
218 
219  return true ;
220  }
221 
224  const reco::SuperClusterRefVector & sclRefs, const std::vector<float> & hoe1s, const std::vector<float> & hoe2s,
226  {
227  theInitialSeedColl = seeds ;
228 // bool duplicateTrajectorySeeds =false ;
229 // unsigned int i,j ;
230 // for (i=0;i<seeds->size();++i)
231 // for (j=i+1;j<seeds->size();++j)
232 // {
233 // const TrajectorySeed & s1 =(*seeds)[i] ;
234 // const TrajectorySeed & s2 =(*seeds)[j] ;
235 // if ( equivalent(s1,s2) )
236 // {
237 // const PTrajectoryStateOnDet & ss1 = s1.startingState() ;
238 // const LocalTrajectoryParameters & p1 = ss1.parameters() ;
239 // const PTrajectoryStateOnDet & ss2 = s2.startingState() ;
240 // const LocalTrajectoryParameters & p2 = ss2.parameters() ;
241 // duplicateTrajectorySeeds = true ;
242 // std::cout<<"Same hits for "
243 // <<"\n s["<<i<<"] ("<<s1.direction()<<"/"<<ss1.detId()<<"/"<<ss1.surfaceSide()<<"/"<<p1.charge()<<"/"<<p1.position()<<"/"<<p1.momentum()<<")"
244 // <<"\n s["<<j<<"] ("<<s2.direction()<<"/"<<ss2.detId()<<"/"<<ss2.surfaceSide()<<"/"<<p2.charge()<<"/"<<p2.position()<<"/"<<p2.momentum()<<")"
245 // <<std::endl ;
246 // }
247 // }
248 // if (duplicateTrajectorySeeds)
249 // { edm::LogWarning("ElectronSeedGenerator|DuplicateTrajectorySeeds")<<"We see several identical trajectory seeds." ; }
250 
251 
252  theSetup= &setup;
253  NavigationSetter theSetter(*theNavigationSchool);
254 
255  // get initial TrajectorySeeds if necessary
256  // if (fromTrackerSeeds_) e.getByLabel(initialSeeds_, theInitialSeedColl);
257 
258  // get the beamspot from the Event:
259  //e.getByType(theBeamSpot);
260  e.getByLabel(beamSpotTag_,theBeamSpot);
261 
262  // if required get the vertices
263  if (useRecoVertex_) e.getByLabel(verticesTag_,theVertices);
264 
265  if (!fromTrackerSeeds_)
266  { theMeasurementTracker->update(e) ; }
267 
268  for (unsigned int i=0;i<sclRefs.size();++i) {
269  // Find the seeds
270  recHits_.clear();
271 
272  LogDebug ("run") << "new cluster, calling seedsFromThisCluster";
273  seedsFromThisCluster(sclRefs[i],hoe1s[i],hoe2s[i],out);
274  }
275 
276  LogDebug ("run") << ": For event "<<e.id();
277  LogDebug ("run") <<"Nr of superclusters after filter: "<<sclRefs.size()
278  <<", no. of ElectronSeeds found = " << out.size();
279 }
280 
283  float hoe1, float hoe2,
285 {
286  float clusterEnergy = seedCluster->energy() ;
287  GlobalPoint clusterPos
288  ( seedCluster->position().x(),
289  seedCluster->position().y(),
290  seedCluster->position().z() ) ;
291  reco::ElectronSeed::CaloClusterRef caloCluster(seedCluster) ;
292 
293  //LogDebug("") << "[ElectronSeedGenerator::seedsFromThisCluster] new supercluster with energy: " << clusterEnergy ;
294  //LogDebug("") << "[ElectronSeedGenerator::seedsFromThisCluster] and position: " << clusterPos ;
295 
296  if (dynamicphiroad_)
297  {
298  float clusterEnergyT = clusterEnergy / cosh( EleRelPoint(clusterPos,theBeamSpot->position()).eta() ) ;
299 
300  float deltaPhi1 ;
301  if (clusterEnergyT < lowPtThreshold_)
302  { deltaPhi1= deltaPhi1Low_ ; }
303  else if (clusterEnergyT > highPtThreshold_)
304  { deltaPhi1= deltaPhi1High_ ; }
305  else
306  { deltaPhi1 = deltaPhi1Coef1_ + deltaPhi1Coef2_/clusterEnergyT ; }
307 
308  float ephimin1 = -deltaPhi1*sizeWindowENeg_ ;
309  float ephimax1 = deltaPhi1*(1.-sizeWindowENeg_);
310  float pphimin1 = -deltaPhi1*(1.-sizeWindowENeg_);
311  float pphimax1 = deltaPhi1*sizeWindowENeg_;
312 
313  float phimin2B = -deltaPhi2B_/2. ;
314  float phimax2B = deltaPhi2B_/2. ;
315  float phimin2F = -deltaPhi2F_/2. ;
316  float phimax2F = deltaPhi2F_/2. ;
317 
318 
319  myMatchEle->set1stLayer(ephimin1,ephimax1);
320  myMatchPos->set1stLayer(pphimin1,pphimax1);
321  myMatchEle->set2ndLayer(phimin2B,phimax2B, phimin2F,phimax2F);
322  myMatchPos->set2ndLayer(phimin2B,phimax2B, phimin2F,phimax2F);
323  }
324 
326 
327  if (!useRecoVertex_) // here use the beam spot position
328  {
329  double sigmaZ=theBeamSpot->sigmaZ();
330  double sigmaZ0Error=theBeamSpot->sigmaZ0Error();
331  double sq=sqrt(sigmaZ*sigmaZ+sigmaZ0Error*sigmaZ0Error);
332  double myZmin1=theBeamSpot->position().z()-nSigmasDeltaZ1_*sq;
333  double myZmax1=theBeamSpot->position().z()+nSigmasDeltaZ1_*sq;
334 
335  GlobalPoint vertexPos ;
336  ele_convert(theBeamSpot->position(),vertexPos) ;
337 
338  myMatchEle->set1stLayerZRange(myZmin1,myZmax1);
339  myMatchPos->set1stLayerZRange(myZmin1,myZmax1);
340 
341  if (!fromTrackerSeeds_)
342  {
343  // try electron
344  std::vector<std::pair<RecHitWithDist,ConstRecHitPointer> > elePixelHits
345  = myMatchEle->compatibleHits(clusterPos,vertexPos,clusterEnergy,-1.) ;
346  GlobalPoint eleVertex(theBeamSpot->position().x(),theBeamSpot->position().y(),myMatchEle->getVertex()) ;
347  seedsFromRecHits(elePixelHits,dir,eleVertex,caloCluster,out,false) ;
348  // try positron
349  std::vector<std::pair<RecHitWithDist,ConstRecHitPointer> > posPixelHits
350  = myMatchPos->compatibleHits(clusterPos,vertexPos,clusterEnergy,1.) ;
351  GlobalPoint posVertex(theBeamSpot->position().x(),theBeamSpot->position().y(),myMatchPos->getVertex()) ;
352  seedsFromRecHits(posPixelHits,dir,posVertex,caloCluster,out,true) ;
353  }
354  else
355  {
356  // try electron
357  std::vector<SeedWithInfo> elePixelSeeds
358  = myMatchEle->compatibleSeeds(theInitialSeedColl,clusterPos,vertexPos,clusterEnergy,-1.) ;
359  seedsFromTrajectorySeeds(elePixelSeeds,caloCluster,hoe1,hoe2,out,false) ;
360  // try positron
361  std::vector<SeedWithInfo> posPixelSeeds
362  = myMatchPos->compatibleSeeds(theInitialSeedColl,clusterPos,vertexPos,clusterEnergy,1.) ;
363  seedsFromTrajectorySeeds(posPixelSeeds,caloCluster,hoe1,hoe2,out,true) ;
364  }
365 
366  }
367  else // here we use the reco vertices
368  {
369 
370  myMatchEle->setUseRecoVertex(true) ; //Hit matchers need to know that the vertex is known
371  myMatchPos->setUseRecoVertex(true) ;
372 
373  const std::vector<reco::Vertex> * vtxCollection = theVertices.product() ;
374  std::vector<reco::Vertex>::const_iterator vtxIter ;
375  for (vtxIter = vtxCollection->begin(); vtxIter != vtxCollection->end() ; vtxIter++)
376  {
377 
378  GlobalPoint vertexPos(vtxIter->position().x(),vtxIter->position().y(),vtxIter->position().z());
379  double myZmin1, myZmax1 ;
380  if (vertexPos.z()==theBeamSpot->position().z())
381  { // in case vetex not found
382  double sigmaZ=theBeamSpot->sigmaZ();
383  double sigmaZ0Error=theBeamSpot->sigmaZ0Error();
384  double sq=sqrt(sigmaZ*sigmaZ+sigmaZ0Error*sigmaZ0Error);
385  myZmin1=theBeamSpot->position().z()-nSigmasDeltaZ1_*sq;
386  myZmax1=theBeamSpot->position().z()+nSigmasDeltaZ1_*sq;
387  }
388  else
389  { // a vertex has been recoed
390  myZmin1=vtxIter->position().z()-deltaZ1WithVertex_;
391  myZmax1=vtxIter->position().z()+deltaZ1WithVertex_;
392  }
393 
394  myMatchEle->set1stLayerZRange(myZmin1,myZmax1);
395  myMatchPos->set1stLayerZRange(myZmin1,myZmax1);
396 
397  if (!fromTrackerSeeds_)
398  {
399  // try electron
400  std::vector<std::pair<RecHitWithDist,ConstRecHitPointer> > elePixelHits
401  = myMatchEle->compatibleHits(clusterPos,vertexPos,clusterEnergy,-1.) ;
402  seedsFromRecHits(elePixelHits,dir,vertexPos,caloCluster,out,false) ;
403  // try positron
404  std::vector<std::pair<RecHitWithDist,ConstRecHitPointer> > posPixelHits
405  = myMatchPos->compatibleHits(clusterPos,vertexPos,clusterEnergy,1.) ;
406  seedsFromRecHits(posPixelHits,dir,vertexPos,caloCluster,out,true) ;
407  }
408  else
409  {
410  // try electron
411  std::vector<SeedWithInfo> elePixelSeeds
412  = myMatchEle->compatibleSeeds(theInitialSeedColl,clusterPos,vertexPos,clusterEnergy,-1.) ;
413  seedsFromTrajectorySeeds(elePixelSeeds,caloCluster,hoe1,hoe2,out,false) ;
414  // try positron
415  std::vector<SeedWithInfo> posPixelSeeds
416  = myMatchPos->compatibleSeeds(theInitialSeedColl,clusterPos,vertexPos,clusterEnergy,1.) ;
417  seedsFromTrajectorySeeds(posPixelSeeds,caloCluster,hoe1,hoe2,out,true) ;
418  }
419  }
420  }
421 
422  return ;
423  }
424 
426  ( std::vector<std::pair<RecHitWithDist,ConstRecHitPointer> > & pixelHits,
428  const GlobalPoint & vertexPos, const reco::ElectronSeed::CaloClusterRef & cluster,
430  bool positron )
431  {
432  if (!pixelHits.empty())
433  { LogDebug("ElectronSeedGenerator") << "Compatible "<<(positron?"positron":"electron")<<" hits found." ; }
434 
435  std::vector<std::pair<RecHitWithDist,ConstRecHitPointer> >::iterator v ;
436  for ( v = pixelHits.begin() ; v != pixelHits.end() ; v++ )
437  {
438  if (!positron)
439  { (*v).first.invert() ; }
440  if (!prepareElTrackSeed((*v).first.recHit(),(*v).second,vertexPos))
441  { continue ; }
442  reco::ElectronSeed seed(pts_,recHits_,dir) ;
443  seed.setCaloCluster(cluster) ;
444  addSeed(seed,0,positron,out) ;
445  }
446  }
447 
449  ( const std::vector<SeedWithInfo> & pixelSeeds,
450  const reco::ElectronSeed::CaloClusterRef & cluster,
451  float hoe1, float hoe2,
453  bool positron )
454  {
455  if (!pixelSeeds.empty())
456  { LogDebug("ElectronSeedGenerator") << "Compatible "<<(positron?"positron":"electron")<<" seeds found." ; }
457 
458  std::vector<SeedWithInfo>::const_iterator s;
459  for ( s = pixelSeeds.begin() ; s != pixelSeeds.end() ; s++ )
460  {
461  reco::ElectronSeed seed(s->seed()) ;
462  seed.setCaloCluster(cluster,s->hitsMask(),s->subDet2(),s->subDet1(),hoe1,hoe2) ;
463  addSeed(seed,&*s,positron,out) ;
464  }
465  }
466 
469  const SeedWithInfo * info,
470  bool positron,
472  {
473  if (!info)
474  { out.push_back(seed) ; return ; }
475 
476  if (positron)
477  { seed.setPosAttributes(info->dRz2(),info->dPhi2(),info->dRz1(),info->dPhi1()) ; }
478  else
479  { seed.setNegAttributes(info->dRz2(),info->dPhi2(),info->dRz1(),info->dPhi1()) ; }
480  reco::ElectronSeedCollection::iterator resItr ;
481  for ( resItr=out.begin() ; resItr!=out.end() ; ++resItr )
482  {
483  if ( (seed.caloCluster()==resItr->caloCluster()) &&
484  (seed.hitsMask()==resItr->hitsMask()) &&
485  equivalent(seed,*resItr) )
486  {
487  if (positron)
488  {
489  if ( resItr->dRz2Pos()==std::numeric_limits<float>::infinity() &&
490  resItr->dRz2()!=std::numeric_limits<float>::infinity() )
491  {
492  resItr->setPosAttributes(info->dRz2(),info->dPhi2(),info->dRz1(),info->dPhi1()) ;
493  seed.setNegAttributes(resItr->dRz2(),resItr->dPhi2(),resItr->dRz1(),resItr->dPhi1()) ;
494  break ;
495  }
496  else
497  {
498  if ( resItr->dRz2Pos()!=std::numeric_limits<float>::infinity() )
499  {
500  if ( resItr->dRz2Pos()!=seed.dRz2Pos() )
501  {
502  edm::LogWarning("ElectronSeedGenerator|BadValue")
503  <<"this similar old seed already has another dRz2Pos"
504  <<"\nold seed mask/dRz2/dPhi2/dRz2Pos/dPhi2Pos: "<<(unsigned int)resItr->hitsMask()<<"/"<<resItr->dRz2()<<"/"<<resItr->dPhi2()<<"/"<<resItr->dRz2Pos()<<"/"<<resItr->dPhi2Pos()
505  <<"\nnew seed mask/dRz2/dPhi2/dRz2Pos/dPhi2Pos: "<<(unsigned int)seed.hitsMask()<<"/"<<seed.dRz2()<<"/"<<seed.dPhi2()<<"/"<<seed.dRz2Pos()<<"/"<<seed.dPhi2Pos() ;
506  }
507 // else
508 // {
509 // edm::LogWarning("ElectronSeedGenerator|UnexpectedValue")
510 // <<"this old seed already knows its dRz2Pos, we suspect duplicates in input trajectry seeds"
511 // <<"\nold seed mask/dRz2/dPhi2/dRz2Pos/dPhi2Pos: "<<(unsigned int)resItr->hitsMask()<<"/"<<resItr->dRz2()<<"/"<<resItr->dPhi2()<<"/"<<resItr->dRz2Pos()<<"/"<<resItr->dPhi2Pos()
512 // <<"\nnew seed mask/dRz2/dPhi2/dRz2Pos/dPhi2Pos: "<<(unsigned int)seed.hitsMask()<<"/"<<seed.dRz2()<<"/"<<seed.dPhi2()<<"/"<<seed.dRz2Pos()<<"/"<<seed.dPhi2Pos() ;
513 // }
514  }
515 // if (resItr->dRz2()==std::numeric_limits<float>::infinity())
516 // {
517 // edm::LogWarning("ElectronSeedGenerator|BadValue")
518 // <<"this old seed has no dRz2, we suspect duplicates in input trajectry seeds"
519 // <<"\nold seed mask/dRz2/dPhi2/dRz2Pos/dPhi2Pos: "<<(unsigned int)resItr->hitsMask()<<"/"<<resItr->dRz2()<<"/"<<resItr->dPhi2()<<"/"<<resItr->dRz2Pos()<<"/"<<resItr->dPhi2Pos()
520 // <<"\nnew seed mask/dRz2/dPhi2/dRz2Pos/dPhi2Pos: "<<(unsigned int)seed.hitsMask()<<"/"<<seed.dRz2()<<"/"<<seed.dPhi2()<<"/"<<seed.dRz2Pos()<<"/"<<seed.dPhi2Pos() ;
521 // }
522  }
523  }
524  else
525  {
526  if ( resItr->dRz2()==std::numeric_limits<float>::infinity()
527  && resItr->dRz2Pos()!=std::numeric_limits<float>::infinity() )
528  {
529  resItr->setNegAttributes(info->dRz2(),info->dPhi2(),info->dRz1(),info->dPhi1()) ;
530  seed.setPosAttributes(resItr->dRz2Pos(),resItr->dPhi2Pos(),resItr->dRz1Pos(),resItr->dPhi1Pos()) ;
531  break ;
532  }
533  else
534  {
535  if ( resItr->dRz2()!=std::numeric_limits<float>::infinity() )
536  {
537  if (resItr->dRz2()!=seed.dRz2())
538  {
539  edm::LogWarning("ElectronSeedGenerator|BadValue")
540  <<"this old seed already has another dRz2"
541  <<"\nold seed mask/dRz2/dPhi2/dRz2Pos/dPhi2Pos: "<<(unsigned int)resItr->hitsMask()<<"/"<<resItr->dRz2()<<"/"<<resItr->dPhi2()<<"/"<<resItr->dRz2Pos()<<"/"<<resItr->dPhi2Pos()
542  <<"\nnew seed mask/dRz2/dPhi2/dRz2Pos/dPhi2Pos: "<<(unsigned int)seed.hitsMask()<<"/"<<seed.dRz2()<<"/"<<seed.dPhi2()<<"/"<<seed.dRz2Pos()<<"/"<<seed.dPhi2Pos() ;
543  }
544  // else
545  // {
546  // edm::LogWarning("ElectronSeedGenerator|UnexpectedValue")
547  // <<"this old seed already knows its dRz2, we suspect duplicates in input trajectry seeds"
548  // <<"\nold seed mask/dRz2/dPhi2/dRz2Pos/dPhi2Pos: "<<(unsigned int)resItr->hitsMask()<<"/"<<resItr->dRz2()<<"/"<<resItr->dPhi2()<<"/"<<resItr->dRz2Pos()<<"/"<<resItr->dPhi2Pos()
549  // <<"\nnew seed mask/dRz2/dPhi2/dRz2Pos/dPhi2Pos: "<<(unsigned int)seed.hitsMask()<<"/"<<seed.dRz2()<<"/"<<seed.dPhi2()<<"/"<<seed.dRz2Pos()<<"/"<<seed.dPhi2Pos() ;
550  // seed.setPosAttributes(resItr->dRz2Pos(),resItr->dPhi2Pos(),resItr->dRz1Pos(),resItr->dPhi1Pos()) ;
551  // }
552  }
553 // if (resItr->dRz2Pos()==std::numeric_limits<float>::infinity())
554 // {
555 // edm::LogWarning("ElectronSeedGenerator|BadValue")
556 // <<"this old seed has no dRz2Pos"
557 // <<"\nold seed mask/dRz2/dPhi2/dRz2Pos/dPhi2Pos: "<<(unsigned int)resItr->hitsMask()<<"/"<<resItr->dRz2()<<"/"<<resItr->dPhi2()<<"/"<<resItr->dRz2Pos()<<"/"<<resItr->dPhi2Pos()
558 // <<"\nnew seed mask/dRz2/dPhi2/dRz2Pos/dPhi2Pos: "<<(unsigned int)seed.hitsMask()<<"/"<<seed.dRz2()<<"/"<<seed.dPhi2()<<"/"<<seed.dRz2Pos()<<"/"<<seed.dPhi2Pos() ;
559 // }
560  }
561  }
562  }
563  }
564 
565  out.push_back(seed) ;
566  }
567 
569  ( ConstRecHitPointer innerhit,
570  ConstRecHitPointer outerhit,
571  const GlobalPoint& vertexPos )
572  {
573 
574  // debug prints
575  LogDebug("") <<"[ElectronSeedGenerator::prepareElTrackSeed] inner PixelHit x,y,z "<<innerhit->globalPosition();
576  LogDebug("") <<"[ElectronSeedGenerator::prepareElTrackSeed] outer PixelHit x,y,z "<<outerhit->globalPosition();
577 
578  recHits_.clear();
579 
580  SiPixelRecHit *pixhit=0;
581  SiStripMatchedRecHit2D *striphit=0;
582  const SiPixelRecHit* constpixhit = dynamic_cast <const SiPixelRecHit*> (innerhit->hit());
583  if (constpixhit) {
584  pixhit=new SiPixelRecHit(*constpixhit);
585  recHits_.push_back(pixhit);
586  } else return false;
587  constpixhit = dynamic_cast <const SiPixelRecHit *> (outerhit->hit());
588  if (constpixhit) {
589  pixhit=new SiPixelRecHit(*constpixhit);
590  recHits_.push_back(pixhit);
591  } else {
592  const SiStripMatchedRecHit2D * conststriphit=dynamic_cast <const SiStripMatchedRecHit2D *> (outerhit->hit());
593  if (conststriphit) {
594  striphit = new SiStripMatchedRecHit2D(*conststriphit);
595  recHits_.push_back(striphit);
596  } else return false;
597  }
598 
600 
601  // make a spiral
602  FastHelix helix(outerhit->globalPosition(),innerhit->globalPosition(),vertexPos,*theSetup);
603  if ( !helix.isValid()) {
604  return false;
605  }
606  FreeTrajectoryState fts = helix.stateAtVertex();
607  TSOS propagatedState = thePropagator->propagate(fts,innerhit->det()->surface()) ;
608  if (!propagatedState.isValid())
609  return false;
610  TSOS updatedState = theUpdator->update(propagatedState, *innerhit);
611 
612  TSOS propagatedState_out = thePropagator->propagate(updatedState,outerhit->det()->surface()) ;
613  if (!propagatedState_out.isValid())
614  return false;
615  TSOS updatedState_out = theUpdator->update(propagatedState_out, *outerhit);
616  // debug prints
617  LogDebug("") <<"[ElectronSeedGenerator::prepareElTrackSeed] final TSOS, position: "<<updatedState_out.globalPosition()<<" momentum: "<<updatedState_out.globalMomentum();
618  LogDebug("") <<"[ElectronSeedGenerator::prepareElTrackSeed] final TSOS Pt: "<<updatedState_out.globalMomentum().perp();
619  pts_ = trajectoryStateTransform::persistentState(updatedState_out, outerhit->geographicalId().rawId());
620 
621  return true;
622  }
#define LogDebug(id)
PropagationDirection direction() const
void setCaloCluster(const CaloClusterRef &, unsigned char hitsMask=0, int subDet2=0, int subDet1=0, float hoe1=std::numeric_limits< float >::infinity(), float hoe2=std::numeric_limits< float >::infinity())
Definition: ElectronSeed.cc:71
T getParameter(std::string const &) const
unsigned long long cacheIdentifier() const
unsigned long long cacheIDNavSchool_
int i
Definition: DBlmapReader.cc:9
dictionary parameters
Definition: Parameters.py:2
T perp() const
Definition: PV3DBase.h:71
PixelHitMatcher * myMatchEle
void setupES(const edm::EventSetup &setup)
LocalPoint position() const
Local x and y position coordinates.
void setES(const MagneticField *, const MeasurementTracker *theMeasurementTracker, const TrackerGeometry *trackerGeometry)
const NavigationSchool * theNavigationSchool
float dRz1() const
PTrajectoryStateOnDet persistentState(const TrajectoryStateOnSurface &ts, unsigned int detid)
bool exists(std::string const &parameterName) const
checks if a parameter exists
float dRz2() const
GlobalPoint globalPosition() const
unsigned long long cacheIDMagField_
PropagationDirection
T eta() const
void run(edm::Event &, const edm::EventSetup &setup, const reco::SuperClusterRefVector &, const std::vector< float > &hoe1s, const std::vector< float > &hoe2s, TrajectorySeedCollection *seeds, reco::ElectronSeedCollection &)
unsigned long long cacheIDTrkGeom_
tuple s2
Definition: indexGen.py:106
CaloClusterRef caloCluster() const
Definition: ElectronSeed.h:70
float dPhi2() const
Definition: ElectronSeed.h:74
float dRz2Pos() const
Definition: ElectronSeed.h:75
edm::ESHandle< TrackerGeometry > theTrackerGeometry
std::vector< TrajectorySeed > TrajectorySeedCollection
recHitContainer::const_iterator const_iterator
T sqrt(T t)
Definition: SSEVec.h:46
const double infinity
std::pair< const_iterator, const_iterator > range
void setNegAttributes(float dRz2=std::numeric_limits< float >::infinity(), float dPhi2=std::numeric_limits< float >::infinity(), float dRz1=std::numeric_limits< float >::infinity(), float dPhi1=std::numeric_limits< float >::infinity())
Definition: ElectronSeed.cc:86
unsigned int detId() const
PropagatorWithMaterial * thePropagator
LocalVector momentum() const
Momentum vector in the local frame.
std::vector< ElectronSeed > ElectronSeedCollection
collection of ElectronSeed objects
ElectronSeedGenerator(const edm::ParameterSet &)
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
Definition: Event.h:356
PixelHitMatcher * myMatchPos
tuple out
Definition: dbtoconf.py:99
float dRz2() const
Definition: ElectronSeed.h:73
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:23
PTrajectoryStateOnDet const & startingState() const
float dPhi2Pos() const
Definition: ElectronSeed.h:76
void addSeed(reco::ElectronSeed &seed, const SeedWithInfo *info, bool positron, reco::ElectronSeedCollection &out)
const T & get() const
Definition: EventSetup.h:55
T const * product() const
Definition: ESHandle.h:62
void seedsFromThisCluster(edm::Ref< reco::SuperClusterCollection > seedCluster, float hoe1, float hoe2, reco::ElectronSeedCollection &out)
range recHits() const
void ele_convert(const Type1 &obj1, Type2 &obj2)
TrackCharge charge() const
Charge (-1, 0 or 1)
edm::ESHandle< MagneticField > theMagField
edm::EventID id() const
Definition: EventBase.h:56
bool equivalent(const TrajectorySeed &s1, const TrajectorySeed &s2)
unsigned int nHits() const
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
size_type size() const
Size of the RefVector.
Definition: RefVector.h:89
int subDet2() const
Definition: ElectronSeed.h:72
tuple cout
Definition: gather_cfg.py:121
dbl *** dir
Definition: mlp_gen.cc:35
void setPosAttributes(float dRz2=std::numeric_limits< float >::infinity(), float dPhi2=std::numeric_limits< float >::infinity(), float dRz1=std::numeric_limits< float >::infinity(), float dPhi1=std::numeric_limits< float >::infinity())
Definition: ElectronSeed.cc:95
void seedsFromTrajectorySeeds(const std::vector< SeedWithInfo > &elePixelSeeds, const reco::ElectronSeed::CaloClusterRef &cluster, float hoe1, float hoe2, reco::ElectronSeedCollection &out, bool positron)
void setup(std::vector< TH2F > &depth, std::string name, std::string units="")
mathSSE::Vec4< T > v
const LocalTrajectoryParameters & parameters() const
Pixel Reconstructed Hit.
unsigned char hitsMask() const
Definition: ElectronSeed.h:71
unsigned long long cacheIDCkfComp_