1 #ifndef EgammaTowerIsolation_h 2 #define EgammaTowerIsolation_h 35 template <
unsigned int NC>
59 return compute(et, sum, sc, first, last);
65 for (std::size_t
i = 0;
i !=
NCuts; ++
i) {
85 uint32_t*
mem =
nullptr;
87 mem =
new uint32_t[nt * 6];
93 id = (uint32_t*)(st) +
nt;
102 std::atomic<uint32_t>
create = 0;
103 std::atomic<uint32_t>
comp = 0;
104 std::atomic<uint32_t> span = 0;
112 template <
unsigned int NC>
125 for (std::size_t
i = 0;
i !=
NCuts; ++
i) {
133 std::vector<float>
e(
nt);
137 for (std::size_t
k = 0;
k !=
nt; ++
k) {
138 e[
k] = towers[
k].eta();
140 std::push_heap(index, index +
k + 1, [&e](uint32_t
i, uint32_t
j) {
return e[
i] < e[
j]; });
142 std::sort_heap(index, index +
nt, [&e](uint32_t
i, uint32_t
j) {
return e[
i] < e[
j]; });
144 for (std::size_t i = 0; i !=
nt; ++
i) {
146 eta[
i] = towers[
j].eta();
147 phi[
i] = towers[
j].phi();
148 id[
i] = towers[
j].id();
149 st[
i] = 1.f / std::cosh(
eta[i]);
150 he[
i] = towers[
j].hadEnergy();
151 h2[
i] = towers[
j].hadEnergyHeOuterLayer();
155 template <
unsigned int NC>
165 float candEta = sc.
eta();
166 float candPhi = sc.
phi();
169 auto ub = std::upper_bound(lb,
eta +
nt, candEta +
maxEta);
170 uint32_t il = lb -
eta;
171 uint32_t iu =
std::min(
nt, uint32_t(ub - eta + 1));
178 for (std::size_t
i = il;
i != iu; ++
i) {
180 float tt = et ?
st[
i] : 1.f;
181 for (std::size_t
j = 0;
j !=
NCuts; ++
j) {
187 if (
std::find(first, last,
id[i]) == last) {
198 enum HcalDepth { AllDepths = -1, Undefined = 0, Depth1 = 1, Depth2 = 2 };
206 return getSum(
true, sc, detIdToExclude);
210 return getSum(
false, sc, detIdToExclude);
213 const std::vector<CaloTowerDetId>* detIdToExclude =
nullptr)
const {
214 return getSum(
true, *sc, detIdToExclude);
217 return getSum(
false, *sc, detIdToExclude);
221 double getSum(
bool et,
reco::SuperCluster const&
sc,
const std::vector<CaloTowerDetId>* detIdToExclude)
const;
def create(alignables, pedeDump, additionalData, outputFile, config)
EgammaTowerIsolationNew()
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
double getTowerESum(reco::SuperCluster const *sc, const std::vector< CaloTowerDetId > *detIdToExclude=0) const
double eta() const
pseudorapidity of cluster centroid
~EgammaTowerIsolationNew()
void setRadius(float const extRadius[NC], float const intRadius[NC])
static unsigned int NCuts
double getTowerESum(const reco::Candidate *cand, const std::vector< CaloTowerDetId > *detIdToExclude=0) const
constexpr auto deltaR2(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
double getTowerEtSum(const reco::Candidate *cand, const std::vector< CaloTowerDetId > *detIdToExclude=0) const
T get() const
get a component
double getTowerEtSum(reco::SuperCluster const *sc, const std::vector< CaloTowerDetId > *detIdToExclude=0) const
double phi() const
azimuthal angle of cluster centroid
void compute(bool et, Sum &sum, reco::Candidate const &cand, CaloTowerDetId const *first, CaloTowerDetId const *last) const