ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/IPHCalignment2/TrackingTools/PatternTools/src/TSCPBuilderNoMaterial.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/TSCPBuilderNoMaterial.h"
2 #include "DataFormats/GeometrySurface/interface/Surface.h"
3 #include "TrackingTools/TrajectoryState/interface/FreeTrajectoryState.h"
4 #include "TrackingTools/AnalyticalJacobians/interface/AnalyticalCurvilinearJacobian.h"
5 #include "DataFormats/GeometrySurface/interface/BoundPlane.h"
6 #include "TrackingTools/GeomPropagators/interface/HelixBarrelPlaneCrossingByCircle.h"
7 #include "TrackingTools/TrajectoryParametrization/interface/TrajectoryStateExceptions.h"
8 #include "MagneticField/Engine/interface/MagneticField.h"
9 #include "FWCore/MessageLogger/interface/MessageLogger.h"
10
11 TrajectoryStateClosestToPoint
12 TSCPBuilderNoMaterial::operator() (const FTS& originalFTS,
13 const GlobalPoint& referencePoint) const
14 {
15 if (positionEqual(referencePoint, originalFTS.position()))
16 return constructTSCP(originalFTS, referencePoint);
17
18 // Now do the propagation or whatever...
19
20 PairBoolFTS newStatePair =
21 createFTSatTransverseImpactPoint(originalFTS, referencePoint);
22 if (newStatePair.first) {
23 return constructTSCP(newStatePair.second, referencePoint);
24 } else {
25 return TrajectoryStateClosestToPoint();
26 }
27 }
28
29 TrajectoryStateClosestToPoint
30 TSCPBuilderNoMaterial::operator() (const TSOS& originalTSOS,
31 const GlobalPoint& referencePoint) const
32 {
33 if (positionEqual(referencePoint, originalTSOS.globalPosition()))
34 return constructTSCP(*originalTSOS.freeState(), referencePoint);
35
36 // Now do the propagation
37
38 PairBoolFTS newStatePair =
39 createFTSatTransverseImpactPoint(*originalTSOS.freeState(), referencePoint);
40 if (newStatePair.first) {
41 return constructTSCP(newStatePair.second, referencePoint);
42 } else {
43 return TrajectoryStateClosestToPoint();
44 }
45 }
46
47 TSCPBuilderNoMaterial::PairBoolFTS
48 TSCPBuilderNoMaterial::createFTSatTransverseImpactPoint(
49 const FTS& originalFTS, const GlobalPoint& referencePoint) const
50 {
51 //
52 // Straight line approximation? |rho|<1.e-10 equivalent to ~ 1um
53 // difference in transversal position at 10m.
54 //
55 if( fabs(originalFTS.transverseCurvature())<1.e-10 ) {
56 return createFTSatTransverseImpactPointNeutral(originalFTS, referencePoint);
57 } else {
58 return createFTSatTransverseImpactPointCharged(originalFTS, referencePoint);
59 }
60 }
61
62 TSCPBuilderNoMaterial::PairBoolFTS
63 TSCPBuilderNoMaterial::createFTSatTransverseImpactPointCharged(
64 const FTS& originalFTS, const GlobalPoint& referencePoint) const
65 {
66
67 GlobalVector pvecOrig = originalFTS.momentum();
68 GlobalPoint xvecOrig = originalFTS.position();
69 double kappa = originalFTS.transverseCurvature();
70 double pxOrig = pvecOrig.x();
71 double pyOrig = pvecOrig.y();
72 double pzOrig = pvecOrig.z();
73 double xOrig = xvecOrig.x();
74 double yOrig = xvecOrig.y();
75 double zOrig = xvecOrig.z();
76
77 // double fac = 1./originalFTS.charge()/MagneticField::inInverseGeV(referencePoint).z();
78 double fac = 1./originalFTS.charge()/
79 (originalFTS.parameters().magneticField().inInverseGeV(referencePoint).z());
80 GlobalVectorDouble xOrig2Centre = GlobalVectorDouble(fac * pyOrig, -fac * pxOrig, 0.);
81 GlobalVectorDouble xOrigProj = GlobalVectorDouble(xOrig, yOrig, 0.);
82 GlobalVectorDouble xRefProj = GlobalVectorDouble(referencePoint.x(), referencePoint.y(), 0.);
83 GlobalVectorDouble deltax = xRefProj-xOrigProj-xOrig2Centre;
84 GlobalVectorDouble ndeltax = deltax.unit();
85
86 PropagationDirection direction = anyDirection;
87 Surface::PositionType pos(referencePoint);
88 // Need to define plane with orientation as the
89 // ImpactPointSurface
90 GlobalVector X(ndeltax.x(), ndeltax.y(), ndeltax.z());
91 GlobalVector Y(0.,0.,1.);
92 Surface::RotationType rot(X,Y);
93 BoundPlane* plane = new BoundPlane(pos,rot);
94 // Using Teddy's HelixBarrelPlaneCrossingByCircle for general barrel planes.
95 // A large variety of other,
96 // direct solutions turned out to be not so stable numerically.
97 HelixBarrelPlaneCrossingByCircle
98 planeCrossing(HelixPlaneCrossing::PositionType(xOrig, yOrig, zOrig),
99 HelixPlaneCrossing::DirectionType(pxOrig, pyOrig, pzOrig),
100 kappa, direction);
101 std::pair<bool,double> propResult = planeCrossing.pathLength(*plane);
102 if ( !propResult.first ) {
103 edm::LogWarning ("TSCPBuilderNoMaterial") << "Propagation to perigee plane failed!";
104 return PairBoolFTS(false, FreeTrajectoryState() );
105 }
106 double s = propResult.second;
107 HelixPlaneCrossing::PositionType xGen = planeCrossing.position(s);
108 GlobalPoint xPerigee = GlobalPoint(xGen.x(),xGen.y(),xGen.z());
109 // direction (reconverted to GlobalVector, renormalised)
110 HelixPlaneCrossing::DirectionType pGen = planeCrossing.direction(s);
111 pGen *= pvecOrig.mag()/pGen.mag();
112 GlobalVector pPerigee = GlobalVector(pGen.x(),pGen.y(),pGen.z());
113 delete plane;
114
115 if (originalFTS.hasError()) {
116 const AlgebraicSymMatrix55 &errorMatrix = originalFTS.curvilinearError().matrix();
117 AnalyticalCurvilinearJacobian curvilinJacobian(originalFTS.parameters(), xPerigee,
118 pPerigee, s);
119 const AlgebraicMatrix55 &jacobian = curvilinJacobian.jacobian();
120 CurvilinearTrajectoryError cte( ROOT::Math::Similarity(jacobian, errorMatrix) );
121
122 return PairBoolFTS(true,
123 FreeTrajectoryState(GlobalTrajectoryParameters(xPerigee, pPerigee, originalFTS.charge(),
124 &(originalFTS.parameters().magneticField())), cte) );
125 }
126 else {
127 return PairBoolFTS(true,
128 FreeTrajectoryState(GlobalTrajectoryParameters(xPerigee, pPerigee, originalFTS.charge(),
129 &(originalFTS.parameters().magneticField()))) );
130 }
131
132 }
133
134
135 TSCPBuilderNoMaterial::PairBoolFTS
136 TSCPBuilderNoMaterial::createFTSatTransverseImpactPointNeutral(const FTS& originalFTS,
137 const GlobalPoint& referencePoint) const
138 {
139
140 GlobalPoint xvecOrig = originalFTS.position();
141 double phi = originalFTS.momentum().phi();
142 double theta = originalFTS.momentum().theta();
143 double xOrig = xvecOrig.x();
144 double yOrig = xvecOrig.y();
145 double zOrig = xvecOrig.z();
146 double xR = referencePoint.x();
147 double yR = referencePoint.y();
148
149 double s2D = (xR - xOrig) * cos(phi) + (yR - yOrig) * sin(phi);
150 double s = s2D / sin(theta);
151 double xGen = xOrig + s2D*cos(phi);
152 double yGen = yOrig + s2D*sin(phi);
153 double zGen = zOrig + s2D/tan(theta);
154 GlobalPoint xPerigee = GlobalPoint(xGen, yGen, zGen);
155
156 GlobalVector pPerigee = originalFTS.momentum();
157
158 if (originalFTS.hasError()) {
159 const AlgebraicSymMatrix55 &errorMatrix = originalFTS.curvilinearError().matrix();
160 AnalyticalCurvilinearJacobian curvilinJacobian(originalFTS.parameters(), xPerigee,
161 pPerigee, s);
162 const AlgebraicMatrix55 &jacobian = curvilinJacobian.jacobian();
163 CurvilinearTrajectoryError cte( ROOT::Math::Similarity(jacobian, errorMatrix) );
164
165 return PairBoolFTS(true,
166 FreeTrajectoryState(GlobalTrajectoryParameters(xPerigee, pPerigee, originalFTS.charge(),
167 &(originalFTS.parameters().magneticField())), cte));
168 }
169 else {
170 return PairBoolFTS(true,
171 FreeTrajectoryState(GlobalTrajectoryParameters(xPerigee, pPerigee, originalFTS.charge(),
172 &(originalFTS.parameters().magneticField()))) );
173 }
174
175 }