File indexing completed on 2025-12-17 09:21:33
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include "ActsPlugins/Json/Seeding2ConfigJsonConverter.hpp"
0010
0011 #include "Acts/Utilities/GridBinFinder.hpp"
0012 #include "Acts/Utilities/Helpers.hpp"
0013 #include "ActsPlugins/Json/DefinitionsJsonConverter.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(nlohmann::json& j,
0117 const TripletSeedFinder::Config& config) {
0118 j["minPt"] = config.minPt;
0119 j["sigmaScattering"] = config.sigmaScattering;
0120 j["radLengthPerSeed"] = config.radLengthPerSeed;
0121 j["impactMax"] = config.impactMax;
0122 j["helixCutTolerance"] = config.helixCutTolerance;
0123 j["toleranceParam"] = config.toleranceParam;
0124 j["useStripInfo"] = config.useStripInfo;
0125 j["sortedByCotTheta"] = config.sortedByCotTheta;
0126 }
0127
0128 void Acts::Experimental::to_json(
0129 nlohmann::json& j, const TripletSeedFinder::DerivedConfig& config) {
0130 to_json(j, static_cast<const TripletSeedFinder::Config&>(config));
0131 j["bFieldInZ"] = config.bFieldInZ;
0132 j["highland"] = config.highland;
0133 j["pTPerHelixRadius"] = config.pTPerHelixRadius;
0134 j["minHelixDiameter2"] = config.minHelixDiameter2;
0135 j["sigmapT2perRadius"] = config.sigmapT2perRadius;
0136 j["multipleScattering2"] = config.multipleScattering2;
0137 }
0138
0139 void Acts::Experimental::to_json(nlohmann::json& j,
0140 const BroadTripletSeedFilter::Config& config) {
0141 j["deltaInvHelixDiameter"] = config.deltaInvHelixDiameter;
0142 j["deltaRMin"] = config.deltaRMin;
0143 j["compatSeedWeight"] = config.compatSeedWeight;
0144 j["impactWeightFactor"] = config.impactWeightFactor;
0145 j["zOriginWeightFactor"] = config.zOriginWeightFactor;
0146 j["maxSeedsPerSpM"] = config.maxSeedsPerSpM;
0147 j["compatSeedLimit"] = config.compatSeedLimit;
0148 j["seedWeightIncrement"] = config.seedWeightIncrement;
0149 j["numSeedIncrement"] = config.numSeedIncrement;
0150 j["seedConfirmation"] = config.seedConfirmation;
0151 j["centralSeedConfirmationRange"] = config.centralSeedConfirmationRange;
0152 j["forwardSeedConfirmationRange"] = config.forwardSeedConfirmationRange;
0153 j["maxSeedsPerSpMConf"] = config.maxSeedsPerSpMConf;
0154 j["maxQualitySeedsPerSpMConf"] = config.maxQualitySeedsPerSpMConf;
0155 j["useDeltaRinsteadOfTopRadius"] = config.useDeltaRinsteadOfTopRadius;
0156
0157 }
0158
0159 void Acts::Experimental::to_json(
0160 nlohmann::json& j, const CylindricalSpacePointGrid2::Config& config) {
0161 j["minPt"] = config.minPt;
0162 j["rMin"] = config.rMin;
0163 j["rMax"] = config.rMax;
0164 j["zMin"] = config.zMin;
0165 j["zMax"] = config.zMax;
0166 j["deltaRMax"] = config.deltaRMax;
0167 j["cotThetaMax"] = config.cotThetaMax;
0168 j["impactMax"] = config.impactMax;
0169 j["phiMin"] = config.phiMin;
0170 j["phiMax"] = config.phiMax;
0171 j["phiBinDeflectionCoverage"] = config.phiBinDeflectionCoverage;
0172 j["maxPhiBins"] = config.maxPhiBins;
0173 j["zBinEdges"] = config.zBinEdges;
0174 j["rBinEdges"] = config.rBinEdges;
0175 j["bFieldInZ"] = config.bFieldInZ;
0176 if (config.bottomBinFinder.has_value()) {
0177 ::to_json(j["bottomBinFinder"], config.bottomBinFinder.value());
0178 }
0179 if (config.topBinFinder.has_value()) {
0180 ::to_json(j["topBinFinder"], config.topBinFinder.value());
0181 }
0182 j["navigation"] = config.navigation;
0183 }
0184
0185 void Acts::Experimental::from_json(const nlohmann::json& j,
0186 DoubletSeedFinder::Config& config) {
0187 j["candidateDirection"].get_to(config.candidateDirection);
0188 j["deltaRMin"].get_to(config.deltaRMin);
0189 j["deltaRMax"].get_to(config.deltaRMax);
0190 j["deltaZMin"].get_to(config.deltaZMin);
0191 j["deltaZMax"].get_to(config.deltaZMax);
0192 j["impactMax"].get_to(config.impactMax);
0193 j["interactionPointCut"].get_to(config.interactionPointCut);
0194 j["collisionRegionMin"].get_to(config.collisionRegionMin);
0195 j["collisionRegionMax"].get_to(config.collisionRegionMax);
0196 j["cotThetaMax"].get_to(config.cotThetaMax);
0197 j["minPt"].get_to(config.minPt);
0198 j["helixCutTolerance"].get_to(config.helixCutTolerance);
0199
0200 }
0201
0202 void Acts::Experimental::from_json(const nlohmann::json& j,
0203 DoubletSeedFinder::DerivedConfig& config) {
0204 from_json(j, static_cast<DoubletSeedFinder::Config&>(config));
0205 j["bFieldInZ"].get_to(config.bFieldInZ);
0206 j["minHelixDiameter2"].get_to(config.minHelixDiameter2);
0207 }
0208
0209 void Acts::Experimental::from_json(const nlohmann::json& j,
0210 TripletSeedFinder::Config& config) {
0211 j["minPt"].get_to(config.minPt);
0212 j["sigmaScattering"].get_to(config.sigmaScattering);
0213 j["radLengthPerSeed"].get_to(config.radLengthPerSeed);
0214 j["impactMax"].get_to(config.impactMax);
0215 j["helixCutTolerance"].get_to(config.helixCutTolerance);
0216 j["toleranceParam"].get_to(config.toleranceParam);
0217 j["useStripInfo"].get_to(config.useStripInfo);
0218 j["sortedByCotTheta"].get_to(config.sortedByCotTheta);
0219 }
0220
0221 void Acts::Experimental::from_json(const nlohmann::json& j,
0222 TripletSeedFinder::DerivedConfig& config) {
0223 from_json(j, static_cast<TripletSeedFinder::Config&>(config));
0224 j["bFieldInZ"].get_to(config.bFieldInZ);
0225 j["highland"].get_to(config.highland);
0226 j["pTPerHelixRadius"].get_to(config.pTPerHelixRadius);
0227 j["minHelixDiameter2"].get_to(config.minHelixDiameter2);
0228 j["sigmapT2perRadius"].get_to(config.sigmapT2perRadius);
0229 j["multipleScattering2"].get_to(config.multipleScattering2);
0230 }
0231
0232 void Acts::Experimental::from_json(const nlohmann::json& j,
0233 BroadTripletSeedFilter::Config& config) {
0234 j["deltaInvHelixDiameter"].get_to(config.deltaInvHelixDiameter);
0235 j["deltaRMin"].get_to(config.deltaRMin);
0236 j["compatSeedWeight"].get_to(config.compatSeedWeight);
0237 j["impactWeightFactor"].get_to(config.impactWeightFactor);
0238 j["zOriginWeightFactor"].get_to(config.zOriginWeightFactor);
0239 j["maxSeedsPerSpM"].get_to(config.maxSeedsPerSpM);
0240 j["compatSeedLimit"].get_to(config.compatSeedLimit);
0241 j["seedWeightIncrement"].get_to(config.seedWeightIncrement);
0242 j["numSeedIncrement"].get_to(config.numSeedIncrement);
0243 j["seedConfirmation"].get_to(config.seedConfirmation);
0244 j["centralSeedConfirmationRange"].get_to(config.centralSeedConfirmationRange);
0245 j["forwardSeedConfirmationRange"].get_to(config.forwardSeedConfirmationRange);
0246 j["maxSeedsPerSpMConf"].get_to(config.maxSeedsPerSpMConf);
0247 j["maxQualitySeedsPerSpMConf"].get_to(config.maxQualitySeedsPerSpMConf);
0248 j["useDeltaRinsteadOfTopRadius"].get_to(config.useDeltaRinsteadOfTopRadius);
0249
0250 }
0251
0252 void Acts::Experimental::from_json(const nlohmann::json& j,
0253 CylindricalSpacePointGrid2::Config& config) {
0254 j["minPt"].get_to(config.minPt);
0255 j["rMin"].get_to(config.rMin);
0256 j["rMax"].get_to(config.rMax);
0257 j["zMin"].get_to(config.zMin);
0258 j["zMax"].get_to(config.zMax);
0259 j["deltaRMax"].get_to(config.deltaRMax);
0260 j["cotThetaMax"].get_to(config.cotThetaMax);
0261 j["impactMax"].get_to(config.impactMax);
0262 j["phiMin"].get_to(config.phiMin);
0263 j["phiMax"].get_to(config.phiMax);
0264 j["phiBinDeflectionCoverage"].get_to(config.phiBinDeflectionCoverage);
0265 j["maxPhiBins"].get_to(config.maxPhiBins);
0266 j["zBinEdges"].get_to(config.zBinEdges);
0267 j["rBinEdges"].get_to(config.rBinEdges);
0268 j["bFieldInZ"].get_to(config.bFieldInZ);
0269 if (j.contains("bottomBinFinder")) {
0270 config.bottomBinFinder = ::from_json<3ul>(j["bottomBinFinder"]);
0271 }
0272 if (j.contains("topBinFinder")) {
0273 config.topBinFinder = ::from_json<3ul>(j["topBinFinder"]);
0274 }
0275 j["navigation"].get_to(config.navigation);
0276 }