|
| 1 | +/** TRACCC library, part of the ACTS project (R&D line) |
| 2 | + * |
| 3 | + * (c) 2025 CERN for the benefit of the ACTS project |
| 4 | + * |
| 5 | + * Mozilla Public License Version 2.0 |
| 6 | + */ |
| 7 | + |
| 8 | +#include "traccc/gbts_seeding/gbts_seeding_config.hpp" |
| 9 | + |
| 10 | +#include <algorithm> |
| 11 | +#include <ranges> |
| 12 | + |
| 13 | +namespace traccc { |
| 14 | + |
| 15 | +// binTables contains pairs of linked layer-eta bins |
| 16 | +// the layerInfo should really be calculated from the barcodeBinning |
| 17 | +// BarcodeBinning pair is detray barcode and bin index (corrisponding to the |
| 18 | +// layers in layerInfo) minPt in MeV |
| 19 | +bool gbts_seedfinder_config::setLinkingScheme( |
| 20 | + const std::vector<std::pair<int, std::vector<int>>>& input_binTables, |
| 21 | + const device::gbts_layerInfo input_layerInfo, |
| 22 | + std::vector<std::pair<uint64_t, short>>& detrayBarcodeBinning, |
| 23 | + float minPt = 900.0f, |
| 24 | + std::unique_ptr<const traccc::Logger> callers_logger = |
| 25 | + getDummyLogger().clone()) { |
| 26 | + |
| 27 | + TRACCC_LOCAL_LOGGER(std::move(callers_logger)); |
| 28 | + // copy layer-eta binning infomation |
| 29 | + layerInfo = input_layerInfo; |
| 30 | + // unroll binTables |
| 31 | + for (std::pair<int, std::vector<int>> binPairs : input_binTables) { |
| 32 | + for (int bin2 : binPairs.second) { |
| 33 | + binTables.push_back( |
| 34 | + std::make_pair(static_cast<unsigned int>(binPairs.first), |
| 35 | + static_cast<unsigned int>(bin2))); |
| 36 | + } |
| 37 | + } |
| 38 | + |
| 39 | + for (std::pair<int, int> lI : layerInfo.info) |
| 40 | + n_eta_bins = std::max(n_eta_bins, |
| 41 | + static_cast<unsigned int>(lI.first + lI.second)); |
| 42 | + |
| 43 | + // bin by volume |
| 44 | + std::ranges::sort( |
| 45 | + detrayBarcodeBinning, |
| 46 | + [](const std::pair<uint64_t, short> a, |
| 47 | + const std::pair<uint64_t, short> b) { return a.first > b.first; }); |
| 48 | + |
| 49 | + unsigned int largest_volume_index = |
| 50 | + detray::geometry::barcode(detrayBarcodeBinning[0].first).volume(); |
| 51 | + auto current_volume = static_cast<short>(largest_volume_index); |
| 52 | + if (largest_volume_index >= SHRT_MAX) { |
| 53 | + TRACCC_ERROR( |
| 54 | + "volume index to large to fit in type-short GBTS volume to layer " |
| 55 | + "map"); |
| 56 | + return false; |
| 57 | + } |
| 58 | + |
| 59 | + bool layerChange = false; |
| 60 | + short current_layer = detrayBarcodeBinning[0].second; |
| 61 | + |
| 62 | + int split_volumes = 0; |
| 63 | + std::vector<std::pair<short, unsigned int>> volumeToLayerMap_unordered; |
| 64 | + detrayBarcodeBinning.push_back( |
| 65 | + std::make_pair(UINT_MAX, -1)); // end-of-vector element |
| 66 | + std::vector<std::array<unsigned int, 2>> surfacesInVolume; |
| 67 | + for (std::pair<uint64_t, short> barcodeLayerPair : detrayBarcodeBinning) { |
| 68 | + detray::geometry::barcode barcode(barcodeLayerPair.first); |
| 69 | + if (current_volume != static_cast<short>(barcode.volume())) { |
| 70 | + // reached the end of this volume so add it to the maps |
| 71 | + short bin = current_layer; |
| 72 | + if (layerChange) { |
| 73 | + split_volumes++; |
| 74 | + bin = -1 * |
| 75 | + static_cast<short>( |
| 76 | + surfaceToLayerMap.size() + |
| 77 | + 1); // start of this volume's surfaces in the map + 1 |
| 78 | + for (std::array<unsigned int, 2> pair : surfacesInVolume) |
| 79 | + surfaceToLayerMap.push_back(pair); |
| 80 | + } |
| 81 | + volumeToLayerMap_unordered.push_back(std::make_pair( |
| 82 | + bin, current_volume)); // layerIdx if not split, begin-index in |
| 83 | + // the surface map otherwise |
| 84 | + |
| 85 | + current_volume = static_cast<short>(barcode.volume()); |
| 86 | + current_layer = barcodeLayerPair.second; |
| 87 | + layerChange = false; |
| 88 | + surfacesInVolume.clear(); |
| 89 | + } |
| 90 | + // is volume encompassed by a layer |
| 91 | + layerChange |= (current_layer != barcodeLayerPair.second); |
| 92 | + |
| 93 | + // save surfaces incase volume is not encommpassed by a layer |
| 94 | + surfacesInVolume.push_back(std::array<unsigned int, 2>{ |
| 95 | + static_cast<unsigned int>(barcode.index()), |
| 96 | + static_cast<unsigned int>(barcodeLayerPair.second)}); |
| 97 | + } |
| 98 | + // make volume by layer map |
| 99 | + volumeToLayerMap.resize(largest_volume_index + 1); |
| 100 | + for (unsigned int i = 0; i < largest_volume_index + 1; ++i) |
| 101 | + volumeToLayerMap.push_back(SHRT_MAX); |
| 102 | + for (std::pair<short, unsigned int> vLpair : volumeToLayerMap_unordered) |
| 103 | + volumeToLayerMap[vLpair.second] = vLpair.first; |
| 104 | + // scale cuts |
| 105 | + float ptScale = 900.0f / minPt; |
| 106 | + algo_params.min_delta_phi *= ptScale; |
| 107 | + algo_params.dphi_coeff *= ptScale; |
| 108 | + algo_params.min_delta_phi_low_dr *= ptScale; |
| 109 | + algo_params.dphi_coeff_low_dr *= ptScale; |
| 110 | + algo_params.max_Kappa *= ptScale; |
| 111 | + |
| 112 | + // contianers sizes |
| 113 | + nLayers = static_cast<unsigned int>(layerInfo.type.size()); |
| 114 | + |
| 115 | + TRACCC_INFO("volume layer map has " << volumeToLayerMap_unordered.size() |
| 116 | + << " volumes"); |
| 117 | + TRACCC_INFO("The maxium volume index in the layer map is " |
| 118 | + << volumeToLayerMap.size()); |
| 119 | + TRACCC_INFO("surface to layer map has " |
| 120 | + << surfaceToLayerMap.size() << " barcodes from " |
| 121 | + << split_volumes << " multi-layer volumes"); |
| 122 | + TRACCC_INFO("layer info found for " << nLayers << " layers"); |
| 123 | + TRACCC_INFO(binTables.size() << " linked layer-eta bins for GBTS"); |
| 124 | + |
| 125 | + if (nLayers == 0) { |
| 126 | + TRACCC_ERROR("no layers input"); |
| 127 | + return false; |
| 128 | + } else if (volumeToLayerMap.size() == 0) { |
| 129 | + TRACCC_ERROR("empty volume to layer map"); |
| 130 | + return false; |
| 131 | + } else if (surfaceToLayerMap.size() > SHRT_MAX) { |
| 132 | + TRACCC_ERROR("surface to layer map is to large"); |
| 133 | + return false; |
| 134 | + } |
| 135 | + return true; |
| 136 | +} |
| 137 | + |
| 138 | +} // namespace traccc |
0 commit comments