File indexing completed on 2026-04-07 07:46:18
0001
0002
0003
0004
0005
0006
0007
0008
0009 #pragma once
0010
0011 #include "Acts/Geometry/GeometryHierarchyMap.hpp"
0012 #include "Acts/TrackFitting/KalmanFitter.hpp"
0013 #include "ActsAlignment/Kernel/Alignment.hpp"
0014 #include "ActsExamples/EventData/Measurement.hpp"
0015 #include "ActsExamples/EventData/ProtoTrack.hpp"
0016 #include "ActsExamples/EventData/Track.hpp"
0017 #include "ActsExamples/Framework/DataHandle.hpp"
0018 #include "ActsExamples/Framework/IAlgorithm.hpp"
0019
0020 #include <memory>
0021 #include <vector>
0022
0023 namespace Acts {
0024 class MagneticFieldProvider;
0025 }
0026
0027 namespace ActsExamples {
0028
0029 class AlignmentGroup {
0030 public:
0031 AlignmentGroup(const std::string& name,
0032 const std::vector<Acts::GeometryIdentifier>& geoIds)
0033 : m_name(name), m_map(constructHierarchyMap(geoIds)) {}
0034
0035
0036 std::string getNameOfGroup() const { return m_name; }
0037
0038
0039 bool has(Acts::GeometryIdentifier geoId) {
0040 auto it = m_map.find(geoId);
0041 return (it == m_map.end()) ? false : *it;
0042 }
0043
0044 private:
0045 std::string m_name;
0046 Acts::GeometryHierarchyMap<bool> m_map;
0047
0048 Acts::GeometryHierarchyMap<bool> constructHierarchyMap(
0049 const std::vector<Acts::GeometryIdentifier>& geoIds) {
0050 std::vector<Acts::GeometryHierarchyMap<bool>::InputElement> ies;
0051 for (const auto& geoId : geoIds) {
0052 ies.emplace_back(geoId, true);
0053 }
0054 return Acts::GeometryHierarchyMap<bool>(ies);
0055 }
0056 };
0057
0058 class AlignmentAlgorithm final : public IAlgorithm {
0059 public:
0060 using AlignmentResult = Acts::Result<ActsAlignment::AlignmentResult>;
0061 using AlignmentParameters =
0062 std::unordered_map<Acts::SurfacePlacementBase*, Acts::Transform3>;
0063
0064
0065
0066 using TrackFitterOptions =
0067 Acts::KalmanFitterOptions<Acts::VectorMultiTrajectory>;
0068
0069
0070
0071
0072 class AlignmentFunction {
0073 public:
0074 virtual ~AlignmentFunction() = default;
0075 virtual AlignmentResult operator()(
0076 const std::vector<std::vector<IndexSourceLink>>&,
0077 const TrackParametersContainer&,
0078 const ActsAlignment::AlignmentOptions<TrackFitterOptions>&) const = 0;
0079 };
0080
0081
0082
0083
0084
0085 static std::shared_ptr<AlignmentFunction> makeAlignmentFunction(
0086 std::shared_ptr<const Acts::TrackingGeometry> trackingGeometry,
0087 std::shared_ptr<const Acts::MagneticFieldProvider> magneticField);
0088
0089 struct Config {
0090
0091 std::string inputMeasurements;
0092
0093 std::string inputProtoTracks;
0094
0095 std::string inputInitialTrackParameters;
0096
0097 std::string outputAlignmentParameters;
0098
0099 std::shared_ptr<AlignmentFunction> align;
0100
0101 ActsAlignment::AlignedTransformUpdater alignedTransformUpdater;
0102
0103 std::vector<Acts::SurfacePlacementBase*> alignedDetElements;
0104
0105 std::map<unsigned int, std::bitset<6>> iterationState;
0106
0107 double chi2ONdfCutOff = 0.10;
0108
0109 std::pair<std::size_t, double> deltaChi2ONdfCutOff = {10, 0.00001};
0110
0111 std::size_t maxNumIterations = 100;
0112
0113 int maxNumTracks = -1;
0114 std::vector<AlignmentGroup> m_groups;
0115 };
0116
0117
0118
0119
0120
0121 explicit AlignmentAlgorithm(
0122 Config cfg, std::unique_ptr<const Acts::Logger> logger = nullptr);
0123
0124
0125
0126
0127
0128 ProcessCode execute(const AlgorithmContext& ctx) const override;
0129
0130 private:
0131 Config m_cfg;
0132
0133 ReadDataHandle<MeasurementContainer> m_inputMeasurements{this,
0134 "InputMeasurements"};
0135 ReadDataHandle<TrackParametersContainer> m_inputInitialTrackParameters{
0136 this, "InputInitialTrackParameters"};
0137 ReadDataHandle<ProtoTrackContainer> m_inputProtoTracks{this,
0138 "InputProtoTracks"};
0139 WriteDataHandle<AlignmentParameters> m_outputAlignmentParameters{
0140 this, "OutputAlignmentParameters"};
0141 };
0142
0143 }