26 double m0 = mother.m();
27 double m1 = daughter1.m();
28 double m2 = daughter2.m();
29 double m3 = daughter3.m();
35 if (m0 < m1 +
m2 + m3) {
36 std::cout <<
"Error: Daughters too heavy!" << std::endl;
37 std::cout <<
"M: " <<
m0 / GeV <<
" < m1+m2+m3: " <<
m1 / GeV +
m2 / GeV + m3 / GeV << std::endl;
40 double m2_12max =
sqr(m0 - m3);
41 double m2_12min =
sqr(m1 +
m2);
42 double m2_23max =
sqr(m0 - m1);
43 double m2_23min =
sqr(
m2 + m3);
49 double m2_23max_12, m2_23min_12;
54 m2_12 = m2_12min +
x1 * (m2_12max - m2_12min);
56 m2_23 = m2_23min +
x2 * (m2_23max - m2_23min);
60 E2_12 = (m2_12 -
m1 *
m1 +
m2 *
m2) / (2.0 *
sqrt(m2_12));
61 E3_12 = (
m0 *
m0 - m2_12 - m3 * m3) / (2.0 *
sqrt(m2_12));
64 }
while ((m2_23 > m2_23max_12) || (m2_23 < m2_23min_12));
67 double m2_13 = sumM2 - m2_12 - m2_23;
70 double e1 = (
m0 *
m0 +
m1 *
m1 - m2_23) / (2.0 * m0);
71 double e2 = (
m0 *
m0 +
m2 *
m2 - m2_13) / (2.0 * m0);
72 double e3 = (
m0 *
m0 + m3 * m3 - m2_12) / (2.0 * m0);
78 double cos12 = (
m1 *
m1 +
m2 *
m2 + 2.0 *
e1 * e2 - m2_12) / (2.0 *
p1 *
p2);
79 double cos13 = (
m1 *
m1 + m3 * m3 + 2.0 *
e1 *
e3 - m2_13) / (2.0 *
p1 *
p3);
80 double cos23 = (
m2 *
m2 + m3 * m3 + 2.0 * e2 *
e3 - m2_23) / (2.0 *
p2 *
p3);
81 if (fabs(cos12) > 1.0)
82 std::cout <<
"Error: Undefined angle12!" << std::endl;
83 if (fabs(cos13) > 1.0)
84 std::cout <<
"Error: Undefined angle13!" << std::endl;
85 if (fabs(cos23) > 1.0)
86 std::cout <<
"Error: Undefined angle23!" << std::endl;
89 double xi = 2.0 *
pi * G4UniformRand();
95 double theta = acos(2.0 * G4UniformRand() - 1.0);
96 double phi = 2.0 *
pi * G4UniformRand();
97 double psi = 2.0 *
pi * G4UniformRand();
100 ROOT::Math::Rotation3D
rot(ang);
110 ROOT::Math::Boost cmboost(mmm.BoostToCM());
113 if (acos(cos12) + acos(cos13) + acos(cos23) - 2.0 *
pi >
tolerance)
114 std::cout <<
"Error: Total angle not 2pi! " << acos(cos12) + acos(cos13) + acos(cos23) - 2.0 *
pi << std::endl;
115 if (fabs(daughter1_orig.px() + daughter2_orig.px() + daughter3_orig.px()) / GeV >
tolerance)
116 std::cout <<
"Error: Total 3B Px not conserved! " 117 << (daughter1_orig.px() + daughter2_orig.px() + daughter3_orig.px()) / GeV << std::endl;
118 if (fabs(daughter1_orig.py() + daughter2_orig.py() + daughter3_orig.py()) / GeV >
tolerance)
119 std::cout <<
"Error: Total 3B Py not conserved! " 120 << (daughter1_orig.py() + daughter2_orig.py() + daughter3_orig.py()) / GeV << std::endl;
121 if (fabs(daughter1_orig.pz() + daughter2_orig.pz() + daughter3_orig.pz()) / GeV >
tolerance)
122 std::cout <<
"Error: Total 3B Pz not conserved! " << (daughter1.pz() + daughter2.pz() + daughter3.pz()) / GeV
131 daughter1.setPx(temp1.Px());
132 daughter1.setPy(temp1.Py());
133 daughter1.setPz(temp1.Pz());
134 daughter1.setE(temp1.e());
136 daughter2.setPx(temp2.Px());
137 daughter2.setPy(temp2.Py());
138 daughter2.setPz(temp2.Pz());
139 daughter2.setE(temp2.e());
141 daughter3.setPx(temp3.Px());
142 daughter3.setPy(temp3.Py());
143 daughter3.setPz(temp3.Pz());
144 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