Belle II Software  release-08-01-10
CDCHitRateCounter.cc
1 /**************************************************************************
2  * basf2 (Belle II Analysis Software Framework) *
3  * Author: The Belle II Collaboration *
4  * *
5  * See git log for contributors and copyright holders. *
6  * This file is licensed under LGPL-3.0, see LICENSE.md. *
7  **************************************************************************/
8 
9 // Own header.
10 #include <background/modules/BeamBkgHitRateMonitor/CDCHitRateCounter.h>
11 
12 // framework aux
13 #include <framework/gearbox/Unit.h>
14 #include <framework/gearbox/Const.h>
15 #include <framework/logging/Logger.h>
16 
17 #include <tracking/trackFindingCDC/rootification/StoreWrappedObjPtr.h>
18 #include <tracking/trackFindingCDC/eventdata/hits/CDCWireHit.h>
19 
20 #include <cdc/geometry/CDCGeometryPar.h>
21 #include <cdc/dataobjects/WireID.h>
22 
23 using namespace std;
24 
25 namespace Belle2 {
31  using TrackFindingCDC::StoreWrappedObjPtr;
32  using TrackFindingCDC::CDCWireHit;
33 
34  namespace Background {
35 
36  void CDCHitRateCounter::initialize(TTree* tree)
37  {
38  // register collection(s) as optional, your detector might be excluded in DAQ
39  m_digits.isOptional();
40 
41  // set branch address
42  //tree->Branch("cdc", &m_rates, "averageRate/F:numEvents/I:valid/O");
43  stringstream leafList;
44  leafList
45  << "averageRate/F:"
46  << "superLayerHitRate[" << f_nSuperLayer << "]/F:"
47  << "layerHitRate[" << f_nLayer << "]/F:"
48  << "layerPhiHitRate[" << f_nLayer << "][" << f_nPhiDivision << "]/F:"
49  << "timeWindowForSmallCell/I:"
50  << "timeWindowForNormalCell/I:"
51  << "nActiveWireInTotal/I:"
52  << "nActiveWireInSuperLayer[" << f_nSuperLayer << "]/I:"
53  << "nActiveWireInLayer[" << f_nLayer << "]/I:"
54  << "nActiveWireInLayerPhi[" << f_nLayer << "][" << f_nPhiDivision << "]/I:"
55  << "numEvents/I:"
56  << "valid/O";
57  tree->Branch("cdc", &m_rates, leafList.str().c_str());
58 
59  if (m_enableBadWireTreatment) {
60  countActiveWires();
61  } else {
62  countActiveWires_countAll();
63  }
64  }
65 
66  void CDCHitRateCounter::clear()
67  {
68  m_buffer.clear();
69  }
70 
71  void CDCHitRateCounter::accumulate(unsigned timeStamp)
72  {
73  // check if data are available
74  if (not m_digits.isValid()) return;
75 
76  // get buffer element
77  auto& rates = m_buffer[timeStamp];
78 
79  // increment event counter
80  rates.numEvents++;
81 
83  std::map<const CDCHit*, bool> CDCHitToBackgroundFlag;
84  if (m_enableBackgroundHitFilter) {
85  StoreWrappedObjPtr<std::vector<CDCWireHit>> storeVector("CDCWireHitVector");
86  if (not storeVector) {
87  B2FATAL("CDCWireHitVector is unaccessible in DataStore."
88  "Need TFCDC_WireHitParameter module before.");
89  }
90  const std::vector<CDCWireHit>& cdcWireHitVector = *storeVector;
91  for (const auto& cdcWireHit : cdcWireHitVector) {
92  const CDCHit* cdcHit = cdcWireHit.getHit();
93  CDCHitToBackgroundFlag[cdcHit] = cdcWireHit->hasBackgroundFlag();
94  }
95  }
96 
97  CDC::CDCGeometryPar& geometryPar = CDC::CDCGeometryPar::Instance();
98 
106  for (CDCHit& hit : m_digits) {
107  const WireID wireID(hit.getID());
108  if (m_enableBadWireTreatment && geometryPar.isBadWire(wireID))
109  continue;
110 
111  const unsigned short iSuperLayer = hit.getISuperLayer();
112  const unsigned short iLayer = hit.getICLayer();
113  const unsigned short iWireInLayer = hit.getIWire();
114  const unsigned short iPhiBin = getIPhiBin(iSuperLayer, iWireInLayer);
115  const unsigned short adc = hit.getADCCount();
116  const short tdc = hit.getTDCCount();
117 
118  if (m_enableBackgroundHitFilter) {
119  if (CDCHitToBackgroundFlag[&hit]) {
120  if (m_enableMarkBackgroundHit) {
121  unsigned short newStatus = (hit.getStatus() | 0x100);
122  hit.setStatus(newStatus);
123  }
124  continue;
125  }
126  } else {
127  if (iSuperLayer == 0 && adc < 15)
128  continue;
129  if (iSuperLayer != 0 && adc < 18)
130  continue;
131  }
132 
133  if (not isInTimeWindow(iSuperLayer, tdc))
134  continue;
135 
136 
137  rates.averageRate += 1;
138  rates.superLayerHitRate[iSuperLayer] += 1;
139  rates.layerHitRate[iLayer] += 1;
140  rates.layerPhiHitRate[iLayer][iPhiBin] += 1;
141  }
142 
143  // set flag to true to indicate the rates are valid
144  rates.valid = true;
145  }
146 
147  void CDCHitRateCounter::normalize(unsigned timeStamp)
148  {
149  // copy buffer element
150  m_rates = m_buffer[timeStamp];
151 
152  if (not m_rates.valid) return;
153 
154  m_rates.timeWindowForSmallCell = m_timeWindowUpperEdge_smallCell - m_timeWindowLowerEdge_smallCell;
155  m_rates.timeWindowForNormalCell = m_timeWindowUpperEdge_normalCell - m_timeWindowLowerEdge_normalCell;
156 
157  // normalize : hit rate in the time stamp in kHz
158  m_rates.normalize();
159 
162  if (m_nActiveWireInTotal == 0) {
163  m_rates.averageRate = 0;
164  } else {
165  m_rates.averageRate /= m_nActiveWireInTotal;
166  }
168  for (int iSL = 0 ; iSL < f_nSuperLayer ; ++iSL)
169  if (m_nActiveWireInSuperLayer[iSL] == 0) {
170  m_rates.superLayerHitRate[iSL] = 0;
171  } else {
172  m_rates.superLayerHitRate[iSL] /= m_nActiveWireInSuperLayer[iSL];
173  }
175  for (int iLayer = 0 ; iLayer < f_nLayer ; ++iLayer)
176  if (m_nActiveWireInLayer[iLayer] == 0) {
177  m_rates.layerHitRate[iLayer] = 0;
178  } else {
179  m_rates.layerHitRate[iLayer] /= m_nActiveWireInLayer[iLayer];
180  }
182  for (int iLayer = 0 ; iLayer < f_nLayer ; ++iLayer)
183  for (int iPhi = 0 ; iPhi < f_nPhiDivision ; ++iPhi)
184  if (m_nActiveWireInLayerPhi[iLayer][iPhi] == 0) {
185  m_rates.layerPhiHitRate[iLayer][iPhi] = 0;
186  } else {
187  m_rates.layerPhiHitRate[iLayer][iPhi] /= m_nActiveWireInLayerPhi[iLayer][iPhi];
188  }
189 
191  m_rates.nActiveWireInTotal = m_nActiveWireInTotal;
192  for (int i = 0 ; i < f_nSuperLayer ; ++i)
193  m_rates.nActiveWireInSuperLayer[i] = m_nActiveWireInSuperLayer[i];
194  for (int i = 0 ; i < f_nLayer ; ++i)
195  m_rates.nActiveWireInLayer[i] = m_nActiveWireInLayer[i];
196  for (int i = 0 ; i < f_nLayer ; ++i)
197  for (int j = 0 ; j < f_nPhiDivision ; ++j)
198  m_rates.nActiveWireInLayerPhi[i][j] = m_nActiveWireInLayerPhi[i][j];
199  }
200 
201 
202  void CDCHitRateCounter::countActiveWires_countAll()
203  {
204  static const unsigned short nlayer_in_SL[f_nSuperLayer] = { 8, 6, 6,
205  6, 6, 6,
206  6, 6, 6
207  };
208  static const unsigned short nwire_in_layer[f_nSuperLayer] = { 160, 160, 192,
209  224, 256, 288,
210  320, 352, 384
211  };
212 
213  m_nActiveWireInTotal = 0;
214  int contLayerID = 0;
215  for (int iSL = 0 ; iSL < f_nSuperLayer ; ++iSL) {
216  m_nActiveWireInSuperLayer[iSL] = 0;
217  for (int i = 0 ; i < nlayer_in_SL[iSL] ; ++i) {
218  m_nActiveWireInTotal += nwire_in_layer[iSL];
219  m_nActiveWireInSuperLayer[iSL] += nwire_in_layer[iSL];
220  m_nActiveWireInLayer[contLayerID] = nwire_in_layer[iSL];
221  for (int j = 0 ; j < f_nPhiDivision ; ++j)
222  m_nActiveWireInLayerPhi[contLayerID][j] = nwire_in_layer[iSL] / f_nPhiDivision;
223  ++contLayerID;
224  }
225  }
226  }
227 
228 
229 
230  void CDCHitRateCounter::countActiveWires()
231  {
232  static const unsigned short nlayer_in_SL[f_nSuperLayer] = { 8, 6, 6,
233  6, 6, 6,
234  6, 6, 6
235  };
236  static const unsigned short nwire_in_layer[f_nSuperLayer] = { 160, 160, 192,
237  224, 256, 288,
238  320, 352, 384
239  };
240 
241  CDC::CDCGeometryPar& geometryPar = CDC::CDCGeometryPar::Instance();
242 
243  m_nActiveWireInTotal = 0;
244  int contLayerID = 0;
245 
246  for (int iSL = 0 ; iSL < f_nSuperLayer ; ++iSL) {
247  m_nActiveWireInSuperLayer[iSL] = 0;
248  for (int iL = 0 ; iL < nlayer_in_SL[iSL] ; ++iL) {
249  m_nActiveWireInLayer[contLayerID] = 0;
250  for (int iPhi = 0 ; iPhi < f_nPhiDivision ; ++iPhi)
251  m_nActiveWireInLayerPhi[contLayerID][iPhi] = 0;
252 
253  for (int i = 0 ; i < nwire_in_layer[iSL] ; ++i) {
254  WireID wireID(iSL, iL, i);
255  if (not geometryPar.isBadWire(wireID)) {
256  ++m_nActiveWireInLayerPhi[contLayerID][getIPhiBin(iSL, i)];
257  ++m_nActiveWireInLayer[contLayerID];
258  }
259  }
260  m_nActiveWireInSuperLayer[iSL] += m_nActiveWireInLayer[contLayerID];
261  ++contLayerID;
262  }
263  m_nActiveWireInTotal += m_nActiveWireInSuperLayer[iSL];
264  }
265 
266 
267  //B2INFO("CDC, # of Active wires / # of total wires");
268  std::cout << "CDC, # of Active wires / # of total wires" << std::endl;
269  int contLayerID_2 = 0;
270  for (int iSL = 0 ; iSL < f_nSuperLayer ; ++iSL) {
271  for (int iL = 0 ; iL < nlayer_in_SL[iSL] ; ++iL) {
272  //B2INFO("Layer "<< contLayerID_2 << ": "
273  std::cout << "Layer " << contLayerID_2 << ": "
274  << m_nActiveWireInLayer[contLayerID_2] << " / "
275  //<< nwire_in_layer[iSL] );
276  << nwire_in_layer[iSL] << std::endl;
277  ++contLayerID_2;
278  }
279  }
280 
281  }
282 
283 
284  unsigned short CDCHitRateCounter::getIPhiBin(unsigned short iSL, unsigned short iWireInLayer)
285  {
286  static const unsigned short nwire_in_layer[f_nSuperLayer] = { 160, 160, 192,
287  224, 256, 288,
288  320, 352, 384
289  };
290  return iWireInLayer / (nwire_in_layer[iSL] / f_nPhiDivision);
291  }
292 
293 
294  } // Background namespace
296 } // Belle2 namespace
297 
Class containing the result of the unpacker in raw data and the result of the digitizer in simulation...
Definition: CDCHit.h:40
The Class for CDC Geometry Parameters.
bool isBadWire(const WireID &wid)
Inquire if the wire is totally-dead.
This class is for convenience access and registration of objects, that are stored inside the StoreWra...
Class to identify a wire inside the CDC.
Definition: WireID.h:34
Abstract base class for different kinds of events.