8 const double primaryMass,
9 const double secondaryMass )
const
11 GlobalPoint linPoint = tracks[0]->linearizationPoint();
18 secondaryMomentum1[0] = firstMomentum.
x();
19 secondaryMomentum1[1] = firstMomentum.
y();
20 secondaryMomentum1[2] = firstMomentum.
z();
23 secondaryMomentum2[0] = secondMomentum.
x();
24 secondaryMomentum2[1] = secondMomentum.
y();
25 secondaryMomentum2[2] = secondMomentum.
z();
27 AlgebraicVector primaryMomentum = secondaryMomentum1 + secondaryMomentum2;
33 double p = primaryMomentum.norm();
34 double pSquared = p*
p;
35 double gamma =
sqrt( pSquared + primaryMass*primaryMass )/primaryMass;
36 double betaGamma = p/primaryMass;
38 lorentzTransformation[0][0] = gamma;
39 lorentzTransformation[3][3] = gamma;
40 lorentzTransformation[0][3] = -betaGamma;
42 double p1 = secondaryMomentum1.norm();
44 boostedLorentzMomentum1[0] =
sqrt( p1*p1 + secondaryMass*secondaryMass );
45 boostedLorentzMomentum1.sub( 2, invRotMat*secondaryMomentum1 );
47 AlgebraicVector restFrameLorentzMomentum1 = lorentzTransformation*boostedLorentzMomentum1;
48 AlgebraicVector restFrameMomentum1 = restFrameLorentzMomentum1.sub( 2, 4 );
49 double perp1 =
sqrt( restFrameMomentum1[0]*restFrameMomentum1[0] + restFrameMomentum1[1]*restFrameMomentum1[1] );
50 double theta1 = atan2( perp1, restFrameMomentum1[2] );
51 double phi1 = atan2( restFrameMomentum1[1], restFrameMomentum1[0] );
53 double p2 = secondaryMomentum2.norm();
55 boostedLorentzMomentum2[0] =
sqrt( p2*p2 + secondaryMass*secondaryMass );
56 boostedLorentzMomentum2.sub( 2, invRotMat*secondaryMomentum2 );
58 AlgebraicVector restFrameLorentzMomentum2 = lorentzTransformation*boostedLorentzMomentum2;
59 AlgebraicVector restFrameMomentum2 = restFrameLorentzMomentum2.sub( 2, 4 );
60 double perp2 =
sqrt( restFrameMomentum2[0]*restFrameMomentum2[0] + restFrameMomentum2[1]*restFrameMomentum2[1] );
61 double theta2 = atan2( perp2, restFrameMomentum2[2] );
62 double phi2 = atan2( restFrameMomentum2[1], restFrameMomentum2[0] );
64 double pi = 3.141592654;
67 if ( phi1 < 0 ) phi1 += 2*
pi;
68 if ( phi2 < 0 ) phi2 += 2*
pi;
69 if ( phi1 > phi2 ) relSign = 1.;
71 double momentumSquared1 = secondaryMomentum1.normsq();
72 double energy1 =
sqrt( secondaryMass*secondaryMass + momentumSquared1 );
73 double momentumSquared2 = secondaryMomentum2.normsq();
74 double energy2 =
sqrt( secondaryMass*secondaryMass + momentumSquared2 );
75 double sumMomentaSquared = ( secondaryMomentum1 + secondaryMomentum2 ).normsq();
76 double sumEnergiesSquared = ( energy1 + energy2 )*( energy1 + energy2 );
77 double estimatedPrimaryMass =
sqrt( sumEnergiesSquared - sumMomentaSquared );
virtual const TwoBodyDecayParameters getLinearizationPoint(const std::vector< RefCountedLinearizedTrackState > &tracks, const double primaryMass, const double secondaryMass) const
AlgebraicMatrix rotationMatrix(double px, double py, double pz)
CLHEP::HepMatrix AlgebraicMatrix
const TrajectoryStateClosestToPoint & predictedState() const
CLHEP::HepVector AlgebraicVector
T perp2() const
Squared magnitude of transverse component.
CLHEP::HepSymMatrix AlgebraicSymMatrix
GlobalVector momentum() const