test
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 
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(0), myMatchPos(0),
81  thePropagator(0),
82  theMeasurementTracker(0),
83  theMeasurementTrackerEventTag(ts.token_measTrkEvt),
84  theSetup(0),
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,
224  {
225  theInitialSeedColl = seeds ;
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
259  e.getByToken(theMeasurementTrackerEventTag, data);
260  myMatchEle->setEvent(*data);
261  myMatchPos->setEvent(*data);
262 
263  // get initial TrajectorySeeds if necessary
264  // if (fromTrackerSeeds_) e.getByToken(initialSeeds_, theInitialSeedColl);
265 
266  // get the beamspot from the Event:
267  //e.getByType(theBeamSpot);
268  e.getByToken(beamSpotTag_,theBeamSpot);
269 
270  // if required get the vertices
271  if (useRecoVertex_) e.getByToken(verticesTag_,theVertices);
272 
273  if (!fromTrackerSeeds_)
274  { throw cms::Exception("NotSupported") << "Here in ElectronSeedGenerator " << __FILE__ << ":" << __LINE__ << " I would like to do theMeasurementTracker->update(e); but that no longer makes sense.\n";
275  }
276 
277  for (unsigned int i=0;i<sclRefs.size();++i) {
278  // Find the seeds
279  recHits_.clear();
280 
281  LogDebug ("ElectronSeedGenerator") << "new cluster, calling seedsFromThisCluster";
282  seedsFromThisCluster(sclRefs[i],hoe1s[i],hoe2s[i],out,tTopo);
283  }
284 
285  LogDebug ("ElectronSeedGenerator") << ": For event "<<e.id();
286  LogDebug ("ElectronSeedGenerator") <<"Nr of superclusters after filter: "<<sclRefs.size()
287  <<", no. of ElectronSeeds found = " << out.size();
288 
289 #ifdef COUNT_ElectronSeeds
290  stcount.s+=sclRefs.size();
291  stcount.n+=out.size();
292 #endif
293 
294 }
295 
298  float hoe1, float hoe2,
299  reco::ElectronSeedCollection & out, const TrackerTopology *tTopo )
300 {
301  float clusterEnergy = seedCluster->energy() ;
302  GlobalPoint clusterPos
303  ( seedCluster->position().x(),
304  seedCluster->position().y(),
305  seedCluster->position().z() ) ;
306  reco::ElectronSeed::CaloClusterRef caloCluster(seedCluster) ;
307 
308  //LogDebug("") << "[ElectronSeedGenerator::seedsFromThisCluster] new supercluster with energy: " << clusterEnergy ;
309  //LogDebug("") << "[ElectronSeedGenerator::seedsFromThisCluster] and position: " << clusterPos ;
310 
311  if (dynamicphiroad_)
312  {
313  float clusterEnergyT = clusterEnergy / cosh( EleRelPoint(clusterPos,theBeamSpot->position()).eta() ) ;
314 
315  float deltaPhi1 ;
316  if (clusterEnergyT < lowPtThreshold_)
317  { deltaPhi1= deltaPhi1Low_ ; }
318  else if (clusterEnergyT > highPtThreshold_)
319  { deltaPhi1= deltaPhi1High_ ; }
320  else
321  { deltaPhi1 = deltaPhi1Coef1_ + deltaPhi1Coef2_/clusterEnergyT ; }
322 
323  float ephimin1 = -deltaPhi1*sizeWindowENeg_ ;
324  float ephimax1 = deltaPhi1*(1.-sizeWindowENeg_);
325  float pphimin1 = -deltaPhi1*(1.-sizeWindowENeg_);
326  float pphimax1 = deltaPhi1*sizeWindowENeg_;
327 
328  float phimin2B = -deltaPhi2B_/2. ;
329  float phimax2B = deltaPhi2B_/2. ;
330  float phimin2F = -deltaPhi2F_/2. ;
331  float phimax2F = deltaPhi2F_/2. ;
332 
333 
334  myMatchEle->set1stLayer(ephimin1,ephimax1);
335  myMatchPos->set1stLayer(pphimin1,pphimax1);
336  myMatchEle->set2ndLayer(phimin2B,phimax2B, phimin2F,phimax2F);
337  myMatchPos->set2ndLayer(phimin2B,phimax2B, phimin2F,phimax2F);
338  }
339 
341 
342  if (!useRecoVertex_) // here use the beam spot position
343  {
344  double sigmaZ=theBeamSpot->sigmaZ();
345  double sigmaZ0Error=theBeamSpot->sigmaZ0Error();
346  double sq=sqrt(sigmaZ*sigmaZ+sigmaZ0Error*sigmaZ0Error);
347  double myZmin1=theBeamSpot->position().z()-nSigmasDeltaZ1_*sq;
348  double myZmax1=theBeamSpot->position().z()+nSigmasDeltaZ1_*sq;
349 
350  GlobalPoint vertexPos ;
351  ele_convert(theBeamSpot->position(),vertexPos) ;
352 
353  myMatchEle->set1stLayerZRange(myZmin1,myZmax1);
354  myMatchPos->set1stLayerZRange(myZmin1,myZmax1);
355 
356  if (!fromTrackerSeeds_)
357  {
358  // try electron
359  std::vector<std::pair<RecHitWithDist,ConstRecHitPointer> > elePixelHits
360  = myMatchEle->compatibleHits(clusterPos,vertexPos,
361  clusterEnergy,-1., tTopo, *theNavigationSchool) ;
362  GlobalPoint eleVertex(theBeamSpot->position().x(),theBeamSpot->position().y(),myMatchEle->getVertex()) ;
363  seedsFromRecHits(elePixelHits,dir,eleVertex,caloCluster,out,false) ;
364  // try positron
365  std::vector<std::pair<RecHitWithDist,ConstRecHitPointer> > posPixelHits
366  = myMatchPos->compatibleHits(clusterPos,vertexPos,clusterEnergy,1.,tTopo, *theNavigationSchool) ;
367  GlobalPoint posVertex(theBeamSpot->position().x(),theBeamSpot->position().y(),myMatchPos->getVertex()) ;
368  seedsFromRecHits(posPixelHits,dir,posVertex,caloCluster,out,true) ;
369  }
370  else
371  {
372  // try electron
373  std::vector<SeedWithInfo> elePixelSeeds
374  = myMatchEle->compatibleSeeds(theInitialSeedColl,clusterPos,vertexPos,clusterEnergy,-1.) ;
375  seedsFromTrajectorySeeds(elePixelSeeds,caloCluster,hoe1,hoe2,out,false) ;
376  // try positron
377  std::vector<SeedWithInfo> posPixelSeeds
378  = myMatchPos->compatibleSeeds(theInitialSeedColl,clusterPos,vertexPos,clusterEnergy,1.) ;
379  seedsFromTrajectorySeeds(posPixelSeeds,caloCluster,hoe1,hoe2,out,true) ;
380  }
381 
382  }
383  else // here we use the reco vertices
384  {
385 
386  myMatchEle->setUseRecoVertex(true) ; //Hit matchers need to know that the vertex is known
387  myMatchPos->setUseRecoVertex(true) ;
388 
389  const std::vector<reco::Vertex> * vtxCollection = theVertices.product() ;
390  std::vector<reco::Vertex>::const_iterator vtxIter ;
391  for (vtxIter = vtxCollection->begin(); vtxIter != vtxCollection->end() ; vtxIter++)
392  {
393 
394  GlobalPoint vertexPos(vtxIter->position().x(),vtxIter->position().y(),vtxIter->position().z());
395  double myZmin1, myZmax1 ;
396  if (vertexPos.z()==theBeamSpot->position().z())
397  { // in case vetex not found
398  double sigmaZ=theBeamSpot->sigmaZ();
399  double sigmaZ0Error=theBeamSpot->sigmaZ0Error();
400  double sq=sqrt(sigmaZ*sigmaZ+sigmaZ0Error*sigmaZ0Error);
401  myZmin1=theBeamSpot->position().z()-nSigmasDeltaZ1_*sq;
402  myZmax1=theBeamSpot->position().z()+nSigmasDeltaZ1_*sq;
403  }
404  else
405  { // a vertex has been recoed
406  myZmin1=vtxIter->position().z()-deltaZ1WithVertex_;
407  myZmax1=vtxIter->position().z()+deltaZ1WithVertex_;
408  }
409 
410  myMatchEle->set1stLayerZRange(myZmin1,myZmax1);
411  myMatchPos->set1stLayerZRange(myZmin1,myZmax1);
412 
413  if (!fromTrackerSeeds_)
414  {
415  // try electron
416  std::vector<std::pair<RecHitWithDist,ConstRecHitPointer> > elePixelHits
417  = myMatchEle->compatibleHits(clusterPos,vertexPos,clusterEnergy,-1.,tTopo, *theNavigationSchool) ;
418  seedsFromRecHits(elePixelHits,dir,vertexPos,caloCluster,out,false) ;
419  // try positron
420  std::vector<std::pair<RecHitWithDist,ConstRecHitPointer> > posPixelHits
421  = myMatchPos->compatibleHits(clusterPos,vertexPos,clusterEnergy,1.,tTopo, *theNavigationSchool) ;
422  seedsFromRecHits(posPixelHits,dir,vertexPos,caloCluster,out,true) ;
423  }
424  else
425  {
426  // try electron
427  std::vector<SeedWithInfo> elePixelSeeds
428  = myMatchEle->compatibleSeeds(theInitialSeedColl,clusterPos,vertexPos,clusterEnergy,-1.) ;
429  seedsFromTrajectorySeeds(elePixelSeeds,caloCluster,hoe1,hoe2,out,false) ;
430  // try positron
431  std::vector<SeedWithInfo> posPixelSeeds
432  = myMatchPos->compatibleSeeds(theInitialSeedColl,clusterPos,vertexPos,clusterEnergy,1.) ;
433  seedsFromTrajectorySeeds(posPixelSeeds,caloCluster,hoe1,hoe2,out,true) ;
434  }
435  }
436  }
437 
438  return ;
439  }
440 
442  ( std::vector<std::pair<RecHitWithDist,ConstRecHitPointer> > & pixelHits,
444  const GlobalPoint & vertexPos, const reco::ElectronSeed::CaloClusterRef & cluster,
446  bool positron )
447  {
448  if (!pixelHits.empty())
449  { LogDebug("ElectronSeedGenerator") << "Compatible "<<(positron?"positron":"electron")<<" hits found." ; }
450 
451  std::vector<std::pair<RecHitWithDist,ConstRecHitPointer> >::iterator v ;
452  for ( v = pixelHits.begin() ; v != pixelHits.end() ; v++ )
453  {
454  if (!positron)
455  { (*v).first.invert() ; }
456  if (!prepareElTrackSeed((*v).first.recHit(),(*v).second,vertexPos))
457  { continue ; }
458  reco::ElectronSeed seed(pts_,recHits_,dir) ;
459  seed.setCaloCluster(cluster) ;
460  addSeed(seed,0,positron,out) ;
461  }
462  }
463 
465  ( const std::vector<SeedWithInfo> & pixelSeeds,
466  const reco::ElectronSeed::CaloClusterRef & cluster,
467  float hoe1, float hoe2,
469  bool positron )
470  {
471  if (!pixelSeeds.empty())
472  { LogDebug("ElectronSeedGenerator") << "Compatible "<<(positron?"positron":"electron")<<" seeds found." ; }
473 
474  std::vector<SeedWithInfo>::const_iterator s;
475  for ( s = pixelSeeds.begin() ; s != pixelSeeds.end() ; s++ )
476  {
477  reco::ElectronSeed seed(s->seed()) ;
478  seed.setCaloCluster(cluster,s->hitsMask(),s->subDet2(),s->subDet1(),hoe1,hoe2) ;
479  addSeed(seed,&*s,positron,out) ;
480  }
481  }
482 
485  const SeedWithInfo * info,
486  bool positron,
488  {
489  if (!info)
490  { out.push_back(seed) ; return ; }
491 
492  if (positron)
493  { seed.setPosAttributes(info->dRz2(),info->dPhi2(),info->dRz1(),info->dPhi1()) ; }
494  else
495  { seed.setNegAttributes(info->dRz2(),info->dPhi2(),info->dRz1(),info->dPhi1()) ; }
496  reco::ElectronSeedCollection::iterator resItr ;
497  for ( resItr=out.begin() ; resItr!=out.end() ; ++resItr )
498  {
499  if ( (seed.caloCluster()==resItr->caloCluster()) &&
500  (seed.hitsMask()==resItr->hitsMask()) &&
501  equivalent(seed,*resItr) )
502  {
503  if (positron)
504  {
505  if ( resItr->dRz2Pos()==std::numeric_limits<float>::infinity() &&
506  resItr->dRz2()!=std::numeric_limits<float>::infinity() )
507  {
508  resItr->setPosAttributes(info->dRz2(),info->dPhi2(),info->dRz1(),info->dPhi1()) ;
509  seed.setNegAttributes(resItr->dRz2(),resItr->dPhi2(),resItr->dRz1(),resItr->dPhi1()) ;
510  break ;
511  }
512  else
513  {
514  if ( resItr->dRz2Pos()!=std::numeric_limits<float>::infinity() )
515  {
516  if ( resItr->dRz2Pos()!=seed.dRz2Pos() )
517  {
518  edm::LogWarning("ElectronSeedGenerator|BadValue")
519  <<"this similar old seed already has another dRz2Pos"
520  <<"\nold seed mask/dRz2/dPhi2/dRz2Pos/dPhi2Pos: "<<(unsigned int)resItr->hitsMask()<<"/"<<resItr->dRz2()<<"/"<<resItr->dPhi2()<<"/"<<resItr->dRz2Pos()<<"/"<<resItr->dPhi2Pos()
521  <<"\nnew seed mask/dRz2/dPhi2/dRz2Pos/dPhi2Pos: "<<(unsigned int)seed.hitsMask()<<"/"<<seed.dRz2()<<"/"<<seed.dPhi2()<<"/"<<seed.dRz2Pos()<<"/"<<seed.dPhi2Pos() ;
522  }
523 // else
524 // {
525 // edm::LogWarning("ElectronSeedGenerator|UnexpectedValue")
526 // <<"this old seed already knows its dRz2Pos, we suspect duplicates in input trajectry seeds"
527 // <<"\nold seed mask/dRz2/dPhi2/dRz2Pos/dPhi2Pos: "<<(unsigned int)resItr->hitsMask()<<"/"<<resItr->dRz2()<<"/"<<resItr->dPhi2()<<"/"<<resItr->dRz2Pos()<<"/"<<resItr->dPhi2Pos()
528 // <<"\nnew seed mask/dRz2/dPhi2/dRz2Pos/dPhi2Pos: "<<(unsigned int)seed.hitsMask()<<"/"<<seed.dRz2()<<"/"<<seed.dPhi2()<<"/"<<seed.dRz2Pos()<<"/"<<seed.dPhi2Pos() ;
529 // }
530  }
531 // if (resItr->dRz2()==std::numeric_limits<float>::infinity())
532 // {
533 // edm::LogWarning("ElectronSeedGenerator|BadValue")
534 // <<"this old seed has no dRz2, we suspect duplicates in input trajectry seeds"
535 // <<"\nold seed mask/dRz2/dPhi2/dRz2Pos/dPhi2Pos: "<<(unsigned int)resItr->hitsMask()<<"/"<<resItr->dRz2()<<"/"<<resItr->dPhi2()<<"/"<<resItr->dRz2Pos()<<"/"<<resItr->dPhi2Pos()
536 // <<"\nnew seed mask/dRz2/dPhi2/dRz2Pos/dPhi2Pos: "<<(unsigned int)seed.hitsMask()<<"/"<<seed.dRz2()<<"/"<<seed.dPhi2()<<"/"<<seed.dRz2Pos()<<"/"<<seed.dPhi2Pos() ;
537 // }
538  }
539  }
540  else
541  {
542  if ( resItr->dRz2()==std::numeric_limits<float>::infinity()
543  && resItr->dRz2Pos()!=std::numeric_limits<float>::infinity() )
544  {
545  resItr->setNegAttributes(info->dRz2(),info->dPhi2(),info->dRz1(),info->dPhi1()) ;
546  seed.setPosAttributes(resItr->dRz2Pos(),resItr->dPhi2Pos(),resItr->dRz1Pos(),resItr->dPhi1Pos()) ;
547  break ;
548  }
549  else
550  {
551  if ( resItr->dRz2()!=std::numeric_limits<float>::infinity() )
552  {
553  if (resItr->dRz2()!=seed.dRz2())
554  {
555  edm::LogWarning("ElectronSeedGenerator|BadValue")
556  <<"this old seed already has another dRz2"
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  // else
561  // {
562  // edm::LogWarning("ElectronSeedGenerator|UnexpectedValue")
563  // <<"this old seed already knows its dRz2, we suspect duplicates in input trajectry seeds"
564  // <<"\nold seed mask/dRz2/dPhi2/dRz2Pos/dPhi2Pos: "<<(unsigned int)resItr->hitsMask()<<"/"<<resItr->dRz2()<<"/"<<resItr->dPhi2()<<"/"<<resItr->dRz2Pos()<<"/"<<resItr->dPhi2Pos()
565  // <<"\nnew seed mask/dRz2/dPhi2/dRz2Pos/dPhi2Pos: "<<(unsigned int)seed.hitsMask()<<"/"<<seed.dRz2()<<"/"<<seed.dPhi2()<<"/"<<seed.dRz2Pos()<<"/"<<seed.dPhi2Pos() ;
566  // seed.setPosAttributes(resItr->dRz2Pos(),resItr->dPhi2Pos(),resItr->dRz1Pos(),resItr->dPhi1Pos()) ;
567  // }
568  }
569 // if (resItr->dRz2Pos()==std::numeric_limits<float>::infinity())
570 // {
571 // edm::LogWarning("ElectronSeedGenerator|BadValue")
572 // <<"this old seed has no dRz2Pos"
573 // <<"\nold seed mask/dRz2/dPhi2/dRz2Pos/dPhi2Pos: "<<(unsigned int)resItr->hitsMask()<<"/"<<resItr->dRz2()<<"/"<<resItr->dPhi2()<<"/"<<resItr->dRz2Pos()<<"/"<<resItr->dPhi2Pos()
574 // <<"\nnew seed mask/dRz2/dPhi2/dRz2Pos/dPhi2Pos: "<<(unsigned int)seed.hitsMask()<<"/"<<seed.dRz2()<<"/"<<seed.dPhi2()<<"/"<<seed.dRz2Pos()<<"/"<<seed.dPhi2Pos() ;
575 // }
576  }
577  }
578  }
579  }
580 
581  out.push_back(seed) ;
582  }
583 
585  ( ConstRecHitPointer innerhit,
586  ConstRecHitPointer outerhit,
587  const GlobalPoint& vertexPos )
588  {
589 
590  // debug prints
591  LogDebug("") <<"[ElectronSeedGenerator::prepareElTrackSeed] inner PixelHit x,y,z "<<innerhit->globalPosition();
592  LogDebug("") <<"[ElectronSeedGenerator::prepareElTrackSeed] outer PixelHit x,y,z "<<outerhit->globalPosition();
593 
594  recHits_.clear();
595 
596  SiPixelRecHit *pixhit=0;
597  SiStripMatchedRecHit2D *striphit=0;
598  const SiPixelRecHit* constpixhit = dynamic_cast <const SiPixelRecHit*> (innerhit->hit());
599  if (constpixhit) {
600  pixhit=new SiPixelRecHit(*constpixhit);
601  recHits_.push_back(pixhit);
602  } else return false;
603  constpixhit = dynamic_cast <const SiPixelRecHit *> (outerhit->hit());
604  if (constpixhit) {
605  pixhit=new SiPixelRecHit(*constpixhit);
606  recHits_.push_back(pixhit);
607  } else {
608  const SiStripMatchedRecHit2D * conststriphit=dynamic_cast <const SiStripMatchedRecHit2D *> (outerhit->hit());
609  if (conststriphit) {
610  striphit = new SiStripMatchedRecHit2D(*conststriphit);
611  recHits_.push_back(striphit);
612  } else return false;
613  }
614 
616 
617  // FIXME to be optimized outside the loop
619  theSetup->get<IdealMagneticFieldRecord>().get(bfield);
620  float nomField = bfield->nominalValue();
621 
622  // make a spiral
623  FastHelix helix(outerhit->globalPosition(),innerhit->globalPosition(),vertexPos,nomField,&*bfield);
624  if ( !helix.isValid()) {
625  return false;
626  }
627  FreeTrajectoryState fts(helix.stateAtVertex());
628  TSOS propagatedState = thePropagator->propagate(fts,innerhit->det()->surface()) ;
629  if (!propagatedState.isValid())
630  return false;
631  TSOS updatedState = theUpdator->update(propagatedState, *innerhit);
632 
633  TSOS propagatedState_out = thePropagator->propagate(updatedState,outerhit->det()->surface()) ;
634  if (!propagatedState_out.isValid())
635  return false;
636  TSOS updatedState_out = theUpdator->update(propagatedState_out, *outerhit);
637  // debug prints
638  LogDebug("") <<"[ElectronSeedGenerator::prepareElTrackSeed] final TSOS, position: "<<updatedState_out.globalPosition()<<" momentum: "<<updatedState_out.globalMomentum();
639  LogDebug("") <<"[ElectronSeedGenerator::prepareElTrackSeed] final TSOS Pt: "<<updatedState_out.globalMomentum().perp();
640  pts_ = trajectoryStateTransform::persistentState(updatedState_out, outerhit->geographicalId().rawId());
641 
642  return true;
643  }
#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
static const TGPicture * info(bool iBackgroundIsBlack)
T perp() const
Definition: PV3DBase.h:72
PixelHitMatcher * myMatchEle
void setupES(const edm::EventSetup &setup)
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:462
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
PTrajectoryStateOnDet persistentState(const TrajectoryStateOnSurface &ts, unsigned int detid)
float dRz2() const
GlobalPoint globalPosition() const
unsigned long long cacheIDMagField_
PropagationDirection
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
const SurfaceType & surface() const
edm::ESHandle< TrackerGeometry > theTrackerGeometry
void seedsFromThisCluster(edm::Ref< reco::SuperClusterCollection > seedCluster, float hoe1, float hoe2, reco::ElectronSeedCollection &out, const TrackerTopology *tTopo)
std::vector< TrajectorySeed > TrajectorySeedCollection
recHitContainer::const_iterator const_iterator
T sqrt(T t)
Definition: SSEVec.h:18
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
PixelHitMatcher * myMatchPos
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:19
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:56
T const * product() const
Definition: ESHandle.h:86
range recHits() const
ElectronSeedGenerator(const edm::ParameterSet &, const Tokens &)
void ele_convert(const Type1 &obj1, Type2 &obj2)
TrackCharge charge() const
Charge (-1, 0 or 1)
edm::ESHandle< MagneticField > theMagField
return(e1-e2)*(e1-e2)+dp *dp
edm::EventID id() const
Definition: EventBase.h:59
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:107
int subDet2() const
Definition: ElectronSeed.h:72
tuple cout
Definition: gather_cfg.py:145
dbl *** dir
Definition: mlp_gen.cc:35
volatile std::atomic< bool > shutdown_flag false
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)
const LocalTrajectoryParameters & parameters() const
Our base class.
Definition: SiPixelRecHit.h:23
unsigned char hitsMask() const
Definition: ElectronSeed.h:71
unsigned long long cacheIDCkfComp_