7 : dr_(conf.getParameter<double>(
"dR_multicluster")),
8 dr_byLayer_coefficientA_(conf.existsAs<
std::vector<double>>(
"dR_multicluster_byLayer_coefficientA")
9 ? conf.getParameter<
std::vector<double>>(
"dR_multicluster_byLayer_coefficientA")
10 :
std::vector<double>()),
11 dr_byLayer_coefficientB_(conf.existsAs<
std::vector<double>>(
"dR_multicluster_byLayer_coefficientB")
12 ? conf.getParameter<
std::vector<double>>(
"dR_multicluster_byLayer_coefficientB")
13 :
std::vector<double>()),
14 ptC3dThreshold_(conf.getParameter<double>(
"minPt_multicluster")),
15 cluster_association_input_(conf.getParameter<
string>(
"cluster_association")),
27 <<
"Multicluster dR: " <<
dr_ <<
"\nMulticluster minimum transverse-momentum: " <<
ptC3dThreshold_;
29 id_ = std::unique_ptr<HGCalTriggerClusterIdentificationBase>{
40 const std::vector<std::pair<GlobalPoint, double>>& seeds)
const {
41 std::map<int, l1t::HGCalMulticluster> mapSeedMulticluster;
42 std::vector<l1t::HGCalMulticluster> multiclustersTmp;
44 for (
const auto& clu : clustersPtrs) {
47 double radiusCoefficientA =
49 double radiusCoefficientB =
52 double minDist = radiusCoefficientA + radiusCoefficientB * (
kMidRadius_ -
std::abs(clu->eta()));
54 std::vector<pair<int, double>> targetSeedsEnergy;
58 double seedEnergy = seeds[
iseed].second;
60 if (z_side * seedPosition.
z() < 0)
66 targetSeedsEnergy.emplace_back(
iseed, seedEnergy);
70 if (targetSeedsEnergy.empty()) {
71 targetSeedsEnergy.emplace_back(
iseed, seedEnergy);
73 targetSeedsEnergy.at(0).first =
iseed;
74 targetSeedsEnergy.at(0).second = seedEnergy;
80 if (targetSeedsEnergy.empty())
83 double totalTargetSeedEnergy = 0;
84 for (
const auto&
energy : targetSeedsEnergy) {
85 totalTargetSeedEnergy +=
energy.second;
88 for (
const auto&
energy : targetSeedsEnergy) {
89 double seedWeight = 1;
91 seedWeight =
energy.second / totalTargetSeedEnergy;
92 if (mapSeedMulticluster[
energy.first].size() == 0) {
95 mapSeedMulticluster[
energy.first].addConstituent(clu,
true, seedWeight);
100 for (
const auto& mclu : mapSeedMulticluster)
101 multiclustersTmp.emplace_back(mclu.second);
103 return multiclustersTmp;
107 const std::vector<std::pair<GlobalPoint, double>>& seedPositionsEnergy,
111 std::vector<l1t::HGCalMulticluster> multiclustersTmp =
clusterSeedMulticluster(clustersPtrs, seedPositionsEnergy);
119 for (
auto& multicluster : multiclusters_in) {
122 double sumPt = multicluster.sumPt();
125 multicluster.setP4(multiclusterP4);
131 multicluster.setHwQual(
id_->decision(multicluster));
133 multicluster.saveHOverE();
135 multiclusters_out.
push_back(0, multicluster);
T getParameter(std::string const &) const
void finalizeClusters(std::vector< l1t::HGCalMulticluster > &, l1t::HGCalMulticlusterBxCollection &, const HGCalTriggerGeometryBase &) const
T mag() const
The vector magnitude. Equivalent to sqrt(vec.mag2())
std::unique_ptr< HGCalTriggerClusterIdentificationBase > id_
static double kMidRadius_
const GlobalPoint & centreProj() const
std::vector< l1t::HGCalMulticluster > clusterSeedMulticluster(const std::vector< edm::Ptr< l1t::HGCalCluster >> &clustersPtrs, const std::vector< std::pair< GlobalPoint, double >> &seeds) const
PtEtaPhiMLorentzVectorD PtEtaPhiMLorentzVector
Lorentz vector with cartesian internal representation.
HGCalTriggerTools triggerTools_
std::string cluster_association_input_
void clusterizeHisto(const std::vector< edm::Ptr< l1t::HGCalCluster >> &clustersPtr, const std::vector< std::pair< GlobalPoint, double >> &seedPositionsEnergy, const HGCalTriggerGeometryBase &triggerGeometry, l1t::HGCalMulticlusterBxCollection &multiclusters) const
Abs< T >::type abs(const T &t)
std::vector< double > dr_byLayer_coefficientB_
float dR(const l1t::HGCalCluster &clu, const GlobalPoint &seed) const
HGCalHistoClusteringImpl(const edm::ParameterSet &conf)
ClusterAssociationStrategy cluster_association_strategy_
void fillShapes(l1t::HGCalMulticluster &, const HGCalTriggerGeometryBase &) const
std::vector< double > dr_byLayer_coefficientA_
void push_back(int bx, T object)