Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-07-12 07:52:54

0001 // This file is part of the ACTS project.
0002 //
0003 // Copyright (C) 2016 CERN for the benefit of the ACTS project
0004 //
0005 // This Source Code Form is subject to the terms of the Mozilla Public
0006 // License, v. 2.0. If a copy of the MPL was not distributed with this
0007 // file, You can obtain one at https://mozilla.org/MPL/2.0/.
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 }  // namespace
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   // experiment cuts cannot be serialized directly, so we skip it
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   // experiment cuts cannot be serialized directly, so we skip it
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   // experiment cuts cannot be serialized directly, so we skip it
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   // experiment cuts cannot be serialized directly, so we skip it
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 }