ATLAS Offline Software
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)
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();
63  continue;
64 
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();
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;
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 }
grepfile.info
info
Definition: grepfile.py:38
egammaCellRecoveryTool::existingCells::existL3
bool existL3[m_nL3]
Definition: egammaCellRecoveryTool.h:49
egammaCellRecoveryTool::m_timeCut
static constexpr double m_timeCut
Definition: egammaCellRecoveryTool.h:38
egammaCellRecoveryTool::execute
virtual StatusCode execute(const xAOD::CaloCluster &cluster, Info &info) const override final
Method to just calculate hadronic leakage.
Definition: egammaCellRecoveryTool.cxx:22
egammaCellRecoveryTool::m_nL3
static const int m_nL3
Definition: egammaCellRecoveryTool.h:45
get_generator_info.result
result
Definition: get_generator_info.py:21
ReadCellNoiseFromCool.cell
cell
Definition: ReadCellNoiseFromCool.py:53
CaloCellPos2Ntuple.int
int
Definition: CaloCellPos2Ntuple.py:24
index
Definition: index.py:1
IegammaCellRecoveryTool::Info
Definition: IegammaCellRecoveryTool.h:36
M_PI
#define M_PI
Definition: ActiveFraction.h:11
AthCommonMsg< AlgTool >::msgLvl
bool msgLvl(const MSG::Level lvl) const
Definition: AthCommonMsg.h:30
egammaCellRecoveryTool::m_phiSize
static constexpr double m_phiSize
Definition: egammaCellRecoveryTool.h:41
xAOD::CaloCluster_v1
Description of a calorimeter cluster.
Definition: CaloCluster_v1.h:59
egammaCellRecoveryTool::initialize
StatusCode initialize() override
initialize method
Definition: egammaCellRecoveryTool.cxx:17
constants.EMB2
int EMB2
Definition: Calorimeter/CaloClusterCorrection/python/constants.py:54
lumiFormat.i
int i
Definition: lumiFormat.py:92
CaloCluster.h
egammaCellRecoveryTool::m_nL2
static const int m_nL2
Definition: egammaCellRecoveryTool.h:44
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
TRT::Hit::layer
@ layer
Definition: HitInfo.h:79
egammaCellRecoveryTool::buildCellArrays
existingCells buildCellArrays(const xAOD::CaloCluster *clus, double etamax, double phimax) const
Definition: egammaCellRecoveryTool.cxx:112
test_pyathena.parent
parent
Definition: test_pyathena.py:15
egammaCellRecoveryTool::existingCells::existL2
bool existL2[m_nL2]
Definition: egammaCellRecoveryTool.h:48
egammaCellRecoveryTool.h
xAOD::CaloCluster_v1::getCellLinks
const CaloClusterCellLink * getCellLinks() const
Get a pointer to the CaloClusterCellLink object (const version)
Definition: CaloCluster_v1.cxx:905
egammaCellRecoveryTool::existingCells
Definition: egammaCellRecoveryTool.h:47
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:192
CaloCell_ID_FCS::EME3
@ EME3
Definition: FastCaloSim_CaloCell_ID.h:26
CaloCellContainer.h
CaloCellContainer
Container class for CaloCell.
Definition: CaloCellContainer.h:55
DeMoScan.index
string index
Definition: DeMoScan.py:362
CaloCell
Data object for each calorimeter readout cell.
Definition: CaloCell.h:57
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
DEBUG
#define DEBUG
Definition: page_access.h:11
AthAlgTool
Definition: AthAlgTool.h:26
CaloCell_ID_FCS::EMB3
@ EMB3
Definition: FastCaloSim_CaloCell_ID.h:22
python.compressB64.c
def c
Definition: compressB64.py:93
egammaCellRecoveryTool::egammaCellRecoveryTool
egammaCellRecoveryTool(const std::string &type, const std::string &name, const IInterface *parent)
Default constructor.
Definition: egammaCellRecoveryTool.cxx:9
constants.EME2
int EME2
Definition: Calorimeter/CaloClusterCorrection/python/constants.py:56