33 struct LayerRZPredictions {
45 : thePairGenerator(0),
47 useFixedPreFiltering(cfg.getParameter<bool>(
"useFixedPreFiltering")),
48 extraHitRZtolerance(cfg.getParameter<double>(
"extraHitRZtolerance")),
49 extraHitRPhitolerance(cfg.getParameter<double>(
"extraHitRPhitolerance")),
50 useMScat(cfg.getParameter<bool>(
"useMultScattering")),
51 useBend(cfg.getParameter<bool>(
"useBending"))
65 std::vector<SeedingLayerSetsHits::SeedingLayer> thirdLayers) {
74 if (range.first > second.max() || range.second < second.min())
76 if (range.first < second.min())
77 range.first = second.min();
78 if (range.second > second.max())
79 range.second = second.max();
80 return range.first < range.second;
99 if (doublets.empty())
return;
108 std::vector<NodeInfo > layerTree;
109 std::vector<unsigned int> foundNodes;
110 foundNodes.reserve(100);
112 std::vector<KDTreeLinkerAlgo<unsigned int>> hitTree(size);
113 std::vector<LayerRZPredictions> mapPred(size);
116 LayerRZPredictions mapPred[
size];
125 for(
int il = 0; il <
size; il++) {
127 auto const & hits = *thirdHitMap[il];
129 const DetLayer *layer = theLayers[il].detLayer();
130 LayerRZPredictions &predRZ = mapPred[il];
131 predRZ.line.initLayer(layer);
132 predRZ.helix1.initLayer(layer);
133 predRZ.helix2.initLayer(layer);
140 float minv=999999.0;
float maxv = -999999.0;
142 for (
unsigned int i=0;
i!=hits.size(); ++
i) {
147 float myerr = hits.dv[
i];
149 layerTree.emplace_back(
i,
angle,
v);
155 KDTreeBox phiZ(minphi, maxphi, minv-0.01
f, maxv+0.01
f);
157 hitTree[il].
build(layerTree, phiZ);
158 rzError[il] = maxErr;
163 for (std::size_t ip =0; ip!=doublets.size(); ip++) {
180 if (!intersect(generalCurvature,
Range(-curv, curv)))
continue;
182 for(
int il = 0; il <
size; il++) {
183 if (hitTree[il].
empty())
continue;
185 bool barrelLayer = layer->
isBarrel();
190 LayerRZPredictions &predRZ = mapPred[il];
191 predRZ.line.initPropagator(&line);
214 Range z3s = predRZ.line.detRange();
215 double z3 = z3s.first < 0 ?
std::max(z3s.first, z3s.second)
218 gp1.
z(), gp2.
z(), z3);
219 if (!intersect(curvature,
Range(-maxCurvature, maxCurvature)))
223 HelixRZ helix1(&predictionRPhi, gp1.
z(), gp2.
z(), curvature.first);
224 HelixRZ helix2(&predictionRPhi, gp1.
z(), gp2.
z(), curvature.second);
226 predRZ.helix1.initPropagator(&helix1);
227 predRZ.helix2.initPropagator(&helix2);
229 Range rzRanges[2] = { predRZ.helix1(), predRZ.helix2() };
230 predRZ.helix1.initPropagator(
nullptr);
231 predRZ.helix2.initPropagator(
nullptr);
233 rzRange.first =
std::min(rzRanges[0].
first, rzRanges[1].first);
234 rzRange.second =
std::max(rzRanges[0].second, rzRanges[1].second);
238 if (curvature.first * curvature.second < 0.0) {
239 Range rzLineRange = predRZ.line();
240 rzRange.first =
std::min(rzRange.first, rzLineRange.first);
241 rzRange.second =
std::max(rzRange.second, rzLineRange.second);
244 rzRange = predRZ.line();
247 if (rzRange.first >= rzRange.second)
250 correction.correctRZRange(rzRange);
260 radius = predRZ.line.detRange();
261 if (!intersect(rzRange, predRZ.line.detSize()))
265 if (!intersect(radius, predRZ.line.detSize()))
269 Range rPhi1 = predictionRPhi(curvature, radius.first);
270 Range rPhi2 = predictionRPhi(curvature, radius.second);
271 correction.correctRPhiRange(rPhi1);
272 correction.correctRPhiRange(rPhi2);
273 rPhi1.first /= radius.first;
274 rPhi1.second /= radius.first;
275 rPhi2.first /= radius.second;
276 rPhi2.second /= radius.second;
281 float prmin=phiRange.min(), prmax=phiRange.max();
290 Range regMax = predRZ.line.detRange();
291 Range regMin = predRZ.line(regMax.min());
292 regMax = predRZ.line(regMax.max());
293 correction.correctRZRange(regMin);
294 correction.correctRZRange(regMax);
295 if (regMax.min() < regMin.min()) {
swap(regMax, regMin);}
299 hitTree[il].
search(phiZ, foundNodes);
305 hitTree[il].
search(phiZ, foundNodes);
312 auto const & hits = *thirdHitMap[il];
313 for (
auto KDdata : foundNodes) {
315 double p3_r = p3.
perp();
316 double p3_z = p3.
z();
317 float p3_phi = hits.phi(KDdata);
319 Range rangeRPhi = predictionRPhi(curvature, p3_r);
320 correction.correctRPhiRange(rangeRPhi);
323 float phiErr =
nSigmaPhi * hits.drphi[KDdata]*ir;
324 if (!
checkPhiInRange(p3_phi, rangeRPhi.first*ir-phiErr, rangeRPhi.second*ir+phiErr))
329 auto curv_ = predictionRPhi.curvature(thc);
330 double p2_r = point2.
r();
double p2_z = point2.z();
332 l2rzFixup(predictionRPhi, curv_, *doublets.hit(ip,
HitDoublets::outer), p2_r, p2_z, tTopo);
333 l3rzFixup(predictionRPhi, curv_, *hits.theHits[KDdata].hit(), p3_r, p3_z, tTopo);
337 HelixRZ updatedHelix(&predictionRPhi, gp1.
z(), p2_z, curv_);
338 rangeRZ = predRZ.helix1(barrelLayer ? p3_r : p3_z, updatedHelix);
340 float tIP = predictionRPhi.transverseIP(thc);
343 rangeRZ = predRZ.line(barrelLayer ? p3_r : p3_z, line);
345 correction.correctRZRange(rangeRZ);
347 double err =
nSigmaRZ * hits.dv[KDdata];
349 rangeRZ.first -= err, rangeRZ.second += err;
351 if (!rangeRZ.inside(barrelLayer ? p3_z : p3_r))
continue;
355 edm::LogError(
"TooManyTriplets")<<
" number of triples exceed maximum. no triplets produced.";
366 {
while (phi > phi2) phi -= 2. *
M_PI;
367 while (phi < phi1) phi += 2. *
M_PI;
371 std::pair<float, float>
373 const std::pair<float, float> &
r2)
const
374 {
float r2Min = r2.first;
375 float r2Max = r2.second;
376 while (r1.first - r2Min > +
M_PI) r2Min += 2. *
M_PI, r2Max += 2. *
M_PI;
377 while (r1.first - r2Min < -
M_PI) r2Min -= 2. *
M_PI, r2Max -= 2. *
M_PI;
378 return std::make_pair(
min(r1.first, r2Min),
max(r1.second, r2Max));
float originRBound() const
bounds the particle vertex in the transverse plane
void swap(ora::Record &rh, ora::Record &lh)
T getParameter(std::string const &) const
virtual HitPairGenerator * clone() const =0
void build(std::vector< KDTreeNodeInfo > &eltList, const KDTreeBox ®ion)
ThirdHitPredictionFromCircle::HelixRZ HelixRZ
T r() const
Radius, same as mag()
void setSeedingLayers(SeedingLayerSetsHits::SeedingLayerSet pairLayers, std::vector< SeedingLayerSetsHits::SeedingLayer > thirdLayers) override
bool useFixedPreFiltering
void search(const KDTreeBox &searchBox, std::vector< KDTreeNodeInfo > &resRecHitList)
LayerCacheType * theLayerCache
float extraHitRPhitolerance
U second(std::pair< T, U > const &p)
bool checkPhiInRange(float phi, float phi1, float phi2) const
T curvature(T InversePt, const edm::EventSetup &iSetup)
std::vector< SeedingLayerSetsHits::SeedingLayer > theLayers
PixelTripletLargeTipGenerator(const edm::ParameterSet &cfg, edm::ConsumesCollector &iC)
unsigned int theMaxElement
void init(const HitPairGenerator &pairs, LayerCacheType *layerCache) override
virtual HitDoublets doublets(const TrackingRegion ®, const edm::Event &ev, const edm::EventSetup &es)
virtual void hitTriplets(const TrackingRegion ®ion, OrderedHitTriplets &trs, const edm::Event &ev, const edm::EventSetup &es)
std::pair< float, float > mergePhiRanges(const std::pair< float, float > &r1, const std::pair< float, float > &r2) const
float extraHitRZtolerance
HitPairGenerator * thePairGenerator
PixelRecoRange< float > Range
static double maxCurvature(const ThirdHitPredictionFromCircle *circle, double z1, double z2, double z3)
T const * product() const
float ptMin() const
minimal pt of interest
Geom::Phi< T > phi() const
virtual unsigned int size() const
static const float fnSigmaRZ
DetLayer const * detLayer(layer l) const
tuple size
Write out results.
virtual void setSeedingLayers(SeedingLayerSetsHits::SeedingLayerSet layers)=0
T angle(T x1, T y1, T z1, T x2, T y2, T z2)