From c8080f2587378ee5ebf890e92968c50c32d40519 Mon Sep 17 00:00:00 2001
From: pdigiglio
Date: Tue, 14 Mar 2017 12:16:31 +0100
Subject: [PATCH] [4-mom] Small improvements to 4-momenta calculation
---
src/FourMomenta.cxx | 84 +++++++++++++++++++++------------------------
1 file changed, 40 insertions(+), 44 deletions(-)
diff --git a/src/FourMomenta.cxx b/src/FourMomenta.cxx
index cabb1dc8..ed20815b 100644
--- a/src/FourMomenta.cxx
+++ b/src/FourMomenta.cxx
@@ -224,18 +224,20 @@ std::vector > calculate_four_momenta(double initial_mass, con
double m2_sum_1 = 0;
double m_sum_1 = initial_mass;
for (size_t i = 0; i < n_fsp; ++i) {
- pp[i][i] = pow(FSPs[i]->mass(), 2);
+ const auto m = FSPs[i]->mass();
+
+ pp[i][i] = m * m;
m2_sum_1 += pp[i][i];
- m_sum_1 -= FSPs[i]->mass();
+ m_sum_1 -= m;
}
// add two-particle invariant masses for those provided
double m2_sum_2 = 0;
for (size_t i = 0; i < axes.size(); ++i) {
- if (axes[i]->indices()[0] < axes[i]->indices()[1])
- pp[axes[i]->indices()[0]][axes[i]->indices()[1]] = squared_masses[i];
- else
- pp[axes[i]->indices()[1]][axes[i]->indices()[0]] = squared_masses[i];
+ const auto row = std::min(axes[i]->indices()[0], axes[i]->indices()[1]);
+ const auto col = std::max(axes[i]->indices()[0], axes[i]->indices()[1]);
+ pp[row][col] = squared_masses[i];
+
m2_sum_2 += squared_masses[i];
}
@@ -272,59 +274,53 @@ std::vector > calculate_four_momenta(double initial_mass, con
std::vector > P(n_fsp, FourVector());
- for (unsigned i = 0; i < n_fsp; ++i) {
+ for (unsigned i = 0; i < std::min(n_fsp, static_cast(2)); ++i) {
+ P[i][0] = (pp[0][i] + pp[1][i]) / m_01; // E
+ P[i][3] = pow_negative_one(i) * P[i][0] * sqrt(1. - pp[i][i] / pow(P[i][0], 2)); // Z
- FourVector p;
+ if (!std::isfinite(P[i][3]))
+ return std::vector >();
+ }
- if (i < 2) {
+ for (unsigned i = 2; i < n_fsp; ++ i) {
+ // Energy E_i = (P_0 * P_i + P_1 * P_i) / (E_1 + E_0)
+ P[i][0] = (pp[0][i] + pp[1][i]) / (P[0][0] + P[1][0]);
- P[i][0] = (pp[0][i] + pp[1][i]) / m_01; // E
- P[i][3] = pow_negative_one(i) * P[i][0] * sqrt(1. - pp[i][i] / pow(P[i][0], 2)); // Z
+ // if E^2 < m^2
+ if (P[i][0] < sqrt(pp[i][i]))
+ return std::vector >();
- if (!std::isfinite(P[i][3]))
- return std::vector >();
+ // if p0 and p1 are at rest in m01 rest frame, Z_i := 0
+ // else Z_i = (P_1 * P_i - P_0 * P_i - (E_1 - E_0) * E_i) / 2 / Z_0
+ P[i][3] = (P[0][3] == 0) ? 0 : (pp[1][i] - pp[0][i] - (P[1][0] - P[0][0]) * P[i][0]) / 2. / P[0][3];
- } else {
+ if (i < 3) {
- // Energy E_i = (P_0 * P_i + P_1 * P_i) / (E_1 + E_0)
- P[i][0] = (pp[0][i] + pp[1][i]) / (P[0][0] + P[1][0]);
+ // p2 in y-z plane, enforce P^2 = m^2
+ P[i][2] = P[i][0] * sqrt(1 - pp[i][i] / pow(P[i][0], 2) - pow(P[i][3] / P[i][0], 2));
- // if E^2 < m^2
- if (P[i][0] < sqrt(pp[i][i]))
+ if (!std::isfinite(P[i][2]))
return std::vector >();
- // if p0 and p1 are at rest in m01 rest frame, Z_i := 0
- // else Z_i = (P_1 * P_i - P_0 * P_i - (E_1 - E_0) * E_i) / 2 / Z_0
- P[i][3] = (P[0][3] == 0) ? 0 : (pp[1][i] - pp[0][i] - (P[1][0] - P[0][0]) * P[i][0]) / 2. / P[0][3];
-
- if (i < 3) {
-
- // p2 in y-z plane, enforce P^2 = m^2
- P[i][2] = P[i][0] * sqrt(1 - pp[i][i] / pow(P[i][0], 2) - pow(P[i][3] / P[i][0], 2));
-
- if (!std::isfinite(P[i][2]))
- return std::vector >();
-
- // phasespace check for special case: p0 and p1 are at rest in m01 rest frame
- if (n_fsp == 3 and P[0][3] == 0 and !check_invariant_masses(axes, squared_masses, P))
- return std::vector >();
+ // phasespace check for special case: p0 and p1 are at rest in m01 rest frame
+ if (n_fsp == 3 and P[0][3] == 0 and !check_invariant_masses(axes, squared_masses, P))
+ return std::vector >();
- } else {
+ } else {
- // if Y_2 == 0, Y_i := 0
- // else Y_i = (P_2 * P_i - P_2 * P_i) / Y_2
- P[i][2] = (P[2][2] == 0) ? 0 : (P[2][0] * P[i][0] - pp[2][i] - P[2][3] * P[i][3]) / P[2][2];
+ // if Y_2 == 0, Y_i := 0
+ // else Y_i = (P_2 * P_i - P_2 * P_i) / Y_2
+ P[i][2] = (P[2][2] == 0) ? 0 : (P[2][0] * P[i][0] - pp[2][i] - P[2][3] * P[i][3]) / P[2][2];
- // if (i < 4) {
+ // if (i < 4) {
- // enforce P^2 = m^2
- P[i][1] = P[i][0] * sqrt(1 - pp[i][i] / pow(P[i][0], 2) - pow(P[i][2] / P[i][0], 2) - pow(P[i][3] / P[i][0], 2));
+ // enforce P^2 = m^2
+ P[i][1] = P[i][0] * sqrt(1 - pp[i][i] / pow(P[i][0], 2) - pow(P[i][2] / P[i][0], 2) - pow(P[i][3] / P[i][0], 2));
- if (!std::isfinite(P[i][1]))
- return std::vector >();
+ if (!std::isfinite(P[i][1]))
+ return std::vector >();
- // }
- }
+ // }
}
}