File indexing completed on 2024-04-06 12:20:41
0001 #include "L1Trigger/L1THGCal/interface/backend/HGCalHistoClusteringImpl_SA.h"
0002
0003 #include <map>
0004 #include <cmath>
0005
0006 std::vector<l1thgcfirmware::HGCalMulticluster> HGCalHistoClusteringImplSA::clusterSeedMulticluster_SA(
0007 const std::vector<l1thgcfirmware::HGCalCluster>& clusters,
0008 const std::vector<l1thgcfirmware::HGCalSeed>& seeds,
0009 std::vector<l1thgcfirmware::HGCalCluster>& rejected_clusters,
0010 const l1thgcfirmware::ClusterAlgoConfig& configuration) const {
0011 std::map<int, l1thgcfirmware::HGCalMulticluster> mapSeedMulticluster;
0012 std::vector<l1thgcfirmware::HGCalMulticluster> multiclustersOut;
0013
0014 for (const auto& clu : clusters) {
0015 int z_side = clu.zside();
0016
0017 double radiusCoefficientA = configuration.dr_byLayer_coefficientA().empty()
0018 ? configuration.dr()
0019 : configuration.dr_byLayer_coefficientA()[clu.layer()];
0020 double radiusCoefficientB =
0021 configuration.dr_byLayer_coefficientB().empty() ? 0 : configuration.dr_byLayer_coefficientB()[clu.layer()];
0022
0023 double minDistSqrd = radiusCoefficientA + radiusCoefficientB * (configuration.midRadius() - std::abs(clu.eta()));
0024 minDistSqrd *= minDistSqrd;
0025
0026 std::vector<std::pair<int, double>> targetSeedsEnergy;
0027
0028 unsigned int iseed = 0;
0029 for (const auto& seed : seeds) {
0030 if (z_side * seed.z() < 0) {
0031 ++iseed;
0032 continue;
0033 }
0034
0035 double seedEnergy = seed.energy();
0036
0037 double d = (clu.x() - seed.x()) * (clu.x() - seed.x()) + (clu.y() - seed.y()) * (clu.y() - seed.y());
0038
0039 if (d < minDistSqrd) {
0040
0041 minDistSqrd = d;
0042
0043 if (targetSeedsEnergy.empty()) {
0044 targetSeedsEnergy.emplace_back(iseed, seedEnergy);
0045 } else {
0046 targetSeedsEnergy.at(0).first = iseed;
0047 targetSeedsEnergy.at(0).second = seedEnergy;
0048 }
0049 }
0050 ++iseed;
0051 }
0052
0053 if (targetSeedsEnergy.empty()) {
0054 rejected_clusters.emplace_back(clu);
0055 continue;
0056 }
0057
0058
0059
0060
0061
0062
0063 for (const auto& energy : targetSeedsEnergy) {
0064 double seedWeight = 1;
0065 if (mapSeedMulticluster[energy.first].size() == 0) {
0066 mapSeedMulticluster[energy.first] = l1thgcfirmware::HGCalMulticluster(clu, 1);
0067 } else {
0068 mapSeedMulticluster[energy.first].addConstituent(clu, true, seedWeight);
0069 }
0070 }
0071 }
0072
0073 multiclustersOut.reserve(mapSeedMulticluster.size());
0074 for (const auto& mclu : mapSeedMulticluster)
0075 multiclustersOut.emplace_back(mclu.second);
0076
0077 return multiclustersOut;
0078 }
0079
0080 void HGCalHistoClusteringImplSA::finalizeClusters_SA(
0081 const std::vector<l1thgcfirmware::HGCalMulticluster>& multiclusters_in,
0082 const std::vector<l1thgcfirmware::HGCalCluster>& rejected_clusters_in,
0083 std::vector<l1thgcfirmware::HGCalMulticluster>& multiclusters_out,
0084 std::vector<l1thgcfirmware::HGCalCluster>& rejected_clusters_out,
0085 const l1thgcfirmware::ClusterAlgoConfig& configuration) const {
0086 for (const auto& tc : rejected_clusters_in) {
0087 rejected_clusters_out.push_back(tc);
0088 }
0089
0090 for (const auto& multicluster : multiclusters_in) {
0091 if (multicluster.sumPt() > configuration.ptC3dThreshold()) {
0092 multiclusters_out.push_back(multicluster);
0093 } else {
0094 for (const auto& tc : multicluster.constituents()) {
0095 rejected_clusters_out.push_back(tc);
0096 }
0097 }
0098 }
0099 }