File indexing completed on 2025-07-12 07:52:54
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include "Acts/Plugins/Json/Seeding2ConfigJsonConverter.hpp"
0010
0011 #include "Acts/Plugins/Json/DefinitionsJsonConverter.hpp"
0012 #include "Acts/Utilities/GridBinFinder.hpp"
0013 #include "Acts/Utilities/Helpers.hpp"
0014
0015 #include <algorithm>
0016
0017 namespace {
0018
0019 template <std::size_t DIM>
0020 void to_json(nlohmann::json& j, const Acts::GridBinFinder<DIM>& f) {
0021 nlohmann::json::array_t values;
0022
0023 for (const auto& value : f.values()) {
0024 std::visit(
0025 Acts::overloaded{
0026 [&](int v) { values.push_back(v); },
0027 [&](const std::pair<int, int>& p) { values.push_back(p); },
0028 [&](const std::vector<std::pair<int, int>>& vec) {
0029 values.push_back(vec);
0030 },
0031 [](const auto&) {
0032 throw std::runtime_error("Unsupported type in GridBinFinder");
0033 }},
0034 value);
0035 }
0036
0037 j = values;
0038 }
0039
0040 template <std::size_t DIM>
0041 Acts::GridBinFinder<DIM> from_json(const nlohmann::json& j) {
0042 using stored_values_t = typename Acts::GridBinFinder<DIM>::stored_values_t;
0043
0044 std::array<stored_values_t, DIM> values;
0045 for (std::size_t i = 0; i < DIM; ++i) {
0046 if (j[i].is_number_integer()) {
0047 values[i] = j[i].get<int>();
0048 } else if (j[i].is_array() && j[i].size() == 2 &&
0049 j[i][0].is_number_integer() && j[i][1].is_number_integer()) {
0050 values[i] = j[i].get<std::pair<int, int>>();
0051 } else if (j[i].is_array() &&
0052 std::ranges::all_of(j[i], [](const nlohmann::json& elem) {
0053 return elem.is_array() && elem.size() == 2 &&
0054 elem[0].is_number_integer() &&
0055 elem[1].is_number_integer();
0056 })) {
0057 values[i] = j[i].get<std::vector<std::pair<int, int>>>();
0058 } else {
0059 throw std::runtime_error("Invalid type for GridBinFinder value");
0060 }
0061 }
0062
0063 return Acts::GridBinFinder<DIM>(std::move(values));
0064 }
0065
0066 }
0067
0068 void Acts::to_json(nlohmann::json& j,
0069 const SeedConfirmationRangeConfig& config) {
0070 j["zMinSeedConf"] = config.zMinSeedConf;
0071 j["zMaxSeedConf"] = config.zMaxSeedConf;
0072 j["rMaxSeedConf"] = config.rMaxSeedConf;
0073 j["nTopForLargeR"] = config.nTopForLargeR;
0074 j["nTopForSmallR"] = config.nTopForSmallR;
0075 j["seedConfMinBottomRadius"] = config.seedConfMinBottomRadius;
0076 j["seedConfMaxZOrigin"] = config.seedConfMaxZOrigin;
0077 j["minImpactSeedConf"] = config.minImpactSeedConf;
0078 }
0079
0080 void Acts::from_json(const nlohmann::json& j,
0081 SeedConfirmationRangeConfig& config) {
0082 j["zMinSeedConf"].get_to(config.zMinSeedConf);
0083 j["zMaxSeedConf"].get_to(config.zMaxSeedConf);
0084 j["rMaxSeedConf"].get_to(config.rMaxSeedConf);
0085 j["nTopForLargeR"].get_to(config.nTopForLargeR);
0086 j["nTopForSmallR"].get_to(config.nTopForSmallR);
0087 j["seedConfMinBottomRadius"].get_to(config.seedConfMinBottomRadius);
0088 j["seedConfMaxZOrigin"].get_to(config.seedConfMaxZOrigin);
0089 j["minImpactSeedConf"].get_to(config.minImpactSeedConf);
0090 }
0091
0092 void Acts::Experimental::to_json(nlohmann::json& j,
0093 const DoubletSeedFinder::Config& config) {
0094 j["candidateDirection"] = config.candidateDirection;
0095 j["deltaRMin"] = config.deltaRMin;
0096 j["deltaRMax"] = config.deltaRMax;
0097 j["deltaZMin"] = config.deltaZMin;
0098 j["deltaZMax"] = config.deltaZMax;
0099 j["impactMax"] = config.impactMax;
0100 j["interactionPointCut"] = config.interactionPointCut;
0101 j["collisionRegionMin"] = config.collisionRegionMin;
0102 j["collisionRegionMax"] = config.collisionRegionMax;
0103 j["cotThetaMax"] = config.cotThetaMax;
0104 j["minPt"] = config.minPt;
0105 j["helixCutTolerance"] = config.helixCutTolerance;
0106
0107 }
0108
0109 void Acts::Experimental::to_json(
0110 nlohmann::json& j, const DoubletSeedFinder::DerivedConfig& config) {
0111 to_json(j, static_cast<const DoubletSeedFinder::Config&>(config));
0112 j["bFieldInZ"] = config.bFieldInZ;
0113 j["minHelixDiameter2"] = config.minHelixDiameter2;
0114 }
0115
0116 void Acts::Experimental::to_json(
0117 nlohmann::json& j, const BroadTripletSeedFinder::Options& options) {
0118 j["bFieldInZ"] = options.bFieldInZ;
0119 j["useStripMeasurementInfo"] = options.useStripMeasurementInfo;
0120 }
0121
0122 void Acts::Experimental::to_json(
0123 nlohmann::json& j, const BroadTripletSeedFinder::TripletCuts& cuts) {
0124 j["minPt"] = cuts.minPt;
0125 j["sigmaScattering"] = cuts.sigmaScattering;
0126 j["radLengthPerSeed"] = cuts.radLengthPerSeed;
0127 j["maxPtScattering"] = cuts.maxPtScattering;
0128 j["impactMax"] = cuts.impactMax;
0129 j["helixCutTolerance"] = cuts.helixCutTolerance;
0130 j["toleranceParam"] = cuts.toleranceParam;
0131 }
0132
0133 void Acts::Experimental::to_json(
0134 nlohmann::json& j, const BroadTripletSeedFinder::DerivedTripletCuts& cuts) {
0135 to_json(j, static_cast<const BroadTripletSeedFinder::TripletCuts&>(cuts));
0136 j["bFieldInZ"] = cuts.bFieldInZ;
0137 j["highland"] = cuts.highland;
0138 j["pTPerHelixRadius"] = cuts.pTPerHelixRadius;
0139 j["minHelixDiameter2"] = cuts.minHelixDiameter2;
0140 j["sigmapT2perRadius"] = cuts.sigmapT2perRadius;
0141 j["multipleScattering2"] = cuts.multipleScattering2;
0142 }
0143
0144 void Acts::Experimental::to_json(nlohmann::json& j,
0145 const BroadTripletSeedFilter::Config& config) {
0146 j["deltaInvHelixDiameter"] = config.deltaInvHelixDiameter;
0147 j["deltaRMin"] = config.deltaRMin;
0148 j["compatSeedWeight"] = config.compatSeedWeight;
0149 j["impactWeightFactor"] = config.impactWeightFactor;
0150 j["zOriginWeightFactor"] = config.zOriginWeightFactor;
0151 j["maxSeedsPerSpM"] = config.maxSeedsPerSpM;
0152 j["compatSeedLimit"] = config.compatSeedLimit;
0153 j["seedWeightIncrement"] = config.seedWeightIncrement;
0154 j["numSeedIncrement"] = config.numSeedIncrement;
0155 j["seedConfirmation"] = config.seedConfirmation;
0156 j["centralSeedConfirmationRange"] = config.centralSeedConfirmationRange;
0157 j["forwardSeedConfirmationRange"] = config.forwardSeedConfirmationRange;
0158 j["maxSeedsPerSpMConf"] = config.maxSeedsPerSpMConf;
0159 j["maxQualitySeedsPerSpMConf"] = config.maxQualitySeedsPerSpMConf;
0160 j["useDeltaRinsteadOfTopRadius"] = config.useDeltaRinsteadOfTopRadius;
0161
0162 }
0163
0164 void Acts::Experimental::to_json(
0165 nlohmann::json& j, const CylindricalSpacePointGrid2::Config& config) {
0166 j["minPt"] = config.minPt;
0167 j["rMin"] = config.rMin;
0168 j["rMax"] = config.rMax;
0169 j["zMin"] = config.zMin;
0170 j["zMax"] = config.zMax;
0171 j["deltaRMax"] = config.deltaRMax;
0172 j["cotThetaMax"] = config.cotThetaMax;
0173 j["impactMax"] = config.impactMax;
0174 j["phiMin"] = config.phiMin;
0175 j["phiMax"] = config.phiMax;
0176 j["phiBinDeflectionCoverage"] = config.phiBinDeflectionCoverage;
0177 j["maxPhiBins"] = config.maxPhiBins;
0178 j["zBinEdges"] = config.zBinEdges;
0179 j["rBinEdges"] = config.rBinEdges;
0180 j["bFieldInZ"] = config.bFieldInZ;
0181 if (config.bottomBinFinder.has_value()) {
0182 ::to_json(j["bottomBinFinder"], config.bottomBinFinder.value());
0183 }
0184 if (config.topBinFinder.has_value()) {
0185 ::to_json(j["topBinFinder"], config.topBinFinder.value());
0186 }
0187 j["navigation"] = config.navigation;
0188 }
0189
0190 void Acts::Experimental::from_json(const nlohmann::json& j,
0191 DoubletSeedFinder::Config& config) {
0192 j["candidateDirection"].get_to(config.candidateDirection);
0193 j["deltaRMin"].get_to(config.deltaRMin);
0194 j["deltaRMax"].get_to(config.deltaRMax);
0195 j["deltaZMin"].get_to(config.deltaZMin);
0196 j["deltaZMax"].get_to(config.deltaZMax);
0197 j["impactMax"].get_to(config.impactMax);
0198 j["interactionPointCut"].get_to(config.interactionPointCut);
0199 j["collisionRegionMin"].get_to(config.collisionRegionMin);
0200 j["collisionRegionMax"].get_to(config.collisionRegionMax);
0201 j["cotThetaMax"].get_to(config.cotThetaMax);
0202 j["minPt"].get_to(config.minPt);
0203 j["helixCutTolerance"].get_to(config.helixCutTolerance);
0204
0205 }
0206
0207 void Acts::Experimental::from_json(const nlohmann::json& j,
0208 DoubletSeedFinder::DerivedConfig& config) {
0209 from_json(j, static_cast<DoubletSeedFinder::Config&>(config));
0210 j["bFieldInZ"].get_to(config.bFieldInZ);
0211 j["minHelixDiameter2"].get_to(config.minHelixDiameter2);
0212 }
0213
0214 void Acts::Experimental::from_json(const nlohmann::json& j,
0215 BroadTripletSeedFinder::Options& options) {
0216 j["bFieldInZ"].get_to(options.bFieldInZ);
0217 j["useStripMeasurementInfo"].get_to(options.useStripMeasurementInfo);
0218 }
0219
0220 void Acts::Experimental::from_json(const nlohmann::json& j,
0221 BroadTripletSeedFinder::TripletCuts& cuts) {
0222 j["minPt"].get_to(cuts.minPt);
0223 j["sigmaScattering"].get_to(cuts.sigmaScattering);
0224 j["radLengthPerSeed"].get_to(cuts.radLengthPerSeed);
0225 j["maxPtScattering"].get_to(cuts.maxPtScattering);
0226 j["impactMax"].get_to(cuts.impactMax);
0227 j["helixCutTolerance"].get_to(cuts.helixCutTolerance);
0228 j["toleranceParam"].get_to(cuts.toleranceParam);
0229 }
0230
0231 void Acts::Experimental::from_json(
0232 const nlohmann::json& j, BroadTripletSeedFinder::DerivedTripletCuts& cuts) {
0233 from_json(j, static_cast<BroadTripletSeedFinder::TripletCuts&>(cuts));
0234 j["bFieldInZ"].get_to(cuts.bFieldInZ);
0235 j["highland"].get_to(cuts.highland);
0236 j["pTPerHelixRadius"].get_to(cuts.pTPerHelixRadius);
0237 j["minHelixDiameter2"].get_to(cuts.minHelixDiameter2);
0238 j["sigmapT2perRadius"].get_to(cuts.sigmapT2perRadius);
0239 j["multipleScattering2"].get_to(cuts.multipleScattering2);
0240 }
0241
0242 void Acts::Experimental::from_json(const nlohmann::json& j,
0243 BroadTripletSeedFilter::Config& config) {
0244 j["deltaInvHelixDiameter"].get_to(config.deltaInvHelixDiameter);
0245 j["deltaRMin"].get_to(config.deltaRMin);
0246 j["compatSeedWeight"].get_to(config.compatSeedWeight);
0247 j["impactWeightFactor"].get_to(config.impactWeightFactor);
0248 j["zOriginWeightFactor"].get_to(config.zOriginWeightFactor);
0249 j["maxSeedsPerSpM"].get_to(config.maxSeedsPerSpM);
0250 j["compatSeedLimit"].get_to(config.compatSeedLimit);
0251 j["seedWeightIncrement"].get_to(config.seedWeightIncrement);
0252 j["numSeedIncrement"].get_to(config.numSeedIncrement);
0253 j["seedConfirmation"].get_to(config.seedConfirmation);
0254 j["centralSeedConfirmationRange"].get_to(config.centralSeedConfirmationRange);
0255 j["forwardSeedConfirmationRange"].get_to(config.forwardSeedConfirmationRange);
0256 j["maxSeedsPerSpMConf"].get_to(config.maxSeedsPerSpMConf);
0257 j["maxQualitySeedsPerSpMConf"].get_to(config.maxQualitySeedsPerSpMConf);
0258 j["useDeltaRinsteadOfTopRadius"].get_to(config.useDeltaRinsteadOfTopRadius);
0259
0260 }
0261
0262 void Acts::Experimental::from_json(const nlohmann::json& j,
0263 CylindricalSpacePointGrid2::Config& config) {
0264 j["minPt"].get_to(config.minPt);
0265 j["rMin"].get_to(config.rMin);
0266 j["rMax"].get_to(config.rMax);
0267 j["zMin"].get_to(config.zMin);
0268 j["zMax"].get_to(config.zMax);
0269 j["deltaRMax"].get_to(config.deltaRMax);
0270 j["cotThetaMax"].get_to(config.cotThetaMax);
0271 j["impactMax"].get_to(config.impactMax);
0272 j["phiMin"].get_to(config.phiMin);
0273 j["phiMax"].get_to(config.phiMax);
0274 j["phiBinDeflectionCoverage"].get_to(config.phiBinDeflectionCoverage);
0275 j["maxPhiBins"].get_to(config.maxPhiBins);
0276 j["zBinEdges"].get_to(config.zBinEdges);
0277 j["rBinEdges"].get_to(config.rBinEdges);
0278 j["bFieldInZ"].get_to(config.bFieldInZ);
0279 if (j.contains("bottomBinFinder")) {
0280 config.bottomBinFinder = ::from_json<3ul>(j["bottomBinFinder"]);
0281 }
0282 if (j.contains("topBinFinder")) {
0283 config.topBinFinder = ::from_json<3ul>(j["topBinFinder"]);
0284 }
0285 j["navigation"].get_to(config.navigation);
0286 }