CMS 3D CMS Logo

TwoTrackMinimumDistanceLineLine.cc
Go to the documentation of this file.
6 
8  const GlobalTrajectoryParameters& theH) {
9  GlobalPoint gOrig = theG.position();
10  GlobalPoint hOrig = theH.position();
11  bool isLineG = theG.magneticField().inTesla(gOrig).z() == 0 || theG.charge() == 0;
12  bool isLineH = theH.magneticField().inTesla(hOrig).z() == 0 || theH.charge() == 0;
13  if (!(isLineG && isLineH)) {
14  edm::LogWarning("TwoTrackMinimumDistanceLineLine")
15  << "charge of input track is not zero or field non zero"
16  << "\n positions: " << gOrig << " , " << hOrig << "\n Bz fields: " << theG.magneticField().inTesla(gOrig).z()
17  << " , " << theH.magneticField().inTesla(hOrig).z() << "\n charges: " << theG.charge() << " , "
18  << theH.charge();
19  return true;
20  };
21 
22  GlobalVector gVec = theG.momentum();
23  const double gMag = theG.momentum().mag();
24  double gMag2 = gMag * gMag;
25  GlobalVector hVec = theH.momentum();
26  const double hMag = theH.momentum().mag();
27  double hMag2 = hMag * hMag;
28 
29  if (gMag == 0. || hMag == 0.) {
30  edm::LogWarning("TwoTrackMinimumDistanceLineLine") << "momentum of input trajectory is zero.";
31  return true;
32  };
33 
34  phiG = theG.momentum().phi();
35  phiH = theH.momentum().phi();
36 
37  double gVec_Dot_hVec = gVec.dot(hVec);
38  double norm = gVec_Dot_hVec * gVec_Dot_hVec - gMag2 * hMag2;
39 
40  if (norm == 0) {
41  edm::LogWarning("TwoTrackMinimumDistanceLineLine") << "Tracks are parallel.";
42  return true;
43  }
44 
45  GlobalVector posDiff = gOrig - hOrig;
46 
47  double tG = (posDiff.dot(gVec) * hMag2 - gVec_Dot_hVec * posDiff.dot(hVec)) / norm;
48  double tH = (gVec_Dot_hVec * posDiff.dot(gVec) - posDiff.dot(hVec) * gMag2) / norm;
49 
50  gPos = GlobalPoint(gOrig + tG * gVec);
51  hPos = GlobalPoint(hOrig + tH * hVec);
52  // cout << "TwoTrackMinimumDistanceLineLine "<<gPos<<hPos<<endl;
53 
54  pathG = tG * gMag;
55  pathH = tH * hMag;
56  return false;
57 }
58 
59 std::pair<GlobalPoint, GlobalPoint> TwoTrackMinimumDistanceLineLine::points() const {
60  return std::pair<GlobalPoint, GlobalPoint>(gPos, hPos);
61 }
62 
63 std::pair<double, double> TwoTrackMinimumDistanceLineLine::pathLength() const {
64  return std::pair<double, double>(pathG, pathH);
65 }
T z() const
Definition: PV3DBase.h:61
virtual GlobalVector inTesla(const GlobalPoint &gp) const =0
Field value ad specified global point, in Tesla.
PreciseFloatType< T, U >::Type dot(const Vector3DBase< U, FrameTag > &v) const
Definition: Vector3DBase.h:99
Geom::Phi< T > phi() const
Definition: PV3DBase.h:66
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
bool calculate(const GlobalTrajectoryParameters &, const GlobalTrajectoryParameters &)
std::pair< double, double > pathLength() const
std::pair< GlobalPoint, GlobalPoint > points() const
T mag() const
Definition: PV3DBase.h:64
const MagneticField & magneticField() const
Log< level::Warning, false > LogWarning