test
CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
TrackFitter.cc
Go to the documentation of this file.
3 
8 
12 
17 
22 
25 
28 
30 
34 
35 using namespace std;
37 
38 
39 namespace {
40 int getCharge
41  (const DynArray<GlobalPoint> & points)
42 {
43  GlobalVector v21 = points[1]-points[0];
44  GlobalVector v32 = points[2]-points[1];
45  float dphi = v32.phi() - v21.phi();
46  while (dphi > M_PI) dphi -= 2*M_PI;
47  while (dphi < -M_PI) dphi += 2*M_PI;
48  return (dphi > 0) ? -1 : 1;
49 }
50 
51 
52 
53 }
54 
55 
56 /*****************************************************************************/
59  theConfig(cfg), theTracker(0), theField(0), theTTRecHitBuilder(0)
60 {
61 }
62 
63 /*****************************************************************************/
65  (const edm::EventSetup& es,
66  const std::vector<const TrackingRecHit *> & hits,
67  const TrackingRegion & region) const
68 {
69  int nhits = hits.size();
70  if(nhits <2) return 0;
71 
72  declareDynArray(GlobalPoint,nhits, points);
74  declareDynArray(bool,nhits, isBarrel);
75 
76  if (!theField || !theTracker || !theTTRecHitBuilder)
77  {
79  es.get<TrackerDigiGeometryRecord>().get(trackerESH);
80  theTracker = trackerESH.product();
81 
83  es.get<IdealMagneticFieldRecord>().get(fieldESH);
84  theField = fieldESH.product();
85 
87  std::string builderName = theConfig.getParameter<std::string>("TTRHBuilder");
88  es.get<TransientRecHitRecord>().get(builderName,ttrhbESH);
89  theTTRecHitBuilder = ttrhbESH.product();
90  }
91 
92  unsigned int i=0;
93  for (auto const & ih : hits)
94  {
95  auto recHit = theTTRecHitBuilder->build(ih);
96 
97  points[i] = recHit->globalPosition();
98  errors[i] = recHit->globalPositionError();
99  isBarrel[++i] = recHit->detUnit()->type().isBarrel();
100  }
101 
102  CircleFromThreePoints circle = (nhits==2) ?
103  CircleFromThreePoints(GlobalPoint(0.,0.,0.), points[0], points[1]) :
104  CircleFromThreePoints(points[0],points[1],points[2]);
105 
106  int charge = getCharge(points);
107  float curvature = circle.curvature();
108 
109  // pt
110  float invPt = PixelRecoUtilities::inversePt(curvature, es);
111  float valPt = (invPt > 1.e-4) ? 1./invPt : 1.e4;
112  float errPt = 0.055*valPt + 0.017*valPt*valPt;
113 
114  CircleFromThreePoints::Vector2D center = circle.center();
115 
116  // tip
117  float valTip = charge * (center.mag()-1/curvature);
118  // zip
119  float valZip = getZip(valTip, curvature, points[0],points[1]);
120  // phi
121  float valPhi = getPhi(center.x(), center.y(), charge);
122  // cot(theta), update zip
123  float valCotTheta =
124  getCotThetaAndUpdateZip(points[0],points[1], 1/curvature,
125  valPhi,valTip,valZip);
126 
127  // errors
128  float errTip, errZip;
129  getErrTipAndErrZip(valPt, points.back().eta(), errTip,errZip);
130  float errPhi = 0.002;
131  float errCotTheta = 0.002;
132 
133  float chi2 = 0;
134  if(nhits > 2)
135  {
136  RZLine rzLine(points,errors,isBarrel);
137  float cotTheta, intercept, covss, covii, covsi;
138  rzLine.fit(cotTheta, intercept, covss, covii, covsi);
139  chi2 = rzLine.chi2(cotTheta, intercept);
140  //FIXME: check which intercept to use!
141  }
142 
143  // build pixel track
144  PixelTrackBuilder builder;
145 
146  Measurement1D pt (valPt, errPt);
147  Measurement1D phi (valPhi, errPhi);
148  Measurement1D cotTheta(valCotTheta, errCotTheta);
149  Measurement1D tip (valTip, errTip);
150  Measurement1D zip (valZip, errZip);
151 
152  return builder.build(pt, phi, cotTheta, tip, zip, chi2,
153  charge, hits, theField);
154 }
155 
156 
157 /*****************************************************************************/
160  float radius, float phi, float d0, float& zip) const
161 {
162  float chi = phi - M_PI_2;
163  GlobalPoint IP(d0*cos(chi), d0*sin(chi),zip);
164 
165  float phi1 = 2*asin(0.5*(inner - IP).perp()/radius);
166  float phi2 = 2*asin(0.5*(outer - IP).perp()/radius);
167 
168  float dr = radius*(phi2 - phi1);
169  float dz = outer.z()-inner.z();
170 
171  // Recalculate ZIP
172  zip = (inner.z()*phi2 - outer.z()*phi1)/(phi2 - phi1);
173 
174  return (fabs(dr) > 1.e-3) ? dz/dr : 0;
175 }
176 
177 /*****************************************************************************/
179  (float xC, float yC, int charge) const
180 {
181  float phiC;
182 
183  if (charge>0) phiC = atan2(xC,-yC);
184  else phiC = atan2(-xC,yC);
185 
186  return phiC;
187 }
188 
189 /*****************************************************************************/
191  (float d0, float curv,
192  const GlobalPoint& inner, const GlobalPoint& outer) const
193 {
194  // phi = asin(r*rho/2) with asin(x) ~= x+x**3/(2*3)
195  float rho3 = curv*curv*curv;
196 
197  float r1 = inner.perp();
198  double phi1 = r1*curv/2 + inner.perp2()*r1*rho3/48.;
199 
200  float r2 = outer.perp();
201  double phi2 = r2*curv/2 + outer.perp2()*r2*rho3/48.;
202 
203  double z1 = inner.z();
204  double z2 = outer.z();
205 
206  return z1 - phi1/(phi1-phi2)*(z1-z2);
207 }
208 
209 /*****************************************************************************/
211  (float pt, float eta, float & errTip, float & errZip) const
212 {
213  float coshEta = cosh(eta);
214 
215  { // transverse
216  float c_ms = 0.0115; //0.0115;
217  float s_le = 0.0095; //0.0123;
218  float s_ms2 = c_ms*c_ms / (pt*pt) * coshEta;
219 
220  errTip = sqrt(s_le*s_le + s_ms2 );
221  }
222 
223  { // z
224  float c_ms = 0.0070;
225  float s_le = 0.0135;
226 
227  errZip = sqrt( (s_le*s_le + c_ms*c_ms/(pt*pt)) * coshEta*coshEta*coshEta);
228  }
229 }
230 
int i
Definition: DBlmapReader.cc:9
tuple cfg
Definition: looper.py:293
T perp() const
Definition: PV3DBase.h:72
bool isBarrel(GeomDetEnumerators::SubDetector m)
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
Geom::Phi< T > phi() const
Definition: PV3DBase.h:69
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
#define M_PI_2
void getErrTipAndErrZip(float pt, float eta, float &errZip, float &errTip) const
Definition: TrackFitter.cc:211
T mag() const
The vector magnitude. Equivalent to sqrt(vec.mag2())
T perp2() const
Definition: PV3DBase.h:71
T inversePt(T curvature, const edm::EventSetup &iSetup)
float getZip(float d0, float curv, const GlobalPoint &inner, const GlobalPoint &outer) const
Definition: TrackFitter.cc:191
T curvature(T InversePt, const edm::EventSetup &iSetup)
OutputIterator zip(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp)
T sqrt(T t)
Definition: SSEVec.h:18
T z() const
Definition: PV3DBase.h:64
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
reco::Track * build(const Measurement1D &pt, const Measurement1D &phi, const Measurement1D &cotTheta, const Measurement1D &tip, const Measurement1D &zip, float chi2, int charge, const std::vector< const TrackingRecHit * > &hits, const MagneticField *mf, const GlobalPoint &reference=GlobalPoint(0, 0, 0)) const
tuple IP
Definition: listHistos.py:76
float getCotThetaAndUpdateZip(const GlobalPoint &inner, const GlobalPoint &outer, float radius, float phi, float d0, float &zip) const
Definition: TrackFitter.cc:159
int getCharge(int phi1, int phi2, int phi3, int phi4, int mode)
T y() const
Cartesian y coordinate.
#define M_PI
Definition: RZLine.h:9
const T & get() const
Definition: EventSetup.h:56
T const * product() const
Definition: ESHandle.h:86
Geom::Phi< T > phi() const
T perp() const
Magnitude of transverse component.
void fit(float &cotTheta, float &intercept, float &covss, float &covii, float &covsi) const
Definition: RZLine.cc:44
TrackFitter(const edm::ParameterSet &cfg)
Definition: TrackFitter.cc:58
#define declareDynArray(T, n, x)
Definition: DynArray.h:58
float chi2(float cotTheta, float intercept) const
Definition: RZLine.cc:50
float getPhi(float xC, float yC, int charge) const
Definition: TrackFitter.cc:179
T x() const
Cartesian x coordinate.
virtual reco::Track * run(const edm::EventSetup &es, const std::vector< const TrackingRecHit * > &hits, const TrackingRegion &region) const
Definition: TrackFitter.cc:65