CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
HitPairGeneratorFromLayerPair.cc
Go to the documentation of this file.
3 
7 
13 
15 
16 using namespace GeomDetEnumerators;
17 using namespace std;
18 
20 
21 namespace {
22  template <class T>
23  inline T sqr(T t) {
24  return t * t;
25  }
26 } // namespace
27 
34 
36  edm::ConsumesCollector iC, unsigned int inner, unsigned int outer, LayerCacheType* layerCache, unsigned int max)
37  : theLayerCache(layerCache),
38  theFieldToken(iC.esConsumes()),
39  theMSMakerToken(iC.esConsumes()),
40  theOuterLayer(outer),
41  theInnerLayer(inner),
42  theMaxElement(max) {}
43 
45 
46 // devirtualizer
47 #include <tuple>
48 namespace {
49 
50  template <typename Algo>
51  struct Kernel {
52  using Base = HitRZCompatibility;
53  void set(Base const* a) {
54  assert(a->algo() == Algo::me);
55  checkRZ = reinterpret_cast<Algo const*>(a);
56  }
57 
58  void operator()(int b, int e, const RecHitsSortedInPhi& innerHitsMap, bool* ok) const {
59  constexpr float nSigmaRZ = 3.46410161514f; // std::sqrt(12.f);
60  for (int i = b; i != e; ++i) {
61  Range allowed = checkRZ->range(innerHitsMap.u[i]);
62  float vErr = nSigmaRZ * innerHitsMap.dv[i];
63  Range hitRZ(innerHitsMap.v[i] - vErr, innerHitsMap.v[i] + vErr);
64  Range crossRange = allowed.intersection(hitRZ);
65  ok[i - b] = !crossRange.empty();
66  }
67  }
68  Algo const* checkRZ;
69  };
70 
71  template <typename... Args>
72  using Kernels = std::tuple<Kernel<Args>...>;
73 
74 } // namespace
75 
78  const edm::Event& iEvent,
79  const edm::EventSetup& iSetup,
80  Layers layers) {
81  auto const& ds = doublets(region, iEvent, iSetup, layers);
82  for (std::size_t i = 0; i != ds.size(); ++i) {
83  result.push_back(OrderedHitPair(ds.hit(i, HitDoublets::inner), ds.hit(i, HitDoublets::outer)));
84  }
85  if (theMaxElement != 0 && result.size() >= theMaxElement) {
86  result.clear();
87  edm::LogError("TooManyPairs") << "number of pairs exceed maximum, no pairs produced";
88  }
89 }
90 
92  const edm::Event& iEvent,
93  const edm::EventSetup& iSetup,
94  const Layer& innerLayer,
95  const Layer& outerLayer,
96  LayerCacheType& layerCache) {
97  const RecHitsSortedInPhi& innerHitsMap = layerCache(innerLayer, region);
98  if (innerHitsMap.empty())
99  return HitDoublets(innerHitsMap, innerHitsMap);
100 
101  const RecHitsSortedInPhi& outerHitsMap = layerCache(outerLayer, region);
102  if (outerHitsMap.empty())
103  return HitDoublets(innerHitsMap, outerHitsMap);
104  const auto& field = iSetup.getData(theFieldToken);
105  const auto& msmaker = iSetup.getData(theMSMakerToken);
106  HitDoublets result(innerHitsMap, outerHitsMap);
107  result.reserve(std::max(innerHitsMap.size(), outerHitsMap.size()));
108  doublets(region,
109  *innerLayer.detLayer(),
110  *outerLayer.detLayer(),
111  innerHitsMap,
112  outerHitsMap,
113  field,
114  msmaker,
116  result);
117 
118  return result;
119 }
120 
122  const DetLayer& innerHitDetLayer,
123  const DetLayer& outerHitDetLayer,
124  const RecHitsSortedInPhi& innerHitsMap,
125  const RecHitsSortedInPhi& outerHitsMap,
126  const MagneticField& field,
128  const unsigned int theMaxElement,
129  HitDoublets& result) {
130  // HitDoublets result(innerHitsMap,outerHitsMap); result.reserve(std::max(innerHitsMap.size(),outerHitsMap.size()));
132  InnerDeltaPhi deltaPhi(outerHitDetLayer, innerHitDetLayer, region, field, msmaker);
133 
134  // std::cout << "layers " << theInnerLayer.detLayer()->seqNum() << " " << outerLayer.detLayer()->seqNum() << std::endl;
135 
136  // constexpr float nSigmaRZ = std::sqrt(12.f);
137  constexpr float nSigmaPhi = 3.f;
138  for (int io = 0; io != int(outerHitsMap.theHits.size()); ++io) {
139  if (!deltaPhi.prefilter(outerHitsMap.x[io], outerHitsMap.y[io]))
140  continue;
141  Hit const& ohit = outerHitsMap.theHits[io].hit();
142  PixelRecoRange<float> phiRange =
143  deltaPhi(outerHitsMap.x[io], outerHitsMap.y[io], outerHitsMap.z[io], nSigmaPhi * outerHitsMap.drphi[io]);
144 
145  if (phiRange.empty())
146  continue;
147 
148  std::unique_ptr<const HitRZCompatibility> checkRZ =
149  region.checkRZ(&innerHitDetLayer,
150  ohit,
151  &outerHitDetLayer,
152  outerHitsMap.rv(io),
153  outerHitsMap.z[io],
154  outerHitsMap.isBarrel ? outerHitsMap.du[io] : outerHitsMap.dv[io],
155  outerHitsMap.isBarrel ? outerHitsMap.dv[io] : outerHitsMap.du[io]);
156  if (!checkRZ)
157  continue;
158 
159  Kernels<HitZCheck, HitRCheck, HitEtaCheck> kernels;
160 
161  auto innerRange = innerHitsMap.doubleRange(phiRange.min(), phiRange.max());
162  LogDebug("HitPairGeneratorFromLayerPair")
163  << "preparing for combination of: " << innerRange[1] - innerRange[0] + innerRange[3] - innerRange[2]
164  << " inner and: " << outerHitsMap.theHits.size() << " outter";
165  for (int j = 0; j < 3; j += 2) {
166  auto b = innerRange[j];
167  auto e = innerRange[j + 1];
168  if (e == b)
169  continue;
170  bool ok[e - b];
171  switch (checkRZ->algo()) {
173  std::get<0>(kernels).set(checkRZ.get());
174  std::get<0>(kernels)(b, e, innerHitsMap, ok);
175  break;
177  std::get<1>(kernels).set(checkRZ.get());
178  std::get<1>(kernels)(b, e, innerHitsMap, ok);
179  break;
181  std::get<2>(kernels).set(checkRZ.get());
182  std::get<2>(kernels)(b, e, innerHitsMap, ok);
183  break;
184  }
185  for (int i = 0; i != e - b; ++i) {
186  if (!ok[i])
187  continue;
188  if (theMaxElement != 0 && result.size() >= theMaxElement) {
189  result.clear();
190  edm::LogError("TooManyPairs") << "number of pairs exceed maximum, no pairs produced";
191  return;
192  }
193  result.add(b + i, io);
194  }
195  }
196  }
197  LogDebug("HitPairGeneratorFromLayerPair") << " total number of pairs provided back: " << result.size();
198  result.shrink_to_fit();
199 }
std::vector< HitWithPhi > theHits
virtual std::unique_ptr< HitRZCompatibility > checkRZ(const DetLayer *layer, const Hit &outerHit, const DetLayer *outerlayer=nullptr, float lr=0, float gz=0, float dr=0, float dz=0) const =0
std::size_t size() const
std::vector< float > drphi
std::vector< LayerSetAndLayers > layers(const SeedingLayerSetsHits &sets)
Definition: LayerTriplets.cc:4
T max() const
HitPairGeneratorFromLayerPair(edm::ConsumesCollector iC, unsigned int inner, unsigned int outer, LayerCacheType *layerCache, unsigned int max=0)
void hitPairs(const TrackingRegion &reg, OrderedHitPairs &prs, const edm::Event &ev, const edm::EventSetup &es, Layers layers)
PixelRecoRange< float > Range
std::vector< float > z
bool empty() const
T min() const
Log< level::Error, false > LogError
int sqr(const T &t)
assert(be >=bs)
std::vector< float > x
DoubleRange doubleRange(float phiMin, float phiMax) const
void reserve(std::size_t s)
tuple result
Definition: mps_fire.py:311
bool getData(T &iHolder) const
Definition: EventSetup.h:122
int iEvent
Definition: GenABIO.cc:224
constexpr double nSigmaRZ
std::vector< float > y
std::vector< float > v
constexpr float nSigmaPhi
HitDoublets doublets(const TrackingRegion &reg, const edm::Event &ev, const edm::EventSetup &es, Layers layers)
unsigned int size() const override
std::size_t size() const
SeedingHitSet::ConstRecHitPointer Hit
BaseTrackerRecHit const * Hit
const edm::ESGetToken< MagneticField, IdealMagneticFieldRecord > theFieldToken
const edm::ESGetToken< MultipleScatteringParametrisationMaker, TrackerMultipleScatteringRecord > theMSMakerToken
double b
Definition: hdecay.h:118
const DetLayer * detLayer() const
std::vector< float > dv
PixelRecoRange< T > intersection(const PixelRecoRange< T > &r) const
double a
Definition: hdecay.h:119
float rv(int i) const
std::vector< float > u
bool prefilter(float xHit, float yHit) const
Definition: InnerDeltaPhi.h:30
std::vector< float > du
void add(int il, int ol)
long double T
ESGetTokenH3DDVariant esConsumes(std::string const &Reccord, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
Definition: fakeMenu.h:6
#define LogDebug(id)