diff --git a/CI/physmon/reference/performance_ambi_orthogonal.root b/CI/physmon/reference/performance_ambi_orthogonal.root index d96d78062f5..efd4f4c85d9 100644 Binary files a/CI/physmon/reference/performance_ambi_orthogonal.root and b/CI/physmon/reference/performance_ambi_orthogonal.root differ diff --git a/CI/physmon/reference/performance_ambi_seeded.root b/CI/physmon/reference/performance_ambi_seeded.root index 334130914ad..31538786298 100644 Binary files a/CI/physmon/reference/performance_ambi_seeded.root and b/CI/physmon/reference/performance_ambi_seeded.root differ diff --git a/CI/physmon/reference/performance_ckf_orthogonal.root b/CI/physmon/reference/performance_ckf_orthogonal.root index 5ef419d900b..dd781a4bd9a 100644 Binary files a/CI/physmon/reference/performance_ckf_orthogonal.root and b/CI/physmon/reference/performance_ckf_orthogonal.root differ diff --git a/CI/physmon/reference/performance_ckf_seeded.root b/CI/physmon/reference/performance_ckf_seeded.root index abcb4946a0c..92f0abd7bb5 100644 Binary files a/CI/physmon/reference/performance_ckf_seeded.root and b/CI/physmon/reference/performance_ckf_seeded.root differ diff --git a/CI/physmon/reference/performance_ckf_truth_estimated.root b/CI/physmon/reference/performance_ckf_truth_estimated.root index 37097ef22fd..5fa988346ca 100644 Binary files a/CI/physmon/reference/performance_ckf_truth_estimated.root and b/CI/physmon/reference/performance_ckf_truth_estimated.root differ diff --git a/CI/physmon/reference/performance_ckf_truth_smeared.root b/CI/physmon/reference/performance_ckf_truth_smeared.root index 49c18f44159..b709f8d2ce6 100644 Binary files a/CI/physmon/reference/performance_ckf_truth_smeared.root and b/CI/physmon/reference/performance_ckf_truth_smeared.root differ diff --git a/CI/physmon/reference/performance_gsf.root b/CI/physmon/reference/performance_gsf.root index 3e3a4be8b17..2255b54faac 100644 Binary files a/CI/physmon/reference/performance_gsf.root and b/CI/physmon/reference/performance_gsf.root differ diff --git a/CI/physmon/reference/performance_seeding_orthogonal.root b/CI/physmon/reference/performance_seeding_orthogonal.root index b39c62c6c5f..c825cba7be9 100644 Binary files a/CI/physmon/reference/performance_seeding_orthogonal.root and b/CI/physmon/reference/performance_seeding_orthogonal.root differ diff --git a/CI/physmon/reference/performance_seeding_seeded.root b/CI/physmon/reference/performance_seeding_seeded.root index 64dbcb4aaeb..06917aa3dc3 100644 Binary files a/CI/physmon/reference/performance_seeding_seeded.root and b/CI/physmon/reference/performance_seeding_seeded.root differ diff --git a/CI/physmon/reference/performance_seeding_truth_estimated.root b/CI/physmon/reference/performance_seeding_truth_estimated.root index 50da089e0d7..c90f9c2b12f 100644 Binary files a/CI/physmon/reference/performance_seeding_truth_estimated.root and b/CI/physmon/reference/performance_seeding_truth_estimated.root differ diff --git a/CI/physmon/reference/performance_truth_tracking.root b/CI/physmon/reference/performance_truth_tracking.root index 4d83d3b2193..9f334525104 100644 Binary files a/CI/physmon/reference/performance_truth_tracking.root and b/CI/physmon/reference/performance_truth_tracking.root differ diff --git a/CI/physmon/reference/performance_vertexing_orthogonal_hist.root b/CI/physmon/reference/performance_vertexing_orthogonal_hist.root index 3539dc720ab..49f6fe0b741 100644 Binary files a/CI/physmon/reference/performance_vertexing_orthogonal_hist.root and b/CI/physmon/reference/performance_vertexing_orthogonal_hist.root differ diff --git a/CI/physmon/reference/performance_vertexing_seeded_hist.root b/CI/physmon/reference/performance_vertexing_seeded_hist.root index 8e231d57b98..c505b39f35e 100644 Binary files a/CI/physmon/reference/performance_vertexing_seeded_hist.root and b/CI/physmon/reference/performance_vertexing_seeded_hist.root differ diff --git a/CI/physmon/reference/performance_vertexing_truth_estimated_hist.root b/CI/physmon/reference/performance_vertexing_truth_estimated_hist.root index 41811fc4c08..f47aa5da387 100644 Binary files a/CI/physmon/reference/performance_vertexing_truth_estimated_hist.root and b/CI/physmon/reference/performance_vertexing_truth_estimated_hist.root differ diff --git a/CI/physmon/reference/performance_vertexing_truth_smeared_hist.root b/CI/physmon/reference/performance_vertexing_truth_smeared_hist.root index 30bcd29f9b1..69520ab2d0f 100644 Binary files a/CI/physmon/reference/performance_vertexing_truth_smeared_hist.root and b/CI/physmon/reference/performance_vertexing_truth_smeared_hist.root differ diff --git a/Core/include/Acts/Material/Interactions.hpp b/Core/include/Acts/Material/Interactions.hpp index e3d4d032dae..221235012e7 100644 --- a/Core/include/Acts/Material/Interactions.hpp +++ b/Core/include/Acts/Material/Interactions.hpp @@ -13,6 +13,29 @@ namespace Acts { +/// Additional derived relativistic quantities. +struct RelativisticQuantities { + float q2OverBeta2 = 0.0f; + float beta2 = 0.0f; + float betaGamma = 0.0f; + float gamma = 0.0f; + + RelativisticQuantities(float mass, float qOverP, float q) { + // beta²/q² = (p/E)²/q² = p²/(q²m² + q²p²) = 1/(q² + (m²(q/p)²) + // q²/beta² = q² + m²(q/p)² + q2OverBeta2 = q * q + (mass * qOverP) * (mass * qOverP); + // 1/p = q/(qp) = (q/p)/q + const auto mOverP = mass * std::abs(qOverP / q); + const auto pOverM = 1.0f / mOverP; + // beta² = p²/E² = p²/(m² + p²) = 1/(1 + (m/p)²) + beta2 = 1.0f / (1.0f + mOverP * mOverP); + // beta*gamma = (p/sqrt(m² + p²))*(sqrt(m² + p²)/m) = p/m + betaGamma = pOverM; + // gamma = sqrt(m² + p²)/m = sqrt(1 + (p/m)²) + gamma = std::sqrt(1.0f + pOverM * pOverM); + } +}; + /// Compute the mean energy loss due to ionisation and excitation. /// /// @param slab The traversed material and its properties @@ -61,6 +84,14 @@ float deriveEnergyLossLandauQOverP(const MaterialSlab& slab, int pdg, float m, /// computations are valid for intermediate particle energies. float computeEnergyLossLandauSigma(const MaterialSlab& slab, int pdg, float m, float qOverP, float q = UnitConstants::e); + +/// Compute the full with half maximum of landau energy loss distribution +/// +/// @param slab The traversed material and its properties +/// @param rq The relativistic quantities +float computeEnergyLossLandauFwhm(const MaterialSlab& slab, + const RelativisticQuantities& rq); + /// Compute q/p Gaussian-equivalent sigma due to ionisation loss fluctuations. /// /// @copydoc computeEnergyLossBethe diff --git a/Core/src/Material/Interactions.cpp b/Core/src/Material/Interactions.cpp index bc49c590c6f..2323f57a85a 100644 --- a/Core/src/Material/Interactions.cpp +++ b/Core/src/Material/Interactions.cpp @@ -27,36 +27,14 @@ constexpr float K = 0.307075_MeV * 1_cm * 1_cm; // Energy scale for plasma energy. constexpr float PlasmaEnergyScale = 28.816_eV; -/// Additional derived relativistic quantities. -struct RelativisticQuantities { - float q2OverBeta2 = 0.0f; - float beta2 = 0.0f; - float betaGamma = 0.0f; - float gamma = 0.0f; - - RelativisticQuantities(float mass, float qOverP, float q) { - // beta²/q² = (p/E)²/q² = p²/(q²m² + q²p²) = 1/(q² + (m²(q/p)²) - // q²/beta² = q² + m²(q/p)² - q2OverBeta2 = q * q + (mass * qOverP) * (mass * qOverP); - // 1/p = q/(qp) = (q/p)/q - const auto mOverP = mass * std::abs(qOverP / q); - const auto pOverM = 1.0f / mOverP; - // beta² = p²/E² = p²/(m² + p²) = 1/(1 + (m/p)²) - beta2 = 1.0f / (1.0f + mOverP * mOverP); - // beta*gamma = (p/sqrt(m² + p²))*(sqrt(m² + p²)/m) = p/m - betaGamma = pOverM; - // gamma = sqrt(m² + p²)/m = sqrt(1 + (p/m)²) - gamma = std::sqrt(1.0f + pOverM * pOverM); - } -}; - /// Compute q/p derivative of beta². -inline float deriveBeta2(float qOverP, const RelativisticQuantities& rq) { +inline float deriveBeta2(float qOverP, const Acts::RelativisticQuantities& rq) { return -2 / (qOverP * rq.gamma * rq.gamma); } /// Compute the 2 * mass * (beta * gamma)² mass term. -inline float computeMassTerm(float mass, const RelativisticQuantities& rq) { +inline float computeMassTerm(float mass, + const Acts::RelativisticQuantities& rq) { return 2 * mass * rq.betaGamma * rq.betaGamma; } @@ -69,7 +47,7 @@ inline float logDeriveMassTerm(float qOverP) { /// Compute the maximum energy transfer in a single collision. /// /// Uses RPP2018 eq. 33.4. -inline float computeWMax(float mass, const RelativisticQuantities& rq) { +inline float computeWMax(float mass, const Acts::RelativisticQuantities& rq) { const auto mfrac = Me / mass; const auto nominator = 2 * Me * rq.betaGamma * rq.betaGamma; const auto denonimator = 1.0f + 2 * rq.gamma * mfrac + mfrac * mfrac; @@ -78,7 +56,7 @@ inline float computeWMax(float mass, const RelativisticQuantities& rq) { /// Compute WMax logarithmic derivative w/ respect to q/p. inline float logDeriveWMax(float mass, float qOverP, - const RelativisticQuantities& rq) { + const Acts::RelativisticQuantities& rq) { // this is (q/p) * (beta/q). // both quantities have the same sign and the product must always be // positive. we can thus reuse the known (unsigned) quantity (q/beta)². @@ -97,36 +75,36 @@ inline float logDeriveWMax(float mass, float qOverP, /// where (Z/A)*rho is the electron density in the material and x is the /// traversed length (thickness) of the material. inline float computeEpsilon(float molarElectronDensity, float thickness, - const RelativisticQuantities& rq) { + const Acts::RelativisticQuantities& rq) { return 0.5f * K * molarElectronDensity * thickness * rq.q2OverBeta2; } /// Compute epsilon logarithmic derivative w/ respect to q/p. -inline float logDeriveEpsilon(float qOverP, const RelativisticQuantities& rq) { +inline float logDeriveEpsilon(float qOverP, + const Acts::RelativisticQuantities& rq) { // only need to compute d(q²/beta²)/(q²/beta²); everything else cancels. return 2 / (qOverP * rq.gamma * rq.gamma); } /// Compute the density correction factor delta/2. -/// -/// Uses RPP2018 eq. 33.6 which is only valid for high energies. -/// -/// @todo Should we use RPP2018 eq. 33.7 instead w/ tabulated constants? inline float computeDeltaHalf(float meanExitationPotential, float molarElectronDensity, - const RelativisticQuantities& rq) { + const Acts::RelativisticQuantities& rq) { + /// Uses RPP2018 eq. 33.6 which is only valid for high energies. // only relevant for very high ernergies; use arbitrary cutoff if (rq.betaGamma < 10.0f) { return 0.0f; } // pre-factor according to RPP2019 table 33.1 - const auto plasmaEnergy = PlasmaEnergyScale * std::sqrt(molarElectronDensity); + const auto plasmaEnergy = + PlasmaEnergyScale * std::sqrt(1000.f * molarElectronDensity); return std::log(rq.betaGamma) + std::log(plasmaEnergy / meanExitationPotential) - 0.5f; } /// Compute derivative w/ respect to q/p for the density correction. -inline float deriveDeltaHalf(float qOverP, const RelativisticQuantities& rq) { +inline float deriveDeltaHalf(float qOverP, + const Acts::RelativisticQuantities& rq) { // original equation is of the form // log(beta*gamma) + log(eplasma/I) - 1/2 // which the resulting derivative as @@ -153,7 +131,7 @@ float Acts::computeEnergyLossBethe(const MaterialSlab& slab, int /* unused */, const auto I = slab.material().meanExcitationEnergy(); const auto Ne = slab.material().molarElectronDensity(); const auto thickness = slab.thickness(); - const auto rq = RelativisticQuantities(m, qOverP, q); + const auto rq = Acts::RelativisticQuantities(m, qOverP, q); const auto eps = computeEpsilon(Ne, thickness, rq); const auto dhalf = computeDeltaHalf(I, Ne, rq); const auto u = computeMassTerm(Me, rq); @@ -164,7 +142,7 @@ float Acts::computeEnergyLossBethe(const MaterialSlab& slab, int /* unused */, // the required modification only change the prefactor which becomes // identical to the prefactor epsilon for the most probable value. const auto running = - 0.5f * std::log(u / I) + 0.5f * std::log(wmax / I) - rq.beta2 - dhalf; + std::log(u / I) + std::log(wmax / I) - 2.0f * rq.beta2 - 2.0f * dhalf; return eps * running; } @@ -181,20 +159,20 @@ float Acts::deriveEnergyLossBetheQOverP(const MaterialSlab& slab, const auto I = slab.material().meanExcitationEnergy(); const auto Ne = slab.material().molarElectronDensity(); const auto thickness = slab.thickness(); - const auto rq = RelativisticQuantities(m, qOverP, q); + const auto rq = Acts::RelativisticQuantities(m, qOverP, q); const auto eps = computeEpsilon(Ne, thickness, rq); const auto dhalf = computeDeltaHalf(I, Ne, rq); const auto u = computeMassTerm(Me, rq); const auto wmax = computeWMax(m, rq); // original equation is of the form // - // eps * (log(u/I)/2 + log(wmax/I)/2 - beta² - delta/2) - // = eps * (log(u)/2 + log(wmax/I)/2 - log(I) - beta² - delta/2) + // eps * (log(u/I) + log(wmax/I) - 2 * beta² - delta) + // = eps * (log(u) + log(wmax) - 2 * log(I) - 2 * beta² - delta) // // with the resulting derivative as // - // d(eps) * (log(u/I)/2 + log(wmax/I)/2 - beta² - delta/2) - // + eps * (d(u)/(2*u) + d(wmax)/(2*wmax) - d(beta²) - d(delta/2)) + // d(eps) * (log(u/I) + log(wmax/I) - 2 * beta² - delta) + // + eps * (d(u)/(u) + d(wmax)/(wmax) - 2 * d(beta²) - d(delta)) // // where we can use d(eps) = eps * (d(eps)/eps) for further simplification. const auto logDerEps = logDeriveEpsilon(qOverP, rq); @@ -202,9 +180,9 @@ float Acts::deriveEnergyLossBetheQOverP(const MaterialSlab& slab, const auto logDerU = logDeriveMassTerm(qOverP); const auto logDerWmax = logDeriveWMax(m, qOverP, rq); const auto derBeta2 = deriveBeta2(qOverP, rq); - const auto rel = logDerEps * (0.5f * std::log(u / I) + - 0.5f * std::log(wmax / I) - rq.beta2 - dhalf) + - 0.5f * logDerU + 0.5f * logDerWmax - derBeta2 - derDHalf; + const auto rel = logDerEps * (std::log(u / I) + std::log(wmax / I) - + 2.0f * rq.beta2 - 2.0f * dhalf) + + logDerU + logDerWmax - 2.0f * derBeta2 - 2.0f * derDHalf; return eps * rel; } @@ -220,10 +198,10 @@ float Acts::computeEnergyLossLandau(const MaterialSlab& slab, int /* unused */, const auto I = slab.material().meanExcitationEnergy(); const auto Ne = slab.material().molarElectronDensity(); const auto thickness = slab.thickness(); - const auto rq = RelativisticQuantities(m, qOverP, q); + const auto rq = Acts::RelativisticQuantities(m, qOverP, q); const auto eps = computeEpsilon(Ne, thickness, rq); const auto dhalf = computeDeltaHalf(I, Ne, rq); - const auto t = computeMassTerm(m, rq); + const auto t = computeMassTerm(Me, rq); // uses RPP2018 eq. 33.11 const auto running = std::log(t / I) + std::log(eps / I) + 0.2f - rq.beta2 - 2 * dhalf; @@ -243,10 +221,10 @@ float Acts::deriveEnergyLossLandauQOverP(const MaterialSlab& slab, const auto I = slab.material().meanExcitationEnergy(); const auto Ne = slab.material().molarElectronDensity(); const auto thickness = slab.thickness(); - const auto rq = RelativisticQuantities(m, qOverP, q); + const auto rq = Acts::RelativisticQuantities(m, qOverP, q); const auto eps = computeEpsilon(Ne, thickness, rq); const auto dhalf = computeDeltaHalf(I, Ne, rq); - const auto t = computeMassTerm(m, rq); + const auto t = computeMassTerm(Me, rq); // original equation is of the form // // eps * (log(t/I) - log(eps/I) - 0.2 - beta² - delta) @@ -295,17 +273,14 @@ float Acts::computeEnergyLossLandauSigma(const MaterialSlab& slab, const auto Ne = slab.material().molarElectronDensity(); const auto thickness = slab.thickness(); - const auto rq = RelativisticQuantities(m, qOverP, q); + const auto rq = Acts::RelativisticQuantities(m, qOverP, q); // the Landau-Vavilov fwhm is 4*eps (see RPP2018 fig. 33.7) const auto fwhm = 4 * computeEpsilon(Ne, thickness, rq); return convertLandauFwhmToGaussianSigma(fwhm); } -float Acts::computeEnergyLossLandauSigmaQOverP(const MaterialSlab& slab, - int /* unused */, float m, - float qOverP, float q) { - ASSERT_INPUTS(m, qOverP, q) - +float Acts::computeEnergyLossLandauFwhm( + const MaterialSlab& slab, const Acts::RelativisticQuantities& rq) { // return early in case of vacuum or zero thickness if (not slab) { return 0.0f; @@ -313,9 +288,17 @@ float Acts::computeEnergyLossLandauSigmaQOverP(const MaterialSlab& slab, const auto Ne = slab.material().molarElectronDensity(); const auto thickness = slab.thickness(); - const auto rq = RelativisticQuantities(m, qOverP, q); // the Landau-Vavilov fwhm is 4*eps (see RPP2018 fig. 33.7) - const auto fwhm = 4 * computeEpsilon(Ne, thickness, rq); + return 4 * computeEpsilon(Ne, thickness, rq); +} + +float Acts::computeEnergyLossLandauSigmaQOverP(const MaterialSlab& slab, + int /* unused */, float m, + float qOverP, float q) { + ASSERT_INPUTS(m, qOverP, q) + + const auto rq = Acts::RelativisticQuantities(m, qOverP, q); + const auto fwhm = computeEnergyLossLandauFwhm(slab, rq); const auto sigmaE = convertLandauFwhmToGaussianSigma(fwhm); // var(q/p) = (d(q/p)/dE)² * var(E) // d(q/p)/dE = d/dE (q/sqrt(E²-m²)) @@ -506,7 +489,8 @@ float Acts::computeMultipleScatteringTheta0(const MaterialSlab& slab, int pdg, // 1/p = q/(pq) = (q/p)/q const auto momentumInv = std::abs(qOverP / q); // q²/beta²; a smart compiler should be able to remove the unused computations - const auto q2OverBeta2 = RelativisticQuantities(m, qOverP, q).q2OverBeta2; + const auto q2OverBeta2 = + Acts::RelativisticQuantities(m, qOverP, q).q2OverBeta2; if ((pdg == PdgParticle::eElectron) or (pdg == PdgParticle::ePositron)) { return theta0RossiGreisen(xOverX0, momentumInv, q2OverBeta2); diff --git a/Examples/Python/tests/root_file_hashes.txt b/Examples/Python/tests/root_file_hashes.txt index e98d89d8ee8..b59e3a53d18 100644 --- a/Examples/Python/tests/root_file_hashes.txt +++ b/Examples/Python/tests/root_file_hashes.txt @@ -22,22 +22,22 @@ test_itk_seeding__particles_final.root: e7699af6835ca90f730ad5186989c611d782e8b9 test_itk_seeding__particles_initial.root: 88315e93ed4cb5d40a8721502048a9d1fc100e0a7d504e25fd4502c8302f1578 test_propagation__propagation_steps.root: 174301b25784dbb881196b658f2d7f99c0a2ea688a0129e6110fc19aa5cf8e54 test_material_recording__geant4_material_tracks.root: e411152d370775463c22b19a351dfc7bfe40b51985e10a7c1a010aebde80715d -test_truth_tracking_kalman[generic-0.0]__trackstates_fitter.root: 1500deb098d61d7307ece38e9e45e8e54a4ccd2b193c9db12234515a90af182a -test_truth_tracking_kalman[generic-0.0]__tracksummary_fitter.root: c135030376f63b8f330af14cf23b06e7f77fae02063259b3540967f35bc72862 +test_truth_tracking_kalman[generic-0.0]__trackstates_fitter.root: c1d53be0a0c909c6b4733a927794f66e9fe413dd6007a0e28eca4f5b9aa83c37 +test_truth_tracking_kalman[generic-0.0]__tracksummary_fitter.root: 7b419d783c08e3ac7145ba64d67a08baff698c5d888fb35fef280714b727827a test_truth_tracking_kalman[generic-0.0]__performance_track_finder.root: 7fc6f717723c9eddcbf44820b384b373cee6f04b72f79902f938f35e3ff9b470 -test_truth_tracking_kalman[generic-1000.0]__trackstates_fitter.root: 04deef244699917e9c6cb1151c451450baef72728d9678dde859317516f334c5 -test_truth_tracking_kalman[generic-1000.0]__tracksummary_fitter.root: 3d9f9f0a868ea062aec57666a3ebc0ba2ddbf76252ba832aa726578886bfe677 +test_truth_tracking_kalman[generic-1000.0]__trackstates_fitter.root: f7032af2046d504342760403b5bab63c357774b14dca361e292b30b0dfe768e4 +test_truth_tracking_kalman[generic-1000.0]__tracksummary_fitter.root: a15a3f361d0bbf6a1f7a43e738fd9d754bc04553ffe1e11d37a97193cb077e35 test_truth_tracking_kalman[generic-1000.0]__performance_track_finder.root: 7fc6f717723c9eddcbf44820b384b373cee6f04b72f79902f938f35e3ff9b470 -test_truth_tracking_kalman[odd-0.0]__trackstates_fitter.root: decb70cddc3bec51b601a04ce94e2392efaad2a8416fc0b99b811bffeba64c11 -test_truth_tracking_kalman[odd-0.0]__tracksummary_fitter.root: 6f6542f4ebcd6ef958359386440976b71c3610b9f06637def814bdeaa63a8323 +test_truth_tracking_kalman[odd-0.0]__trackstates_fitter.root: f41fd2e4e50dde14280834cf5713d3db3b6650797132ab87a351479589a3fd30 +test_truth_tracking_kalman[odd-0.0]__tracksummary_fitter.root: b638239caa71e0636cc1f4669544ec5a217aeeda63c69d16e90052a70db83562 test_truth_tracking_kalman[odd-0.0]__performance_track_finder.root: 39aec6316cceb90e314e16b02947faa691c18f57c3a851a25e547a8fc05a4593 -test_truth_tracking_kalman[odd-1000.0]__trackstates_fitter.root: 5899475cfa84b7b368f4e85bdcd19c47f0d53de9130e0ee0099c1ddc38ef3508 -test_truth_tracking_kalman[odd-1000.0]__tracksummary_fitter.root: e23ca4a0e5a039f11f49e5421aaa3c5b696ab0dc17dc7c235633174f378e49e9 +test_truth_tracking_kalman[odd-1000.0]__trackstates_fitter.root: 8aaf7ba26ef36f590f2aa95b50a2fbdbb44112071076f10b46dbe03d7d118e94 +test_truth_tracking_kalman[odd-1000.0]__tracksummary_fitter.root: 11f66720a86d762e1a66a104df1e39eab9b8f4e35ad968771c26bffada10bd40 test_truth_tracking_kalman[odd-1000.0]__performance_track_finder.root: 39aec6316cceb90e314e16b02947faa691c18f57c3a851a25e547a8fc05a4593 -test_truth_tracking_gsf[generic]__trackstates_gsf.root: 8294dd35ed5c819185e6aa7c162e4b12f4ad146b90e676725369edcf095e2bb6 -test_truth_tracking_gsf[generic]__tracksummary_gsf.root: a57d28b935a052476c62043505a373301a54be631432e638e4b6a977ef2813cf -test_truth_tracking_gsf[odd]__trackstates_gsf.root: 24259acbb2d31acfb88ee5704cf7174eb5cec312ab7e32d1f3102005e33581dd -test_truth_tracking_gsf[odd]__tracksummary_gsf.root: 6cdc9394b0d8e750adaa96bf251d25bb59c5501929dccc7ad9e305f43eb9a940 +test_truth_tracking_gsf[generic]__trackstates_gsf.root: 39af9f19e7d5bdb691ab74afcae0722a437dc020d23ab2e0d7c5f8275ef24365 +test_truth_tracking_gsf[generic]__tracksummary_gsf.root: a34a60d07c61bef149603fbfd475cc30202a8eb7a7dc7a116b48285151649cb6 +test_truth_tracking_gsf[odd]__trackstates_gsf.root: 155ad00f54d5cf6b3bf022c5d6c897b1b5e630754ba8ccd4ecc740c363771f4f +test_truth_tracking_gsf[odd]__tracksummary_gsf.root: f382fa66c01f4183e8d2763c89cda075d671c1e4d39116544c026007e60a0bd1 test_particle_gun__particles.root: 8549ba6e20338004ab8ba299fc65e1ee5071985b46df8f77f887cb6fef56a8ec test_material_mapping__material-map_tracks.root: 4e1c866038f0c06b099aa74fd01c3d875f07b89f54898f90debd9b558d8e4025 test_material_mapping__propagation-material.root: 646b8e2bbacec40d0bc4132236f9ab3f03b088e656e6e9b80c47ae03eaf6eab5 @@ -46,27 +46,27 @@ test_volume_material_mapping__propagation-volume-material.root: b7597dada372d1b4 test_digitization_example__measurements.root: 96c75125b172d206f3e8c0458ace8f7e7687a5ed651dc00200d08682b5275e9d test_digitization_example_input__particles.root: 8549ba6e20338004ab8ba299fc65e1ee5071985b46df8f77f887cb6fef56a8ec test_digitization_example_input__measurements.root: 6c156d872cd1b160e6a573752dab164081469da49b7a1fb4c595a043da69c19b -test_ckf_tracks_example[generic-full_seeding]__trackstates_ckf.root: 866f361de17e9ac852083ff21ad14990861ae55f00185887cf57c2291bb9ab25 -test_ckf_tracks_example[generic-full_seeding]__tracksummary_ckf.root: 2c707b4b01a6090085b40f1d4d77cefc21aef707e0c2227561b297e65deeb1f4 +test_ckf_tracks_example[generic-full_seeding]__trackstates_ckf.root: 6caf89b0590b8c1cc833e1f13bd1110185c2eaa064dd06b9f47a6b1693bbd941 +test_ckf_tracks_example[generic-full_seeding]__tracksummary_ckf.root: 2b24372052a4166c2dca2df3deb30c85491699b09b2c373da1cbcab1a7ca4db3 test_ckf_tracks_example[generic-full_seeding]__performance_seeding_trees.root: 0e0676ffafdb27112fbda50d1cf627859fa745760f98073261dcf6db3f2f991e -test_ckf_tracks_example[generic-truth_estimated]__trackstates_ckf.root: dcb4f3d8eb8944e22eff02d5bf72054777e81eaeda8bc07852dc9ab5e09e40c2 -test_ckf_tracks_example[generic-truth_estimated]__tracksummary_ckf.root: d3b161774efc95884820aef8ebf655a62e96171a9eb0f54f63cd6f88531a4dd9 +test_ckf_tracks_example[generic-truth_estimated]__trackstates_ckf.root: b60179a4d3e7ca0f7c5e9a533ece0293052ea5a97a730303cce09813485258ca +test_ckf_tracks_example[generic-truth_estimated]__tracksummary_ckf.root: d2b6780ecd666e8c55ba2ec3bfc2404ac4ffcdf6e18d1d787ecdb4f5f4af7e3a test_ckf_tracks_example[generic-truth_estimated]__performance_seeding.root: 1facb05c066221f6361b61f015cdf0918e94d9f3fce2269ec7b6a4dffeb2bc7e -test_ckf_tracks_example[generic-truth_smeared]__trackstates_ckf.root: 1638aa206b0beda87885d2d9a4059f7b50811dd358c8a2ed2e1705726cfe8b86 -test_ckf_tracks_example[generic-truth_smeared]__tracksummary_ckf.root: a37fcd21c17d05600e04722914b12acee1fe2b82e8eee19ed8f009d632b3929b -test_ckf_tracks_example[odd-full_seeding]__trackstates_ckf.root: 86493e2473c75fe8d003be0cd9b692639e1408a5092bbb13297ffd226022a5e3 -test_ckf_tracks_example[odd-full_seeding]__tracksummary_ckf.root: 84631fb48d3308a70a94ce186ea2c39473998a936f8fcbdabf476b2d2ee259bc +test_ckf_tracks_example[generic-truth_smeared]__trackstates_ckf.root: c8c77e313355f946caa39e102340d36654d8faa02460c1449c9b23441026b590 +test_ckf_tracks_example[generic-truth_smeared]__tracksummary_ckf.root: 972fe113560071f0ae8fc9ee80c8e0ea1ad04469869738c9c5ca4ab305c41a56 +test_ckf_tracks_example[odd-full_seeding]__trackstates_ckf.root: a7c6e6834b990c83ceefe093ccbf39e7e2b6e1a59e2446dc6da1ba025033f15b +test_ckf_tracks_example[odd-full_seeding]__tracksummary_ckf.root: 7ee63de00941cfb690a5ac1cae4fff835c389896749e8aebe78cf877b401088c test_ckf_tracks_example[odd-full_seeding]__performance_seeding_trees.root: 43c58577aafe07645e5660c4f43904efadf91d8cda45c5c04c248bbe0f59814f -test_ckf_tracks_example[odd-truth_estimated]__trackstates_ckf.root: 4d655e12293fa2cce4933fb16ddc0b85cc38aa52a94dac26d6006b1403772c9f -test_ckf_tracks_example[odd-truth_estimated]__tracksummary_ckf.root: d94cb2f2f22eceabdff2ee06315096a0420c240509dbaa73b0391eaa1627a2b7 +test_ckf_tracks_example[odd-truth_estimated]__trackstates_ckf.root: f9ac9ed856147587d98a5d86d4a5936ac5954071fa31967b440516b2a88698aa +test_ckf_tracks_example[odd-truth_estimated]__tracksummary_ckf.root: cd4c8340933835afe42056a5f0b723fea60727706dd6c96cb4e874a3ee3318f7 test_ckf_tracks_example[odd-truth_estimated]__performance_seeding.root: 1a36b7017e59f1c08602ef3c2cb0483c51df248f112e3780c66594110719c575 -test_ckf_tracks_example[odd-truth_smeared]__trackstates_ckf.root: 0d740219b7b30b0fb69ebb79a89744ca35aa6a70bcfbb6b94064ecb2a5061f93 -test_ckf_tracks_example[odd-truth_smeared]__tracksummary_ckf.root: 50a483141aa7b43568d1191a88c8b92b9c72cebc89e5c7adfefcfd9e248068c1 +test_ckf_tracks_example[odd-truth_smeared]__trackstates_ckf.root: 67319e2c37469c604fff999a53aa91be4a79bcad447229601c6fb16c80fe08f6 +test_ckf_tracks_example[odd-truth_smeared]__tracksummary_ckf.root: 48b7bb655204ff89c7c0c474366edb7cea8e1a9ed40f2203b6f05efedc7cf3c7 test_vertex_fitting_reading[Truth-False-100]__performance_vertexing.root: 76ef6084d758dfdfc0151ddec2170e12d73394424e3dac4ffe46f0f339ec8293 test_vertex_fitting_reading[Iterative-False-100]__performance_vertexing.root: 60372210c830a04f95ceb78c6c68a9b0de217746ff59e8e73053750c837b57eb -test_vertex_fitting_reading[Iterative-True-100]__performance_vertexing.root: b19ae47bedd6f2de2e0f6141d58ba70e2fa9657d7e7588dde17ed87a1006dc53 +test_vertex_fitting_reading[Iterative-True-100]__performance_vertexing.root: e34f217d524a5051dbb04a811d3407df3ebe2cc4bb7f54f6bda0847dbd7b52c3 test_vertex_fitting_reading[AMVF-False-100]__performance_vertexing.root: 009e4b1687f755e835aa46a4742233e3f336413bc039fa2ac4003ad1d48266e4 -test_vertex_fitting_reading[AMVF-True-100]__performance_vertexing.root: af03417583ebafbf6d3ba08e3a02a856b4ec17f57632fd0d2c5e2d8ab15a34d6 +test_vertex_fitting_reading[AMVF-True-100]__performance_vertexing.root: 2d0dc1e02bfd1f7eaae26ef8ac657ce0291f70c7e4efddd35d171d31988a631e test_bfield_writing__solenoid.root: 7ab4d298cd1657c93c90ad7759ea536ad93f52b11cc90f8e3abe611b9cf13234 test_bfield_writing__solenoid2.root: 948435fab0d2d23b61884acb44e150adc6ab7b432dc41e4e03ae289d8ac30224 test_root_prop_step_writer[configPosConstructor]__prop_steps.root: d982b17f3c30aa52c7ee80ae7d110ad88c3135bfef3a5279529ab68f5def32bc diff --git a/Tests/IntegrationTests/Autodiff/PropagationAutodiffDenseConstant.cpp b/Tests/IntegrationTests/Autodiff/PropagationAutodiffDenseConstant.cpp index 22e3ee6199e..0464d2c4a9a 100644 --- a/Tests/IntegrationTests/Autodiff/PropagationAutodiffDenseConstant.cpp +++ b/Tests/IntegrationTests/Autodiff/PropagationAutodiffDenseConstant.cpp @@ -45,7 +45,7 @@ constexpr auto epsPos = 10_um; constexpr auto epsDir = 1_mrad; constexpr auto epsMom = 5_MeV; // relative covariance tolerance -constexpr auto epsCov = 0.05; +constexpr auto epsCov = 0.07; const Acts::GeometryContext geoCtx; const Acts::MagneticFieldContext magCtx; diff --git a/Tests/IntegrationTests/PropagationDenseConstant.cpp b/Tests/IntegrationTests/PropagationDenseConstant.cpp index b4da26520a2..0b3b094a396 100644 --- a/Tests/IntegrationTests/PropagationDenseConstant.cpp +++ b/Tests/IntegrationTests/PropagationDenseConstant.cpp @@ -43,7 +43,7 @@ constexpr auto epsPos = 10_um; constexpr auto epsDir = 1_mrad; constexpr auto epsMom = 5_MeV; // relative covariance tolerance -constexpr auto epsCov = 0.05; +constexpr auto epsCov = 0.07; const Acts::GeometryContext geoCtx; const Acts::MagneticFieldContext magCtx; diff --git a/Tests/UnitTests/Core/Material/InteractionsTests.cpp b/Tests/UnitTests/Core/Material/InteractionsTests.cpp index 8cf72824f49..b939031f58b 100644 --- a/Tests/UnitTests/Core/Material/InteractionsTests.cpp +++ b/Tests/UnitTests/Core/Material/InteractionsTests.cpp @@ -108,4 +108,58 @@ BOOST_DATA_TEST_CASE(vacuum, thickness* particle* momentum, x, i, m, q, p) { 0); } +// Silicon Bethe Energy Loss Validation +// PDG value from https://pdg.lbl.gov/2022/AtomicNuclearProperties +static const double momentum[] = {0.1003_GeV, 1.101_GeV, 10.11_GeV, 100.1_GeV}; +static const double energy_loss[] = {2.608, 1.803, 2.177, 2.451}; + +BOOST_DATA_TEST_CASE(silicon_energy_loss, + data::make(momentum) ^ data::make(energy_loss), p, loss) { + const Acts::Material silicon = Acts::Test::makeSilicon(); + + const auto thickness = 1_cm; + + const auto slab = Acts::MaterialSlab(silicon, thickness); + + const int pdg = Acts::eMuon; + + const auto m = 105.7_MeV; + + const auto qOverP = -1. / p; + + const auto charge = -1_e; + + // Difference is within 5% from PDG value + BOOST_CHECK_CLOSE(computeEnergyLossBethe(slab, pdg, m, qOverP, charge) / + thickness / slab.material().massDensity() / + (1_MeV * 1_cm2 / 1_g), + loss, 5.); +} + +// Silicon Landau Energy Loss Validation +BOOST_AUTO_TEST_CASE(silicon_landau) { + const Acts::Material silicon = Acts::Test::makeSilicon(); + + const auto thickness = 0.17_cm; + + const auto slab = Acts::MaterialSlab(silicon, thickness); + + const int pdg = Acts::eMuon; + + const float m = 105.7_MeV; + + const float qOverP = -1. / 10_GeV; + + const float charge = -1_e; + + // Difference is within 5% from PDG value + const auto dE = computeEnergyLossLandau(slab, pdg, m, qOverP, charge) / 1_MeV; + BOOST_CHECK_CLOSE(dE, 0.525, 5.); + + // Difference is within 10% from PDG value + const auto fwhm = + Acts::computeEnergyLossLandauFwhm(slab, {m, qOverP, charge}) / 1_MeV; + BOOST_CHECK_CLOSE(fwhm, 0.13, 10.); +} + BOOST_AUTO_TEST_SUITE_END()