ATLAS Offline Software
CaloCellList.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 // Given an input eta,phi, deta,dphi - this class will return you
6 // either an iterator over a list of cells (pointers) in this cone
7 // and the total cell energy of the cells in this cone.
8 // (11/10/2004) Method added: returns number of strips for an input
9 // eta,phi,ncell_eta,ncell_phi. The List of cells replaced by
10 // the Vector of cells.
11 
12 #include "CaloUtils/CaloCellList.h"
14 #include "CaloEvent/CaloCell.h"
16 #include "CaloGeoHelpers/CaloSampling.h"
17 #include "CaloGeoHelpers/proxim.h"
18 
19 #include <cmath>
20 
21 namespace {
22 inline double
23 square(double x)
24 {
25  return x * x;
26 }
27 }
28 
30  : m_cellcont(*cell_container)
31  , m_mgr(*mgr)
32  , m_energy(0)
33  , m_et(0)
34 {
35  m_caloNums.clear();
36  // NSUBCALO indicate take them all
38 }
39 
41  : m_cellcont(cell_container)
42  , m_mgr(mgr)
43  , m_energy(0)
44  , m_et(0)
45 {
46  m_caloNums.clear();
47  // NSUBCALO indicate take them all
49 }
50 
51 // specify one calo number
53  : m_cellcont(*cell_container)
54  , m_mgr(*mgr)
55  , m_energy(0)
56  , m_et(0)
57 {
58  m_caloNums.clear();
59  m_caloNums.push_back(caloNum);
60 }
61 
62 // specify a vector of calonumber
63 // (if all calo it is more efficient to not specify anything)
65  const std::vector<CaloCell_ID::SUBCALO>& caloNums)
66  : m_cellcont(*cell_container)
67  , m_mgr(*mgr)
68  , m_energy(0)
69  , m_et(0)
70 
71 {
72  m_caloNums.clear();
73  std::copy(caloNums.begin(), caloNums.end(), back_inserter(m_caloNums));
74 }
75 
76 
77 void
78 CaloCellList::select(double eta, double phi, double deta, double dphi)
79 {
80  doSelect(eta, phi, deta, dphi, -1);
81 }
82 
83 void
84 CaloCellList::select(double eta, double phi, double deta, double dphi, int sam)
85 {
86  doSelect(eta, phi, deta, dphi, -1, static_cast<CaloCell_ID::CaloSample>(sam));
87 }
88 
89 void
90 CaloCellList::select(double eta, double phi, double dR)
91 {
92  doSelect(eta, phi, dR, dR, dR);
93 }
94 
95 void
96 CaloCellList::select(double eta, double phi, double dR, int sam)
97 {
98  doSelect(eta, phi, dR, dR, dR, static_cast<CaloCell_ID::CaloSample>(sam));
99 }
100 
101 void
103  double phi,
104  double deta,
105  double dphi,
106  double dR,
107  CaloCell_ID::CaloSample sam /*= CaloCell_ID::Unknown*/)
108 {
109 
110  m_theCellVector.clear();
111  m_energy = 0;
112  m_et = 0;
113  m_nBadT0 = 0;
114  m_nBadT12 = 0;
115  if (m_cellcont.empty()){
116  return;
117  }
118  std::vector<IdentifierHash> calo_mgr_vect;
119  std::vector<CaloCell_ID::SUBCALO>::const_iterator itrCaloNum = m_caloNums.begin();
120  std::vector<CaloCell_ID::SUBCALO>::const_iterator itrEndCaloNum = m_caloNums.end();
121 
122  double dR2 = dR*dR;
123 
124  for (; itrCaloNum != itrEndCaloNum; ++itrCaloNum) {
125  CaloCell_ID::SUBCALO caloNum = *itrCaloNum;
126  if (sam != CaloCell_ID::Unknown) {
127  m_mgr.cellsInZone(eta - deta, eta + deta, phi - dphi, phi + dphi, sam, calo_mgr_vect);
128  itrCaloNum = itrEndCaloNum - 1;
129  } else if (caloNum == CaloCell_ID::NSUBCALO) {
130  m_mgr.cellsInZone(eta - deta, eta + deta, phi - dphi, phi + dphi, calo_mgr_vect);
131  } else if (caloNum != CaloCell_ID::NOT_VALID) {
132  m_mgr.cellsInZone(eta - deta, eta + deta, phi - dphi, phi + dphi, caloNum, calo_mgr_vect);
133  } else {
134  continue;
135  }
136  m_theCellVector.reserve(m_theCellVector.size() + calo_mgr_vect.size());
137 
138  for (unsigned int i = 0; i < calo_mgr_vect.size(); i++) {
139  const CaloCell* cell = m_cellcont.findCell(calo_mgr_vect[i]);
140  if (cell) {
141  double pphi = proxim(cell->phi(), phi);
142  if ( (dR > 0 && square(eta - cell->eta()) + square(pphi - phi) < dR2) ||
143  (dR < 0 && std::fabs(eta - cell->eta()) < deta && std::fabs(phi - pphi) < dphi) ) {
144  m_theCellVector.push_back(cell);
145  m_energy += cell->energy();
146  m_et += cell->et();
147  if (cell->badcell()) {
148  if (sam == CaloCell_ID::TileBar0 || sam == CaloCell_ID::TileExt0)
149  m_nBadT0++;
150  else if (sam == CaloCell_ID::TileBar1 || sam == CaloCell_ID::TileExt1 ||
151  sam == CaloCell_ID::TileBar2 || sam == CaloCell_ID::TileExt2 ||
153  m_nBadT12++;
154  }
155  }
156  }
157  }
158  } // end loop on calorimeters
159 }
160 
GetLCDefs::Unknown
@ Unknown
Definition: GetLCDefs.h:21
CaloCellList::CaloCellList
CaloCellList()=delete
CaloCellList::m_theCellVector
vector_type m_theCellVector
Definition: CaloCellList.h:81
CaloCell_ID_FCS::TileExt2
@ TileExt2
Definition: FastCaloSim_CaloCell_ID.h:39
ReadCellNoiseFromCool.cell
cell
Definition: ReadCellNoiseFromCool.py:53
phi
Scalar phi() const
phi method
Definition: AmgMatrixBasePlugin.h:67
CaloCellList::select
void select(double eta, double phi, double deta, double dphi)
Definition: CaloCellList.cxx:78
eta
Scalar eta() const
pseudorapidity method
Definition: AmgMatrixBasePlugin.h:83
CaloCellList.h
CaloCell_ID_FCS::TileExt0
@ TileExt0
Definition: FastCaloSim_CaloCell_ID.h:37
CaloCell_ID_FCS::TileBar1
@ TileBar1
Definition: FastCaloSim_CaloCell_ID.h:32
proxim
double proxim(double b, double a)
Definition: proxim.h:17
CaloCell.h
x
#define x
CaloDetDescrManager.h
Definition of CaloDetDescrManager.
BchCleanup.mgr
mgr
Definition: BchCleanup.py:294
proxim.h
lumiFormat.i
int i
Definition: lumiFormat.py:85
CaloSampling::CaloSample
CaloSample
Definition: Calorimeter/CaloGeoHelpers/CaloGeoHelpers/CaloSampling.h:22
CaloCell_ID_FCS::TileBar0
@ TileBar0
Definition: FastCaloSim_CaloCell_ID.h:31
CaloCellList::m_nBadT12
unsigned short m_nBadT12
Definition: CaloCellList.h:84
CaloCell_ID_FCS::TileGap2
@ TileGap2
Definition: FastCaloSim_CaloCell_ID.h:35
CaloCell_Base_ID::SUBCALO
SUBCALO
enumeration of sub calorimeters
Definition: CaloCell_Base_ID.h:43
CaloCellList::doSelect
void doSelect(double eta, double phi, double deta, double dphi, double dR, CaloCell_ID::CaloSample sam=CaloCell_ID::Unknown)
Definition: CaloCellList.cxx:102
CaloCellList::m_mgr
const CaloDetDescrManager & m_mgr
Definition: CaloCellList.h:79
CaloDetDescrManager_Base::cellsInZone
void cellsInZone(double eta_min, double eta_max, double phi_min, double phi_max, std::vector< IdentifierHash > &cell_list) const
the only client is CaloCellList class
Definition: CaloDetDescrManager.cxx:793
CaloCell_ID_FCS::TileGap1
@ TileGap1
Definition: FastCaloSim_CaloCell_ID.h:34
CaloCellList::m_caloNums
std::vector< CaloCell_ID::SUBCALO > m_caloNums
Definition: CaloCellList.h:80
CaloCellContainer::findCell
const CaloCell * findCell(const IdentifierHash theHash) const
fast find method given identifier hash.
Definition: CaloCellContainer.cxx:345
CaloCell_ID_FCS::TileExt1
@ TileExt1
Definition: FastCaloSim_CaloCell_ID.h:38
CaloCellList::m_cellcont
const CaloCellContainer & m_cellcont
Definition: CaloCellList.h:78
CaloCellContainer.h
CaloCellContainer
Container class for CaloCell.
Definition: CaloCellContainer.h:55
CaloDetDescrManager
This class provides the client interface for accessing the detector description information common to...
Definition: CaloDetDescrManager.h:473
CaloCell
Data object for each calorimeter readout cell.
Definition: CaloCell.h:57
CaloCellList::m_nBadT0
unsigned short m_nBadT0
Definition: CaloCellList.h:84
CaloCellList::m_energy
double m_energy
Definition: CaloCellList.h:82
CaloCellList::m_et
double m_et
Definition: CaloCellList.h:83
CaloCell_Base_ID::NSUBCALO
@ NSUBCALO
Definition: CaloCell_Base_ID.h:43
calibdata.copy
bool copy
Definition: calibdata.py:26
CaloCell_Base_ID::NOT_VALID
@ NOT_VALID
Definition: CaloCell_Base_ID.h:43
CaloCell_ID_FCS::TileBar2
@ TileBar2
Definition: FastCaloSim_CaloCell_ID.h:33
DataVector::empty
bool empty() const noexcept
Returns true if the collection is empty.