File indexing completed on 2024-04-06 12:20:41
0001 #include "L1Trigger/L1THGCal/interface/backend/HGCalMulticluster_SA.h"
0002
0003 #include <cmath>
0004
0005 using namespace l1thgcfirmware;
0006
0007 HGCalMulticluster::HGCalMulticluster(const HGCalCluster& tc, float fraction) {
0008 HGCalMulticluster();
0009 addConstituent(tc, true, fraction);
0010 }
0011
0012 void HGCalMulticluster::addConstituent(const HGCalCluster& tc, bool updateCentre, float fraction) {
0013
0014 if (constituents_.empty()) {
0015
0016 if (!updateCentre) {
0017 centre_x_ = tc.x();
0018 centre_y_ = tc.y();
0019 centre_z_ = tc.z();
0020 }
0021 }
0022
0023 updateP4AndPosition(tc, updateCentre, fraction);
0024
0025 constituents_.emplace_back(tc);
0026 }
0027
0028 void HGCalMulticluster::updateP4AndPosition(const HGCalCluster& tc, bool updateCentre, float fraction) {
0029
0030 double cMipt = tc.mipPt() * fraction;
0031 double cPt = tc.pt() * fraction;
0032 if (updateCentre) {
0033 float clusterCentre_x = centre_x_ * mipPt_ + tc.x() * cMipt;
0034 float clusterCentre_y = centre_y_ * mipPt_ + tc.y() * cMipt;
0035 float clusterCentre_z = centre_z_ * mipPt_ + tc.z() * cMipt;
0036
0037 if ((mipPt_ + cMipt) > 0) {
0038 clusterCentre_x /= (mipPt_ + cMipt);
0039 clusterCentre_y /= (mipPt_ + cMipt);
0040 clusterCentre_z /= (mipPt_ + cMipt);
0041 }
0042 centre_x_ = clusterCentre_x;
0043 centre_y_ = clusterCentre_y;
0044 centre_z_ = clusterCentre_z;
0045
0046 if (centre_z_ != 0) {
0047 centreProj_x_ = centre_x_ / std::abs(centre_z_);
0048 centreProj_y_ = centre_y_ / std::abs(centre_z_);
0049 centreProj_z_ = centre_z_ / std::abs(centre_z_);
0050 }
0051 }
0052
0053 mipPt_ += cMipt;
0054 sumPt_ += cPt;
0055 }