10 #include <background/modules/BeamBkgHitRateMonitor/TOPHitRateCounter.h>
11 #include <top/geometry/TOPGeometryPar.h>
14 #include <framework/gearbox/Unit.h>
15 #include <framework/logging/Logger.h>
24 namespace Background {
26 void TOPHitRateCounter::initialize(TTree* tree)
29 m_digits.isOptional();
32 tree->Branch(
"top", &m_rates,
"slotRates[16]/F:averageRate/F:numEvents/I:valid/O");
35 m_hits =
new TH1F(
"top_hits",
"time distribution of hits; digit.time [ns]",
37 m_hitsInWindow =
new TH1F(
"top_hitsInWindow",
38 "time distribution of hits; digit.time [ns]",
39 100, m_timeOffset - m_timeWindow / 2,
40 m_timeOffset + m_timeWindow / 2);
43 if (m_timeWindow <= 0) B2FATAL(
"invalid time window for TOP: " << m_timeWindow);
49 void TOPHitRateCounter::clear()
54 void TOPHitRateCounter::accumulate(
unsigned timeStamp)
57 if (not m_digits.isValid())
return;
60 auto& rates = m_buffer[timeStamp];
66 const auto* topgp = TOP::TOPGeometryPar::Instance();
67 for (
const auto& digit : m_digits) {
68 if (digit.getHitQuality() != TOPDigit::c_Good)
continue;
69 m_hits->Fill(digit.getTime());
71 if (fabs(digit.getTime() - m_timeOffset) > m_timeWindow / 2)
continue;
72 m_hitsInWindow->Fill(digit.getTime());
74 auto effi = topgp->getRelativePixelEfficiency(digit.getModuleID(),
76 float wt = std::min(1.0 / effi, 10.0);
77 rates.slotRates[digit.getModuleID() - 1] += wt;
78 rates.averageRate += wt;
86 void TOPHitRateCounter::normalize(
unsigned timeStamp)
89 m_rates = m_buffer[timeStamp];
91 if (not m_rates.valid)
return;
97 for (
auto& slotRate : m_rates.slotRates) {
98 slotRate /= m_timeWindow / Unit::us * 32;
100 m_rates.averageRate /= m_timeWindow / Unit::us * 32 * 16;
103 if (m_channelMask.hasChanged()) setActiveFractions();
106 for (
int m = 0; m < 16; m++) {
107 double fraction = m_activeFractions[m];
109 m_rates.slotRates[m] /= fraction;
111 m_rates.slotRates[m] = 0;
114 m_rates.averageRate /= m_activeTotal;
118 void TOPHitRateCounter::setActiveFractions()
120 if (not m_channelMask.isValid()) {
121 for (
auto& fraction : m_activeFractions) fraction = 1;
123 B2WARNING(
"TOPHitRateCounter: no valid channel mask - active fractions set to 1");
127 for (
int m = 0; m < 16; m++) {
128 m_activeFractions[m] = m_channelMask->getActiveFraction(m + 1);
130 m_activeTotal = m_channelMask->getActiveFraction();
Abstract base class for different kinds of events.