33 #include "CaloDetDescr/CaloDetDescrElement.h"
43 #include "GaudiKernel/ServiceHandle.h"
46 static const InterfaceID IID_ITileL2Builder(
"TileL2Builder", 1, 0);
49 return IID_ITileL2Builder;
55 , m_noiseThreshold(100.0)
60 declareInterface<TileL2Builder>(
this);
79 const TileID* tileID =
nullptr;
95 return StatusCode::FAILURE;
99 for (
int ch = 0;
ch < 48; ++
ch) {
108 for (
int ch = 0;
ch < 48; ++
ch) {
127 if (ch1 !=
ch && ch2 !=
ch) {
139 <<
" tower=" << tileID->
tower(cell_id)
140 <<
" sample=" << tileID->
sample(cell_id)
143 <<
" channels in a cell: " << ch1 <<
" " << ch2 );
161 ATH_MSG_INFO(
"TileL2Builder initialization completed" );
163 return StatusCode::SUCCESS;
167 const EventContext& ctx{Gaudi::Hive::currentContext()};
168 return process(fragmin, fragmax, l2Container, ctx);
183 std::vector<unsigned int> extraWord;
184 std::vector<float> EtaMuons;
185 std::vector<float> EMuons0;
186 std::vector<float> EMuons1;
187 std::vector<float> EMuons2;
188 std::vector<unsigned int> qf;
208 if ((fragId >= fragmin) && (fragId <= fragmax)) {
210 ATH_MSG_VERBOSE(
"Unpacking frag 0x" << MSG::hex << fragId << MSG::dec );
212 memset(E_MeV, 0,
sizeof(E_MeV));
213 memset(
bad, 0,
sizeof(
bad));
221 float ampl = rawChannel->amplitude();
240 std::vector<float> sumE(3);
242 (*l2Container)[
m_hashFunc(fragId)]->setEt(std::move(sumE));
255 MTagLB(
ros,
drawer, E_MeV, EtaMuons, EMuons0, EMuons1, EMuons2, qf, extraWord);
258 MTagLB(
ros,
drawer, E_MeV, EtaMuons, EMuons0, EMuons1, EMuons2, qf, extraWord);
261 MTagEB(
ros,
drawer, E_MeV, EtaMuons, EMuons0, EMuons1, EMuons2, qf, extraWord);
264 MTagEB(
ros,
drawer, E_MeV, EtaMuons, EMuons0, EMuons1, EMuons2, qf, extraWord);
272 (*l2Container)[
m_hashFunc(fragId)]->setMu(EtaMuons, EMuons0, EMuons1, EMuons2, qf, extraWord);
281 return StatusCode::SUCCESS;
288 return StatusCode::SUCCESS;
294 , std::vector<float> &EtaMuons
295 , std::vector<float> &EMuons0
296 , std::vector<float> &EMuons1
297 , std::vector<float> &EMuons2
298 , std::vector<unsigned int> &qf
299 , std::vector<unsigned int> &extraWord)
const {
306 int Eth_LB_A[8] = { 1350, 960, 870, 750, 840, 840, 930, 840 };
307 int Eth_LB_BC[8] = { 2550, 1980, 1770, 1890, 1860, 1800, 1890, 1860 };
308 int Eth_LB_D[4] = { 1590, 1110, 1050, 1050 };
311 float eta_LB_A[8] = { 0.05, 0.15, 0.25, 0.35, 0.45, 0.55, 0.65, 0.75 };
312 float eta_LB_BC[8] = { 0.05, 0.15, 0.25, 0.35, 0.45, 0.55, 0.65, 0.75 };
313 float eta_LB_D[4] = { 0.00, 0.20, 0.40, 0.60 };
316 int cell32[4 * 4] = {
332 unsigned int cquality[4] = { 0 };
333 unsigned int flquality[4] = { 0 };
334 unsigned int aquality[4] = { 0 };
337 int splited[4] = { 0 };
338 int found[4] = { 0 };
346 E_A[0] =
E[1] +
E[4];
347 E_A[1] =
E[5] +
E[8];
348 E_A[2] =
E[9] +
E[10];
349 E_A[3] =
E[15] +
E[18];
350 E_A[4] =
E[19] +
E[20];
351 E_A[5] =
E[23] +
E[26];
352 E_A[6] =
E[29] +
E[32];
353 E_A[7] =
E[35] +
E[38];
357 E_BC[0] =
E[2] +
E[3];
358 E_BC[1] =
E[6] +
E[7];
359 E_BC[2] =
E[11] +
E[12];
360 E_BC[3] =
E[16] +
E[17];
361 E_BC[4] =
E[21] +
E[22];
362 E_BC[5] =
E[28] +
E[27];
363 E_BC[6] =
E[34] +
E[33];
364 E_BC[7] =
E[40] +
E[39];
369 E_D[1] =
E[13] +
E[14];
370 E_D[2] =
E[24] +
E[25];
371 E_D[3] =
E[41] +
E[44];
375 for (
int i = 0;
i < 4;
i++) {
376 if (E_D[
i] >= Eth_low) {
379 cquality[cand] = E_D[
i] < Eth_LB_D[
i] ? 0 : 1;
386 if (cand > 4) std::abort();
387 for (
int i = 0;
i < cand;
i++) {
388 for (
int j = 0; j <
i; j++) {
389 if ((cquality[
i] + cquality[j]) == 0) {
392 < (Eth_LB_D[
eta[
i]] > Eth_LB_D[
eta[j]] ? Eth_LB_D[
eta[
i]] : Eth_LB_D[
eta[j]])) {
397 }
else if ((cquality[
i] + cquality[j]) == 1) {
399 if (abs(
eta[
i] -
eta[j]) <= 1) {
411 (
i < cand && splited[
i] < 0) || ((
i < cand && splited[
i] >= 0) &&
found[splited[
i]] == 0);
415 ksto2 = cell32[4 *
eta[
i]];
417 for (ks = 1; ks <= ksto2 &&
found[
i] != 1; ks++) {
420 k2 = cell32[4 *
eta[
i] + ks];
423 if (E_BC[k2] > Eth_low) {
424 flquality[
i] = (E_BC[k2] < Eth_LB_BC[k2] ? 0 : 1);
425 if (
found[
i] != 1 && E_A[k2] > Eth_low) {
426 aquality[
i] = (E_A[k2] < Eth_LB_A[k2] ? 0 : 1);
427 quality = cquality[
i] + flquality[
i] + aquality[
i];
432 EMuons0.push_back(E_A[k2]);
435 EMuons1.push_back(E_BC[k2]);
438 EMuons2.push_back(E_D[
eta[
i]]);
441 qf.push_back(cquality[
i] + flquality[
i] + aquality[
i]);
445 EtaMuons.push_back((eta_LB_D[
eta[
i]] + eta_LB_BC[k2] + eta_LB_A[k2]) * (1. / 3));
449 EtaMuons.push_back(-(eta_LB_D[
eta[
i]] + eta_LB_BC[k2] + eta_LB_A[k2]) * (1. / 3));
462 unsigned int uquality =
quality;
463 extraWord.push_back( (uquality << 31) | (
drawer << 30) | (
pattern << 25) | ((
int) (2 * E_D[
eta[
i]])));
464 extraWord.push_back((((
int) (2 * E_BC[k2])) << 16) | ((
int) (2 * E_A[k2])));
471 if (NMuons >=
cut)
break;
478 , std::vector<float> &EtaMuons
479 , std::vector<float> &EMuons0
480 , std::vector<float> &EMuons1
481 , std::vector<float> &EMuons2
482 , std::vector<unsigned int> &qf
483 , std::vector<unsigned int> &extraWord)
const {
490 int Eth_EB_A[4] = { 810, 1140, 1230, 1380 };
491 int Eth_EB_BC[5] = { 1050, 1380, 1440, 1500, 1680 };
492 int Eth_EB_D[2] = { 2100, 2370 };
495 float eta_EB_A[4] = { 1.15, 1.25, 1.35, 1.45 };
496 float eta_EB_BC[5] = { 1.05, 1.15, 1.25, 1.35, 1.45 };
497 float eta_EB_D[2] = { 1.00, 1.20 };
500 int cell32[2 * 6] = {
506 int cell21[5 * 4] = {
520 int k2, ks, ksto2, k1, ksto1;
523 unsigned int cquality[4] = { 0 };
524 unsigned int flquality[4] = { 0 };
525 unsigned int aquality[4] = { 0 };
528 int splited[4] = { 0 };
529 int found[4] = { 0 };
537 E_A[0] =
E[6] +
E[7];
538 E_A[1] =
E[10] +
E[11];
539 E_A[2] =
E[20] +
E[21];
540 E_A[3] =
E[31] +
E[32];
544 E_BC[0] =
E[8] +
E[9];
545 E_BC[1] =
E[14] +
E[15];
546 E_BC[2] =
E[22] +
E[23];
547 E_BC[3] =
E[30] +
E[35];
548 E_BC[4] =
E[36] +
E[39];
552 E_D[0] =
E[16] +
E[17];
553 E_D[1] =
E[37] +
E[38];
557 for (
int i = 0;
i < 2;
i++) {
558 if (E_D[
i] >= Eth_low) {
561 cquality[cand] = E_D[
i] < Eth_EB_D[
i] ? 0 : 1;
568 if (cand > 4) std::abort();
569 for (
int i = 0;
i < cand;
i++) {
570 for (
int j = 0; j <
i; j++) {
571 if ((cquality[
i] + cquality[j]) == 0) {
574 < (Eth_EB_D[
eta[
i]] > Eth_EB_D[
eta[j]] ? Eth_EB_D[
eta[
i]] : Eth_EB_D[
eta[j]])) {
578 }
else if ((cquality[
i] + cquality[j]) == 1) {
579 if (abs(
eta[
i] -
eta[j]) <= 1) {
589 (
i < cand && splited[
i] < 0) || ((
i < cand && splited[
i] >= 0) &&
found[splited[
i]] == 0);
594 ksto2 = cell32[6 *
eta[
i]];
596 for (ks = 1; ks <= ksto2 &&
found[
i] != 1; ks++) {
599 k2 = cell32[6 *
eta[
i] + ks];
602 if (E_BC[k2] > Eth_low) {
604 flquality[
i] = (E_BC[k2] < Eth_EB_BC[k2] ? 0 : 1);
605 ksto1 = cell21[4 * k2 + 0];
607 for (
int kp = 1; kp <= ksto1 &&
found[
i] != 1; kp++) {
608 k1 = cell21[4 * k2 + kp];
609 if (E_A[k1] > Eth_low) {
610 aquality[
i] = (E_A[k1] < Eth_EB_A[k1] ? 0 : 1);
611 quality = cquality[
i] + flquality[
i] + aquality[
i];
616 EMuons0.push_back(E_A[k1]);
619 EMuons1.push_back(E_BC[k2]);
622 EMuons2.push_back(E_D[
eta[
i]]);
625 qf.push_back(cquality[
i] + flquality[
i] + aquality[
i]);
629 EtaMuons.push_back((eta_EB_D[
eta[
i]] + eta_EB_BC[k2] + eta_EB_A[k1]) * (1. / 3));
633 EtaMuons.push_back(-(eta_EB_D[
eta[
i]] + eta_EB_BC[k2] + eta_EB_A[k1]) * (1. / 3));
635 if (
eta[
i] == 0 && k2 == 0 && k1 == 0)
pattern = 0;
636 if (
eta[
i] == 0 && k2 == 1 && k1 == 0)
pattern = 1;
637 if (
eta[
i] == 0 && k2 == 1 && k1 == 1)
pattern = 2;
638 if (
eta[
i] == 0 && k2 == 2 && k1 == 0)
pattern = 3;
639 if (
eta[
i] == 0 && k2 == 2 && k1 == 1)
pattern = 4;
640 if (
eta[
i] == 0 && k2 == 2 && k1 == 2)
pattern = 5;
641 if (
eta[
i] == 1 && k2 == 0 && k1 == 0)
pattern = 6;
642 if (
eta[
i] == 1 && k2 == 1 && k1 == 0)
pattern = 7;
643 if (
eta[
i] == 1 && k2 == 1 && k1 == 1)
pattern = 8;
644 if (
eta[
i] == 1 && k2 == 2 && k1 == 0)
pattern = 9;
645 if (
eta[
i] == 1 && k2 == 2 && k1 == 1)
pattern = 10;
646 if (
eta[
i] == 1 && k2 == 2 && k1 == 2)
pattern = 11;
647 if (
eta[
i] == 1 && k2 == 3 && k1 == 1)
pattern = 12;
648 if (
eta[
i] == 1 && k2 == 3 && k1 == 2)
pattern = 13;
649 if (
eta[
i] == 1 && k2 == 3 && k1 == 3)
pattern = 14;
650 if (
eta[
i] == 1 && k2 == 4 && k1 == 2)
pattern = 15;
651 if (
eta[
i] == 1 && k2 == 4 && k1 == 3)
pattern = 16;
654 unsigned int uquality =
quality;
655 extraWord.push_back( (uquality << 31)
660 extraWord.push_back((((
int) (2 * E_BC[k2])) << 16) | ((
int) (2 * E_A[k1])));
669 if (NMuons >=
cut)
break;
674 std::vector<float> &sumE)
const {
676 static const float AMPLITUDE_FACTOR_HG[4] = { 16.0, 32.0 * 64, 32.0 * 64., 2.0 };
677 static const float AMPLITUDE_FACTOR_LG[4] = { 16.0, 32.0, 32.0, 2.0 / 64.0 };
679 if (ros < 1 || ros > 4) {
680 sumE[0] = sumE[1] = sumE[2] = 0.0;
685 const float scaleHG = AMPLITUDE_FACTOR_HG[
unit];
686 const float scaleLG = AMPLITUDE_FACTOR_LG[
unit];
700 for (
int i = 0;
i < 48; ++
i) {
702 float e = (*gain) ?
round((*
E) * scaleHG) :
round((*
E) * scaleLG) * 64.;
715 const float inv_scaleHG = 1. / scaleHG;
716 sumE[0] = Et * inv_scaleHG;
717 sumE[1] = Ez * inv_scaleHG;
718 sumE[2] = Es * inv_scaleHG;
722 if (ros < 1 || ros > 4) {
723 sumE[0] = sumE[1] = sumE[2] = 0.0;
728 const float* wt =
m_sinTh[ros1];
729 const float* wz =
m_cosTh[ros1];
735 for (
int i = 0;
i < 48; ++
i) {
755 for (
int i = 0;
i < 48; ++
i) {