103 {
104
106
107
109
111
113
114 memset(eneA, 0, sizeof(eneA));
115 memset(eneBC, 0, sizeof(eneBC));
116 memset(eneD, 0, sizeof(eneD));
117
119 ATH_CHECK( muContainer.record(std::make_unique<TileMuContainer>()) );
120
121
122
123 std::vector<const CaloCell*> cellList;
124
127
130 cellContainer->beginConstCalo(tileCell_ID);
132 cellContainer->endConstCalo(tileCell_ID);
133
135 << cellContainer->nCellsCalo(tileCell_ID));
136
137 double phi[64] = { 0 };
138
139 for (; currentCell != lastCell; ++currentCell) {
140 int iCell = -1;
141 double cellEta = (*currentCell)->eta();
142 if (cellEta > -1.5 && cellEta < 1.5) {
143 int cellModule;
144 int cellSample =
m_tileID->sample((*currentCell)->ID());
145 switch (cellSample) {
147 iCell = (cellEta + 1.5) * 10;
148 cellModule =
m_tileID->module((*currentCell)->ID());
149 eneA[iCell][cellModule] = (*currentCell)->energy();
150 phi[cellModule] = (*currentCell)->phi();
151 break;
153 iCell = (cellEta + 1.5) * 10;
154 cellModule =
m_tileID->module((*currentCell)->ID());
155 eneBC[iCell][cellModule] = (*currentCell)->energy();
156 phi[cellModule] = (*currentCell)->phi();
157 break;
159 iCell = (cellEta + 1.3) * 5;
160 cellModule =
m_tileID->module((*currentCell)->ID());
161 eneD[iCell][cellModule] = (*currentCell)->energy();
162 phi[cellModule] = (*currentCell)->phi();
163 cellList.push_back(*currentCell);
164 break;
166 iCell = (cellEta + 1.5) * 10;
167 if (iCell == 4 || iCell == 25) {
168 cellModule =
m_tileID->module((*currentCell)->ID());
169 eneA[iCell][cellModule] = (*currentCell)->energy();
170 phi[cellModule] = (*currentCell)->phi();
171 }
172 break;
173 }
174 }
175
176 if (
msgLvl(MSG::VERBOSE)) {
177 msg(MSG::VERBOSE) <<
"scintillators sample, eta, phi, ene => "
178 <<
m_tileID->sample((*currentCell)->ID()) <<
","
179 << cellEta << ","
180 << (*currentCell)->phi() << ","
181 << (*currentCell)->energy() <<
endmsg;
182
183 msg(MSG::VERBOSE) <<
"sample, tower, eta => "
184 <<
m_tileID->sample((*currentCell)->ID()) <<
", "
185 <<
m_tileID->tower((*currentCell)->ID()) <<
", "
187 }
188 }
189
190 std::vector<double> muEtaD;
191 std::vector<float> muEneD;
192 std::vector<int> muModule;
193 std::vector<int> muCellD;
194 std::vector<int> muSplitted;
195 std::vector<int> muQualityD;
196 std::vector<int> muFound;
204
205 int nCandidates = 0, ntri = 0;
206 int nSplitted = 0;
207
209
210
211 int lastMuCell = -3;
212 int lastMuModule = -3;
213 for (
int iModule = 0; iModule <
N_MODULES; ++iModule) {
214 int prevCell = -2;
215 for (
int iCellD = 0; iCellD <
N_CELLS_D; ++iCellD) {
216 float energy = eneD[iCellD][iModule];
218 int splitted = -1;
221 int quality = (
energy < hiThr) ? 0 : 1;
222
223 if (prevCell == lastMuCell && iModule == lastMuModule) {
224 int sumQuality = quality + muQualityD.back();
225 float sumEnergy =
energy + eneD[prevCell][iModule];
226 double hiPrevThr =
m_hiThrD[prevCell];
227 double maxHiThr = (hiThr > hiPrevThr) ? hiThr : hiPrevThr;
228 if ((sumQuality == 0 && sumEnergy < maxHiThr) || sumQuality == 1) {
229
230 splitted = nCandidates - 1;
233 ++nSplitted;
235 << (splitted + 1) << ", " << splitted
236 << "): etaD1, etaD2, eta => "
238 <<
m_etaD[prevCell] <<
", "
240 << "; eneD1, eneD2, energy => "
241 << eneD[iCellD][iModule] << ", "
242 << eneD[prevCell][iModule] << ", "
243 << energy);
244 }
245 }
246 muModule.push_back(iModule);
247 muCellD.push_back(iCellD);
248 muSplitted.push_back(splitted);
249 muFound.push_back(0);
250 muEneD.push_back(energy);
251 muQualityD.push_back(quality);
252 muEtaD.push_back(
eta);
253 ++nCandidates;
254 lastMuCell = iCellD;
255 lastMuModule = iModule;
257 << ", tower index (iCellD)= " << iCellD
258 << ", module index(iModuleD)= " << iModule
259 << ", Energy(iCellD)(iModuleD) = " << eneD[iCellD][iModule]
260 <<
", threshold2(iCellD)= " <<
m_hiThrD[iCellD]);
261 } else {
262
263 }
264 prevCell = iCellD;
265 }
266 }
267
268
269 if (
msgLvl(MSG::VERBOSE)) {
270 for (
int i = 0;
i < nCandidates; ++
i) {
271 msg(MSG::VERBOSE) <<
"Candidates list: number phi,ene, eta "
273 << muModule[
i] <<
","
276 << "nSplitted,muSplitted(cand)" << nSplitted << ", "
278 }
279 }
280
281
282
283 for (int iMu = 0; iMu < nCandidates; ++iMu) {
284 int splitted = muSplitted[iMu];
285 if (splitted < 0 || muFound[splitted] == 0) {
286
287
288
289
290
291 int module = muModule[iMu];
293 "loop on mu candidates: iMu, module = " << iMu << ", " << module);
294 int idxD = 6 * muCellD[iMu];
297 while (++idxD <= endIdxD && muFound[iMu] != 1) {
299 float energyBC = eneBC[cellBC][
module];
301 << ", module=" << module
302 << ", eneBC =" << energyBC);
304 int qualityBC = (energyBC <
m_hiThrBC[cellBC]) ? 0 : 1;
305 int idxBC = 6 * cellBC;
308 while (++idxBC <= endIdxBC && muFound[iMu] != 1) {
310 float energyA = eneA[cellA][
module];
312 << ", module=" << module
313 << ", eneA =" << energyA);
314
316
317 int qualityA = (energyA <
m_hiThrA[cellA]) ? 0 : 1;
318
319
320
321 int muQuality = muQualityD[iMu] + qualityBC + qualityA;
322 if (muQuality <= 1) {
323 muFound[iMu] = 1;
324 double muEta = (muEtaD[iMu] +
m_etaBC[cellBC] +
m_etaA[cellA]) / 3;
326 std::vector<float> muEnergy;
327 muEnergy.reserve(4);
328 muEnergy.push_back(energyA);
329 muEnergy.push_back(energyBC);
330 muEnergy.push_back(muEneD[iMu]);
331 float eneAround = 0;
332
334 << muEta << ", "
335 << muPhi << ", "
336 << muEnergy[0] << ", "
337 << muEnergy[1] << ", "
338 << muEnergy[2]
339 << " tag eta 1st, 2nd, 3rd,"
343
344 int nextModule = (module != 63) ? (module + 1) : 0;
345 int prevModule = (module != 0) ? (module - 1) : 63;
346 eneAround = eneA[cellA][nextModule] + eneA[cellA][prevModule]
347 + eneBC[cellBC][nextModule] + eneBC[cellBC][prevModule];
348
349 int nextCellA = cellA + 1;
350 int prevCellA = cellA - 1;
351 if (nextCellA < N_CELLS_A && prevCellA > 0) {
352 eneAround += eneA[nextCellA][
module] + eneA[prevCellA][
module]
353 + eneA[nextCellA][nextModule]
354 + eneA[nextCellA][prevModule]
355 + eneA[prevCellA][nextModule]
356 + eneA[prevCellA][prevModule];
357
358 }
359
360 int nextCellBC = cellBC + 1;
361 int prevCellBC = cellBC - 1;
362 if (nextCellBC < N_CELLS_BC && prevCellBC > 0) {
363 eneAround += eneBC[nextCellBC][
module]
364 + eneBC[prevCellBC][
module]
365 + eneBC[nextCellBC][nextModule]
366 + eneBC[nextCellBC][prevModule]
367 + eneBC[prevCellBC][nextModule]
368 + eneBC[prevCellBC][prevModule];
369
370 }
371
372 muEnergy.push_back(eneAround);
373 std::unique_ptr<TileMu>
muon = std::make_unique<TileMu>((
float) muEta,
374 (float) muPhi,
375 muEnergy,
376 muQuality);
377
379 <<
" muon tag phi=" <<
muon->phi()
380 <<
" energydepVec[0]=" <<
muon->enedep()[0]
381 <<
" energydepVec[1]=" <<
muon->enedep()[1]
382 <<
" energydepVec[2]=" <<
muon->enedep()[2]
383 <<
" energydepVec[3]=" <<
muon->enedep()[3]
384 <<
" muon tag Q factor=" <<
muon->quality()
385 << " ene around= " << eneAround);
386
387 muContainer->push_back(
muon.release());
388 }
389
390 } else {
392 }
393 }
394 } else {
396 }
397 }
398 } else {
399 break;
400 }
401 }
402
403
404
405 if (
msgLvl(MSG::VERBOSE)) {
406 for (const CaloCell* cell : cellList) {
407 msg(MSG::VERBOSE) <<
" tag Cell (sect,side,mod,tow,sam)=("
413 << "),(eta,phi,energy)=("
414 <<
cell->eta() <<
","
415 <<
cell->phi() <<
","
417 }
418 }
419
420
421
423 for (const TileMu* mu : *muContainer) {
425 <<
" eta = " <<
mu->eta()
426 <<
" phi = " <<
mu->phi()
427 <<
" enedep[0] = " << (
mu->enedep())[0]
428 <<
" enedep[1] = " << (
mu->enedep())[1]
429 <<
" enedep[2] = " << (
mu->enedep())[2]
430 <<
" enedep[3] = " << (
mu->enedep())[3]
431 <<
" quality = " <<
mu->quality() <<
endmsg;
432 }
433 }
434
435
436 return StatusCode::SUCCESS;
437}
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_VERBOSE(x)
bool msgLvl(const MSG::Level lvl) const
CaloCell_Base_ID::SUBCALO SUBCALO
DataModel_detail::const_iterator< DataVector > const_iterator