mu2e_artdaq_core  v1_02_31
 All Classes Functions
CalorimeterFragmentReader.hh
1 #ifndef mu2e_artdaq_core_Overlays_CalorimeterFragmentReader_hh
2 #define mu2e_artdaq_core_Overlays_CalorimeterFragmentReader_hh
3 
4 #include "artdaq-core/Data/Fragment.hh"
5 #include "cetlib_except/exception.h"
6 
7 #include "mu2e-artdaq-core/Overlays/DetectorFragment.hh"
8 
9 #include <bitset>
10 #include <iostream>
11 #include <ostream>
12 #include <vector>
13 
14 namespace mu2e {
15 class CalorimeterFragmentReader;
16 }
17 
19 {
20 public:
21  CalorimeterFragmentReader(artdaq::Fragment const &f);
23 
24  // Calorimeter-specific methods:
25  mu2e::DetectorFragment::adc_t crystalID();
26  mu2e::DetectorFragment::adc_t apdID();
27  mu2e::DetectorFragment::adc_t time();
28  mu2e::DetectorFragment::adc_t numSamples();
29  std::vector<mu2e::DetectorFragment::adc_t> calorimeterADC();
30  void printAll();
31 };
32 
33 mu2e::CalorimeterFragmentReader::CalorimeterFragmentReader(artdaq::Fragment const &f)
34  : DetectorFragment(f) {}
35 
36 mu2e::CalorimeterFragmentReader::~CalorimeterFragmentReader() {}
37 
38 mu2e::DetectorFragment::adc_t mu2e::CalorimeterFragmentReader::crystalID()
39 {
40  // The calorimeter data packets begin 8*16=128 bits after the beginning of the fragment data
41  // Bits 0 to 11
42  return mu2e::DetectorFragment::convertFromBinary(bitArray(dataBlockBegin() + 8), 127 - 12, 127 - 0);
43 }
44 
45 mu2e::DetectorFragment::adc_t mu2e::CalorimeterFragmentReader::apdID()
46 {
47  // Bits 12 to 15
48  return mu2e::DetectorFragment::convertFromBinary(bitArray(dataBlockBegin() + 8), 127 - 16, 127 - 12);
49 }
50 
51 mu2e::DetectorFragment::adc_t mu2e::CalorimeterFragmentReader::time()
52 {
53  return mu2e::DetectorFragment::convertFromBinary(bitArray(dataBlockBegin() + 8), 127 - 32, 127 - 16);
54 }
55 
56 mu2e::DetectorFragment::adc_t mu2e::CalorimeterFragmentReader::numSamples()
57 {
58  return mu2e::DetectorFragment::convertFromBinary(bitArray(dataBlockBegin() + 8), 127 - 48, 127 - 32);
59 }
60 
61 std::vector<mu2e::DetectorFragment::adc_t> mu2e::CalorimeterFragmentReader::calorimeterADC()
62 {
63  std::vector<adc_t> theVector;
64  // Start after the 3rd 16-bit block of the first calorimeter DTC data packet:
65  for (size_t adcIdx = 0; adcIdx < numSamples(); adcIdx++) {
66  theVector.push_back(*((adc_t const *)((dataBlockBegin() + 8 + 3) + adcIdx)));
67  }
68  return theVector;
69 }
70 
71 void mu2e::CalorimeterFragmentReader::printAll()
72 {
73  std::cout << "\t\t"
74  << "Binary Representation: ";
75  printBitArray(bitArray(dataBlockBegin() + 8));
76  std::cout << "\t\t"
77  << "Crystal IDX: " << (int)crystalID() << std::endl;
78  std::cout << "\t\t"
79  << "APD ID: " << (int)apdID() << std::endl;
80  std::cout << "\t\t"
81  << "Time: " << (int)time() << std::endl;
82  std::cout << "\t\t"
83  << "Num Samples: " << (int)numSamples() << std::endl;
84  std::cout << "\t\t"
85  << "ADC: {[";
86  std::vector<mu2e::DetectorFragment::adc_t> ADCarray = calorimeterADC();
87  for (size_t i = 0; i < ADCarray.size(); i++) {
88  std::cout << (int)ADCarray[i];
89  if (i < ADCarray.size() - 1) {
90  std::cout << ",";
91  }
92  }
93  std::cout << "]}" << std::endl;
94 }
95 
96 #endif /* mu2e_artdaq_core_Overlays_CalorimeterFragmentReader_hh */