35 {
36 SG::WriteCondHandle<JGTowerMappingData> outputHandle(
m_outputKey, ctx);
37 if (outputHandle.isValid())
38 {
39
40
41 return StatusCode::SUCCESS;
42 }
45 const CaloSuperCellDetDescrManager *scDetMgr = *caloSuperCellMgrHandle;
46
47 auto data = std::make_unique<JGTowerMappingData>();
48
49
50
51 std::map<std::tuple<int, int, int, int>, std::vector<std::size_t>> towerGrid;
52
53 std::map<int, std::tuple<int, int, int>> regionParams;
54
55 for (std::size_t towerIdx = 0; towerIdx < jgTowerID->
tower_hash_max(); ++towerIdx)
56 {
57 Identifier towerID = jgTowerID->
tower_id(towerIdx);
58 Identifier regionID = jgTowerID->
region_id(towerID);
59
60 int detSide = jgTowerID->
pos_neg(towerID) < 0 ? -1 : +1;
61
62
65 int nTowers = (
int)std::ceil(TMath::Pi() / jDPhi);
66 jDPhi = TMath::Pi() / nTowers;
67
68 float jEta = detSide * ((jgTowerID->
eta(towerID) + 0.5) * jDEta + jgTowerID->
eta0(regionID));
69 float jPhi = TVector2::Phi_mpi_pi((jgTowerID->
phi(towerID) + 0.5) * jDPhi + jgTowerID->
phi0(regionID));
70
71 data->emplace_back(jEta, jDEta, jPhi, jDPhi);
74
75 std::vector<std::size_t> &gridLoc = towerGrid[std::make_tuple(
77 jgTowerID->
region(towerID),
78 jgTowerID->
eta(towerID),
79 jgTowerID->
phi(towerID))];
80 regionParams[jgTowerID->
region(towerID)] = std::make_tuple(
84
85
86 gridLoc.insert(std::lower_bound(
87 gridLoc.begin(), gridLoc.end(), towerIdx,
88 [&
data](std::size_t lhs, std::size_t rhs) { return data->at(lhs).sampling() < data->at(rhs).sampling(); }),
89 towerIdx);
90
91 for (std::size_t scIdx = 0; scIdx <
m_scid->calo_cell_hash_max(); ++scIdx)
92 {
93 Identifier scID =
m_scid->cell_id(scIdx);
94 const CaloDetDescrElement *dde = scDetMgr->
get_element(scID);
95 if (!dde)
96 {
98 return StatusCode::FAILURE;
99 }
100 if (
m_scid->is_tile(scID) &&
m_scid->sampling(scID) != 2)
101 {
103 continue;
105 helper.SetTileIndices(scIdx);
106 }
107 else
108 {
109 float superCellEta = dde->
eta_raw();
110
111 if (std::abs(superCellEta) > 3.2)
112 continue;
113
114
115 if (std::abs(std::abs(superCellEta) - 1.4) < 0.001 &&
116 m_scid->region(scID) == 0 &&
117 m_scid->sampling(scID) == 2)
118 superCellEta += (superCellEta > 0 ? 0.05 : -0.05);
123 helper.SetSCIndices(scIdx);
124 }
125 }
126 }
127
128 for (auto &gridLocPair : towerGrid)
129 {
130 std::vector<std::size_t> &towerIndices = gridLocPair.second;
131
132 int pos_neg = std::get<0>(gridLocPair.first);
133 int region = std::get<1>(gridLocPair.first);
134 int iEta = std::get<2>(gridLocPair.first);
135 int iPhi = std::get<3>(gridLocPair.first);
136 int phiMax = std::get<0>(regionParams[region]);
137 int etaMin = std::get<1>(regionParams[region]);
138 int etaMax = std::get<2>(regionParams[region]);
139 auto nextPhiItr = towerGrid.find(std::make_tuple(pos_neg, region, iEta, iPhi == phiMax ? 0 : iPhi + 1));
140 auto prevPhiItr = towerGrid.find(std::make_tuple(pos_neg, region, iEta, iPhi == 0 ? phiMax : iPhi - 1));
141 auto nextEtaItr = towerGrid.end();
142 auto prevEtaItr = towerGrid.end();
143
144
145
146
147 auto & etaIter1 = (pos_neg > 0) ? nextEtaItr : prevEtaItr;
148 auto & etaIter2 = (pos_neg > 0) ? prevEtaItr : nextEtaItr;
149 if (iEta == etaMax)
150 {
151
152 auto itr = regionParams.find(region + 1);
153 if (itr != regionParams.end() && std::get<0>(itr->second) == phiMax)
154
155 etaIter1 = towerGrid.find(std::make_tuple(pos_neg, region + 1, std::get<1>(itr->second), iPhi));
156 }
157 else
158 etaIter1 = towerGrid.find(std::make_tuple(pos_neg, region, iEta + 1, iPhi));
159 if (iEta == etaMin)
160 {
161 if (region == 0)
162 etaIter2 = towerGrid.find(std::make_tuple(pos_neg * -1, region, iEta, iPhi));
163 else
164 {
165 auto itr = regionParams.find(region - 1);
166 if (itr != regionParams.end() && std::get<0>(itr->second) == phiMax)
167
168 etaIter2 = towerGrid.find(std::make_tuple(pos_neg, region - 1, std::get<2>(itr->second), iPhi));
169 }
170 }
171 else
172 etaIter2 = towerGrid.find(std::make_tuple(pos_neg, region, iEta - 1, iPhi));
173
174 std::vector<std::size_t> nextEtaTowers;
175 std::vector<std::size_t> prevEtaTowers;
176 std::vector<std::size_t> nextPhiTowers;
177 std::vector<std::size_t> prevPhiTowers;
178 if (nextEtaItr != towerGrid.end())
179 nextEtaTowers = nextEtaItr->second;
180 if (prevEtaItr != towerGrid.end())
181 prevEtaTowers = prevEtaItr->second;
182 if (nextPhiItr != towerGrid.end())
183 nextPhiTowers = nextPhiItr->second;
184 if (prevPhiItr != towerGrid.end())
185 prevPhiTowers = prevPhiItr->second;
186 nextEtaTowers.resize(towerIndices.size(), SIZE_MAX);
187 prevEtaTowers.resize(towerIndices.size(), SIZE_MAX);
188 nextPhiTowers.resize(towerIndices.size(), SIZE_MAX);
189 prevPhiTowers.resize(towerIndices.size(), SIZE_MAX);
190
191 std::size_t previousIdx = SIZE_MAX;
192 for (std::size_t iIdx = 0; iIdx < towerIndices.size(); ++iIdx)
193 {
194
195
196 std::size_t currentIdx = towerIndices.at(iIdx);
198
199 helper.setNextEtaIndex(nextEtaTowers.at(iIdx));
200 helper.setPreviousEtaIndex(prevEtaTowers.at(iIdx));
201 helper.setNextPhiIndex(nextPhiTowers.at(iIdx));
202 helper.setPreviousPhiIndex(prevPhiTowers.at(iIdx));
203
204 helper.setIndexInFront(previousIdx);
205 if (previousIdx != SIZE_MAX)
206 data->at(previousIdx).setIndexBehind(currentIdx);
207 previousIdx = currentIdx;
208 }
209 }
210
213
214
217
218 return StatusCode::SUCCESS;
219 }
#define ATH_CHECK
Evaluate an expression and check for errors.
char data[hepevt_bytes_allocation_ATLAS]
float eta_raw() const
cell eta_raw
float phi_raw() const
cell phi_raw
const CaloDetDescrElement * get_element(const Identifier &cellId) const
get element by its identifier
static EventIDRange infiniteRunLB()
Produces an EventIDRange that is infinite in RunLumi and invalid in Time.
int sampling(const Identifier id) const
return sampling according to :
float eta0(const Identifier regId) const
Return the minimum eta of region, or NOT_VALID.
int eta_max(const Identifier regId) const
max value of eta index (-999 == failure)
int region(const Identifier id) const
return region according to :
size_type tower_hash_max() const
tower hash table max size
int eta_min(const Identifier regId) const
min value of eta index (-999 == failure)
int pos_neg(const Identifier id) const
Test wether given tower or layer is part of the Tile Calorimeter.
float phiGranularity(const Identifier regId) const
Return the phi granularity of a region, or NOT_VALID.
int phi_max(const Identifier regId) const
min value of phi index (-999 == failure)
int phi(const Identifier id) const
return phi according to :
Identifier tower_id(int pos_neg, int sampling, int region, int eta, int phi) const
build a tower identifier
Identifier region_id(int pos_neg, int sampling, int region) const
build a region (of towers) identifier
float etaGranularity(const Identifier regId) const
Return the eta granularity of a region, or NOT_VALID.
float phi0(const Identifier regId) const
Return the minimum phi of region, or NOT_VALID.
int eta(const Identifier id) const
return eta according to :
const CaloCell_SuperCell_ID * m_scid
virtual StatusCode buildForwardMapping(JGTowerMappingData &data, const CaloSuperCellDetDescrManager *mgr) const =0
SG::ReadCondHandleKey< CaloSuperCellDetDescrManager > m_caloSuperCellMgrKey
virtual const JGTowerBase_ID * getJGTowerID() const =0
SG::WriteCondHandleKey< JGTowerMappingData > m_outputKey
Gaudi::Property< bool > m_mapTileCells
virtual StatusCode loadTowerAreas(JGTowerMappingData &data) const =0
setScale setgFexType iEta