ATLAS Offline Software
Loading...
Searching...
No Matches
egammaCellRecoveryTool.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
4
8
10 const std::string& name,
11 const IInterface* parent)
12 : AthAlgTool(type, name, parent){
13 // declare Interface
14 declareInterface<IegammaCellRecoveryTool>(this);
15}
16
18 ATH_MSG_DEBUG("Initializing egammaCellRecoveryTool");
19 return StatusCode::SUCCESS;
20}
21
23 Info& info) const {
24
25 double etamax = info.etamax;
26 double phimax = info.phimax;
27 ATH_MSG_DEBUG("etamax = " << etamax << " phimax = " << phimax);
28 info.addedCells.reserve(10);
29
30 // Build rectangular cluster arount it (and also in L3)
32 buildCellArrays(&cluster,etamax,phimax);
33
34 //Now compare with the cells stored in the CaloCell container
35 // and compute the energy from missed cells
36
37 // define required size = 3x7 in barrel and 5x7 in endcap for layer 2
38 int iphi1 = 0, iphi2 = 6;
39 int ieta1 = 0, ieta2 = 4;
40 if (std::abs(etamax) < 1.475) {
41 ieta1 = 1;
42 ieta2 = 3;
43 }
44
45 const CaloCellContainer *caloCells = cluster.getCellLinks()->getCellContainer();
46 for (const auto * cell : *caloCells) {
47 if (!cell->caloDDE()) {
48 ATH_MSG_WARNING("Calo cell without detector element ?? eta = "
49 << cell->eta() << " phi = " << cell->phi());
50 continue;
51 }
52
53 double deta = cell->caloDDE()->eta_raw()-etamax;
54 double dphi = cell->caloDDE()->phi_raw()-phimax;
55 if (dphi < -M_PI) dphi += 2*M_PI;
56 if (dphi > M_PI) dphi -= 2*M_PI;
57
58 if (std::abs(deta) > 0.1 || std::abs(dphi) > 0.1) continue;
59
60 int layer = cell->caloDDE()->getSampling();
61 if (layer != CaloSampling::EMB2 && layer != CaloSampling::EME2 &&
62 layer != CaloSampling::EMB3 && layer != CaloSampling::EME3)
63 continue;
64
65 if ((layer == CaloSampling::EMB2 || layer == CaloSampling::EME2) &&
66 std::abs(deta) < 0.07 && std::abs(dphi) < 0.085) {
67 int ieta = (int)((deta+0.052)/0.025);
68 int iphi = (int)((dphi+0.075)/m_phiSize);
69 if (ieta >= ieta1 && ieta <= ieta2 && iphi >= iphi1 && iphi <= iphi2) {
70 int index = 7*ieta+iphi;
71 if (!arrayCells.existL2[index]) {
72 if (std::abs(cell->time()) > m_timeCut) {
73 info.nCells[0]++;
74 info.eCells[0] += cell->energy();
75 info.addedCells.push_back(cell);
76 } // would have been rejected by time cut
77 } // cell not in cluster
78 } // eta-phi window cut
79 } else if ((layer == CaloSampling::EMB3 || layer == CaloSampling::EME3) &&
80 std::abs(deta) < 0.05 && std::abs(dphi) < 0.06) {
81 int ieta = (int)(std::abs(deta)/0.025);
82 int iphi = (int)((dphi+0.05)/m_phiSize);
83 if (ieta <= 1 && iphi >= 0 && iphi <= 4) {
84 int index = 5*ieta+iphi;
85 if (!arrayCells.existL3[index]) {
86 if (std::abs(cell->time()) > m_timeCut) {
87 info.nCells[1]++;
88 info.eCells[1] += cell->energy();
89 info.addedCells.push_back(cell);
90 }
91 }
92 }
93 }
94 } // loop over cell container
95
96 if (msgLvl(MSG::DEBUG)) {
97
98 ATH_MSG_DEBUG("Added cells in L2, n = " << info.nCells[0] << " E = " << info.eCells[0]
99 << " and in L3, n = " << info.nCells[1] << " E = " << info.eCells[1]
100 << " n(L2+L3) = " << info.addedCells.size());
101
102 for (const auto *c : info.addedCells) {
103 ATH_MSG_DEBUG("cell layer " << c->caloDDE()->getSampling() << " E = " << c->energy()
104 << " eta = " << c->caloDDE()->eta_raw()
105 << " phi = " << c->caloDDE()->phi_raw());
106 }
107 }
108
109 return StatusCode::SUCCESS;
110}
111
113 const xAOD::CaloCluster* cluster, double etamax, double phimax) const {
114
116 // Just to be sure. But should not be needed
117 for (int i = 0; i < m_nL2; i++)
118 { result.existL2[i] = 0; }
119 for (int i = 0; i < m_nL3; i++)
120 { result.existL3[i] = 0; }
121
122 const CaloClusterCellLink* cellLinks = cluster->getCellLinks();
123 if (!cellLinks) {
124 ATH_MSG_WARNING("No cell link for cluster. Do nothing");
125 return result;
126 }
127
128 CaloClusterCellLink::const_iterator it_cell = cellLinks->begin(),
129 it_cell_e = cellLinks->end();
130
131 for (; it_cell != it_cell_e; ++it_cell) {
132 const CaloCell* cell = (*it_cell);
133 if (cell) {
134 if (!cell->caloDDE()) {
135 ATH_MSG_WARNING("Calo cell without detector element ?? eta = "
136 << cell->eta() << " phi = " << cell->phi());
137 continue;
138 }
139 int layer = cell->caloDDE()->getSampling();
140 if (layer != CaloSampling::EMB2 && layer != CaloSampling::EME2 &&
141 layer != CaloSampling::EMB3 && layer != CaloSampling::EME3)
142 continue;
143
144 double deta = cell->caloDDE()->eta_raw() - etamax;
145 double dphi = cell->caloDDE()->phi_raw() - phimax;
146 if (dphi < -M_PI) dphi += 2*M_PI;
147 if (dphi > M_PI) dphi -= 2*M_PI;
148 if ((layer == CaloSampling::EMB2 || layer == CaloSampling::EME2) &&
149 std::abs(deta) < 0.07 && std::abs(dphi) < 0.085) {
150 int ieta = (int)((deta+0.052)/0.025);
151 int iphi = (int)((dphi+0.075)/m_phiSize);
152 if (ieta < 0 || ieta > 4 || iphi < 0 || iphi > 6) {
153 ATH_MSG_WARNING("Should never happen ieta = " << ieta
154 << " iphi = " << iphi);
155 } else {
156 int index = 7*ieta+iphi;
157 result.existL2[index] = true;
158 }
159 } else if ((layer == CaloSampling::EMB3 || layer == CaloSampling::EME3) &&
160 std::abs(deta) < 0.05 && std::abs(dphi) < 0.06) {
161 int ieta = (int)(std::abs(deta)/0.025);
162 int iphi = (int)((dphi+0.05)/m_phiSize);
163 if (ieta > 1 || iphi < 0 || iphi > 4) {
164 ATH_MSG_WARNING("Should never happen ieta = " << ieta
165 << " iphi = " << iphi);
166 } else {
167 int index = 5*ieta+iphi;
168 result.existL3[index] = true;
169 }
170 } // L2 or L3, in window vs max
171 } // cell exists
172 } // loop over cells
173
174 return result;
175}
#define M_PI
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
bool msgLvl(const MSG::Level lvl) const
Container class for CaloCell.
Data object for each calorimeter readout cell.
Definition CaloCell.h:57
virtual StatusCode execute(const xAOD::CaloCluster &cluster, Info &info) const override final
Method to just calculate hadronic leakage.
egammaCellRecoveryTool(const std::string &type, const std::string &name, const IInterface *parent)
Default constructor.
StatusCode initialize() override
initialize method
static constexpr double m_phiSize
static constexpr double m_timeCut
existingCells buildCellArrays(const xAOD::CaloCluster *clus, double etamax, double phimax) const
const CaloClusterCellLink * getCellLinks() const
Get a pointer to the CaloClusterCellLink object (const version)
Definition index.py:1
CaloCluster_v1 CaloCluster
Define the latest version of the calorimeter cluster class.