Belle II Software development
SVDHitRateCounter Class Reference

Class for monitoring beam background hit rates of SVD. More...

#include <SVDHitRateCounter.h>

Inheritance diagram for SVDHitRateCounter:
HitRateBase

Classes

struct  TreeStruct
 tree structure More...
 

Public Member Functions

 SVDHitRateCounter (const std::string &svdShaperDigitsName, double thrCharge, bool ignoreHotStripsPayload=false, bool ignoreMaskedStripsPayload=false)
 Constructor.
 
virtual void initialize (TTree *tree) override
 Class initializer: set branch addresses and other staf.
 
virtual void clear () override
 Clear time-stamp buffer to prepare for 'accumulate'.
 
virtual void accumulate (unsigned timeStamp) override
 Accumulate hits.
 
virtual void normalize (unsigned timeStamp) override
 Normalize accumulated hits (e.g.
 
void normalizeRates (TreeStruct &rates, bool isU=false, bool isV=false)
 Normalize TreeStruct.
 
void normalizeEnergyRates (TreeStruct &rates)
 Normalize a TreeStruct that stores charge/energy, not hits.
 
int nStripsOnLayerSide (int layer, bool isU)
 Return number of strips on a sensor.
 
double massOfSensor (int layer, int ladder, int sensor)
 Returns the (active) mass of the given sensor in Kg.
 
bool isStripActive (const VxdID &sensorID, const bool &isU, const unsigned short &strip)
 Returns wether a strips is active (neither hot nor masked), taking into account the ignoreHotStrips and ignoreMaskedStrips settings.
 

Private Attributes

int m_nLayers = 4
 number of layers
 
int m_nLadders [4] = {7, 10, 12, 16}
 number of ladders on each layer
 
int m_nSensors [4] = {2, 3, 4, 5}
 number of sensors on a ladder on each layer
 
TreeStruct m_rates
 tree variables for fired strips
 
TreeStruct m_ratesU
 tree variables for fired U-strips
 
TreeStruct m_ratesV
 tree variables for fired V-strips
 
TreeStruct m_rates_highE
 tree variables for high-energy clusters
 
TreeStruct m_rates_lowE
 tree variables for low-energy clusters
 
TreeStruct m_clustersU
 tree variables for U-side clusters
 
TreeStruct m_clustersV
 tree variables for V-side clusters
 
TreeStruct m_rates_energyU
 Tree variables for deposited charge per unit time, then converted to dose rate (U-side)
 
TreeStruct m_rates_energyV
 Tree variables for deposited charge per unit time, then converted to dose rate (V-side)
 
std::map< unsigned, TreeStructm_buffer
 average strip occupancies in time stamps
 
std::map< unsigned, TreeStructm_bufferU
 average U-strip occupancies in time stamps
 
std::map< unsigned, TreeStructm_bufferV
 average V-strip occupancies in time stamps
 
std::map< unsigned, TreeStructm_buffer_highE
 average cluster occupancies (high energy) in time stamps
 
std::map< unsigned, TreeStructm_buffer_lowE
 average cluster occupancies (low energy) in time stamps
 
std::map< unsigned, TreeStructm_buffer_clustersU
 average cluster occupancies (U-side) in time stamps
 
std::map< unsigned, TreeStructm_buffer_clustersV
 average cluster occupancies (V-side) in time stamps
 
std::map< unsigned, TreeStructm_buffer_energyU
 Average deposited energy (U-side) per event in time stamps.
 
std::map< unsigned, TreeStructm_buffer_energyV
 Average deposited energy (V-side) per event in time stamps.
 
StoreArray< SVDShaperDigitm_digits
 collection of digits
 
StoreArray< SVDClusterm_clusters
 collection of clusters
 
StoreObjPtr< SoftwareTriggerResultm_resultStoreObjectPointer
 trigger decision
 
StoreObjPtr< SVDEventInfom_eventInfo
 For number of APV samples taken (3 or 6).
 
SVDHotStripsCalibrations m_HotStripsCalib
 payload for hot strips
 
SVDFADCMaskedStrips m_FADCMaskedStrips
 payload for strips masked on FADC level
 
OptionalDBObjPtr< HardwareClockSettingsm_clockSettings
 hardware clock settings
 
std::string m_svdShaperDigitsName
 name of the input SVDShaperDigits collection
 
int m_activeStrips = 0
 number of active strips
 
int m_layerActiveStrips [4] = {0}
 number of active strips in each layer
 
int m_layerLadderActiveStrips [4][16] = {{0}}
 number of active strips in each layer, ladder
 
int m_layerSensorActiveStrips [4][5] = {{0}}
 number of active strips in each layer, sensor position
 
int m_l3LadderSensorActiveStrips [7][2] = {{0}}
 number of active strips in each sensor in Layer 3
 
int m_activeStripsU = 0
 number of active U-strips
 
int m_layerActiveStripsU [4] = {0}
 number of active U-strips in each layer
 
int m_layerLadderActiveStripsU [4][16] = {{0}}
 number of active U-strips in each layer, ladder
 
int m_layerSensorActiveStripsU [4][5] = {{0}}
 number of active U-strips in each layer, sensor position
 
int m_l3LadderSensorActiveStripsU [7][2] = {{0}}
 number of active U-strips in each sensor in Layer 3
 
int m_activeStripsV = 0
 number of active V-strips
 
int m_layerActiveStripsV [4] = {0}
 number of active V-strips in each layer
 
int m_layerLadderActiveStripsV [4][16] = {{0}}
 number of active V-strips in each layer, ladder
 
int m_layerSensorActiveStripsV [4][5] = {{0}}
 number of active V-strips in each layer, sensor position
 
int m_l3LadderSensorActiveStripsV [7][2] = {{0}}
 number of active V-strips in each sensor in Layer 3
 
double m_thrCharge = 0
 cut on cluster energy in electrons
 
bool m_ignoreHotStripsPayload
 count hot strips as active
 
bool m_ignoreMaskedStripsPayload
 SVD: count FAD-masked strips as active.
 
double m_massKg = 0
 Active mass of the whole SVD in Kg.
 
double m_layerMassKg [4] = {0}
 Active mass of each layer in Kg.
 
double m_layerLadderMassKg [4][16] = {{0}}
 Active mass of each ladder of each layer, in Kg.
 
double m_layerSensorMassKg [4][5] = {{0}}
 Active mass of each ladder/sensor position, in Kg.
 

Static Private Attributes

static constexpr double c_SVDSamplingClockFrequency = 0.03175
 SVD Sampling Clock frequency (approximated) in GHz (standard unit of frequency in basf2).
 

Detailed Description

Class for monitoring beam background hit rates of SVD.

Definition at line 36 of file SVDHitRateCounter.h.

Constructor & Destructor Documentation

◆ SVDHitRateCounter()

SVDHitRateCounter ( const std::string &  svdShaperDigitsName,
double  thrCharge,
bool  ignoreHotStripsPayload = false,
bool  ignoreMaskedStripsPayload = false 
)
inline

Constructor.

Parameters
svdShaperDigitsNamename of the input SVDShaperDigits collection
thrChargecut on cluster energy in electrons
ignoreHotStripsPayloadCount also hot strips as active
ignoreMaskedStripsPayloadCount also FADC-masked strips as active

Definition at line 85 of file SVDHitRateCounter.h.

87 :
88 m_svdShaperDigitsName(svdShaperDigitsName), m_thrCharge(thrCharge),
89 m_ignoreHotStripsPayload(ignoreHotStripsPayload),
90 m_ignoreMaskedStripsPayload(ignoreMaskedStripsPayload)
91 {}
std::string m_svdShaperDigitsName
name of the input SVDShaperDigits collection
bool m_ignoreHotStripsPayload
count hot strips as active
bool m_ignoreMaskedStripsPayload
SVD: count FAD-masked strips as active.
double m_thrCharge
cut on cluster energy in electrons

Member Function Documentation

◆ accumulate()

void accumulate ( unsigned  timeStamp)
overridevirtual

Accumulate hits.

Parameters
timeStamptime stamp

Implements HitRateBase.

Definition at line 144 of file SVDHitRateCounter.cc.

145 {
146 B2DEBUG(10, "SVDHitRateCounter: accumulate()");
147
148 // check if the event has passed HLT filter
149 if (m_resultStoreObjectPointer.isValid()) {
151 if (!eventAccepted) return;
152 }
153
154 // check if data are available
155 if (m_digits.isValid()) {
156
157 // get buffer element
158 auto& rates = m_buffer[timeStamp];
159 auto& ratesU = m_bufferU[timeStamp];
160 auto& ratesV = m_bufferV[timeStamp];
161
162 // increment event counter
163 rates.numEvents++;
164 ratesU.numEvents++;
165 ratesV.numEvents++;
166
167 // accumulate hits
168 for (const auto& digit : m_digits) {
169 // select digits to count (usualy only good ones)
170 VxdID sensorID = digit.getSensorID();
171 int layer = sensorID.getLayerNumber() - 3;
172 int ladder = sensorID.getLadderNumber() - 1;
173 int sensor = sensorID.getSensorNumber() - 1;
174 rates.layerAverageRates[layer] ++;
175 rates.layerLadderAverageRates[layer][ladder] ++;
176 rates.layerSensorAverageRates[layer][sensor] ++;
177 rates.averageRate ++;
178 if (layer == 0)
179 rates.l3LadderSensorAverageRates[ladder][sensor] ++;
180
181 if (digit.isUStrip()) {
182 ratesU.layerAverageRates[layer]++;
183 ratesU.layerLadderAverageRates[layer][ladder]++;
184 ratesU.layerSensorAverageRates[layer][sensor]++;
185 ratesU.averageRate++;
186 if (layer == 0)
187 ratesU.l3LadderSensorAverageRates[ladder][sensor]++;
188 } else {
189 ratesV.layerAverageRates[layer]++;
190 ratesV.layerLadderAverageRates[layer][ladder]++;
191 ratesV.layerSensorAverageRates[layer][sensor]++;
192 ratesV.averageRate++;
193 if (layer == 0)
194 ratesV.l3LadderSensorAverageRates[ladder][sensor]++;
195 }
196 }
197
198 // set flag to true to indicate the rates are valid
199 rates.valid = true;
200 ratesU.valid = true;
201 ratesV.valid = true;
202 }
203
204 // check if data are available
205 if (m_clusters.isValid()) {
206
207 // get buffer element
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];
214
215 // increment event counter
216 rates_highE.numEvents++;
217 rates_lowE.numEvents++;
218 clustersU.numEvents++;
219 clustersV.numEvents++;
220 rates_energyU.numEvents++;
221 rates_energyV.numEvents++;
222
223 // accumulate clusters
224 for (const auto& cluster : m_clusters) {
225 VxdID sensorID = cluster.getSensorID();
226 int layer = sensorID.getLayerNumber() - 3;
227 int ladder = sensorID.getLadderNumber() - 1;
228 int sensor = sensorID.getSensorNumber() - 1;
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 ++;
234 if (layer == 0)
235 rates_highE.l3LadderSensorAverageRates[ladder][sensor] ++;
236 } else {
237 rates_lowE.layerAverageRates[layer] ++;
238 rates_lowE.layerLadderAverageRates[layer][ladder] ++;
239 rates_lowE.layerSensorAverageRates[layer][sensor] ++;
240 rates_lowE.averageRate ++;
241 if (layer == 0)
242 rates_lowE.l3LadderSensorAverageRates[ladder][sensor] ++;
243 }
244
245 // Compute integration time for obtaining the dose rate
246 int nSamp = 6; // Fallback value
247 double svdSamplingClock = c_SVDSamplingClockFrequency; // Fallback value
248 // Replace number of samples with real value if available
249 if (m_eventInfo.isValid())
250 nSamp = m_eventInfo->getNSamples();
251 else
252 B2WARNING("SVDEventInfo not available: assuming 6 samples were taken.");
253 // Avoid division by zero if nSamp = 1. Valid values are only 6 and 3,
254 // so this line is only meant to prevent a crash in case of corrupted data.
255 if (nSamp < 2) nSamp = 2;
256 // Replace sampling frequency with real value if available
257 if (m_clockSettings.isValid())
258 svdSamplingClock = m_clockSettings->getClockFrequency(Const::SVD, "sampling");
259 else
260 B2WARNING("HardwareClockSettings not available: using approximated SVD sampling clock frequency.");
261 double integrationTimeSeconds = (nSamp - 1) / svdSamplingClock / Unit::s;
262 double chargePerUnitTime = cluster.getCharge() / integrationTimeSeconds;
263 if (cluster.isUCluster()) {
264 rates_energyU.layerAverageRates[layer] += chargePerUnitTime;
265 rates_energyU.layerLadderAverageRates[layer][ladder] += chargePerUnitTime;
266 rates_energyU.layerSensorAverageRates[layer][sensor] += chargePerUnitTime;
267 rates_energyU.averageRate += chargePerUnitTime;
268 if (layer == 0)
269 rates_energyU.l3LadderSensorAverageRates[ladder][sensor] += chargePerUnitTime;
270 clustersU.layerAverageRates[layer]++;
271 clustersU.layerLadderAverageRates[layer][ladder]++;
272 clustersU.layerSensorAverageRates[layer][sensor]++;
273 clustersU.averageRate++;
274 if (layer == 0)
275 clustersU.l3LadderSensorAverageRates[ladder][sensor]++;
276 } else {
277 rates_energyV.layerAverageRates[layer] += chargePerUnitTime;
278 rates_energyV.layerLadderAverageRates[layer][ladder] += chargePerUnitTime;
279 rates_energyV.layerSensorAverageRates[layer][sensor] += chargePerUnitTime;
280 rates_energyV.averageRate += chargePerUnitTime;
281 if (layer == 0)
282 rates_energyV.l3LadderSensorAverageRates[ladder][sensor] += chargePerUnitTime;
283 clustersV.layerAverageRates[layer]++;
284 clustersV.layerLadderAverageRates[layer][ladder]++;
285 clustersV.layerSensorAverageRates[layer][sensor]++;
286 clustersV.averageRate++;
287 if (layer == 0)
288 clustersV.l3LadderSensorAverageRates[ladder][sensor]++;
289 }
290 }
291
292 // set flag to true to indicate the rates are valid
293 rates_highE.valid = true;
294 rates_lowE.valid = true;
295 clustersU.valid = true;
296 clustersV.valid = true;
297 rates_energyU.valid = true;
298 rates_energyV.valid = true;
299 }
300
301 }
std::map< unsigned, TreeStruct > m_buffer
average strip occupancies in time stamps
std::map< unsigned, TreeStruct > m_buffer_energyV
Average deposited energy (V-side) per event in time stamps.
StoreObjPtr< SVDEventInfo > m_eventInfo
For number of APV samples taken (3 or 6).
std::map< unsigned, TreeStruct > m_buffer_clustersV
average cluster occupancies (V-side) in time stamps
std::map< unsigned, TreeStruct > m_buffer_lowE
average cluster occupancies (low energy) in time stamps
static constexpr double c_SVDSamplingClockFrequency
SVD Sampling Clock frequency (approximated) in GHz (standard unit of frequency in basf2).
StoreArray< SVDCluster > m_clusters
collection of clusters
std::map< unsigned, TreeStruct > m_buffer_highE
average cluster occupancies (high energy) in time stamps
OptionalDBObjPtr< HardwareClockSettings > m_clockSettings
hardware clock settings
StoreArray< SVDShaperDigit > m_digits
collection of digits
std::map< unsigned, TreeStruct > m_buffer_clustersU
average cluster occupancies (U-side) in time stamps
std::map< unsigned, TreeStruct > m_bufferU
average U-strip occupancies in time stamps
StoreObjPtr< SoftwareTriggerResult > m_resultStoreObjectPointer
trigger decision
std::map< unsigned, TreeStruct > m_buffer_energyU
Average deposited energy (U-side) per event in time stamps.
std::map< unsigned, TreeStruct > m_bufferV
average V-strip occupancies in time stamps
static bool getFinalTriggerDecision(const SoftwareTriggerResult &result, bool forgetTotalResult=false)
Calculate the final cut decision using all "total_results" of all sub triggers in the software trigge...
bool isValid() const
Check wether the array was registered.
Definition: StoreArray.h:288
static const double s
[second]
Definition: Unit.h:95

◆ clear()

void clear ( )
overridevirtual

Clear time-stamp buffer to prepare for 'accumulate'.

Implements HitRateBase.

Definition at line 139 of file SVDHitRateCounter.cc.

140 {
141 m_buffer.clear();
142 }

◆ initialize()

void initialize ( TTree *  tree)
overridevirtual

Class initializer: set branch addresses and other staf.

Parameters
treea valid TTree pointer

Implements HitRateBase.

Definition at line 30 of file SVDHitRateCounter.cc.

31 {
32 // register collection(s) as optional, your detector might be excluded in DAQ
35 m_resultStoreObjectPointer.isOptional();
36 m_eventInfo.isOptional();
37
38 B2DEBUG(10, "SVDHitRateCounter: initialize()");
39 // set branch address
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");
58
59 // count active strips
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] ++;
72 if (isU) {
74 m_layerActiveStripsU[layer]++;
75 m_layerLadderActiveStripsU[layer][ladder]++;
76 m_layerSensorActiveStripsU[layer][sensor]++;
77 } else {
79 m_layerActiveStripsV[layer]++;
80 m_layerLadderActiveStripsV[layer][ladder]++;
81 m_layerSensorActiveStripsV[layer][sensor]++;
82 }
83 }
84 }
85 }
86 }
87 }
88 }
89 int layer = 0;
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] ++;
98 if (isU)
99 m_l3LadderSensorActiveStripsU[ladder][sensor]++;
100 else
101 m_l3LadderSensorActiveStripsV[ladder][sensor]++;
102 }
103 }
104 }
105 }
106 }
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)));
119 layer = 0;
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));
124
125 // Compute active mass
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);
130 m_massKg += mass;
131 m_layerMassKg[layer] += mass;
132 m_layerLadderMassKg[layer][ladder] += mass;
133 m_layerSensorMassKg[layer][sensor] += mass;
134 }
135 }
136 }
137 }
int m_layerLadderActiveStripsV[4][16]
number of active V-strips in each layer, ladder
int m_activeStripsV
number of active V-strips
int m_activeStrips
number of active strips
double m_layerLadderMassKg[4][16]
Active mass of each ladder of each layer, in Kg.
double m_layerMassKg[4]
Active mass of each layer in Kg.
TreeStruct m_rates
tree variables for fired strips
TreeStruct m_rates_highE
tree variables for high-energy clusters
int m_layerSensorActiveStripsV[4][5]
number of active V-strips in each layer, sensor position
int m_l3LadderSensorActiveStripsU[7][2]
number of active U-strips in each sensor in Layer 3
TreeStruct m_rates_energyU
Tree variables for deposited charge per unit time, then converted to dose rate (U-side)
TreeStruct m_ratesU
tree variables for fired U-strips
int m_nLadders[4]
number of ladders on each layer
int m_l3LadderSensorActiveStrips[7][2]
number of active strips in each sensor in Layer 3
int nStripsOnLayerSide(int layer, bool isU)
Return number of strips on a sensor.
int m_layerSensorActiveStrips[4][5]
number of active strips in each layer, sensor position
double m_layerSensorMassKg[4][5]
Active mass of each ladder/sensor position, in Kg.
double massOfSensor(int layer, int ladder, int sensor)
Returns the (active) mass of the given sensor in Kg.
int m_l3LadderSensorActiveStripsV[7][2]
number of active V-strips in each sensor in Layer 3
TreeStruct m_rates_energyV
Tree variables for deposited charge per unit time, then converted to dose rate (V-side)
double m_massKg
Active mass of the whole SVD in Kg.
int m_nSensors[4]
number of sensors on a ladder on each layer
int m_layerLadderActiveStrips[4][16]
number of active strips in each layer, ladder
TreeStruct m_rates_lowE
tree variables for low-energy clusters
int m_activeStripsU
number of active U-strips
int m_layerSensorActiveStripsU[4][5]
number of active U-strips in each layer, sensor position
bool isStripActive(const VxdID &sensorID, const bool &isU, const unsigned short &strip)
Returns wether a strips is active (neither hot nor masked), taking into account the ignoreHotStrips a...
int m_layerActiveStripsV[4]
number of active V-strips in each layer
int m_layerLadderActiveStripsU[4][16]
number of active U-strips in each layer, ladder
TreeStruct m_clustersV
tree variables for V-side clusters
TreeStruct m_clustersU
tree variables for U-side clusters
int m_layerActiveStrips[4]
number of active strips in each layer
int m_layerActiveStripsU[4]
number of active U-strips in each layer
TreeStruct m_ratesV
tree variables for fired V-strips
bool isOptional(const std::string &name="")
Tell the DataStore about an optional input.

◆ isStripActive()

bool isStripActive ( const VxdID sensorID,
const bool &  isU,
const unsigned short &  strip 
)

Returns wether a strips is active (neither hot nor masked), taking into account the ignoreHotStrips and ignoreMaskedStrips settings.

Parameters
sensorIDThe VxdID of the sensor
isUThe side of the sensor
stripThe strip index

Definition at line 398 of file SVDHitRateCounter.cc.

400 {
401 return ((m_ignoreHotStripsPayload || !m_HotStripsCalib.isHot(sensorID, isU, strip))
402 && (m_ignoreMaskedStripsPayload || !m_FADCMaskedStrips.isMasked(sensorID, isU, strip)));
403 }
SVDFADCMaskedStrips m_FADCMaskedStrips
payload for strips masked on FADC level
SVDHotStripsCalibrations m_HotStripsCalib
payload for hot strips
float isMasked(const VxdID &sensorID, const bool &isU, const unsigned short &strip) const
This is the method for getting the comprehensive list of masked strips at FADC level.
float isHot(const VxdID &sensorID, const bool &isU, const unsigned short &strip) const
This is the method for getting the offline list of bad strips to be masked.

◆ massOfSensor()

double massOfSensor ( int  layer,
int  ladder,
int  sensor 
)

Returns the (active) mass of the given sensor in Kg.

Parameters
layertha layer number (starting from 0, not 3)
ladderthe ladder number (starting from 0, not 1)
sensorthe sensor number (starting from 0, not 1)

Definition at line 388 of file SVDHitRateCounter.cc.

389 {
390 static const double rho_Si = 2.329 * Unit::g_cm3;
391 auto& sensorInfo = VXD::GeoCache::getInstance().getSensorInfo(VxdID(layer + 3, ladder + 1, sensor + 1));
392 double length = sensorInfo.getLength();
393 double width = (sensorInfo.getForwardWidth() + sensorInfo.getBackwardWidth()) / 2.0;
394 double thickness = sensorInfo.getWSize();
395 return length * width * thickness * rho_Si / 1e3;
396 }
static const double g_cm3
Practical units with the value set at 1.
Definition: Unit.h:60
const SensorInfoBase & getSensorInfo(Belle2::VxdID id) const
Return a referecne to the SensorInfo of a given SensorID.
Definition: GeoCache.cc:67
static GeoCache & getInstance()
Return a reference to the singleton instance.
Definition: GeoCache.cc:214
const double rho_Si
Silicon density in g cm^-3.
Definition: PXDUtilities.h:31

◆ normalize()

void normalize ( unsigned  timeStamp)
overridevirtual

Normalize accumulated hits (e.g.

transform to rates)

Parameters
timeStamptime stamp

Implements HitRateBase.

Definition at line 303 of file SVDHitRateCounter.cc.

304 {
305 B2DEBUG(10, "SVDHitRateCounter: normalize()");
306 // copy buffer element
307 m_rates = m_buffer[timeStamp];
308 m_ratesU = m_bufferU[timeStamp];
309 m_ratesV = m_bufferV[timeStamp];
310 m_rates_highE = m_buffer_highE[timeStamp];
311 m_rates_lowE = m_buffer_lowE[timeStamp];
312 m_clustersU = m_buffer_clustersU[timeStamp];
313 m_clustersV = m_buffer_clustersV[timeStamp];
316
326 }
void normalizeRates(TreeStruct &rates, bool isU=false, bool isV=false)
Normalize TreeStruct.
void normalizeEnergyRates(TreeStruct &rates)
Normalize a TreeStruct that stores charge/energy, not hits.

◆ normalizeEnergyRates()

void normalizeEnergyRates ( TreeStruct rates)

Normalize a TreeStruct that stores charge/energy, not hits.

Parameters
ratesTreeStruct to be normalized.

Assumes the TreeStruct contains the total accumulated cluster charge (in e-), and uses Const::ehEnergy and the mass of the sensors to convert to the average dose rate per event in mrad/s.

Assumes the integration time is 155 ns (6 samples).

Definition at line 364 of file SVDHitRateCounter.cc.

365 {
366 static const double ehEnergyJoules = Const::ehEnergy / Unit::J;
367 // Convert charge/s to mrad/s by multiplying by energy/pair and dividing by the mass
368 static const double conv = ehEnergyJoules * 100e3;
369
370 if (!rates.valid) return;
371
372 rates.normalize(); // Divide by nEvents
373 // Convert to dose rate [mrad/s]
374 rates.averageRate *= conv / m_massKg;
375 for (int layer = 0; layer < m_nLayers; layer++) {
376 rates.layerAverageRates[layer] *= conv / m_layerMassKg[layer];
377 for (int ladder = 0; ladder < m_nLadders[layer]; ladder++)
378 rates.layerLadderAverageRates[layer][ladder] *= conv / m_layerLadderMassKg[layer][ladder];
379 for (int sensor = 0; sensor < m_nSensors[layer]; sensor++)
380 rates.layerSensorAverageRates[layer][sensor] *= conv / m_layerSensorMassKg[layer][sensor];
381 }
382 int layer = 0;
383 for (int ladder = 0; ladder < m_nLadders[layer]; ladder++)
384 for (int sensor = 0; sensor < m_nSensors[layer]; sensor++)
385 rates.l3LadderSensorAverageRates[ladder][sensor] *= conv / massOfSensor(layer, ladder, sensor);
386 }
static const double ehEnergy
Energy needed to create an electron-hole pair in Si at std.
Definition: Const.h:697
static const double J
[joule]
Definition: Unit.h:116

◆ normalizeRates()

void normalizeRates ( TreeStruct rates,
bool  isU = false,
bool  isV = false 
)

Normalize TreeStruct.

Parameters
ratesTreeStruct to be normalized
isUWhether the TreeStruct only contains U-side hits
isVWhether the TreeStruct only contains V-side hits

Definition at line 328 of file SVDHitRateCounter.cc.

329 {
330 if (not rates.valid) return;
331
332 // normalize -> nHits on each segment in single event
333 rates.normalize();
334
335 // Take the correct active strips counter
336 const auto& activeStrips = isU ? m_activeStripsU : (isV ? m_activeStripsV : m_activeStrips);
337 const auto& layerActiveStrips = isU ? m_layerActiveStripsU : (isV ? m_layerActiveStripsV : m_layerActiveStrips);
338 const auto& layerLadderActiveStrips = isU ? m_layerLadderActiveStripsU
340 const auto& layerSensorActiveStrips = isU ? m_layerSensorActiveStripsU
342 const auto& l3LadderSensorActiveStrips = isU ? m_l3LadderSensorActiveStripsU
344
345 // convert to occupancy [%]
346 rates.averageRate /= activeStrips / 100.0;
347 for (int layer = 0; layer < m_nLayers; layer++) {
348 rates.layerAverageRates[layer] /= layerActiveStrips[layer] / 100.0;
349 for (int ladder = 0; ladder < m_nLadders[layer]; ladder++) {
350 rates.layerLadderAverageRates[layer][ladder] /= layerLadderActiveStrips[layer][ladder] / 100.0;
351 }
352 for (int sensor = 0; sensor < m_nSensors[layer]; sensor++) {
353 rates.layerSensorAverageRates[layer][sensor] /= layerSensorActiveStrips[layer][sensor] / 100.0;
354 }
355 }
356 int layer = 0;
357 for (int ladder = 0; ladder < m_nLadders[layer]; ladder++) {
358 for (int sensor = 0; sensor < m_nSensors[layer]; sensor++) {
359 rates.l3LadderSensorAverageRates[ladder][sensor] /= l3LadderSensorActiveStrips[ladder][sensor] / 100.0;
360 }
361 }
362 }

◆ nStripsOnLayerSide()

int nStripsOnLayerSide ( int  layer,
bool  isU 
)
inline

Return number of strips on a sensor.

Parameters
layerlayer number of the sensor (starting from 0)
isUtrue if the sensor is U side, false if V.

Definition at line 142 of file SVDHitRateCounter.h.

143 {
144 if (!isU && layer > 0) return 512; // V side on Layer 4,5,6
145 else return 768;
146 }

Member Data Documentation

◆ c_SVDSamplingClockFrequency

constexpr double c_SVDSamplingClockFrequency = 0.03175
staticconstexprprivate

SVD Sampling Clock frequency (approximated) in GHz (standard unit of frequency in basf2).

This is used as a fallback value when HardwareClockSettings' payload is not available.

Definition at line 245 of file SVDHitRateCounter.h.

◆ m_activeStrips

int m_activeStrips = 0
private

number of active strips

Definition at line 211 of file SVDHitRateCounter.h.

◆ m_activeStripsU

int m_activeStripsU = 0
private

number of active U-strips

Definition at line 217 of file SVDHitRateCounter.h.

◆ m_activeStripsV

int m_activeStripsV = 0
private

number of active V-strips

Definition at line 223 of file SVDHitRateCounter.h.

◆ m_buffer

std::map<unsigned, TreeStruct> m_buffer
private

average strip occupancies in time stamps

Definition at line 185 of file SVDHitRateCounter.h.

◆ m_buffer_clustersU

std::map<unsigned, TreeStruct> m_buffer_clustersU
private

average cluster occupancies (U-side) in time stamps

Definition at line 190 of file SVDHitRateCounter.h.

◆ m_buffer_clustersV

std::map<unsigned, TreeStruct> m_buffer_clustersV
private

average cluster occupancies (V-side) in time stamps

Definition at line 191 of file SVDHitRateCounter.h.

◆ m_buffer_energyU

std::map<unsigned, TreeStruct> m_buffer_energyU
private

Average deposited energy (U-side) per event in time stamps.

Definition at line 192 of file SVDHitRateCounter.h.

◆ m_buffer_energyV

std::map<unsigned, TreeStruct> m_buffer_energyV
private

Average deposited energy (V-side) per event in time stamps.

Definition at line 193 of file SVDHitRateCounter.h.

◆ m_buffer_highE

std::map<unsigned, TreeStruct> m_buffer_highE
private

average cluster occupancies (high energy) in time stamps

Definition at line 188 of file SVDHitRateCounter.h.

◆ m_buffer_lowE

std::map<unsigned, TreeStruct> m_buffer_lowE
private

average cluster occupancies (low energy) in time stamps

Definition at line 189 of file SVDHitRateCounter.h.

◆ m_bufferU

std::map<unsigned, TreeStruct> m_bufferU
private

average U-strip occupancies in time stamps

Definition at line 186 of file SVDHitRateCounter.h.

◆ m_bufferV

std::map<unsigned, TreeStruct> m_bufferV
private

average V-strip occupancies in time stamps

Definition at line 187 of file SVDHitRateCounter.h.

◆ m_clockSettings

OptionalDBObjPtr<HardwareClockSettings> m_clockSettings
private

hardware clock settings

Definition at line 206 of file SVDHitRateCounter.h.

◆ m_clusters

StoreArray<SVDCluster> m_clusters
private

collection of clusters

Definition at line 197 of file SVDHitRateCounter.h.

◆ m_clustersU

TreeStruct m_clustersU
private

tree variables for U-side clusters

Definition at line 179 of file SVDHitRateCounter.h.

◆ m_clustersV

TreeStruct m_clustersV
private

tree variables for V-side clusters

Definition at line 180 of file SVDHitRateCounter.h.

◆ m_digits

StoreArray<SVDShaperDigit> m_digits
private

collection of digits

Definition at line 196 of file SVDHitRateCounter.h.

◆ m_eventInfo

StoreObjPtr<SVDEventInfo> m_eventInfo
private

For number of APV samples taken (3 or 6).

Definition at line 201 of file SVDHitRateCounter.h.

◆ m_FADCMaskedStrips

SVDFADCMaskedStrips m_FADCMaskedStrips
private

payload for strips masked on FADC level

Definition at line 205 of file SVDHitRateCounter.h.

◆ m_HotStripsCalib

SVDHotStripsCalibrations m_HotStripsCalib
private

payload for hot strips

Definition at line 204 of file SVDHitRateCounter.h.

◆ m_ignoreHotStripsPayload

bool m_ignoreHotStripsPayload
private

count hot strips as active

Definition at line 230 of file SVDHitRateCounter.h.

◆ m_ignoreMaskedStripsPayload

bool m_ignoreMaskedStripsPayload
private

SVD: count FAD-masked strips as active.

Definition at line 231 of file SVDHitRateCounter.h.

◆ m_l3LadderSensorActiveStrips

int m_l3LadderSensorActiveStrips[7][2] = {{0}}
private

number of active strips in each sensor in Layer 3

Definition at line 215 of file SVDHitRateCounter.h.

◆ m_l3LadderSensorActiveStripsU

int m_l3LadderSensorActiveStripsU[7][2] = {{0}}
private

number of active U-strips in each sensor in Layer 3

Definition at line 221 of file SVDHitRateCounter.h.

◆ m_l3LadderSensorActiveStripsV

int m_l3LadderSensorActiveStripsV[7][2] = {{0}}
private

number of active V-strips in each sensor in Layer 3

Definition at line 227 of file SVDHitRateCounter.h.

◆ m_layerActiveStrips

int m_layerActiveStrips[4] = {0}
private

number of active strips in each layer

Definition at line 212 of file SVDHitRateCounter.h.

◆ m_layerActiveStripsU

int m_layerActiveStripsU[4] = {0}
private

number of active U-strips in each layer

Definition at line 218 of file SVDHitRateCounter.h.

◆ m_layerActiveStripsV

int m_layerActiveStripsV[4] = {0}
private

number of active V-strips in each layer

Definition at line 224 of file SVDHitRateCounter.h.

◆ m_layerLadderActiveStrips

int m_layerLadderActiveStrips[4][16] = {{0}}
private

number of active strips in each layer, ladder

Definition at line 213 of file SVDHitRateCounter.h.

◆ m_layerLadderActiveStripsU

int m_layerLadderActiveStripsU[4][16] = {{0}}
private

number of active U-strips in each layer, ladder

Definition at line 219 of file SVDHitRateCounter.h.

◆ m_layerLadderActiveStripsV

int m_layerLadderActiveStripsV[4][16] = {{0}}
private

number of active V-strips in each layer, ladder

Definition at line 225 of file SVDHitRateCounter.h.

◆ m_layerLadderMassKg

double m_layerLadderMassKg[4][16] = {{0}}
private

Active mass of each ladder of each layer, in Kg.

Definition at line 235 of file SVDHitRateCounter.h.

◆ m_layerMassKg

double m_layerMassKg[4] = {0}
private

Active mass of each layer in Kg.

Definition at line 234 of file SVDHitRateCounter.h.

◆ m_layerSensorActiveStrips

int m_layerSensorActiveStrips[4][5] = {{0}}
private

number of active strips in each layer, sensor position

Definition at line 214 of file SVDHitRateCounter.h.

◆ m_layerSensorActiveStripsU

int m_layerSensorActiveStripsU[4][5] = {{0}}
private

number of active U-strips in each layer, sensor position

Definition at line 220 of file SVDHitRateCounter.h.

◆ m_layerSensorActiveStripsV

int m_layerSensorActiveStripsV[4][5] = {{0}}
private

number of active V-strips in each layer, sensor position

Definition at line 226 of file SVDHitRateCounter.h.

◆ m_layerSensorMassKg

double m_layerSensorMassKg[4][5] = {{0}}
private

Active mass of each ladder/sensor position, in Kg.

Definition at line 236 of file SVDHitRateCounter.h.

◆ m_massKg

double m_massKg = 0
private

Active mass of the whole SVD in Kg.

Definition at line 233 of file SVDHitRateCounter.h.

◆ m_nLadders

int m_nLadders[4] = {7, 10, 12, 16}
private

number of ladders on each layer

Definition at line 170 of file SVDHitRateCounter.h.

◆ m_nLayers

int m_nLayers = 4
private

number of layers

Definition at line 169 of file SVDHitRateCounter.h.

◆ m_nSensors

int m_nSensors[4] = {2, 3, 4, 5}
private

number of sensors on a ladder on each layer

Definition at line 171 of file SVDHitRateCounter.h.

◆ m_rates

TreeStruct m_rates
private

tree variables for fired strips

Definition at line 174 of file SVDHitRateCounter.h.

◆ m_rates_energyU

TreeStruct m_rates_energyU
private

Tree variables for deposited charge per unit time, then converted to dose rate (U-side)

Definition at line 181 of file SVDHitRateCounter.h.

◆ m_rates_energyV

TreeStruct m_rates_energyV
private

Tree variables for deposited charge per unit time, then converted to dose rate (V-side)

Definition at line 182 of file SVDHitRateCounter.h.

◆ m_rates_highE

TreeStruct m_rates_highE
private

tree variables for high-energy clusters

Definition at line 177 of file SVDHitRateCounter.h.

◆ m_rates_lowE

TreeStruct m_rates_lowE
private

tree variables for low-energy clusters

Definition at line 178 of file SVDHitRateCounter.h.

◆ m_ratesU

TreeStruct m_ratesU
private

tree variables for fired U-strips

Definition at line 175 of file SVDHitRateCounter.h.

◆ m_ratesV

TreeStruct m_ratesV
private

tree variables for fired V-strips

Definition at line 176 of file SVDHitRateCounter.h.

◆ m_resultStoreObjectPointer

StoreObjPtr<SoftwareTriggerResult> m_resultStoreObjectPointer
private

trigger decision

Definition at line 200 of file SVDHitRateCounter.h.

◆ m_svdShaperDigitsName

std::string m_svdShaperDigitsName
private

name of the input SVDShaperDigits collection

Definition at line 209 of file SVDHitRateCounter.h.

◆ m_thrCharge

double m_thrCharge = 0
private

cut on cluster energy in electrons

Definition at line 229 of file SVDHitRateCounter.h.


The documentation for this class was generated from the following files: