mu2e_artdaq_core  v1_02_11
 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  public:
20  CalorimeterFragmentReader(artdaq::Fragment const &f);
22 
23  // Calorimeter-specific methods:
24  mu2e::DetectorFragment::adc_t crystalID();
25  mu2e::DetectorFragment::adc_t apdID();
26  mu2e::DetectorFragment::adc_t time();
27  mu2e::DetectorFragment::adc_t numSamples();
28  std::vector<mu2e::DetectorFragment::adc_t> calorimeterADC();
29  void printAll();
30 };
31 
32 mu2e::CalorimeterFragmentReader::CalorimeterFragmentReader(artdaq::Fragment const &f) : DetectorFragment(f) {}
33 
34 mu2e::CalorimeterFragmentReader::~CalorimeterFragmentReader() {}
35 
36 mu2e::DetectorFragment::adc_t mu2e::CalorimeterFragmentReader::crystalID() {
37  // The calorimeter data packets begin 8*16=128 bits after the beginning of the fragment data
38  // Bits 0 to 11
39  return mu2e::DetectorFragment::convertFromBinary(bitArray(dataBlockBegin() + 8), 127 - 12, 127 - 0);
40 }
41 
42 mu2e::DetectorFragment::adc_t mu2e::CalorimeterFragmentReader::apdID() {
43  // Bits 12 to 15
44  return mu2e::DetectorFragment::convertFromBinary(bitArray(dataBlockBegin() + 8), 127 - 16, 127 - 12);
45 }
46 
47 mu2e::DetectorFragment::adc_t mu2e::CalorimeterFragmentReader::time() {
48  return mu2e::DetectorFragment::convertFromBinary(bitArray(dataBlockBegin() + 8), 127 - 32, 127 - 16);
49 }
50 
51 mu2e::DetectorFragment::adc_t mu2e::CalorimeterFragmentReader::numSamples() {
52  return mu2e::DetectorFragment::convertFromBinary(bitArray(dataBlockBegin() + 8), 127 - 48, 127 - 32);
53 }
54 
55 std::vector<mu2e::DetectorFragment::adc_t> mu2e::CalorimeterFragmentReader::calorimeterADC() {
56  std::vector<adc_t> theVector;
57  // Start after the 3rd 16-bit block of the first calorimeter DTC data packet:
58  for (size_t adcIdx = 0; adcIdx < numSamples(); adcIdx++) {
59  theVector.push_back(*((adc_t const *)((dataBlockBegin() + 8 + 3) + adcIdx)));
60  }
61  return theVector;
62 }
63 
64 void mu2e::CalorimeterFragmentReader::printAll() {
65  std::cout << "\t\t"
66  << "Binary Representation: ";
67  printBitArray(bitArray(dataBlockBegin() + 8));
68  std::cout << "\t\t"
69  << "Crystal IDX: " << (int)crystalID() << std::endl;
70  std::cout << "\t\t"
71  << "APD ID: " << (int)apdID() << std::endl;
72  std::cout << "\t\t"
73  << "Time: " << (int)time() << std::endl;
74  std::cout << "\t\t"
75  << "Num Samples: " << (int)numSamples() << std::endl;
76  std::cout << "\t\t"
77  << "ADC: {[";
78  std::vector<mu2e::DetectorFragment::adc_t> ADCarray = calorimeterADC();
79  for (size_t i = 0; i < ADCarray.size(); i++) {
80  std::cout << (int)ADCarray[i];
81  if (i < ADCarray.size() - 1) {
82  std::cout << ",";
83  }
84  }
85  std::cout << "]}" << std::endl;
86 }
87 
88 #endif /* mu2e_artdaq_core_Overlays_CalorimeterFragmentReader_hh */