CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
TwoTrackMinimumDistanceHelixHelix.cc
Go to the documentation of this file.
6 
7 using namespace std;
8 
9 namespace {
10  inline GlobalPoint operator - ( const GlobalPoint & a, const GlobalPoint & b ){
11  return GlobalPoint ( a.basicVector() - b.basicVector() );
12  }
13 
14  inline GlobalPoint operator + ( const GlobalPoint & a, const GlobalPoint & b ){
15  return GlobalPoint ( a.basicVector() + b.basicVector() );
16  }
17 
18  inline GlobalPoint operator / ( const GlobalPoint & a, const double b ){
19  return GlobalPoint ( a.basicVector() / b );
20  }
21 
22  inline GlobalPoint operator * ( const GlobalPoint & a, const float b ){
23  return GlobalPoint ( a.basicVector() * b );
24  }
25 
26  inline GlobalPoint operator * ( const float b , const GlobalPoint & a ){
27  return GlobalPoint ( a.basicVector() * b );
28  }
29 
30  inline double square ( const double s ) { return s*s; }
31 }
32 
34 theH(0), theG(0), pointsUpdated(false), themaxjump(20),thesingjacI(1./0.1), themaxiter(4)
35 { }
36 
38 
40  const GlobalPoint & gpH, const GlobalPoint & gpG ) {
41 
42  const double Bc2kH = theH->magneticField().inInverseGeV(gpH).z();
43  const double Bc2kG = theG->magneticField().inInverseGeV(gpG).z();
44  const double Ht= theH->momentum().perp();
45  const double Gt= theG->momentum().perp();
46  // thelambdaH=asin ( theH->momentum().z() / Hn );
47 
48  if ( Ht == 0. || Gt == 0. ) {
49  edm::LogWarning ("TwoTrackMinimumDistanceHelixHelix")
50  << "transverse momentum of input trajectory is zero.";
51  return true;
52  };
53 
54  if ( theH->charge() == 0. || theG->charge() == 0. ) {
55  edm::LogWarning ("TwoTrackMinimumDistanceHelixHelix")
56  << "charge of input track is zero.";
57  return true;
58  };
59 
60  if ( Bc2kG == 0.) {
61  edm::LogWarning ("TwoTrackMinimumDistanceHelixHelix")
62  << "magnetic field at point " << gpG << " is zero.";
63  return true;
64  };
65 
66  if ( Bc2kH == 0. ) {
67  edm::LogWarning ("TwoTrackMinimumDistanceHelixHelix")
68  << "magnetic field at point " << gpH << " is zero.";
69  return true;
70  };
71 
72  theh= Ht / (theH->charge() * Bc2kH );
73  thesinpH0= - theH->momentum().y() / ( Ht );
74  thecospH0= - theH->momentum().x() / ( Ht );
75  thetanlambdaH = - theH->momentum().z() / ( Ht);
76  thepH0 = atan2 ( thesinpH0 , thecospH0 );
77 
78  // thelambdaG=asin ( theG->momentum().z()/( Gn ) );
79 
80  theg= Gt / (theG->charge() * Bc2kG );
81  thesinpG0= - theG->momentum().y() / ( Gt);
82  thecospG0= - theG->momentum().x() / (Gt);
83  thetanlambdaG = - theG->momentum().z() / ( Gt);
84  thepG0 = atan2 ( thesinpG0 , thecospG0 );
85 
86  thea=theH->position().x() - theG->position().x() + theg * thesinpG0 -
87  theh * thesinpH0;
88  theb=theH->position().y() - theG->position().y() - theg * thecospG0 +
89  theh * thecospH0;
92  thed1= -theg * thetanlambdaG * thetanlambdaH;
93  thed2= theh * thetanlambdaG * thetanlambdaH;
94  thee1= thetanlambdaH * ( theH->position().z() - theG->position().z() -
95  theh * thepH0 * thetanlambdaH + theg * thepG0 * thetanlambdaG );
96  thee2= thetanlambdaG * ( theH->position().z() - theG->position().z() -
97  theh * thepH0 * thetanlambdaH + theg * thepG0 * thetanlambdaG );
98  return false;
99 }
100 
101 bool TwoTrackMinimumDistanceHelixHelix::oneIteration(double & dH, double & dG ) const {
102  thesinpH=sin(thepH);
103  thecospH=cos(thepH);
104  thesinpG=sin(thepG);
105  thecospG=cos(thepG);
106 
107  const double A11= theh * ( - thesinpH * ( thea - theg * thesinpG ) +
108  thecospH * ( theb + theg * thecospG ) + thec1);
109  if (A11 < 0) { return true; };
110  const double A22= -theg * (- thesinpG * ( thea + theh * thesinpH ) +
111  thecospG*( theb - theh * thecospH ) + thec2);
112  if (A22 < 0) { return true; };
113  const double A12= theh * (-theg * thecospG * thecospH -
114  theg * thesinpH * thesinpG + thed1);
115  const double A21= -theg * (theh * thecospG * thecospH +
116  theh * thesinpH * thesinpG + thed2);
117  const double detaI = 1./(A11 * A22 - A12 * A21);
118  const double z1=theh * ( thecospH * ( thea - theg * thesinpG ) + thesinpH *
119  ( theb + theg*thecospG ) + thec1 * thepH + thed1 * thepG + thee1);
120  const double z2=-theg * (thecospG * ( thea + theh * thesinpH ) + thesinpG *
121  ( theb - theh*thecospH ) + thec2 * thepG + thed2 * thepH + thee2);
122 
123  dH=( z1 * A22 - z2 * A12 ) * detaI;
124  dG=( z2 * A11 - z1 * A21 ) * detaI;
125  if ( fabs(detaI) > thesingjacI ) { return true; };
126 
127  thepH -= dH;
128  thepG -= dG;
129  return false;
130 }
131 
132 /*
133 bool TwoTrackMinimumDistanceHelixHelix::parallelTracks() const {
134  return (fabs(theH->momentum().x() - theG->momentum().x()) < .00000001 )
135  && (fabs(theH->momentum().y() - theG->momentum().y()) < .00000001 )
136  && (fabs(theH->momentum().z() - theG->momentum().z()) < .00000001 )
137  && (theH->charge()==theG->charge())
138  ;
139 }
140 */
141 
143  const GlobalTrajectoryParameters & G,
144  const GlobalTrajectoryParameters & H, const float qual ) {
145  pointsUpdated = false;
146  theG= &G;
147  theH= &H;
148  bool retval=false;
149 
150  if ( updateCoeffs ( theG->position(), theH->position() ) ) return true;
151 
152  thepG = thepG0;
153  thepH = thepH0;
154 
155  int counter=0;
156  double pH=0; double pG=0;
157  do {
158  retval=oneIteration ( pG, pH );
159  if ( std::isinf(pG) || std::isinf(pH) ) retval=true;
160  if ( counter++>themaxiter ) retval=true;
161  } while ( (!retval) && ( fabs(pG) > qual || fabs(pH) > qual ));
162  if ( fabs ( theg * ( thepG - thepG0 ) ) > themaxjump ) retval=true;
163  if ( fabs ( theh * ( thepH - thepH0 ) ) > themaxjump ) retval=true;
164  return retval;
165 }
166 
167 
169  GlobalVector tmpG( sin(thepG) - thesinpG0,
170  - cos(thepG) + thecospG0,
171  thetanlambdaG * ( thepG- thepG0 )
172  );
173  pointG = theG->position() + theg * tmpG;
175 
176  GlobalVector tmpH( sin(thepH) - thesinpH0,
177  - cos(thepH) + thecospH0,
178  thetanlambdaH * ( thepH- thepH0 )
179  );
180  pointH = theH->position() + theh * tmpH;
182 
183  pointsUpdated = true;
184 }
185 
T perp() const
Definition: PV3DBase.h:72
MatrixMeschach operator+(const MatrixMeschach &mat1, const MatrixMeschach &mat2)
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
MatrixMeschach operator-(const MatrixMeschach &mat1, const MatrixMeschach &mat2)
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
T y() const
Definition: PV3DBase.h:63
Basic3DVector< long double > operator/(const Basic3DVector< long double > &v, S s)
GlobalVector inInverseGeV(const GlobalPoint &gp) const
Field value ad specified global point, in 1/Gev.
Definition: MagneticField.h:39
bool updateCoeffs(const GlobalPoint &, const GlobalPoint &)
T sqrt(T t)
Definition: SSEVec.h:48
T z() const
Definition: PV3DBase.h:64
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
bool calculate(const GlobalTrajectoryParameters &, const GlobalTrajectoryParameters &, const float qual=.001)
double b
Definition: hdecay.h:120
double a
Definition: hdecay.h:121
static std::atomic< unsigned int > counter
double square(const double a)
const MagneticField & magneticField() const
MatrixMeschach operator*(const MatrixMeschach &mat1, const MatrixMeschach &mat2)
volatile std::atomic< bool > shutdown_flag false
T x() const
Definition: PV3DBase.h:62
const BasicVectorType & basicVector() const
Definition: PV3DBase.h:56