CMS 3D CMS Logo

TwoTrackMinimumDistanceHelixLine.cc
Go to the documentation of this file.
5 #include <iostream>
6 #include <iomanip>
7 
8 using namespace std;
9 
11 {
12  bool isFirstALine = firstGTP->charge() == 0. || firstGTP->magneticField().inTesla(firstGTP->position()).z() == 0.;
13  bool isSecondALine = secondGTP->charge() == 0. || secondGTP->magneticField().inTesla(secondGTP->position()).z() == 0.;
14  if (isFirstALine && !isSecondALine ) {
15  theL= firstGTP;
16  theH= secondGTP;
17  } else if (!isFirstALine && isSecondALine) {
18  theH= firstGTP;
19  theL= secondGTP;
20  } else {
21  edm::LogWarning ("TwoTrackMinimumDistanceHelixLine")
22  << "Error in track charge: "
23  << "One of the tracks has to be charged, and the other not." << endl
24  << "Track Charges: "<<firstGTP->charge() << " and " <<secondGTP->charge();
25  return true;
26  }
27 
28  Hn = theH->momentum().mag();
29  Ln = theL->momentum().mag();
30 
31  if ( Hn == 0. || Ln == 0. )
32  {
33  edm::LogWarning ("TwoTrackMinimumDistanceHelixLine")
34  << "Momentum of input trajectory is zero.";
35  return true;
36  };
37 
38  GlobalPoint lOrig = theL->position();
39  GlobalPoint hOrig = theH->position();
40  posDiff = GlobalVector((lOrig - hOrig).basicVector());
41  X = posDiff.x();
42  Y = posDiff.y();
43  Z = posDiff.z();
44  theLp = theL->momentum();
45  px = theLp.x(); px2 = px*px;
46  py = theLp.y(); py2 = py*py;
47  pz = theLp.z(); pz2 = pz*pz;
48 
49  const double Bc2kH = theH->magneticField().inTesla(hOrig).z() * 2.99792458e-3;
50 // MagneticField::inInverseGeV ( hOrig ).z();
51 
52  if ( Bc2kH == 0. )
53  {
54  edm::LogWarning ("TwoTrackMinimumDistanceHelixLine")
55  << "Magnetic field at point " << hOrig << " is zero.";
56  return true;
57  };
58 
59  theh= - Hn / (theH->charge() * Bc2kH ) *
60  sqrt( 1 - ( ( (theH->momentum().z()*theH->momentum().z()) / (Hn*Hn) )));
61 
62  thetanlambdaH = - theH->momentum().z() / ( theH->charge() * Bc2kH * theh);
63 
64  thePhiH0 = theH->momentum().phi();
65  thesinPhiH0= sin(thePhiH0);
66  thecosPhiH0= cos(thePhiH0);
67 
68  aa = (X + theh*thesinPhiH0)*(py2 + pz2) - px*(py*Y + pz*Z);
69  bb = (Y - theh*thecosPhiH0)*(px2 + pz2) - py*(px*X + pz*Z);
70  cc = pz*theh*thetanlambdaH;
71  dd = theh* px *py;
72  ee = theh*(px2 - py2);
73  ff = (px2 + py2)*theh*thetanlambdaH*thetanlambdaH;
74 
75  baseFct = thetanlambdaH * (Z*(px2+py2) - pz*(px*X + py*Y));
76  baseDer = - ff;
77  return false;
78 }
79 
81  double & thePhiH, double & fct, double & derivative ) const
82 {
83 
84  double thesinPhiH = sin(thePhiH);
85  double thecosPhiH = cos(thePhiH);
86 
87  // Fonction of which the root is to be found:
88 
89  fct = baseFct;
90  fct -= ff*(thePhiH - thePhiH0);
91  fct += thecosPhiH * aa;
92  fct += thesinPhiH * bb;
93  fct += cc*(thePhiH - thePhiH0)*(px * thecosPhiH + py * thesinPhiH);
94  fct += cc * (px * (thesinPhiH - thesinPhiH0) - py * (thecosPhiH - thecosPhiH0));
95  fct += dd * (thesinPhiH* (thesinPhiH - thesinPhiH0) -
96  thecosPhiH*(thecosPhiH - thecosPhiH0));
97  fct += ee * thecosPhiH * thesinPhiH;
98 
99  // Its derivative:
100 
101  derivative = baseDer;
102  derivative += - thesinPhiH * aa;
103  derivative += thecosPhiH * bb;
104  derivative += cc*(thePhiH - thePhiH0)*(py * thecosPhiH - px * thesinPhiH);
105  derivative += 2* cc*(px * thecosPhiH + py * thesinPhiH);
106  derivative += dd *(4 * thecosPhiH * thesinPhiH - thecosPhiH * thesinPhiH0 -
107  thesinPhiH * thecosPhiH0);
108  derivative += ee * (thecosPhiH*thecosPhiH-thesinPhiH*thesinPhiH);
109 
110  return false;
111 }
112 
114  const GlobalTrajectoryParameters & theFirstGTP,
115  const GlobalTrajectoryParameters & theSecondGTP, const float qual )
116 {
117  pointsUpdated = false;
118  firstGTP = &theFirstGTP;
119  secondGTP = &theSecondGTP;
120 
121  if ( updateCoeffs () )
122  {
123  finalPoints();
124  return true;
125  };
126 
127  double fctVal, derVal, dPhiH;
128  thePhiH = thePhiH0;
129 
130  double x1=thePhiH0-M_PI, x2=thePhiH0+M_PI;
131  for (int j=1; j<=themaxiter; ++j) {
132  oneIteration(thePhiH, fctVal, derVal);
133  dPhiH=fctVal/derVal;
134  thePhiH -= dPhiH;
135  if ((x1-thePhiH)*(thePhiH-x2) < 0.0) {
136  LogDebug ("TwoTrackMinimumDistanceHelixLine")
137  << "Jumped out of brackets in root finding. Will be moved closer.";
138  thePhiH += (dPhiH*0.8);
139  }
140  if (fabs(dPhiH) < qual) {
141  finalPoints();
142  return false;
143  }
144  }
145  LogDebug ("TwoTrackMinimumDistanceHelixLine")
146  <<"Number of steps exceeded. Has not converged.";
147  finalPoints();
148  return true;
149 }
150 
152 {
153  if (firstGTP==theL) return theL->momentum().phi();
154  else return thePhiH;
155 }
156 
158 {
159  if (secondGTP==theL) return theL->momentum().phi();
160  else return thePhiH;
161 }
162 
163 pair <GlobalPoint, GlobalPoint> TwoTrackMinimumDistanceHelixLine::points() const
164 {
165  if (firstGTP==theL)
166  return pair<GlobalPoint, GlobalPoint> (linePoint, helixPoint);
167  else return pair<GlobalPoint, GlobalPoint> (helixPoint, linePoint);
168 }
169 
170 pair <double, double> TwoTrackMinimumDistanceHelixLine::pathLength() const
171 {
172  if (firstGTP==theL)
173  return pair<double, double> (linePath, helixPath);
174  else return pair<double, double> (helixPath, linePath);
175 }
176 
178 {
179  if (pointsUpdated) return;
180  helixPoint = GlobalPoint (
181  theH->position().x() + theh * ( sin ( thePhiH) - thesinPhiH0 ),
182  theH->position().y() + theh * ( - cos ( thePhiH) + thecosPhiH0 ),
183  theH->position().z() + theh * ( thetanlambdaH * ( thePhiH- thePhiH0 ))
184  );
185  helixPath = ( thePhiH- thePhiH0 ) * (theh*sqrt(1+thetanlambdaH*thetanlambdaH)) ;
186 
187  GlobalVector diff((theL->position() -helixPoint).basicVector());
188  tL = ( - diff.dot(theLp)) / (Ln*Ln);
189  linePoint = GlobalPoint (
190  theL->position().x() + tL * px,
191  theL->position().y() + tL * py,
192  theL->position().z() + tL * pz );
193  linePath = tL * theLp.mag();
194  pointsUpdated = true;
195 }
#define LogDebug(id)
Derivative< X, A >::type derivative(const A &_)
Definition: Derivative.h:18
bool oneIteration(double &thePhiH, double &fct, double &derivative) const
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
#define X(str)
Definition: MuonsGrabber.cc:48
T mag() const
Definition: PV3DBase.h:67
T sqrt(T t)
Definition: SSEVec.h:18
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
std::pair< double, double > pathLength() const
#define M_PI
std::pair< GlobalPoint, GlobalPoint > points() const
Definition: DDUnits.h:8
bool calculate(const GlobalTrajectoryParameters &, const GlobalTrajectoryParameters &, const float qual=.0001)
Global3DVector GlobalVector
Definition: GlobalVector.h:10