File indexing completed on 2023-03-17 10:49:45
0001 #ifndef EgammaReco_SuperCluster_h
0002 #define EgammaReco_SuperCluster_h
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #include "DataFormats/Math/interface/Point3D.h"
0013 #include "DataFormats/CaloRecHit/interface/CaloCluster.h"
0014 #include "DataFormats/CaloRecHit/interface/CaloClusterFwd.h"
0015 #include "DataFormats/DetId/interface/DetId.h"
0016 #include "DataFormats/EcalDetId/interface/EEDetId.h"
0017 #include "DataFormats/EcalDetId/interface/EBDetId.h"
0018
0019 namespace reco {
0020 class SuperCluster : public CaloCluster {
0021 public:
0022 typedef math::XYZPoint Point;
0023
0024
0025 SuperCluster()
0026 : CaloCluster(0., Point(0., 0., 0.)),
0027 preshowerEnergy_(0),
0028 rawEnergy_(-1.),
0029 phiWidth_(0),
0030 etaWidth_(0),
0031 preshowerEnergy1_(0),
0032 preshowerEnergy2_(0) {}
0033
0034
0035 SuperCluster(double energy, const Point& position);
0036
0037 SuperCluster(double energy,
0038 const Point& position,
0039 const CaloClusterPtr& seed,
0040 const CaloClusterPtrVector& clusters,
0041 double Epreshower = 0.,
0042 double phiWidth = 0.,
0043 double etaWidth = 0.,
0044 double Epreshower1 = 0.,
0045 double Epreshower2 = 0.);
0046
0047
0048 SuperCluster(double energy,
0049 const Point& position,
0050 const CaloClusterPtr& seed,
0051 const CaloClusterPtrVector& clusters,
0052 const CaloClusterPtrVector& preshowerClusters,
0053 double Epreshower = 0.,
0054 double phiWidth = 0.,
0055 double etaWidth = 0.,
0056 double Epreshower1 = 0.,
0057 double Epreshower2 = 0.);
0058
0059
0060 double rawEnergy() const { return rawEnergy_; }
0061
0062
0063 double preshowerEnergy() const { return preshowerEnergy_; }
0064 double preshowerEnergyPlane1() const { return preshowerEnergy1_; }
0065 double preshowerEnergyPlane2() const { return preshowerEnergy2_; }
0066
0067
0068 double phiWidth() const { return phiWidth_; }
0069 double etaWidth() const { return etaWidth_; }
0070
0071
0072 void setPreshowerEnergy(double preshowerEnergy) { preshowerEnergy_ = preshowerEnergy; };
0073 void setPreshowerEnergyPlane1(double preshowerEnergy1) { preshowerEnergy1_ = preshowerEnergy1; };
0074 void setPreshowerEnergyPlane2(double preshowerEnergy2) { preshowerEnergy2_ = preshowerEnergy2; };
0075 void setPhiWidth(double pw) { phiWidth_ = pw; }
0076 void setEtaWidth(double ew) { etaWidth_ = ew; }
0077
0078
0079 const CaloClusterPtr& seed() const { return seed_; }
0080
0081
0082 const CaloClusterPtrVector& clusters() const { return clusters_; }
0083
0084
0085 const CaloClusterPtrVector& preshowerClusters() const { return preshowerClusters_; }
0086
0087
0088 CaloCluster_iterator clustersBegin() const { return clusters_.begin(); }
0089
0090
0091 CaloCluster_iterator clustersEnd() const { return clusters_.end(); }
0092
0093
0094 CaloCluster_iterator preshowerClustersBegin() const { return preshowerClusters_.begin(); }
0095
0096
0097 CaloCluster_iterator preshowerClustersEnd() const { return preshowerClusters_.end(); }
0098
0099
0100 size_t clustersSize() const { return clusters_.size(); }
0101
0102
0103 size_t preshowerClustersSize() const { return preshowerClusters_.size(); }
0104
0105
0106
0107
0108
0109 void setSeed(const CaloClusterPtr& r) { seed_ = r; }
0110
0111
0112 void setClusters(const CaloClusterPtrVector& clusters) {
0113 clusters_ = clusters;
0114 computeRawEnergy();
0115 }
0116
0117
0118 void setPreshowerClusters(const CaloClusterPtrVector& clusters) { preshowerClusters_ = clusters; }
0119
0120
0121 void clearHitsAndFractions() { hitsAndFractions_.clear(); }
0122
0123
0124 void addCluster(const CaloClusterPtr& r) {
0125 clusters_.push_back(r);
0126 computeRawEnergy();
0127 }
0128
0129
0130 void addPreshowerCluster(const CaloClusterPtr& r) { preshowerClusters_.push_back(r); }
0131
0132
0133
0134
0135
0136
0137
0138 void setPreshowerPlanesStatus(const uint32_t& status) {
0139 uint32_t flags = flags_ & flagsMask_;
0140 flags_ = flags | (status << flagsOffset_);
0141 }
0142
0143
0144
0145
0146
0147
0148 const int getPreshowerPlanesStatus() const { return (flags_ >> flagsOffset_); }
0149
0150 const int seedCrysIEtaOrIx() const {
0151 auto detid = seed_->seed();
0152 int ietaorix = 0;
0153 if (detid.subdetId() == EcalBarrel) {
0154 EBDetId ebdetid(detid);
0155 ietaorix = ebdetid.ieta();
0156 } else if (detid.subdetId() == EcalEndcap) {
0157 EEDetId eedetid(detid);
0158 ietaorix = eedetid.ix();
0159 }
0160 return ietaorix;
0161 }
0162
0163 const int seedCrysIPhiOrIy() const {
0164 auto detid = seed_->seed();
0165 int iphioriy = 0;
0166 if (detid.subdetId() == EcalBarrel) {
0167 EBDetId ebdetid(detid);
0168 iphioriy = ebdetid.iphi();
0169 } else if (detid.subdetId() == EcalEndcap) {
0170 EEDetId eedetid(detid);
0171 iphioriy = eedetid.iy();
0172 }
0173 return iphioriy;
0174 }
0175
0176 private:
0177 void computeRawEnergy();
0178
0179
0180 CaloClusterPtr seed_;
0181
0182
0183 CaloClusterPtrVector clusters_;
0184
0185
0186 CaloClusterPtrVector preshowerClusters_;
0187
0188
0189
0190
0191 double preshowerEnergy_;
0192
0193 double rawEnergy_;
0194
0195 double phiWidth_;
0196 double etaWidth_;
0197
0198 double preshowerEnergy1_;
0199 double preshowerEnergy2_;
0200 };
0201
0202 }
0203 #endif