195 badChannels = *badChannelsHandle;
209 ATH_CHECK( ttl1Container.
record(std::make_unique<TileTTL1Container>()) );
212 std::unique_ptr<TileTTL1Container> mbtsTTL1Container;
214 mbtsTTL1Container = std::make_unique<TileTTL1Container>();
225 std::vector<double> ttAmp[16];
226 std::vector<double> MBTSAmp;
236 double ttAmpTotIg = 0.;
237 int minieta, maxieta, posneg;
239 for (
int ieta = 0; ieta < 16; ++ieta)
248 std::vector<float> ttL1samples;
249 std::vector<float> MBTSsamples;
254 std::vector<double> ttl1Shape(
m_nSamples, 0.);
271 <<
" drawer " << drawer
301 posneg = minieta = maxieta = 0;
306 for (
int ieta = 0; ieta < 16; ++ieta) {
308 ttAmp[ieta][js] = 0.0;
314 memset(ttHit, 0,
sizeof(ttHit));
315 nTT = nIgnore = nHit = 0;
320 for (
const TileHit* tile_hit : *hitCollection) {
330 double hit_calib = samplingFraction->getSamplingFraction(drawerIdx, channel);
331 hit_calib = std::round(hit_calib * 1000) / 1000;
334 double qfactor = hit_calib / emScale->calibrateChannel(drawerIdx, channel
346 if (status.isNoGainL1()) {
352 if (status.isHalfGainL1()) {
362 if (mbtsTTL1Container) {
367 hitSamples[js] = 0.0;
369 int n_hits = tile_hit->size();
370 for (
int ihit = 0; ihit < n_hits; ++ihit) {
373 double t_hit = -(tile_hit->time(ihit));
376 double e_hit = tile_hit->energy(ihit);
378 hitSamples[js] += e_hit * ttl1MBTSShape[js];
384 MBTSAmp[js] += qfactor * hitSamples[js];
389 MBTSAmp[js] = qfactor * hitSamples[js];
392 if (
msgLvl(MSG::VERBOSE)) {
400 msg(MSG::VERBOSE) <<
"New MBTS Hit:"
402 <<
", drawer=" << drawer
403 <<
", ch=" << channel
408 <<
", chan is good=" << is_good <<
endmsg;
418 int ieta =
m_TT_ID->eta(tt_id);
419 int iphi =
m_TT_ID->phi(tt_id);
426 hitSamples[js] = 0.0;
427 int n_hits = tile_hit->size();
428 for (
int ihit = 0; ihit < n_hits; ++ihit) {
431 double t_hit = -(tile_hit->time(ihit));
434 double e_hit = tile_hit->energy(ihit);
436 hitSamples[js] += e_hit * ttl1Shape[js];
443 ttAmp[ieta][js] += qfactor * hitSamples[js];
450 ttAmp[ieta][js] = qfactor * hitSamples[js];
452 if (ieta >= minieta && ieta <= maxieta)
456 if (ieta < minieta || ieta > maxieta || !is_good)
460 if (ieta >= minieta && ieta <= maxieta && is_good) {
461 ttAmpTot += hitSamples[
m_iTrig] * hit_calib;
463 ttAmpTotIg += hitSamples[
m_iTrig] * hit_calib;
466 if (
msgLvl(MSG::VERBOSE)) {
470 int tower =
m_tileID->tower(pmt_id);
471 int sample =
m_tileID->sample(pmt_id);
475 msg(MSG::VERBOSE) <<
"New Hit:"
477 <<
", drawer=" << drawer
478 <<
", ch=" << channel
480 <<
", tower=" << tower
481 <<
", sample=" << sample
483 <<
", e0=" << hitSamples[
m_iTrig] * hit_calib
486 <<
", chan is good= " << is_good;
488 if (ieta >= minieta && ieta <= maxieta)
491 msg(MSG::VERBOSE) <<
" Outside limits" <<
endmsg;
498 nIgnoreTot += nIgnore;
502 <<
", drawer=" << drawer
503 <<
"; posneg=" << posneg
504 <<
", minieta=" << minieta
505 <<
", maxieta=" << maxieta
508 <<
", nIgnore=" << nIgnore );
519 if (mbtsTTL1Container) {
524 double ttL1NoiseSigma =
m_tileInfo->MBTSL1NoiseSigma(MBTS_id);
525 double ttL1Thresh =
m_tileInfo->MBTSL1Thresh(MBTS_id);
526 double ttL1Ped =
m_tileInfo->MBTSL1Ped(MBTS_id);
527 double ttL1Calib =
m_tileInfo->MBTSL1Calib(MBTS_id);
528 double ttL1Max =
m_tileInfo->MBTSL1Max(MBTS_id);
533 MBTSAmp[jsamp] *= ttL1Calib;
534 MBTSsamples[jsamp] = MBTSAmp[jsamp] + ttL1Ped;
536 MBTSsamples[jsamp] += ttL1NoiseSigma * Rndm[jsamp];
540 if (MBTSsamples[jsamp] > ttL1Max)
541 MBTSsamples[jsamp] = ttL1Max;
546 if (MBTSsamples[
m_MBTSiTrig] - ttL1Ped < ttL1Thresh)
550 std::unique_ptr<TileTTL1> mbtsTTL1 = std::make_unique<TileTTL1>(MBTS_id, MBTSsamples);
551 mbtsTTL1Container->push_back(mbtsTTL1.release());
559 for (
int ieta = minieta; ieta <= maxieta; ++ieta) {
564 ttId[ieta] =
m_TT_ID->tower_id(posneg, 1, 0, ieta, drawer);
570 double ttL1NoiseSigma =
m_tileInfo->TTL1CosmicsNoiseSigma(ttId[ieta]);
571 double ttL1Thresh =
m_tileInfo->TTL1CosmicsThresh(ttId[ieta]);
572 double ttL1Ped =
m_tileInfo->TTL1CosmicsPed(ttId[ieta]);
573 double ttL1Calib =
m_tileInfo->TTL1CosmicsCalib(ttId[ieta]);
575 double peakAmp = 0.0;
577 for (
int jsamp = 0; jsamp <
m_nSamples; ++jsamp) {
578 ttAmp[ieta][jsamp] *= ttL1Calib;
579 ttAmp[ieta][jsamp] += ttL1Ped;
580 if (ttAmp[ieta][jsamp] > peakAmp) {
581 peakAmp = ttAmp[ieta][jsamp];
587 peakAmp += ttL1NoiseSigma * RandGaussQ::shoot(rngWrapper->
getEngine(ctx));
588 ttL1samples[0] = peakAmp;
590 if (ttL1samples[0] - ttL1Ped < ttL1Thresh)
593 if (
msgLvl(MSG::DEBUG) && Good) {
594 msg(MSG::DEBUG) <<
" TTL1: "
598 <<
", hitTrue=" << ttHit[ieta]
600 <<
", peak Amp=" << ttAmp[ieta][peakSamp]
601 <<
", with noise=" << ttL1samples[0] <<
endmsg;
606 double ttL1NoiseSigma =
m_tileInfo->TTL1NoiseSigma(ttId[ieta]);
607 double ttL1Thresh =
m_tileInfo->TTL1Thresh(ttId[ieta]);
608 double ttL1Ped =
m_tileInfo->TTL1Ped(ttId[ieta]);
609 double ttL1Calib =
m_tileInfo->TTL1Calib(ttId[ieta]);
610 double ttL1Max =
m_tileInfo->TTL1Max(ttId[ieta]);
614 for (
int jsamp = 0; jsamp <
m_nSamples; ++jsamp) {
615 ttAmp[ieta][jsamp] *= ttL1Calib;
616 ttL1samples[jsamp] = ttAmp[ieta][jsamp] + ttL1Ped;
618 ttL1samples[jsamp] += ttL1NoiseSigma * Rndm[jsamp];
622 if (ttL1samples[jsamp] > ttL1Max)
623 ttL1samples[jsamp] = ttL1Max;
628 if (ttL1samples[
m_iTrig] - ttL1Ped < ttL1Thresh)
631 if (
msgLvl(MSG::DEBUG) && Good) {
632 msg(MSG::DEBUG) <<
" TTL1: "
636 <<
", hitTrue=" << ttHit[ieta]
638 <<
", amp0=" << ttAmp[ieta][
m_iTrig]
646 std::unique_ptr<TileTTL1> ttl1 = std::make_unique<TileTTL1>(ttId[ieta], ttL1samples);
647 ttl1Container->push_back(ttl1.release());
654 ATH_MSG_DEBUG(
"Sorting container of size " << ttl1Container->size() );
656 ttl1Container->sort(order);
659 if (mbtsTTL1Container) {
668 msg(MSG::DEBUG) <<
"TileHitToTTL1 execution completed." <<
endmsg;
669 msg(MSG::DEBUG) <<
" nTTTot=" << nTTTot
670 <<
" nHitTot=" << nHitTot
671 <<
" nIgnoreTot=" << nIgnoreTot
672 <<
" ttAmpTot=" << ttAmpTot
673 <<
" ttAmpTotIg=" << ttAmpTotIg
674 <<
" =>eneTot=" << ttAmpTot + ttAmpTotIg <<
endmsg;
677 return StatusCode::SUCCESS;