ATLAS Offline Software
Loading...
Searching...
No Matches
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
14#include "CaloEvent/CaloCell.h"
16#include "CaloGeoHelpers/CaloSampling.h"
18
19#include <cmath>
20
21namespace {
22inline double
23square(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
77 : m_cellcont(*cell_container)
78 , m_mgr(*mgr)
79 , m_energy(0)
80 , m_et(0)
81{
82 m_caloNums.clear();
83 // NSUBCALO indicate take them all
85}
86
87
88void
89CaloCellList::select(double eta, double phi, double deta, double dphi)
90{
91 doSelect(eta, phi, deta, dphi, -1);
92}
93
94void
95CaloCellList::select(double eta, double phi, double deta, double dphi, int sam)
96{
97 doSelect(eta, phi, deta, dphi, -1, static_cast<CaloCell_ID::CaloSample>(sam));
98}
99
100void
101CaloCellList::select(double eta, double phi, double dR)
102{
103 doSelect(eta, phi, dR, dR, dR);
104}
105
106void
107CaloCellList::select(double eta, double phi, double dR, int sam)
108{
109 doSelect(eta, phi, dR, dR, dR, static_cast<CaloCell_ID::CaloSample>(sam));
110}
111
112void
114 double phi,
115 double deta,
116 double dphi,
117 double dR,
118 CaloCell_ID::CaloSample sam /*= CaloCell_ID::Unknown*/)
119{
120
121 m_theCellVector.clear();
122 m_energy = 0;
123 m_et = 0;
124 m_nBadT0 = 0;
125 m_nBadT12 = 0;
126 if (m_cellcont.empty()){
127 return;
128 }
129 std::vector<IdentifierHash> calo_mgr_vect;
130 std::vector<CaloCell_ID::SUBCALO>::const_iterator itrCaloNum = m_caloNums.begin();
131 std::vector<CaloCell_ID::SUBCALO>::const_iterator itrEndCaloNum = m_caloNums.end();
132
133 double dR2 = dR*dR;
134
135 for (; itrCaloNum != itrEndCaloNum; ++itrCaloNum) {
136 CaloCell_ID::SUBCALO caloNum = *itrCaloNum;
137 if (sam != CaloCell_ID::Unknown) {
138 m_mgr.cellsInZone(eta - deta, eta + deta, phi - dphi, phi + dphi, sam, calo_mgr_vect);
139 itrCaloNum = itrEndCaloNum - 1;
140 } else if (caloNum == CaloCell_ID::NSUBCALO) {
141 m_mgr.cellsInZone(eta - deta, eta + deta, phi - dphi, phi + dphi, calo_mgr_vect);
142 } else if (caloNum != CaloCell_ID::NOT_VALID) {
143 m_mgr.cellsInZone(eta - deta, eta + deta, phi - dphi, phi + dphi, caloNum, calo_mgr_vect);
144 } else {
145 continue;
146 }
147 m_theCellVector.reserve(m_theCellVector.size() + calo_mgr_vect.size());
148
149 for (unsigned int i = 0; i < calo_mgr_vect.size(); i++) {
150 const CaloCell* cell = m_cellcont.findCell(calo_mgr_vect[i]);
151 if (cell) {
152 double pphi = proxim(cell->phi(), phi);
153 if ( (dR > 0 && square(eta - cell->eta()) + square(pphi - phi) < dR2) ||
154 (dR < 0 && std::fabs(eta - cell->eta()) < deta && std::fabs(phi - pphi) < dphi) ) {
155 m_theCellVector.push_back(cell);
156 m_energy += cell->energy();
157 m_et += cell->et();
158 if (cell->badcell()) {
159 if (sam == CaloCell_ID::TileBar0 || sam == CaloCell_ID::TileExt0)
160 m_nBadT0++;
161 else if (sam == CaloCell_ID::TileBar1 || sam == CaloCell_ID::TileExt1 ||
162 sam == CaloCell_ID::TileBar2 || sam == CaloCell_ID::TileExt2 ||
163 sam == CaloCell_ID::TileGap1 || sam == CaloCell_ID::TileGap2)
164 m_nBadT12++;
165 }
166 }
167 }
168 }
169 } // end loop on calorimeters
170}
171
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
Definition of CaloDetDescrManager.
#define x
Container class for CaloCell.
void doSelect(double eta, double phi, double deta, double dphi, double dR, CaloCell_ID::CaloSample sam=CaloCell_ID::Unknown)
vector_type m_theCellVector
unsigned short m_nBadT0
CaloCellList()=delete
const CaloCellContainer & m_cellcont
const CaloDetDescrManager_Base & m_mgr
void select(double eta, double phi, double deta, double dphi)
unsigned short m_nBadT12
double m_energy
std::vector< CaloCell_ID::SUBCALO > m_caloNums
CaloCell_Base_ID::SUBCALO SUBCALO
Definition CaloCell_ID.h:50
CaloSampling::CaloSample CaloSample
Definition CaloCell_ID.h:53
Data object for each calorimeter readout cell.
Definition CaloCell.h:57
This class provides the client interface for accessing the detector description information common to...
double proxim(double b, double a)
Definition proxim.h:17