CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
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 TrackingRecHit *outerHit,const edm::EventSetup& iSetup) const
71 {
73  iSetup.get<TrackerDigiGeometryRecord>().get(tracker);
74 
75  bool isBarrel = (layer->location() == GeomDetEnumerators::barrel);
76  GlobalPoint ohit = tracker->idToDet(outerHit->geographicalId())->surface().toGlobal(outerHit->localPosition());
77  float outerred_r = sqrt( sqr(ohit.x()-origin().x())+sqr(ohit.y()-origin().y()) );
78  //PixelRecoPointRZ outer(ohit.perp(), ohit.z());
79  PixelRecoPointRZ outer(outerred_r, ohit.z());
80 
81  float zMinOrigin = origin().z() - originZBound();
82  float zMaxOrigin = origin().z() + originZBound();
83 
84  if (!thePrecise) {
85  float vcotMin = (outer.z() > zMaxOrigin) ?
86  (outer.z()-zMaxOrigin)/(outer.r()+originRBound())
87  : (outer.z()-zMaxOrigin)/(outer.r()-originRBound());
88  float vcotMax = (outer.z() > zMinOrigin) ?
89  (outer.z()-zMinOrigin)/(outer.r()-originRBound())
90  : (outer.z()-zMinOrigin)/(outer.r()+originRBound());
91  float cotRight = std::max(vcotMin,theLambdaRange.min());
92  float cotLeft = std::min(vcotMax, theLambdaRange.max());
93  return new HitEtaCheck( isBarrel, outer, cotLeft, cotRight);
94  }
95  float hitZErr = 0.;
96  float hitRErr = 0.;
97 
98  PixelRecoPointRZ outerL, outerR;
99  if (layer->location() == GeomDetEnumerators::barrel) {
100  outerL = PixelRecoPointRZ(outer.r(), outer.z()-hitZErr);
101  outerR = PixelRecoPointRZ(outer.r(), outer.z()+hitZErr);
102  } else if (outer.z() > 0) {
103  outerL = PixelRecoPointRZ(outer.r()+hitRErr, outer.z());
104  outerR = PixelRecoPointRZ(outer.r()-hitRErr, outer.z());
105  } else {
106  outerL = PixelRecoPointRZ(outer.r()-hitRErr, outer.z());
107  outerR = PixelRecoPointRZ(outer.r()+hitRErr, outer.z());
108  }
109  //CHECK
110  MultipleScatteringParametrisation oSigma(layer,iSetup);
111  float cotThetaOuter = theMeanLambda;
112  float sinThetaOuter = 1/std::sqrt(1+sqr(cotThetaOuter));
113  float outerZscatt = 3.f*oSigma(ptMin(),cotThetaOuter) / sinThetaOuter;
114 
115  PixelRecoLineRZ boundL(outerL, theLambdaRange.max());
116  PixelRecoLineRZ boundR(outerR, theLambdaRange.min());
117  float zMinLine = boundL.zAtR(0.)-outerZscatt;
118  float zMaxLine = boundR.zAtR(0.)+outerZscatt;
119  PixelRecoPointRZ vtxL(0.,max(zMinLine, zMinOrigin));
120  PixelRecoPointRZ vtxR(0.,min(zMaxLine, zMaxOrigin));
121  PixelRecoPointRZ vtxMean(0.,(vtxL.z()+vtxR.z())*0.5f);
122  //CHECK
123  MultipleScatteringParametrisation iSigma(layer,iSetup);
124  float innerScatt = 3.f * iSigma(ptMin(),vtxMean, outer);
125 
126  SimpleLineRZ leftLine( vtxL, outerL);
127  SimpleLineRZ rightLine( vtxR, outerR);
128 
129  HitRZConstraint rzConstraint(leftLine, rightLine);
130  float cotTheta = std::abs(leftLine.cotLine()+rightLine.cotLine())*0.5f;
131 
132 // float bendR = longitudinalBendingCorrection(outer.r(),ptMin());
133 
134  // std::cout << "RectangularEtaPhiTrackingRegion " << outer.r()<<','<< outer.z() << " " << innerScatt << " " << cotTheta << " " << hitZErr << std::endl;
135 
136  if (isBarrel) {
137  float sinTheta = 1/std::sqrt(1+sqr(cotTheta));
138  float corrZ = innerScatt/sinTheta + hitZErr;
139  return new HitZCheck(rzConstraint, HitZCheck::Margin(corrZ,corrZ));
140  } else {
141  float cosTheta = 1/std::sqrt(1+sqr(1/cotTheta));
142  float corrR = innerScatt/cosTheta + hitRErr;
143  return new HitRCheck( rzConstraint, HitRCheck::Margin(corrR,corrR));
144  }
145 }
146 
147 std::unique_ptr<OuterEstimator>
149 {
150 
151  // det dimensions
152  float halfLength = 0.5f*layer->surface().bounds().length();
153  float halfThickness = 0.5f*layer->surface().bounds().thickness();
154  float z0 = layer->position().z();
155  float radius = layer->specificSurface().radius();
156 
157  // det ranges
158  Range detRWindow (radius-halfThickness, radius+halfThickness);
159  Range detZWindow(z0-halfLength,z0+halfLength);
160 
161  // z prediction, skip if not intersection
162  HitZCheck zPrediction(rzConstraint());
163  Range hitZWindow = zPrediction.range(detRWindow.min()).
164  intersection(detZWindow);
165  if (hitZWindow.empty()) return 0;
166 
167  // phi prediction
168  OuterHitPhiPrediction phiPrediction = phiWindow(iSetup);
169 
170  //
171  // optional corrections for tolerance (mult.scatt, error, bending)
172  //
174  if (thePrecise) {
175  float cotTheta = (hitZWindow.mean()-origin().z()) / radius;
176  float sinTheta = 1/std::sqrt(1+sqr(cotTheta));
177  MultipleScatteringParametrisation msSigma(layer,iSetup);
178  float scatt = 3.f * msSigma(ptMin(), cotTheta);
179  float bendR = longitudinalBendingCorrection(radius,ptMin(),iSetup);
180 
181  float hitErrRPhi = 0.;
182  float hitErrZ = 0.;
183  float corrPhi = (scatt+ hitErrRPhi)/radius;
184  float corrZ = scatt/sinTheta + bendR*std::abs(cotTheta) + hitErrZ;
185 
186  phiPrediction.setTolerance(OuterHitPhiPrediction::Margin(corrPhi,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>(
204  OuterDetCompatibility( layer, phiRange, detRWindow, hitZWindow),
205  OuterHitCompatibility( phiPrediction, zPrediction ),
206  iSetup);
207 }
208 
209 std::unique_ptr<OuterEstimator>
211 {
212 
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 0;
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 cosTheta = cotTheta/std::sqrt(1+sqr(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(cosTheta) + bendR + hitErrR;
242 
243  phiPrediction.setTolerance(OuterHitPhiPrediction::Margin(corrPhi,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>(
261  OuterDetCompatibility( layer, phiRange, hitRWindow, detZWindow),
262  OuterHitCompatibility( phiPrediction, rPrediction),iSetup );
263 }
264 
265 
266 
269 {
270  float 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::Event& ev,
304  const edm::EventSetup& es,
305  const SeedingLayerSetsHits::SeedingLayer& layer) const {
307 
308  //ESTIMATOR
309 
310  const DetLayer * detLayer = layer.detLayer();
311  std::unique_ptr<OuterEstimator> est;
312 
313  bool measurementMethod = false;
314  if(theMeasurementTrackerUsage == UseMeasurementTracker::kAlways) measurementMethod = true;
315  else if(theMeasurementTrackerUsage == UseMeasurementTracker::kForSiStrips &&
316  GeomDetEnumerators::isTrackerStrip(detLayer->subDetector())) measurementMethod = true;
317 
318  if(measurementMethod) {
320  es.get<IdealMagneticFieldRecord>().get(field);
321  const MagneticField * magField = field.product();
322 
323  const GlobalPoint vtx = origin();
324  GlobalVector dir = direction();
325 
327  (!theUseEtaPhi && detLayer->location() == GeomDetEnumerators::barrel)) {
328  const BarrelDetLayer& bl = dynamic_cast<const BarrelDetLayer&>(*detLayer);
329  est = estimator(&bl,es);
331  (!theUseEtaPhi && detLayer->location() == GeomDetEnumerators::endcap)) {
332  const ForwardDetLayer& fl = dynamic_cast<const ForwardDetLayer&>(*detLayer);
333  est = estimator(&fl,es);
334  }
335 
336  EtaPhiMeasurementEstimator etaPhiEstimator ((theEtaRange.second-theEtaRange.first)*0.5f,
337  (thePhiMargin.left()+thePhiMargin.right())*0.5f);
338  MeasurementEstimator * findDetAndHits = &etaPhiEstimator;
339  if (est){
340  LogDebug("RectangularEtaPhiTrackingRegion")<<"use pixel specific estimator.";
341  findDetAndHits = est.get();
342  }
343  else{
344  LogDebug("RectangularEtaPhiTrackingRegion")<<"use generic etat phi estimator.";
345  }
346 
347  // TSOS
348  float phi = phiDirection();
349  // std::cout << "dir " << direction().x()/direction().perp() <<','<< direction().y()/direction().perp() << " " << sin(phi) <<','<<cos(phi)<< std::endl;
350  Surface::RotationType rot( sin(phi), -cos(phi), 0,
351  0, 0, -1,
352  cos(phi), sin(phi), 0);
353 
354  Plane::PlanePointer surface = Plane::build(GlobalPoint(0.,0.,0.), rot);
355  //TrajectoryStateOnSurface tsos(lpar, *surface, magField);
356 
357  FreeTrajectoryState fts( GlobalTrajectoryParameters(vtx, dir, 1, magField) );
358  TrajectoryStateOnSurface tsos(fts, *surface);
359 
360  // propagator
361  StraightLinePropagator prop( magField, alongMomentum);
362 
363  LayerMeasurements lm(theMeasurementTracker->measurementTracker(), *theMeasurementTracker);
364 
366  lm.recHits(hits,*detLayer, tsos, prop, *findDetAndHits);
367  /*
368  { // old code
369  vector<TrajectoryMeasurement> meas = lm.measurements(*detLayer, tsos, prop, *findDetAndHits);
370  auto n=0UL;
371  for (auto const & im : meas)
372  if(im.recHit()->isValid()) ++n;
373  assert(n==hits.size());
374  // std::cout << "old/new " << n <<'/'<<hits.size() << std::endl;
375  }
376  */
377 
378  result.reserve(hits.size());
379  for (auto h : hits) {
380  cache.emplace_back(h);
381  result.emplace_back(h);
382  }
383 
384  LogDebug("RectangularEtaPhiTrackingRegion")<<" found "<< hits.size()<<" minus one measurements on layer: "<<detLayer->subDetector();
385  // std::cout << "RectangularEtaPhiTrackingRegion" <<" found "<< meas.size()<<" minus one measurements on layer: "<<detLayer->subDetector() << std::endl;
386 
387  } else {
388  //
389  // temporary solution
390  //
391  if (detLayer->location() == GeomDetEnumerators::barrel) {
392  const BarrelDetLayer& bl = dynamic_cast<const BarrelDetLayer&>(*detLayer);
393  est = estimator(&bl,es);
394  } else {
395  const ForwardDetLayer& fl = dynamic_cast<const ForwardDetLayer&>(*detLayer);
396  est = estimator(&fl,es);
397  }
398  if (!est) return result;
399 
400  auto layerHits = layer.hits();
401  result.reserve(layerHits.size());
402  for (auto && ih : layerHits) {
403  if ( est->hitCompatibility()(*ih) ) {
404  result.emplace_back( std::move(ih) );
405  }
406  }
407  }
408 
409  // std::cout << "RectangularEtaPhiTrackingRegion hits " << result.size() << std::endl;
410 
411  return result;
412 }
413 
415  std::ostringstream str;
416  str << TrackingRegionBase::print()
417  <<" eta: "<<theEtaRange<<" phi:"<<thePhiMargin
418  << "precise: "<<thePrecise;
419  return str.str();
420 }
421 
#define LogDebug(id)
float cotLine() const
virtual float length() const =0
std::unique_ptr< OuterEstimator > estimator(const BarrelDetLayer *layer, const edm::EventSetup &iSetup) const
common ppss p3p6s2 common epss epspn46 common const1 w2
Definition: inclppp.h:1
T max() const
virtual Location location() const =0
Which part of the detector (barrel, endcap)
std::vector< BaseTrackerRecHit * > SimpleHitContainer
virtual const BoundSurface & surface() const
The surface of the GeometricSearchDet.
bool isBarrel(GeomDetEnumerators::SubDetector m)
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
T y() const
Definition: PV3DBase.h:63
virtual SubDetector subDetector() const =0
The type of detector (PixelBarrel, PixelEndcap, TIB, TOB, TID, TEC, CSC, DT, RPCBarrel, RPCEndcap)
const Bounds & bounds() const
Definition: Surface.h:128
bool ev
bool empty() const
static UseMeasurementTracker stringToUseMeasurementTracker(const std::string &name)
HitRZCompatibility * checkRZOld(const DetLayer *layer, const TrackingRecHit *outerHit, const edm::EventSetup &iSetup) const
T min() const
virtual float thickness() const =0
float zAtR(float r) const
bool isTrackerStrip(const GeomDetEnumerators::SubDetector m)
bool recHits(SimpleHitContainer &result, const DetLayer &layer, const TrajectoryStateOnSurface &startingState, const Propagator &prop, const MeasurementEstimator &est) const
void initEtaRange(const GlobalVector &dir, const Margin &margin)
T curvature(T InversePt, const edm::EventSetup &iSetup)
virtual TrackingRegion::Hits hits(const edm::Event &ev, const edm::EventSetup &es, const SeedingLayerSetsHits::SeedingLayer &layer) const override
get hits from layer compatible with region constraints
T sqrt(T t)
Definition: SSEVec.h:48
T z() const
Definition: PV3DBase.h:64
tuple result
Definition: query.py:137
virtual const BoundDisk & specificSurface() const
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
def move
Definition: eostools.py:510
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]
The Signals That Services Can Subscribe To This is based on ActivityRegistry h
Helper function to determine trigger accepts.
Definition: Activities.doc:4
T min(T a, T b)
Definition: MathUtil.h:58
bool isEndcap(GeomDetEnumerators::SubDetector m)
OuterHitPhiPrediction phiWindow(const edm::EventSetup &iSetup) const
SimpleLineRZ::Point Point
PixelRecoRange< float > Range
SeedingLayerSetsHits::Hits Hits
float z() const
virtual const BoundSurface & surface() const
GeometricSearchDet interface.
double longitudinalBendingCorrection(double radius, double pt, const edm::EventSetup &iSetup)
T mean() const
virtual const Surface::PositionType & position() const
Returns position of the surface.
const T & get() const
Definition: EventSetup.h:56
T const * product() const
Definition: ESHandle.h:86
virtual const BoundCylinder & specificSurface() const
Extension of the interface.
const DetLayer * detLayer() const
virtual std::string print() const
bool isTrackerPixel(const GeomDetEnumerators::SubDetector m)
Geom::Phi< T > phi() const
T eta() const
Definition: PV3DBase.h:76
std::vector< std::vector< double > > tmp
Definition: MVATrainer.cc:100
PixelRecoRange< T > intersection(const PixelRecoRange< T > &r) const
Square< F >::type sqr(const F &f)
Definition: Square.h:13
void setTolerance(const Margin &tolerance)
DetId geographicalId() const
dbl *** dir
Definition: mlp_gen.cc:35
long double T
T x() const
Definition: PV3DBase.h:62
virtual LocalPoint localPosition() const =0
void setTolerance(const Margin &tolerance)
Definition: HitZCheck.h:28
Range range(const float &radius) const
Definition: HitZCheck.h:35