File indexing completed on 2026-05-08 08:01:24
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <boost/test/tools/old/interface.hpp>
0010 #include <boost/test/unit_test.hpp>
0011
0012 #include "Acts/Definitions/Algebra.hpp"
0013 #include "Acts/EventData/detail/TestSourceLink.hpp"
0014 #include "Acts/Geometry/CuboidVolumeBuilder.hpp"
0015 #include "Acts/Geometry/GeometryContext.hpp"
0016 #include "ActsAlignment/Kernel/Alignment.hpp"
0017 #include "ActsAlignment/Kernel/detail/AlignmentEngine.hpp"
0018 #include "ActsPlugins/Mille/ActsToMille.hpp"
0019 #include "ActsPlugins/Mille/Helpers.hpp"
0020 #include "ActsTests/CommonHelpers/AlignmentHelpers.hpp"
0021
0022 #include <string>
0023
0024 #include <Mille/MilleDecoder.h>
0025 #include <Mille/MilleFactory.h>
0026
0027 using namespace Acts;
0028 using namespace ActsTests;
0029 using namespace ActsTests::AlignmentUtils;
0030 using namespace Acts::detail::Test;
0031 using namespace Acts::UnitConstants;
0032
0033 BOOST_AUTO_TEST_CASE(ZeroFieldKalmanToMille) {
0034
0035
0036
0037
0038 aliTestUtils utils;
0039
0040 TelescopeDetector detector(utils.geoCtx);
0041 const auto geometry = detector();
0042
0043
0044 auto kfLogger = getDefaultLogger("KalmanFilter", Logging::INFO);
0045 const auto kfZeroPropagator =
0046 makeConstantFieldPropagator(geometry, 0_T, std::move(kfLogger));
0047 auto kfZero = KalmanFitterType(kfZeroPropagator);
0048
0049
0050 auto alignLogger = getDefaultLogger("Alignment", Logging::INFO);
0051 const auto alignZero =
0052 ActsAlignment::Alignment(std::move(kfZero), std::move(alignLogger));
0053
0054
0055 const auto& trajectories = createTrajectories(geometry, 10, utils);
0056
0057
0058
0059 auto extensions = getExtensions(utils);
0060 TestSourceLink::SurfaceAccessor surfaceAccessor{*geometry};
0061 extensions.surfaceAccessor
0062 .connect<&TestSourceLink::SurfaceAccessor::operator()>(&surfaceAccessor);
0063 KalmanFitterOptions kfOptions(
0064 utils.geoCtx, utils.magCtx, utils.calCtx, extensions,
0065 PropagatorPlainOptions(utils.geoCtx, utils.magCtx));
0066
0067
0068 ActsAlignment::AlignedTransformUpdater voidAlignUpdater =
0069 [](SurfacePlacementBase* , const GeometryContext& ,
0070 const Transform3& ) { return true; };
0071
0072
0073 ActsAlignment::AlignmentOptions<KalmanFitterOptions<VectorMultiTrajectory>>
0074 alignOptions(kfOptions, voidAlignUpdater);
0075 alignOptions.maxIterations = 1;
0076
0077
0078 unsigned int iSurface = 0;
0079 std::unordered_map<const Surface*, std::size_t> idxedAlignSurfaces;
0080
0081 for (auto& det : detector.detectorStore) {
0082 const auto& surface = det->surface();
0083 if (surface.geometryId().layer() != 8) {
0084 alignOptions.alignedDetElements.push_back(det.get());
0085 idxedAlignSurfaces.emplace(&surface, iSurface);
0086 iSurface++;
0087 }
0088 }
0089
0090
0091 const auto& inputTraj = trajectories.front();
0092 kfOptions.referenceSurface = &(*inputTraj.startParameters).referenceSurface();
0093
0094 auto evaluateRes = alignZero.evaluateTrackAlignmentState(
0095 kfOptions.geoContext, inputTraj.sourceLinks, *inputTraj.startParameters,
0096 kfOptions, idxedAlignSurfaces, ActsAlignment::AlignmentMask::All);
0097 BOOST_CHECK(evaluateRes.ok());
0098
0099
0100
0101 auto milleRecord = Mille::spawnMilleRecord("myRecord.root", true);
0102
0103 const auto& alignState = evaluateRes.value();
0104 ActsPlugins::ActsToMille::dumpToMille(alignState, *milleRecord);
0105
0106
0107 milleRecord->flushOutputFile();
0108 milleRecord.reset();
0109
0110
0111
0112
0113
0114
0115 auto milleReader = Mille::spawnMilleReader("myRecord.root");
0116 BOOST_CHECK(milleReader->open("myRecord.root"));
0117
0118
0119
0120 ActsAlignment::detail::TrackAlignmentState millePedeState;
0121
0122 millePedeState.alignedSurfaces = alignState.alignedSurfaces;
0123 BOOST_CHECK(ActsPlugins::ActsToMille::unpackMilleRecord(
0124 *milleReader, millePedeState, idxedAlignSurfaces) ==
0125 Mille::MilleDecoder::ReadResult::OK);
0126
0127
0128
0129 BOOST_CHECK_EQUAL(millePedeState.alignmentDof, alignState.alignmentDof);
0130 BOOST_CHECK_EQUAL(millePedeState.measurementDim, alignState.measurementDim);
0131 BOOST_CHECK_EQUAL(millePedeState.trackParametersDim,
0132 alignState.trackParametersDim);
0133
0134 BOOST_CHECK_EQUAL(millePedeState.residual, alignState.residual);
0135 BOOST_CHECK_EQUAL(millePedeState.chi2, alignState.chi2);
0136 BOOST_CHECK_EQUAL(millePedeState.measurementCovariance,
0137 alignState.measurementCovariance);
0138 BOOST_CHECK_EQUAL(millePedeState.projectionMatrix,
0139 alignState.projectionMatrix);
0140
0141 BOOST_CHECK_EQUAL(millePedeState.alignmentToResidualDerivative,
0142 alignState.alignmentToResidualDerivative);
0143
0144
0145
0146
0147 BOOST_CHECK(millePedeState.trackParametersCovariance.isApprox(
0148 ActsPlugins::ActsToMille::regulariseCovariance(
0149 alignState.trackParametersCovariance),
0150 1.e-6));
0151
0152
0153
0154 BOOST_CHECK(millePedeState.residualCovariance.isApprox(
0155 alignState.residualCovariance, 1.e-6));
0156 BOOST_CHECK(millePedeState.alignmentToChi2Derivative.isApprox(
0157 alignState.alignmentToChi2Derivative, 1.e-6));
0158 BOOST_CHECK(millePedeState.alignmentToChi2SecondDerivative.isApprox(
0159 alignState.alignmentToChi2SecondDerivative, 1.e-6));
0160 }