CMS 3D CMS Logo

RectangularEtaPhiTrackingRegion.cc
Go to the documentation of this file.
1 #include <cmath>
3 
4 #include "OuterEstimator.h"
5 
11 
23 
26 
35 
36 
37 #include<iostream>
38 #include <algorithm>
39 #include <cctype>
40 
41 namespace {
42 template <class T> T sqr( T t) {return t*t;}
43 }
44 
45 
46 using namespace PixelRecoUtilities;
47 using namespace std;
48 using namespace ctfseeding;
49 
52  std::transform(tmp.begin(), tmp.end(), tmp.begin(), ::tolower);
53  if(tmp == "never")
54  return UseMeasurementTracker::kNever;
55  if(tmp == "forsistrips")
56  return UseMeasurementTracker::kForSiStrips;
57  if(tmp == "always")
58  return UseMeasurementTracker::kAlways;
59  throw cms::Exception("Configuration") << "Got invalid string '" << name << "', valid values are 'Never', 'ForSiStrips', 'Always' (case insensitive)";
60 }
61 
63  float eta = dir.eta();
64  theEtaRange = Range(eta-margin.left(), eta+margin.right());
65  theLambdaRange=Range(std::sinh(theEtaRange.min()),std::sinh(theEtaRange.max()));
66  theMeanLambda = std::sinh(theEtaRange.mean());
67 }
68 
70 checkRZOld(const DetLayer* layer, const Hit & outerHit, const edm::EventSetup&iSetup, const DetLayer* outerlayer) const
71 {
72 
73  bool isBarrel = (layer->location() == GeomDetEnumerators::barrel);
74  GlobalPoint ohit = outerHit->globalPosition();
75  float outerred_r = std::sqrt( sqr(ohit.x()-origin().x())+sqr(ohit.y()-origin().y()) );
76  PixelRecoPointRZ outer(outerred_r, ohit.z());
77 
78  float zMinOrigin = origin().z() - originZBound();
79  float zMaxOrigin = origin().z() + originZBound();
80 
81  if (!thePrecise) {
82  float vcotMin = (outer.z() > zMaxOrigin) ?
83  (outer.z()-zMaxOrigin)/(outer.r()+originRBound())
84  : (outer.z()-zMaxOrigin)/(outer.r()-originRBound());
85  float vcotMax = (outer.z() > zMinOrigin) ?
86  (outer.z()-zMinOrigin)/(outer.r()-originRBound())
87  : (outer.z()-zMinOrigin)/(outer.r()+originRBound());
88  float cotRight = std::max(vcotMin,theLambdaRange.min());
89  float cotLeft = std::min(vcotMax, theLambdaRange.max());
90  return new HitEtaCheck( isBarrel, outer, cotLeft, cotRight);
91  }
92 
93 
94 
95  float outerZscatt=0;
96  float innerScatt =0;
97  //CHECK
98  if (theUseMS) {
99  MultipleScatteringParametrisation oSigma(layer,iSetup);
100  float cotThetaOuter = theMeanLambda;
101  float sinThetaOuterInv = std::sqrt(1.f+sqr(cotThetaOuter));
102  outerZscatt = 3.f*oSigma(ptMin(),cotThetaOuter)*sinThetaOuterInv;
103  }
104 
105  PixelRecoLineRZ boundL(outer, theLambdaRange.max());
106  PixelRecoLineRZ boundR(outer, theLambdaRange.min());
107  float zMinLine = boundL.zAtR(0.)-outerZscatt;
108  float zMaxLine = boundR.zAtR(0.)+outerZscatt;
109  PixelRecoPointRZ vtxL(0.,max(zMinLine, zMinOrigin));
110  PixelRecoPointRZ vtxR(0.,min(zMaxLine, zMaxOrigin));
111  PixelRecoPointRZ vtxMean(0.,(vtxL.z()+vtxR.z())*0.5f);
112  //CHECK
113 
114  if (theUseMS) {
115  MultipleScatteringParametrisation iSigma(layer,iSetup);
116 
117  innerScatt = 3.f * ( outerlayer ?
118  iSigma( ptMin(), vtxMean, outer, outerlayer->seqNum())
119  : iSigma( ptMin(), vtxMean, outer) ) ;
120 
121  // innerScatt = 3.f *iSigma( ptMin(), vtxMean, outer);
122  }
123 
124  SimpleLineRZ leftLine( vtxL, outer);
125  SimpleLineRZ rightLine(vtxR, outer);
126 
127  HitRZConstraint rzConstraint(leftLine, rightLine);
128  auto cotTheta = std::abs(leftLine.cotLine()+rightLine.cotLine())*0.5f;
129 
130 
131  // std::cout << "RectangularEtaPhiTrackingRegion " << outer.r()<<','<< outer.z() << " " << innerScatt << " " << cotTheta << " " << hitZErr << std::endl;
132 
133  if (isBarrel) {
134  auto sinThetaInv = std::sqrt(1.f+sqr(cotTheta));
135  auto corr = innerScatt*sinThetaInv;
136  return new HitZCheck(rzConstraint, HitZCheck::Margin(corr,corr));
137  } else {
138  auto cosThetaInv = std::sqrt(1.f+sqr(1.f/cotTheta));
139  auto corr = innerScatt*cosThetaInv;
140  return new HitRCheck( rzConstraint, HitRCheck::Margin(corr,corr));
141  }
142 }
143 
144 std::unique_ptr<MeasurementEstimator>
146 {
147 
148  using Algo = HitZCheck;
149 
150  // det dimensions
151  float halfLength = 0.5f*layer->surface().bounds().length();
152  float halfThickness = 0.5f*layer->surface().bounds().thickness();
153  float z0 = layer->position().z();
154  float radius = layer->specificSurface().radius();
155 
156  // det ranges
157  Range detRWindow (radius-halfThickness, radius+halfThickness);
158  Range detZWindow(z0-halfLength,z0+halfLength);
159 
160  // z prediction, skip if not intersection
161  HitZCheck zPrediction(rzConstraint());
162  Range hitZWindow = zPrediction.range(detRWindow.min()).
163  intersection(detZWindow);
164  if (hitZWindow.empty()) return nullptr;
165 
166  // phi prediction
167  OuterHitPhiPrediction phiPrediction = phiWindow(iSetup);
168 
169  //
170  // optional corrections for tolerance (mult.scatt, error, bending)
171  //
173  if (thePrecise) {
174  auto invR = 1.f/ radius;
175  auto cotTheta = (hitZWindow.mean()-origin().z()) * invR;
176  auto sinThetaInv = std::sqrt(1.f+sqr(cotTheta));
177  MultipleScatteringParametrisation msSigma(layer,iSetup);
178  auto scatt = 3.f * msSigma(ptMin(), cotTheta);
179  auto bendR = longitudinalBendingCorrection(radius,ptMin(),iSetup);
180 
181  float hitErrRPhi = 0.;
182  float hitErrZ = 0.;
183  float corrPhi = (scatt+ hitErrRPhi)*invR;
184  float corrZ = scatt*sinThetaInv + bendR*std::abs(cotTheta) + hitErrZ;
185 
186  phiPrediction.setTolerance(corrPhi);
187  zPrediction.setTolerance(HitZCheck::Margin(corrZ,corrZ));
188 
189  //
190  // hit ranges in det
191  //
192  OuterHitPhiPrediction::Range phi1 = phiPrediction(detRWindow.min());
193  OuterHitPhiPrediction::Range phi2 = phiPrediction(detRWindow.max());
194  phiRange = Range( std::min(phi1.min(),phi2.min()), std::max(phi1.max(),phi2.max()));
195  Range w1 = zPrediction.range(detRWindow.min());
196  Range w2 = zPrediction.range(detRWindow.max());
197  hitZWindow = Range(std::min(w1.min(),w2.min()), std::max(w1.max(),w2.max())).intersection(detZWindow);
198  }
199  else {
200  phiRange = phiPrediction(detRWindow.mean());
201  }
202 
203  return std::make_unique<OuterEstimator<Algo>>(
204  OuterDetCompatibility( layer, phiRange, detRWindow, hitZWindow),
205  OuterHitCompatibility<Algo>( phiPrediction, zPrediction ),
206  iSetup);
207 }
208 
209 std::unique_ptr<MeasurementEstimator>
211 {
212  using Algo=HitRCheck;
213  // det dimensions, ranges
214  float halfThickness = 0.5f*layer->surface().bounds().thickness();
215  float zLayer = layer->position().z() ;
216  Range detZWindow( zLayer-halfThickness, zLayer+halfThickness);
217  Range detRWindow( layer->specificSurface().innerRadius(),
218  layer->specificSurface().outerRadius());
219 
220  // r prediction, skip if not intersection
221  HitRCheck rPrediction(rzConstraint());
222  Range hitRWindow = rPrediction.range(zLayer).intersection(detRWindow);
223  if (hitRWindow.empty()) return nullptr;
224 
225  // phi prediction
226  OuterHitPhiPrediction phiPrediction = phiWindow(iSetup);
227  OuterHitPhiPrediction::Range phiRange = phiPrediction(detRWindow.max());
228 
229  //
230  // optional corrections for tolerance (mult.scatt, error, bending)
231  //
232  if (thePrecise) {
233  float cotTheta = (detZWindow.mean()-origin().z())/hitRWindow.mean();
234  float cosThetaInv = std::sqrt(1+sqr(cotTheta))/cotTheta;
235  MultipleScatteringParametrisation msSigma(layer,iSetup);
236  float scatt = 3.f * msSigma(ptMin(),cotTheta);
237  float bendR = longitudinalBendingCorrection(hitRWindow.max(),ptMin(),iSetup);
238  float hitErrRPhi = 0.;
239  float hitErrR = 0.;
240  float corrPhi = (scatt+hitErrRPhi)/detRWindow.min();
241  float corrR = scatt*std::abs(cosThetaInv) + bendR + hitErrR;
242 
243  phiPrediction.setTolerance(corrPhi);
244  rPrediction.setTolerance(HitRCheck::Margin(corrR,corrR));
245 
246  //
247  // hit ranges in det
248  //
249  Range w1,w2;
250  if (zLayer > 0) {
251  w1 = rPrediction.range(detZWindow.min());
252  w2 = rPrediction.range(detZWindow.max());
253  } else {
254  w1 = rPrediction.range(detZWindow.max());
255  w2 = rPrediction.range(detZWindow.min());
256  }
257  hitRWindow = Range(w1.min(),w2.max()).intersection(detRWindow);
258  }
259 
260  return std::make_unique<OuterEstimator<Algo>>(
261  OuterDetCompatibility( layer, phiRange, hitRWindow, detZWindow),
262  OuterHitCompatibility<Algo>( phiPrediction, rPrediction),iSetup );
263 }
264 
265 
266 
269 {
270  auto phi0 = phiDirection();
271  return OuterHitPhiPrediction(
272  OuterHitPhiPrediction::Range( phi0-thePhiMargin.left(),
273  phi0+thePhiMargin.right()),
274  OuterHitPhiPrediction::Range( curvature(invPtRange().min(),iSetup),
275  curvature(invPtRange().max(),iSetup)),
276  originRBound());
277 }
278 
279 
282  HitRZConstraint::Point pLeft,pRight;
283  float zMin = origin().z() - originZBound();
284  float zMax = origin().z() + originZBound();
285  float rMin = -originRBound();
286  float rMax = originRBound();
287  if(theEtaRange.max() > 0) {
288  pRight = HitRZConstraint::Point(rMin,zMax);
289  } else {
290  pRight = HitRZConstraint::Point(rMax,zMax);
291  }
292  if (theEtaRange.min() > 0.) {
293  pLeft = HitRZConstraint::Point(rMax, zMin);
294  } else {
295  pLeft = HitRZConstraint::Point(rMin, zMin);
296  }
297  return HitRZConstraint(pLeft, theLambdaRange.min(),
298  pRight,theLambdaRange.max()
299  );
300 }
301 
303  const edm::EventSetup& es,
304  const SeedingLayerSetsHits::SeedingLayer& layer) const {
306 
307  //ESTIMATOR
308 
309  const DetLayer * detLayer = layer.detLayer();
310 
311  bool measurementMethod = false;
312  if(theMeasurementTrackerUsage == UseMeasurementTracker::kAlways) measurementMethod = true;
313  else if(theMeasurementTrackerUsage == UseMeasurementTracker::kForSiStrips &&
314  GeomDetEnumerators::isTrackerStrip(detLayer->subDetector())) measurementMethod = true;
315 
316  if(measurementMethod) {
318  es.get<IdealMagneticFieldRecord>().get(field);
319  const MagneticField * magField = field.product();
320 
321  const GlobalPoint vtx = origin();
322  GlobalVector dir = direction();
323 
324  std::unique_ptr<MeasurementEstimator> est;
326  (!theUseEtaPhi && detLayer->location() == GeomDetEnumerators::barrel)) {
327  const BarrelDetLayer& bl = dynamic_cast<const BarrelDetLayer&>(*detLayer);
328  est = estimator(&bl,es);
330  (!theUseEtaPhi && detLayer->location() == GeomDetEnumerators::endcap)) {
331  const ForwardDetLayer& fl = dynamic_cast<const ForwardDetLayer&>(*detLayer);
332  est = estimator(&fl,es);
333  }
334 
335  EtaPhiMeasurementEstimator etaPhiEstimator ((theEtaRange.second-theEtaRange.first)*0.5f,
336  (thePhiMargin.left()+thePhiMargin.right())*0.5f);
337  MeasurementEstimator * findDetAndHits = &etaPhiEstimator;
338  if (est){
339  LogDebug("RectangularEtaPhiTrackingRegion")<<"use pixel specific estimator.";
340  findDetAndHits = est.get();
341  }
342  else{
343  LogDebug("RectangularEtaPhiTrackingRegion")<<"use generic etat phi estimator.";
344  }
345 
346  // TSOS
347  float phi = phiDirection();
348  // std::cout << "dir " << direction().x()/direction().perp() <<','<< direction().y()/direction().perp() << " " << sin(phi) <<','<<cos(phi)<< std::endl;
349  Surface::RotationType rot( sin(phi), -cos(phi), 0,
350  0, 0, -1,
351  cos(phi), sin(phi), 0);
352 
353  Plane::PlanePointer surface = Plane::build(GlobalPoint(0.,0.,0.), rot);
354  //TrajectoryStateOnSurface tsos(lpar, *surface, magField);
355 
356  FreeTrajectoryState fts( GlobalTrajectoryParameters(vtx, dir, 1, magField) );
357  TrajectoryStateOnSurface tsos(fts, *surface);
358 
359  // propagator
360  StraightLinePropagator prop( magField, alongMomentum);
361 
362  LayerMeasurements lm(theMeasurementTracker->measurementTracker(), *theMeasurementTracker);
363 
365  lm.recHits(hits,*detLayer, tsos, prop, *findDetAndHits);
366  /*
367  { // old code
368  vector<TrajectoryMeasurement> meas = lm.measurements(*detLayer, tsos, prop, *findDetAndHits);
369  auto n=0UL;
370  for (auto const & im : meas)
371  if(im.recHit()->isValid()) ++n;
372  assert(n==hits.size());
373  // std::cout << "old/new " << n <<'/'<<hits.size() << std::endl;
374  }
375  */
376 
377  result.reserve(hits.size());
378  for (auto h : hits) {
379  cache.emplace_back(h);
380  result.emplace_back(h);
381  }
382 
383  LogDebug("RectangularEtaPhiTrackingRegion")<<" found "<< hits.size()<<" minus one measurements on layer: "<<detLayer->subDetector();
384  // std::cout << "RectangularEtaPhiTrackingRegion" <<" found "<< meas.size()<<" minus one measurements on layer: "<<detLayer->subDetector() << std::endl;
385 
386  } else {
387  //
388  // temporary solution (actually heavily used for Pixels....)
389  //
390  if (detLayer->location() == GeomDetEnumerators::barrel) {
391  const BarrelDetLayer& bl = dynamic_cast<const BarrelDetLayer&>(*detLayer);
392  auto est = estimator(&bl,es);
393  if (!est) return result;
394  using Algo = HitZCheck;
395  auto const & hitComp = (reinterpret_cast<OuterEstimator<Algo> const&>(*est)).hitCompatibility();
396  auto layerHits = layer.hits();
397  result.reserve(layerHits.size());
398  for (auto && ih : layerHits) {
399  if ( hitComp(*ih) )
400  result.emplace_back( std::move(ih) );
401  }
402 
403  } else {
404  const ForwardDetLayer& fl = dynamic_cast<const ForwardDetLayer&>(*detLayer);
405  auto est = estimator(&fl,es);
406  if (!est) return result;
407  using Algo = HitRCheck;
408  auto const & hitComp = (reinterpret_cast<OuterEstimator<Algo> const&>(*est)).hitCompatibility();
409  auto layerHits = layer.hits();
410  result.reserve(layerHits.size());
411  for (auto && ih : layerHits) {
412  if ( hitComp(*ih) )
413  result.emplace_back( std::move(ih) );
414  }
415 
416  }
417 
418  }
419 
420  // std::cout << "RectangularEtaPhiTrackingRegion hits " << result.size() << std::endl;
421 
422  return result;
423 }
424 
426  std::ostringstream str;
427  str << TrackingRegionBase::print()
428  <<" eta: "<<theEtaRange<<" phi:"<<thePhiMargin
429  << "precise: "<<thePrecise;
430  return str.str();
431 }
432 
#define LogDebug(id)
void setTolerance(float tolerance)
HitRZCompatibility * checkRZOld(const DetLayer *layer, const Hit &outerHit, const edm::EventSetup &iSetup, const DetLayer *outerlayer) const
virtual float length() const =0
float cotLine() const
common ppss p3p6s2 common epss epspn46 common const1 w2
Definition: inclppp.h:1
T max() const
std::vector< BaseTrackerRecHit * > SimpleHitContainer
virtual SubDetector subDetector() const =0
The type of detector (PixelBarrel, PixelEndcap, TIB, TOB, TID, TEC, CSC, DT, RPCBarrel, RPCEndcap)
bool isBarrel(GeomDetEnumerators::SubDetector m)
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
virtual Location location() const =0
Which part of the detector (barrel, endcap)
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
T y() const
Definition: PV3DBase.h:63
const Bounds & bounds() const
Definition: Surface.h:120
TrackingRegion::Hits hits(const edm::EventSetup &es, const SeedingLayerSetsHits::SeedingLayer &layer) const override
get hits from layer compatible with region constraints
bool empty() const
static UseMeasurementTracker stringToUseMeasurementTracker(const std::string &name)
virtual const BoundCylinder & specificSurface() const final
Extension of the interface.
T min() const
Range range(const float &radius) const override
Definition: HitZCheck.h:35
std::unique_ptr< MeasurementEstimator > estimator(const BarrelDetLayer *layer, const edm::EventSetup &iSetup) const
float zAtR(float r) const
int seqNum() const
Definition: DetLayer.h:36
void initEtaRange(const GlobalVector &dir, const Margin &margin)
T curvature(T InversePt, const edm::EventSetup &iSetup)
PixelRecoRange< float > Range
T sqrt(T t)
Definition: SSEVec.h:18
static PlanePointer build(Args &&...args)
Definition: Plane.h:33
T z() const
Definition: PV3DBase.h:64
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
Double_t margin
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
static GlobalPoint vtxMean(const GlobalPoint &p1, const GlobalError &e1, const GlobalPoint &p2, const GlobalError &e2)
double f[11][100]
T min(T a, T b)
Definition: MathUtil.h:58
bool isEndcap(GeomDetEnumerators::SubDetector m)
def cache(function)
JetCorrectorParameters corr
Definition: classes.h:5
bool isTrackerStrip(GeomDetEnumerators::SubDetector m)
OuterHitPhiPrediction phiWindow(const edm::EventSetup &iSetup) const
SimpleLineRZ::Point Point
virtual const BoundDisk & specificSurface() const final
SeedingLayerSetsHits::Hits Hits
float z() const
double longitudinalBendingCorrection(double radius, double pt, const edm::EventSetup &iSetup)
virtual float thickness() const =0
T mean() const
virtual const Surface::PositionType & position() const
Returns position of the surface.
const T & get() const
Definition: EventSetup.h:55
const DetLayer * detLayer() const
virtual std::string print() const
T eta() const
Definition: PV3DBase.h:76
std::vector< std::vector< double > > tmp
Definition: MVATrainer.cc:100
const BoundSurface & surface() const final
The surface of the GeometricSearchDet.
PixelRecoRange< T > intersection(const PixelRecoRange< T > &r) const
Square< F >::type sqr(const F &f)
Definition: Square.h:13
dbl *** dir
Definition: mlp_gen.cc:35
long double T
T x() const
Definition: PV3DBase.h:62
T const * product() const
Definition: ESHandle.h:86
const BoundSurface & surface() const final
GeometricSearchDet interface.
Definition: fakeMenu.h:6
def move(src, dest)
Definition: eostools.py:510
bool isTrackerPixel(GeomDetEnumerators::SubDetector m)
void setTolerance(const Margin &tolerance)
Definition: HitZCheck.h:28