12 #include <background/modules/BeamBkgHitRateMonitor/SVDHitRateCounter.h>
15 #include <framework/logging/Logger.h>
16 #include <hlt/softwaretrigger/core/FinalTriggerDecisionCalculator.h>
17 #include <framework/gearbox/Const.h>
18 #include <framework/gearbox/Unit.h>
19 #include <vxd/geometry/GeoCache.h>
23 #define LOGRATIO(x,y) (x) << " / " << (y) << " = " << ((x) * 100 / (y)) << "%"
30 namespace Background {
32 void SVDHitRateCounter::initialize(TTree* tree)
35 m_digits.isOptional(m_svdShaperDigitsName);
36 m_clusters.isOptional();
38 B2DEBUG(10,
"SVDHitRateCounter: initialize()");
40 tree->Branch(
"svd", &m_rates,
41 "layerAverageRates[4]/F:layerLadderAverageRates[4][16]/F:layerSensorAverageRates[4][5]:averageRate/F:l3LadderSensorAverageRates[7][2]/F:numEvents/I:valid/O");
42 tree->Branch(
"svdU", &m_ratesU,
43 "layerAverageRates[4]/F:layerLadderAverageRates[4][16]/F:layerSensorAverageRates[4][5]:averageRate/F:l3LadderSensorAverageRates[7][2]/F:numEvents/I:valid/O");
44 tree->Branch(
"svdV", &m_ratesV,
45 "layerAverageRates[4]/F:layerLadderAverageRates[4][16]/F:layerSensorAverageRates[4][5]:averageRate/F:l3LadderSensorAverageRates[7][2]/F:numEvents/I:valid/O");
46 tree->Branch(
"svd_highE", &m_rates_highE,
47 "layerAverageRates[4]/F:layerLadderAverageRates[4][16]/F:layerSensorAverageRates[4][5]:averageRate/F:l3LadderSensorAverageRates[7][2]/F:numEvents/I:valid/O");
48 tree->Branch(
"svd_lowE", &m_rates_lowE,
49 "layerAverageRates[4]/F:layerLadderAverageRates[4][16]/F:layerSensorAverageRates[4][5]:averageRate/F:l3LadderSensorAverageRates[7][2]/F:numEvents/I:valid/O");
50 tree->Branch(
"svd_clustersU", &m_clustersU,
51 "layerAverageRates[4]/F:layerLadderAverageRates[4][16]/F:layerSensorAverageRates[4][5]:averageRate/F:l3LadderSensorAverageRates[7][2]/F:numEvents/I:valid/O");
52 tree->Branch(
"svd_clustersV", &m_clustersV,
53 "layerAverageRates[4]/F:layerLadderAverageRates[4][16]/F:layerSensorAverageRates[4][5]:averageRate/F:l3LadderSensorAverageRates[7][2]/F:numEvents/I:valid/O");
54 tree->Branch(
"svd_energyU", &m_rates_energyU,
55 "layerAverageRates[4]/F:layerLadderAverageRates[4][16]/F:layerSensorAverageRates[4][5]:averageRate/F:l3LadderSensorAverageRates[7][2]/F:numEvents/I:valid/O");
56 tree->Branch(
"svd_energyV", &m_rates_energyV,
57 "layerAverageRates[4]/F:layerLadderAverageRates[4][16]/F:layerSensorAverageRates[4][5]:averageRate/F:l3LadderSensorAverageRates[7][2]/F:numEvents/I:valid/O");
60 for (
int layer = 0; layer < m_nLayers; layer++) {
61 for (
int ladder = 0; ladder < m_nLadders[layer]; ladder++) {
62 for (
int sensor = 0; sensor < m_nSensors[layer]; sensor++) {
63 VxdID sensorID(layer + 3, ladder + 1, sensor + 1);
64 for (
bool isU : {
true,
false}) {
65 int nStrips = nStripsOnLayerSide(layer, isU);
66 for (
int strip = 0; strip < nStrips; strip++) {
67 if (isStripActive(sensorID, isU, strip)) {
69 m_layerActiveStrips[layer] ++;
70 m_layerLadderActiveStrips[layer][ladder] ++;
71 m_layerSensorActiveStrips[layer][sensor] ++;
74 m_layerActiveStripsU[layer]++;
75 m_layerLadderActiveStripsU[layer][ladder]++;
76 m_layerSensorActiveStripsU[layer][sensor]++;
79 m_layerActiveStripsV[layer]++;
80 m_layerLadderActiveStripsV[layer][ladder]++;
81 m_layerSensorActiveStripsV[layer][sensor]++;
90 for (
int ladder = 0; ladder < m_nLadders[layer]; ladder++) {
91 for (
int sensor = 0; sensor < m_nSensors[layer]; sensor++) {
92 VxdID sensorID(layer + 3, ladder + 1, sensor + 1);
93 for (
bool isU : {
true,
false}) {
94 int nStrips = nStripsOnLayerSide(layer, isU);
95 for (
int strip = 0; strip < nStrips; strip++) {
96 if (isStripActive(sensorID, isU, strip)) {
97 m_l3LadderSensorActiveStrips[ladder][sensor] ++;
99 m_l3LadderSensorActiveStripsU[ladder][sensor]++;
101 m_l3LadderSensorActiveStripsV[ladder][sensor]++;
107 B2INFO(
"SVD active strips = " << LOGRATIO(m_activeStrips, 223744));
108 for (layer = 0; layer < m_nLayers; layer++)
109 B2INFO(
" Active strips L" << layer + 3 <<
".X.X = "
110 << LOGRATIO(m_layerActiveStrips[layer], m_nLadders[layer] * m_nSensors[layer] * (nStripsOnLayerSide(layer,
false) + 768)));
111 for (layer = 0; layer < m_nLayers; layer++)
112 for (
int ladder = 0; ladder < m_nLadders[layer]; ladder++)
113 B2INFO(
" Active strips L" << layer + 3 <<
"." << ladder + 1 <<
".X = "
114 << LOGRATIO(m_layerLadderActiveStrips[layer][ladder], m_nSensors[layer] * (nStripsOnLayerSide(layer,
false) + 768)));
115 for (layer = 0; layer < m_nLayers; layer++)
116 for (
int sensor = 0; sensor < m_nSensors[layer]; sensor++)
117 B2INFO(
" Active strips L" << layer + 3 <<
".X." << sensor + 1 <<
" = "
118 << LOGRATIO(m_layerSensorActiveStrips[layer][sensor], m_nLadders[layer] * (nStripsOnLayerSide(layer,
false) + 768)));
120 for (
int ladder = 0; ladder < m_nLadders[layer]; ladder++)
121 for (
int sensor = 0; sensor < m_nSensors[layer]; sensor++)
122 B2INFO(
" Active strips L3." << ladder + 1 <<
"." << sensor + 1 <<
" = "
123 << LOGRATIO(m_l3LadderSensorActiveStrips[ladder][sensor], 2 * 768));
126 for (layer = 0; layer < m_nLayers; layer++) {
127 for (
int ladder = 0; ladder < m_nLadders[layer]; ladder++) {
128 for (
int sensor = 0; sensor < m_nSensors[layer]; sensor++) {
129 double mass = massOfSensor(layer, ladder, sensor);
131 m_layerMassKg[layer] += mass;
132 m_layerLadderMassKg[layer][ladder] += mass;
133 m_layerSensorMassKg[layer][sensor] += mass;
139 void SVDHitRateCounter::clear()
144 void SVDHitRateCounter::accumulate(
unsigned timeStamp)
146 B2DEBUG(10,
"SVDHitRateCounter: accumulate()");
149 if (m_resultStoreObjectPointer.isValid()) {
150 const bool eventAccepted = SoftwareTrigger::FinalTriggerDecisionCalculator::getFinalTriggerDecision(*m_resultStoreObjectPointer);
151 if (!eventAccepted)
return;
155 if (m_digits.isValid()) {
158 auto& rates = m_buffer[timeStamp];
159 auto& ratesU = m_bufferU[timeStamp];
160 auto& ratesV = m_bufferV[timeStamp];
168 for (
const auto& digit : m_digits) {
170 VxdID sensorID = digit.getSensorID();
174 rates.layerAverageRates[layer] ++;
175 rates.layerLadderAverageRates[layer][ladder] ++;
176 rates.layerSensorAverageRates[layer][sensor] ++;
177 rates.averageRate ++;
179 rates.l3LadderSensorAverageRates[ladder][sensor] ++;
181 if (digit.isUStrip()) {
182 ratesU.layerAverageRates[layer]++;
183 ratesU.layerLadderAverageRates[layer][ladder]++;
184 ratesU.layerSensorAverageRates[layer][sensor]++;
185 ratesU.averageRate++;
187 ratesU.l3LadderSensorAverageRates[ladder][sensor]++;
189 ratesV.layerAverageRates[layer]++;
190 ratesV.layerLadderAverageRates[layer][ladder]++;
191 ratesV.layerSensorAverageRates[layer][sensor]++;
192 ratesV.averageRate++;
194 ratesV.l3LadderSensorAverageRates[ladder][sensor]++;
205 if (m_clusters.isValid()) {
208 auto& rates_highE = m_buffer_highE[timeStamp];
209 auto& rates_lowE = m_buffer_lowE[timeStamp];
210 auto& clustersU = m_buffer_clustersU[timeStamp];
211 auto& clustersV = m_buffer_clustersV[timeStamp];
212 auto& rates_energyU = m_buffer_energyU[timeStamp];
213 auto& rates_energyV = m_buffer_energyV[timeStamp];
216 rates_highE.numEvents++;
217 rates_lowE.numEvents++;
218 clustersU.numEvents++;
219 clustersV.numEvents++;
220 rates_energyU.numEvents++;
221 rates_energyV.numEvents++;
224 for (
const auto& cluster : m_clusters) {
225 VxdID sensorID = cluster.getSensorID();
229 if (cluster.getCharge() > m_thrCharge) {
230 rates_highE.layerAverageRates[layer] ++;
231 rates_highE.layerLadderAverageRates[layer][ladder] ++;
232 rates_highE.layerSensorAverageRates[layer][sensor] ++;
233 rates_highE.averageRate ++;
235 rates_highE.l3LadderSensorAverageRates[ladder][sensor] ++;
237 rates_lowE.layerAverageRates[layer] ++;
238 rates_lowE.layerLadderAverageRates[layer][ladder] ++;
239 rates_lowE.layerSensorAverageRates[layer][sensor] ++;
240 rates_lowE.averageRate ++;
242 rates_lowE.l3LadderSensorAverageRates[ladder][sensor] ++;
244 int nSamp = m_eventInfo.isValid() ? m_eventInfo->getNSamples() : 6;
245 if (nSamp < 2) nSamp = 2;
246 double integrationTimeSeconds = (nSamp - 1) / c_SVDSamplingClockFrequency / Unit::s;
247 double chargePerUnitTime = cluster.getCharge() / integrationTimeSeconds;
248 if (cluster.isUCluster()) {
249 rates_energyU.layerAverageRates[layer] += chargePerUnitTime;
250 rates_energyU.layerLadderAverageRates[layer][ladder] += chargePerUnitTime;
251 rates_energyU.layerSensorAverageRates[layer][sensor] += chargePerUnitTime;
252 rates_energyU.averageRate += chargePerUnitTime;
254 rates_energyU.l3LadderSensorAverageRates[ladder][sensor] += chargePerUnitTime;
255 clustersU.layerAverageRates[layer]++;
256 clustersU.layerLadderAverageRates[layer][ladder]++;
257 clustersU.layerSensorAverageRates[layer][sensor]++;
258 clustersU.averageRate++;
260 clustersU.l3LadderSensorAverageRates[ladder][sensor]++;
262 rates_energyV.layerAverageRates[layer] += chargePerUnitTime;
263 rates_energyV.layerLadderAverageRates[layer][ladder] += chargePerUnitTime;
264 rates_energyV.layerSensorAverageRates[layer][sensor] += chargePerUnitTime;
265 rates_energyV.averageRate += chargePerUnitTime;
267 rates_energyV.l3LadderSensorAverageRates[ladder][sensor] += chargePerUnitTime;
268 clustersV.layerAverageRates[layer]++;
269 clustersV.layerLadderAverageRates[layer][ladder]++;
270 clustersV.layerSensorAverageRates[layer][sensor]++;
271 clustersV.averageRate++;
273 clustersV.l3LadderSensorAverageRates[ladder][sensor]++;
278 rates_highE.valid =
true;
279 rates_lowE.valid =
true;
280 clustersU.valid =
true;
281 clustersV.valid =
true;
282 rates_energyU.valid =
true;
283 rates_energyV.valid =
true;
288 void SVDHitRateCounter::normalize(
unsigned timeStamp)
290 B2DEBUG(10,
"SVDHitRateCounter: normalize()");
292 m_rates = m_buffer[timeStamp];
293 m_ratesU = m_bufferU[timeStamp];
294 m_ratesV = m_bufferV[timeStamp];
295 m_rates_highE = m_buffer_highE[timeStamp];
296 m_rates_lowE = m_buffer_lowE[timeStamp];
297 m_clustersU = m_buffer_clustersU[timeStamp];
298 m_clustersV = m_buffer_clustersV[timeStamp];
299 m_rates_energyU = m_buffer_energyU[timeStamp];
300 m_rates_energyV = m_buffer_energyV[timeStamp];
302 SVDHitRateCounter::normalizeRates(m_rates);
303 SVDHitRateCounter::normalizeRates(m_ratesU,
true);
304 SVDHitRateCounter::normalizeRates(m_ratesV,
false,
true);
305 SVDHitRateCounter::normalizeRates(m_rates_highE);
306 SVDHitRateCounter::normalizeRates(m_rates_lowE);
307 SVDHitRateCounter::normalizeRates(m_clustersU,
true);
308 SVDHitRateCounter::normalizeRates(m_clustersV,
false,
true);
309 SVDHitRateCounter::normalizeEnergyRates(m_rates_energyU);
310 SVDHitRateCounter::normalizeEnergyRates(m_rates_energyV);
313 void SVDHitRateCounter::normalizeRates(
TreeStruct& rates,
bool isU,
bool isV)
315 if (not rates.
valid)
return;
321 const auto& activeStrips = isU ? m_activeStripsU : (isV ? m_activeStripsV : m_activeStrips);
322 const auto& layerActiveStrips = isU ? m_layerActiveStripsU : (isV ? m_layerActiveStripsV : m_layerActiveStrips);
323 const auto& layerLadderActiveStrips = isU ? m_layerLadderActiveStripsU
324 : (isV ? m_layerLadderActiveStripsV : m_layerLadderActiveStrips);
325 const auto& layerSensorActiveStrips = isU ? m_layerSensorActiveStripsU
326 : (isV ? m_layerSensorActiveStripsV : m_layerSensorActiveStrips);
327 const auto& l3LadderSensorActiveStrips = isU ? m_l3LadderSensorActiveStripsU
328 : (isV ? m_l3LadderSensorActiveStripsV : m_l3LadderSensorActiveStrips);
332 for (
int layer = 0; layer < m_nLayers; layer++) {
334 for (
int ladder = 0; ladder < m_nLadders[layer]; ladder++) {
337 for (
int sensor = 0; sensor < m_nSensors[layer]; sensor++) {
342 for (
int ladder = 0; ladder < m_nLadders[layer]; ladder++) {
343 for (
int sensor = 0; sensor < m_nSensors[layer]; sensor++) {
349 void SVDHitRateCounter::normalizeEnergyRates(
TreeStruct& rates)
351 static const double ehEnergyJoules = Const::ehEnergy / Unit::J;
353 static const double conv = ehEnergyJoules * 100e3;
355 if (!rates.
valid)
return;
360 for (
int layer = 0; layer < m_nLayers; layer++) {
362 for (
int ladder = 0; ladder < m_nLadders[layer]; ladder++)
364 for (
int sensor = 0; sensor < m_nSensors[layer]; sensor++)
368 for (
int ladder = 0; ladder < m_nLadders[layer]; ladder++)
369 for (
int sensor = 0; sensor < m_nSensors[layer]; sensor++)
373 double SVDHitRateCounter::massOfSensor(
int layer,
int ladder,
int sensor)
375 static const double rho_Si = 2.329 * Unit::g_cm3;
376 auto& sensorInfo = VXD::GeoCache::getInstance().getSensorInfo(
VxdID(layer + 3, ladder + 1, sensor + 1));
377 double length = sensorInfo.getLength();
378 double width = (sensorInfo.getForwardWidth() + sensorInfo.getBackwardWidth()) / 2.0;
379 double thickness = sensorInfo.getWSize();
380 return length * width * thickness *
rho_Si / 1e3;
383 bool SVDHitRateCounter::isStripActive(
const VxdID& sensorID,
const bool& isU,
384 const unsigned short& strip)
386 return ((m_ignoreHotStripsPayload || !m_HotStripsCalib.isHot(sensorID, isU, strip))
387 && (m_ignoreMaskedStripsPayload || !m_FADCMaskedStrips.isMasked(sensorID, isU, strip)));