ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/IPHCalignment2/TrackingTools/PatternTools/src/TransverseImpactPointExtrapolator.cc
Revision: 1.1
Committed: Fri Nov 25 16:38:25 2011 UTC (13 years, 5 months ago) by econte
Content type: text/plain
Branch: MAIN
CVS Tags: TBD2011, TBD_2011, HEAD
Log Message:
new IPHC alignment

File Contents

# Content
1 #include "TrackingTools/PatternTools/interface/TransverseImpactPointExtrapolator.h"
2 #include "TrackingTools/TrajectoryState/interface/TrajectoryStateOnSurface.h"
3 #include "DataFormats/GeometrySurface/interface/Surface.h"
4 #include "boost/intrusive_ptr.hpp"
5 #include "TrackingTools/TrajectoryState/interface/FreeTrajectoryState.h"
6 #include "DataFormats/TrajectorySeed/interface/PropagationDirection.h"
7 #include "TrackingTools/GeomPropagators/interface/AnalyticalPropagator.h"
8 #include "DataFormats/GeometryVector/interface/Point2DBase.h"
9 #include "DataFormats/GeometryVector/interface/Vector2DBase.h"
10 #include "DataFormats/GeometrySurface/interface/PlaneBuilder.h"
11
12 #include "FWCore/MessageLogger/interface/MessageLogger.h"
13
14
15 TransverseImpactPointExtrapolator::TransverseImpactPointExtrapolator () :
16 thePropagator(0) {}
17
18
19 TransverseImpactPointExtrapolator::TransverseImpactPointExtrapolator (const MagneticField* field) :
20 thePropagator(new AnalyticalPropagator(field, anyDirection)) {}
21
22 TransverseImpactPointExtrapolator::TransverseImpactPointExtrapolator (const Propagator& u) :
23 thePropagator(u.clone())
24 {
25 thePropagator->setPropagationDirection(anyDirection);
26 }
27
28 TrajectoryStateOnSurface
29 TransverseImpactPointExtrapolator::extrapolate (const FreeTrajectoryState& fts,
30 const GlobalPoint& vtx) const
31 {
32 return doExtrapolation(fts, vtx, *thePropagator);
33 }
34
35 TrajectoryStateOnSurface
36 TransverseImpactPointExtrapolator::extrapolate (const TrajectoryStateOnSurface tsos,
37 const GlobalPoint& vtx) const
38 {
39 if ( !tsos.isValid() ) return tsos;
40 return doExtrapolation(tsos, vtx, *thePropagator);
41 }
42
43 TrajectoryStateOnSurface
44 TransverseImpactPointExtrapolator::extrapolate (const FreeTrajectoryState& fts,
45 const GlobalPoint& vtx,
46 const Propagator& p) const
47 {
48 //
49 // set propagator for bidirectional propagation
50 //
51 SetPropagationDirection setter(p,anyDirection);
52 return doExtrapolation(fts,vtx,p);
53 }
54
55 TrajectoryStateOnSurface
56 TransverseImpactPointExtrapolator::extrapolate (const TrajectoryStateOnSurface tsos,
57 const GlobalPoint& vtx,
58 const Propagator& p) const
59 {
60 if ( !tsos.isValid() ) return tsos;
61 //
62 // set propagator for bidirectional propagation
63 //
64 SetPropagationDirection setter(p,anyDirection);
65 return doExtrapolation(tsos,vtx,p);
66 }
67
68 TrajectoryStateOnSurface
69 TransverseImpactPointExtrapolator::doExtrapolation (const TrajectoryStateOnSurface tsos,
70 const GlobalPoint& vtx,
71 const Propagator& p) const
72 {
73 //
74 // Compute tip surface
75 //
76 if (fabs(tsos.freeState()->transverseCurvature())<1.E-6){
77 LogDebug("TransverseImpactPointExtrapolator")<< "negligeable curvature: using a trick to extrapolate:\n"<<tsos;
78
79 //0T field probably
80 //x is perpendicular to the momentum
81 GlobalVector xLocal = GlobalVector(-tsos.globalMomentum().y(),tsos.globalMomentum().x(),0).unit();
82 //y along global Z
83 GlobalVector yLocal(0.,0.,1.);
84 //z accordingly
85 GlobalVector zLocal(xLocal.cross(yLocal));
86
87 Surface::PositionType origin(vtx);
88 Surface::RotationType rotation(xLocal,yLocal,zLocal);
89 ReferenceCountingPointer<BoundPlane> surface = PlaneBuilder().plane(origin,rotation);
90
91 return p.propagate(*tsos.freeState(),*surface);
92 }else{
93 ReferenceCountingPointer<BoundPlane> surface =
94 tipSurface(tsos.globalPosition(),tsos.globalMomentum(),
95 1./tsos.transverseCurvature(),vtx);
96 //
97 // propagate
98 //
99 return p.propagate(tsos,*surface);
100 }
101 }
102
103 TrajectoryStateOnSurface
104 TransverseImpactPointExtrapolator::doExtrapolation (const FreeTrajectoryState& fts,
105 const GlobalPoint& vtx,
106 const Propagator& p) const
107 {
108 //
109 // Compute tip surface
110 //
111 if (fabs(fts.transverseCurvature())<1.E-6){
112 LogDebug("TransverseImpactPointExtrapolator")<< "negligeable curvature: using a trick to extrapolate:\n"<<fts;
113
114 //0T field probably
115 //x is perpendicular to the momentum
116 GlobalVector xLocal = GlobalVector(-fts.momentum().y(),fts.momentum().x(),0).unit();
117 //y along global Z
118 GlobalVector yLocal(0.,0.,1.);
119 //z accordingly
120 GlobalVector zLocal(xLocal.cross(yLocal));
121
122 Surface::PositionType origin(vtx);
123 Surface::RotationType rotation(xLocal,yLocal,zLocal);
124 ReferenceCountingPointer<BoundPlane> surface = PlaneBuilder().plane(origin,rotation);
125
126 return p.propagate(fts,*surface);
127 }else{
128 ReferenceCountingPointer<BoundPlane> surface =
129 tipSurface(fts.position(),fts.momentum(),
130 1./fts.transverseCurvature(),vtx);
131 //
132 // propagate
133 //
134 return p.propagate(fts,*surface);
135 }
136 }
137
138 ReferenceCountingPointer<BoundPlane>
139 TransverseImpactPointExtrapolator::tipSurface (const GlobalPoint& position,
140 const GlobalVector& momentum,
141 const double& signedTransverseRadius,
142 const GlobalPoint& vertex) const
143 {
144
145 LogDebug("TransverseImpactPointExtrapolator")<< position<<"\n"
146 <<momentum<<"\n"
147 <<"signedTransverseRadius : "<<signedTransverseRadius<<"\n"
148 <<vertex;
149
150 typedef Point2DBase<double,GlobalTag> PositionType2D;
151 typedef Vector2DBase<double,GlobalTag> DirectionType2D;
152
153 PositionType2D x0(position.x(),position.y());
154 DirectionType2D t0(-momentum.y(),momentum.x());
155 t0 = t0/t0.mag();
156
157 PositionType2D xc(x0+signedTransverseRadius*t0);
158
159 DirectionType2D vtxDirection(xc.x()-vertex.x(),xc.y()-vertex.y());
160 double vtxDistance = vtxDirection.mag();
161
162 Surface::PositionType origin(vertex);
163 GlobalVector xLocal(vtxDirection.x()/vtxDistance,
164 vtxDirection.y()/vtxDistance,
165 0.);
166 if ( vtxDistance<fabs(signedTransverseRadius) ) {
167 LogDebug("TransverseImpactPointExtrapolator")<<"Inverting the x axis.";
168 xLocal = -xLocal;
169 }
170 GlobalVector yLocal(0.,0.,1.);
171 GlobalVector zLocal(xLocal.cross(yLocal));
172 if ( zLocal.dot(momentum)<0. ) {
173 LogDebug("TransverseImpactPointExtrapolator")<<"Inverting the y,z frame.";
174 yLocal = -yLocal;
175 zLocal = -zLocal;
176 }
177 Surface::RotationType rotation(xLocal,yLocal,zLocal);
178
179 LogDebug("TransverseImpactPointExtrapolator")<<"plane center: "<<origin<<"\n"
180 <<"plane rotation axis:\n"
181 <<xLocal<<"\n"
182 <<yLocal<<"\n"
183 <<zLocal<<"\n"
184 <<"x0: "<<x0<<"\n"
185 <<"t0: "<<t0<<"\n"
186 <<"xc: "<<xc<<"\n"
187 <<"vtxDirection: "<<vtxDirection;
188
189 return PlaneBuilder().plane(origin,rotation);
190 }