CMS 3D CMS Logo

List of all members | Public Member Functions | Private Member Functions | Private Attributes
GenericTripletGenerator Class Reference

#include <GenericTripletGenerator.h>

Inheritance diagram for GenericTripletGenerator:
OrderedHitsGenerator

Public Member Functions

void clear () override
 
 GenericTripletGenerator (const edm::ParameterSet &conf, edm::ConsumesCollector &iC)
 
const OrderedSeedingHitsrun (const TrackingRegion &region, const edm::Event &ev, const edm::EventSetup &es) override
 
 ~GenericTripletGenerator () override
 
- Public Member Functions inherited from OrderedHitsGenerator
 OrderedHitsGenerator ()
 
virtual ~OrderedHitsGenerator ()
 

Private Member Functions

std::pair< bool, float > qualityFilter (const OrderedHitTriplet &oht, const std::map< float, OrderedHitTriplet > &map, const SeedingLayerSetsHits::SeedingLayerSet &ls) const
 

Private Attributes

OrderedHitTriplets hitTriplets
 
edm::EDGetTokenT< SeedingLayerSetsHitstheSeedingLayerToken
 

Additional Inherited Members

- Public Attributes inherited from OrderedHitsGenerator
unsigned int theMaxElement
 

Detailed Description

Definition at line 15 of file GenericTripletGenerator.h.

Constructor & Destructor Documentation

GenericTripletGenerator::GenericTripletGenerator ( const edm::ParameterSet conf,
edm::ConsumesCollector iC 
)

Definition at line 9 of file GenericTripletGenerator.cc.

11  edm::LogInfo("CtfSpecialSeedGenerator|GenericTripletGenerator") << "Constructing GenericTripletGenerator";
12 }
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
T getParameter(std::string const &) const
edm::EDGetTokenT< SeedingLayerSetsHits > theSeedingLayerToken
GenericTripletGenerator::~GenericTripletGenerator ( )
inlineoverride

Definition at line 18 of file GenericTripletGenerator.h.

References ev, HLT_2018_cff::region, and run().

18 {};

Member Function Documentation

void GenericTripletGenerator::clear ( void  )
inlineoverridevirtual

Reimplemented from OrderedHitsGenerator.

Definition at line 20 of file GenericTripletGenerator.h.

References hitTriplets, eostools::ls(), genParticles_cff::map, and qualityFilter().

20 { hitTriplets.clear(); }
std::pair< bool, float > GenericTripletGenerator::qualityFilter ( const OrderedHitTriplet oht,
const std::map< float, OrderedHitTriplet > &  map,
const SeedingLayerSetsHits::SeedingLayerSet ls 
) const
private

Definition at line 62 of file GenericTripletGenerator.cc.

References MillePedeFileConverter_cfg::e, OrderedHitTriplet::inner(), PV3DBase< T, PVType, FrameType >::mag(), mag(), OrderedHitTriplet::middle(), OrderedHitTriplet::outer(), PV3DBase< T, PVType, FrameType >::phi(), FastCircle::rho(), mathSSE::sqrt(), PV3DBase< T, PVType, FrameType >::x(), and PV3DBase< T, PVType, FrameType >::y().

Referenced by clear(), and run().

64  {
65  //first check the radius
66  GlobalPoint innerpos = oht.inner()->globalPosition();
67  GlobalPoint middlepos = oht.middle()->globalPosition();
68  GlobalPoint outerpos = oht.outer()->globalPosition();
69  std::vector<const TrackingRecHit*> ohttrh;
70  ohttrh.push_back(&(*(oht.inner())));
71  ohttrh.push_back(&(*(oht.middle())));
72  ohttrh.push_back(&(*(oht.outer())));
73  std::vector<const TrackingRecHit*>::const_iterator ioht;
74  //now chech that the change in phi is reasonable. the limiting angular distance is the one in case
75  //one of the two points is a tangent point.
76  float limit_phi_distance1 = sqrt((middlepos.x() - outerpos.x()) * (middlepos.x() - outerpos.x()) +
77  (middlepos.y() - outerpos.y()) * (middlepos.y() - outerpos.y())) /
78  middlepos.mag(); //actually this is the tangent of the limiting angle
79  float limit_phi_distance2 = sqrt((middlepos.x() - innerpos.x()) * (middlepos.x() - innerpos.x()) +
80  (middlepos.y() - innerpos.y()) * (middlepos.y() - innerpos.y())) /
81  innerpos.mag();
82  //if (fabs(tan(outerpos.phi()-middlepos.phi()))>limit_phi_distance1 ||
83  // fabs(tan(innerpos.phi()-middlepos.phi()))>limit_phi_distance2) {
84  if (fabs(outerpos.phi() - middlepos.phi()) > fabs(atan(limit_phi_distance1)) ||
85  fabs(innerpos.phi() - middlepos.phi()) > fabs(atan(limit_phi_distance2))) {
86  //std::cout << "rejected because phi" << std::endl;
87  return std::make_pair(false, 0.);
88  }
89  //should we add a control on the r-z plane too?
90  /*
91  //now check that there is no big change in the r-z projection
92  float dz1 = outerpos.z()-middlepos.z();
93  float dr1 = sqrt(outerpos.x()*outerpos.x()+outerpos.y()*outerpos.y())-
94  sqrt(middlepos.x()*middlepos.x()+middlepos.y()*middlepos.y());
95  float dz2 = middlepos.z()-innerpos.z();
96  float dr2 = sqrt(middlepos.x()*middlepos.x()+middlepos.y()*middlepos.y())-
97  sqrt(innerpos.x()*innerpos.x()+innerpos.y()*innerpos.y());
98  float tan1 = dz1/dr1;
99  float tan2 = dz2/dr2;
100  //how much should we allow? should we make it configurable?
101  if (fabs(tan1-tan2)/tan1>0.5){
102  //std::cout << "rejected because z" << std::endl;
103  return std::make_pair(false, 0.);
104  }
105  */
106  //now check the radius is not too small
107  FastCircle circle(innerpos, middlepos, outerpos);
108  if (circle.rho() < 200 && circle.rho() != 0)
109  return std::make_pair(false, circle.rho()); //to small radius
110  //now check if at least 2 hits are shared with an existing triplet
111  //look for similar radii in the map
112  std::map<float, OrderedHitTriplet>::const_iterator lower_bound = map.lower_bound((1 - 0.01) * circle.rho());
113  std::map<float, OrderedHitTriplet>::const_iterator upper_bound = map.upper_bound((1 + 0.01) * circle.rho());
114  std::map<float, OrderedHitTriplet>::const_iterator iter;
115  for (iter = lower_bound; iter != upper_bound && iter->first <= upper_bound->first; iter++) {
116  int shared = 0;
117  std::vector<const TrackingRecHit*> curtrh;
118  curtrh.push_back(&*(iter->second.inner()));
119  curtrh.push_back(&*(iter->second.middle()));
120  curtrh.push_back(&*(iter->second.outer()));
121  std::vector<const TrackingRecHit*>::const_iterator curiter;
122  for (curiter = curtrh.begin(); curiter != curtrh.end(); curiter++) {
123  for (ioht = ohttrh.begin(); ioht != ohttrh.end(); ioht++) {
124  if ((*ioht)->geographicalId() == (*curiter)->geographicalId() &&
125  ((*ioht)->localPosition() - (*curiter)->localPosition()).mag() < 1e-5)
126  shared++;
127  }
128  }
129  if (shared > 1)
130  return std::make_pair(false, circle.rho());
131  }
132 
133  return std::make_pair(true, circle.rho());
134 }
MiddleRecHit middle() const
T mag() const
The vector magnitude. Equivalent to sqrt(vec.mag2())
Geom::Phi< T > phi() const
Definition: PV3DBase.h:66
T y() const
Definition: PV3DBase.h:60
InnerRecHit inner() const
T mag() const
Definition: PV3DBase.h:64
T sqrt(T t)
Definition: SSEVec.h:19
OuterRecHit outer() const
T x() const
Definition: PV3DBase.h:59
const OrderedSeedingHits & GenericTripletGenerator::run ( const TrackingRegion region,
const edm::Event ev,
const edm::EventSetup es 
)
overridevirtual

Implements OrderedHitsGenerator.

Definition at line 14 of file GenericTripletGenerator.cc.

References edm::Event::getByToken(), TrackingRegion::hits(), hitTriplets, hgcalTopologyTester_cfi::layers, eostools::ls(), SeedingLayerSetsHits::numberOfLayersInSet(), qualityFilter(), and theSeedingLayerToken.

Referenced by ~GenericTripletGenerator().

16  {
17  hitTriplets.clear();
18  hitTriplets.reserve(0);
20  e.getByToken(theSeedingLayerToken, hlayers);
21  const SeedingLayerSetsHits& layers = *hlayers;
22  if (layers.numberOfLayersInSet() != 3)
23  throw cms::Exception("CtfSpecialSeedGenerator")
24  << "You are using " << layers.numberOfLayersInSet() << " layers in set instead of 3 ";
25  std::map<float, OrderedHitTriplet> radius_triplet_map;
27  auto innerHits = region.hits(es, ls[0]);
28  //std::cout << "innerHits.size()=" << innerHits.size() << std::endl;
29  auto middleHits = region.hits(es, ls[1]);
30  //std::cout << "middleHits.size()=" << middleHits.size() << std::endl;
31  auto outerHits = region.hits(es, ls[2]);
32  //std::cout << "outerHits.size()=" << outerHits.size() << std::endl;
33  //std::cout << "trying " << innerHits.size()*middleHits.size()*outerHits.size() << " combinations "<<std::endl;
34  for (auto iOuterHit = outerHits.begin(); iOuterHit != outerHits.end(); iOuterHit++) {
35  for (auto iMiddleHit = middleHits.begin(); iMiddleHit != middleHits.end(); iMiddleHit++) {
36  for (auto iInnerHit = innerHits.begin(); iInnerHit != innerHits.end(); iInnerHit++) {
37  //GlobalPoint innerpos = ls[0].hitBuilder()->build(&(**iInnerHit))->globalPosition();
38  //GlobalPoint middlepos = ls[1].hitBuilder()->build(&(**iMiddleHit))->globalPosition();
39  //GlobalPoint outerpos = ls[2].hitBuilder()->build(&(**iOuterHit))->globalPosition();
40  //FastCircle circle(innerpos,
41  // middlepos,
42  // outerpos);
43  //do a first check on the radius of curvature to reduce the combinatorics
44  OrderedHitTriplet oht(&(**iInnerHit), &(**iMiddleHit), &(**iOuterHit));
45  std::pair<bool, float> val_radius = qualityFilter(oht, radius_triplet_map, ls);
46  if (val_radius.first) {
47  //if (circle.rho() > 200 || circle.rho() == 0) { //0 radius means straight line
48  //hitTriplets.push_back(OrderedHitTriplet(*iInnerHit,
49  // *iMiddleHit,
50  // *iOuterHit));
51  hitTriplets.push_back(oht);
52  radius_triplet_map.insert(std::make_pair(val_radius.second, oht));
53  }
54  }
55  }
56  }
57  }
58  //std::cout << "ending with " << hitTriplets.size() << " triplets" << std::endl;
59  return hitTriplets;
60 }
unsigned short numberOfLayersInSet() const
Get number of layers in each SeedingLayerSets.
edm::EDGetTokenT< SeedingLayerSetsHits > theSeedingLayerToken
std::pair< bool, float > qualityFilter(const OrderedHitTriplet &oht, const std::map< float, OrderedHitTriplet > &map, const SeedingLayerSetsHits::SeedingLayerSet &ls) const
def ls(path, rec=False)
Definition: eostools.py:349
virtual Hits hits(const edm::EventSetup &es, const SeedingLayerSetsHits::SeedingLayer &layer) const =0
get hits from layer compatible with region constraints

Member Data Documentation

OrderedHitTriplets GenericTripletGenerator::hitTriplets
private

Definition at line 27 of file GenericTripletGenerator.h.

Referenced by clear(), and run().

edm::EDGetTokenT<SeedingLayerSetsHits> GenericTripletGenerator::theSeedingLayerToken
private

Definition at line 26 of file GenericTripletGenerator.h.

Referenced by run().