File indexing completed on 2026-05-27 07:23:34
0001
0002
0003
0004
0005
0006
0007
0008
0009 #pragma once
0010
0011 #include "Acts/EventData/StripSpacePointCalibrationDetails.hpp"
0012 #include "Acts/Utilities/detail/StdArrayLinalg.hpp"
0013
0014 #include <cmath>
0015
0016 namespace Acts::detail {
0017
0018
0019
0020
0021 inline OuterStripSpacePointCalibrationDetailsDerived
0022 deriveOuterStripSpacePointCalibrationDetails(const std::array<float, 3>& ihv,
0023 const std::array<float, 3>& ohv,
0024 const std::array<float, 3>& iosv,
0025 const std::array<float, 3>& oc) {
0026 OuterStripSpacePointCalibrationDetailsDerived result{};
0027 result.innerCrossOuterHalfVector = stdArrayCross(ihv, ohv);
0028 result.innerToOuterSeparationCrossOuterHalfVector = stdArrayCross(iosv, ohv);
0029 result.innerToOuterSeparationCrossInnerHalfVector = stdArrayCross(iosv, ihv);
0030 result.outerCenter = oc;
0031 result.outerHalfVector = ohv;
0032 return result;
0033 }
0034
0035 inline OuterStripSpacePointCalibrationDetailsDerived
0036 deriveOuterStripSpacePointCalibrationDetails(
0037 const OuterStripSpacePointCalibrationDetails& sp) {
0038 return deriveOuterStripSpacePointCalibrationDetails(
0039 sp.innerHalfVector, sp.outerHalfVector, sp.innerToOuterSeparation,
0040 sp.outerCenter);
0041 }
0042
0043 inline bool calibrateOuterStripSpacePoint(
0044 const std::array<float, 3>& direction,
0045 const std::array<float, 3>& ihvCrossOhv,
0046 const std::array<float, 3>& iosvCrossOhv,
0047 const std::array<float, 3>& iosvCrossIhv, const std::array<float, 3>& oc,
0048 const std::array<float, 3>& ohv, std::array<float, 3>& calibrated,
0049 const float tolerance) {
0050
0051 const float scale = stdArrayDot(direction, ihvCrossOhv);
0052
0053
0054
0055 const float sInner = stdArrayDot(direction, iosvCrossOhv);
0056 if (std::abs(sInner) > std::abs(scale) * tolerance) {
0057 return false;
0058 }
0059
0060
0061
0062 const float sOuter = stdArrayDot(direction, iosvCrossIhv);
0063 if (std::abs(sOuter) > std::abs(scale) * tolerance) {
0064 return false;
0065 }
0066
0067
0068 const float sOuterNorm = sOuter / scale;
0069 calibrated = stdArrayAddScaled(oc, ohv, sOuterNorm);
0070 return true;
0071 }
0072
0073 inline bool calibrateOuterStripSpacePoint(
0074 const std::array<float, 3>& direction,
0075 const OuterStripSpacePointCalibrationDetailsDerived& sp,
0076 std::array<float, 3>& calibrated, const float tolerance) {
0077 return detail::calibrateOuterStripSpacePoint(
0078 direction, sp.innerCrossOuterHalfVector,
0079 sp.innerToOuterSeparationCrossOuterHalfVector,
0080 sp.innerToOuterSeparationCrossInnerHalfVector, sp.outerCenter,
0081 sp.outerHalfVector, calibrated, tolerance);
0082 }
0083
0084 }