24 double m0 = mother.m();
25 double m1 = daughter1.m();
26 double m2 = daughter2.m();
27 double m3 = daughter3.m();
28 double sumM2 = m0 * m0 + m1 * m1 +
m2 *
m2 + m3 * m3;
33 if (m0 < m1 +
m2 + m3) {
34 std::cout <<
"Error: Daughters too heavy!" << std::endl;
35 std::cout <<
"M: " << m0 / GeV <<
" < m1+m2+m3: " << m1 / GeV +
m2 / GeV + m3 / GeV << std::endl;
38 double m2_12max =
sqr(m0 - m3);
39 double m2_12min =
sqr(m1 +
m2);
40 double m2_23max =
sqr(m0 - m1);
41 double m2_23min =
sqr(
m2 + m3);
47 double m2_23max_12, m2_23min_12;
52 m2_12 = m2_12min +
x1 * (m2_12max - m2_12min);
54 m2_23 = m2_23min +
x2 * (m2_23max - m2_23min);
58 E2_12 = (m2_12 - m1 * m1 +
m2 *
m2) / (2.0 *
sqrt(m2_12));
59 E3_12 = (m0 * m0 - m2_12 - m3 * m3) / (2.0 *
sqrt(m2_12));
62 }
while ((m2_23 > m2_23max_12) || (m2_23 < m2_23min_12));
65 double m2_13 = sumM2 - m2_12 - m2_23;
68 double e1 = (m0 * m0 + m1 * m1 - m2_23) / (2.0 * m0);
69 double e2 = (m0 * m0 +
m2 *
m2 - m2_13) / (2.0 * m0);
70 double e3 = (m0 * m0 + m3 * m3 - m2_12) / (2.0 * m0);
76 double cos12 = (m1 * m1 +
m2 *
m2 + 2.0 *
e1 * e2 - m2_12) / (2.0 *
p1 *
p2);
77 double cos13 = (m1 * m1 + m3 * m3 + 2.0 *
e1 *
e3 - m2_13) / (2.0 *
p1 *
p3);
78 double cos23 = (
m2 *
m2 + m3 * m3 + 2.0 * e2 *
e3 - m2_23) / (2.0 *
p2 *
p3);
79 if (fabs(cos12) > 1.0)
80 std::cout <<
"Error: Undefined angle12!" << std::endl;
81 if (fabs(cos13) > 1.0)
82 std::cout <<
"Error: Undefined angle13!" << std::endl;
83 if (fabs(cos23) > 1.0)
84 std::cout <<
"Error: Undefined angle23!" << std::endl;
87 double xi = 2.0 *
pi * G4UniformRand();
93 double theta = acos(2.0 * G4UniformRand() - 1.0);
94 double phi = 2.0 *
pi * G4UniformRand();
95 double psi = 2.0 *
pi * G4UniformRand();
98 ROOT::Math::Rotation3D
rot(ang);
108 ROOT::Math::Boost cmboost(mmm.BoostToCM());
111 if (acos(cos12) + acos(cos13) + acos(cos23) - 2.0 *
pi >
tolerance)
112 std::cout <<
"Error: Total angle not 2pi! " << acos(cos12) + acos(cos13) + acos(cos23) - 2.0 *
pi << std::endl;
113 if (fabs(daughter1_orig.px() + daughter2_orig.px() + daughter3_orig.px()) / GeV >
tolerance)
114 std::cout <<
"Error: Total 3B Px not conserved! " 115 << (daughter1_orig.px() + daughter2_orig.px() + daughter3_orig.px()) / GeV << std::endl;
116 if (fabs(daughter1_orig.py() + daughter2_orig.py() + daughter3_orig.py()) / GeV >
tolerance)
117 std::cout <<
"Error: Total 3B Py not conserved! " 118 << (daughter1_orig.py() + daughter2_orig.py() + daughter3_orig.py()) / GeV << std::endl;
119 if (fabs(daughter1_orig.pz() + daughter2_orig.pz() + daughter3_orig.pz()) / GeV >
tolerance)
120 std::cout <<
"Error: Total 3B Pz not conserved! " << (daughter1.pz() + daughter2.pz() + daughter3.pz()) / GeV
129 daughter1.setPx(temp1.Px());
130 daughter1.setPy(temp1.Py());
131 daughter1.setPz(temp1.Pz());
132 daughter1.setE(temp1.e());
134 daughter2.setPx(temp2.Px());
135 daughter2.setPy(temp2.Py());
136 daughter2.setPz(temp2.Pz());
137 daughter2.setE(temp2.e());
139 daughter3.setPx(temp3.Px());
140 daughter3.setPy(temp3.Py());
141 daughter3.setPz(temp3.Pz());
142 daughter3.setE(temp3.e());
ROOT::Math::LorentzVector< ROOT::Math::PxPyPzE4D< double > > XYZTLorentzVectorD
Lorentz vector with cylindrical internal representation using pseudorapidity.
Sin< T >::type sin(const T &t)
std::map< std::string, int, std::less< std::string > > psi
ROOT::Math::DisplacementVector3D< ROOT::Math::Cartesian3D< double > > XYZVectorD
spatial vector with cartesian internal representation
Cos< T >::type cos(const T &t)
AlgebraicVector EulerAngles
Geom::Theta< T > theta() const