mu2e_artdaq_core  v1_02_01e
 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/exception.h"
6 
7 #include "mu2e-artdaq-core/Overlays/DetectorFragment.hh"
8 
9 #include <iostream>
10 #include <ostream>
11 #include <vector>
12 #include <bitset>
13 
14 namespace mu2e {
15  class CalorimeterFragmentReader;
16 }
17 
19 
20  public:
21 
22  CalorimeterFragmentReader(artdaq::Fragment const & f);
24 
25  // Calorimeter-specific methods:
26  mu2e::DetectorFragment::adc_t crystalID();
27  mu2e::DetectorFragment::adc_t apdID();
28  mu2e::DetectorFragment::adc_t time();
29  mu2e::DetectorFragment::adc_t numSamples();
30  std::vector<mu2e::DetectorFragment::adc_t> calorimeterADC();
31  void printAll();
32 
33 };
34 
35 mu2e::CalorimeterFragmentReader::CalorimeterFragmentReader(artdaq::Fragment const & f ) :
36  DetectorFragment(f) {
37 }
38 
39 mu2e::CalorimeterFragmentReader::~CalorimeterFragmentReader() {
40 }
41 
42 mu2e::DetectorFragment::adc_t mu2e::CalorimeterFragmentReader::crystalID() {
43  // The calorimeter data packets begin 8*16=128 bits after the beginning of the fragment data
44  // Bits 0 to 11
45  return mu2e::DetectorFragment::convertFromBinary(bitArray(dataBlockBegin()+8),127-12,127-0);
46 }
47 
48 mu2e::DetectorFragment::adc_t mu2e::CalorimeterFragmentReader::apdID() {
49  // Bits 12 to 15
50  return mu2e::DetectorFragment::convertFromBinary(bitArray(dataBlockBegin()+8),127-16,127-12);
51 }
52 
53 mu2e::DetectorFragment::adc_t mu2e::CalorimeterFragmentReader::time() {
54  return mu2e::DetectorFragment::convertFromBinary(bitArray(dataBlockBegin()+8),127-32,127-16);
55 }
56 
57 mu2e::DetectorFragment::adc_t mu2e::CalorimeterFragmentReader::numSamples() {
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  std::vector<adc_t> theVector;
63  // Start after the 3rd 16-bit block of the first calorimeter DTC data packet:
64  for(size_t adcIdx=0; adcIdx<numSamples(); adcIdx++) {
65  theVector.push_back( *((adc_t const *)( (dataBlockBegin()+8+3) + adcIdx )) );
66  }
67  return theVector;
68 }
69 
70 void mu2e::CalorimeterFragmentReader::printAll() {
71  std::cout << "\t\t" << "Binary Representation: ";
72  printBitArray(bitArray(dataBlockBegin()+8));
73  std::cout << "\t\t" << "Crystal IDX: " << (int)crystalID() << std::endl;
74  std::cout << "\t\t" << "APD ID: " << (int)apdID() << std::endl;
75  std::cout << "\t\t" << "Time: " << (int)time() << std::endl;
76  std::cout << "\t\t" << "Num Samples: " << (int)numSamples() << std::endl;
77  std::cout << "\t\t" << "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 */