00001 #ifndef mu2e_artdaq_core_Overlays_CalorimeterFragmentReader_hh
00002 #define mu2e_artdaq_core_Overlays_CalorimeterFragmentReader_hh
00003
00004 #include "artdaq-core/Data/Fragment.hh"
00005 #include "cetlib_except/exception.h"
00006
00007 #include "mu2e-artdaq-core/Overlays/DetectorFragment.hh"
00008
00009 #include <bitset>
00010 #include <iostream>
00011 #include <ostream>
00012 #include <vector>
00013
00014 namespace mu2e {
00015 class CalorimeterFragmentReader;
00016 }
00017
00018 class mu2e::CalorimeterFragmentReader : public mu2e::DetectorFragment
00019 {
00020 public:
00021 CalorimeterFragmentReader(artdaq::Fragment const &f);
00022 ~CalorimeterFragmentReader();
00023
00024
00025 mu2e::DetectorFragment::adc_t crystalID();
00026 mu2e::DetectorFragment::adc_t apdID();
00027 mu2e::DetectorFragment::adc_t time();
00028 mu2e::DetectorFragment::adc_t numSamples();
00029 std::vector<mu2e::DetectorFragment::adc_t> calorimeterADC();
00030 void printAll();
00031 };
00032
00033 mu2e::CalorimeterFragmentReader::CalorimeterFragmentReader(artdaq::Fragment const &f)
00034 : DetectorFragment(f) {}
00035
00036 mu2e::CalorimeterFragmentReader::~CalorimeterFragmentReader() {}
00037
00038 mu2e::DetectorFragment::adc_t mu2e::CalorimeterFragmentReader::crystalID()
00039 {
00040
00041
00042 return mu2e::DetectorFragment::convertFromBinary(bitArray(dataBlockBegin() + 8), 127 - 12, 127 - 0);
00043 }
00044
00045 mu2e::DetectorFragment::adc_t mu2e::CalorimeterFragmentReader::apdID()
00046 {
00047
00048 return mu2e::DetectorFragment::convertFromBinary(bitArray(dataBlockBegin() + 8), 127 - 16, 127 - 12);
00049 }
00050
00051 mu2e::DetectorFragment::adc_t mu2e::CalorimeterFragmentReader::time()
00052 {
00053 return mu2e::DetectorFragment::convertFromBinary(bitArray(dataBlockBegin() + 8), 127 - 32, 127 - 16);
00054 }
00055
00056 mu2e::DetectorFragment::adc_t mu2e::CalorimeterFragmentReader::numSamples()
00057 {
00058 return mu2e::DetectorFragment::convertFromBinary(bitArray(dataBlockBegin() + 8), 127 - 48, 127 - 32);
00059 }
00060
00061 std::vector<mu2e::DetectorFragment::adc_t> mu2e::CalorimeterFragmentReader::calorimeterADC()
00062 {
00063 std::vector<adc_t> theVector;
00064
00065 for (size_t adcIdx = 0; adcIdx < numSamples(); adcIdx++) {
00066 theVector.push_back(*((adc_t const *)((dataBlockBegin() + 8 + 3) + adcIdx)));
00067 }
00068 return theVector;
00069 }
00070
00071 void mu2e::CalorimeterFragmentReader::printAll()
00072 {
00073 std::cout << "\t\t"
00074 << "Binary Representation: ";
00075 printBitArray(bitArray(dataBlockBegin() + 8));
00076 std::cout << "\t\t"
00077 << "Crystal IDX: " << (int)crystalID() << std::endl;
00078 std::cout << "\t\t"
00079 << "APD ID: " << (int)apdID() << std::endl;
00080 std::cout << "\t\t"
00081 << "Time: " << (int)time() << std::endl;
00082 std::cout << "\t\t"
00083 << "Num Samples: " << (int)numSamples() << std::endl;
00084 std::cout << "\t\t"
00085 << "ADC: {[";
00086 std::vector<mu2e::DetectorFragment::adc_t> ADCarray = calorimeterADC();
00087 for (size_t i = 0; i < ADCarray.size(); i++) {
00088 std::cout << (int)ADCarray[i];
00089 if (i < ADCarray.size() - 1) {
00090 std::cout << ",";
00091 }
00092 }
00093 std::cout << "]}" << std::endl;
00094 }
00095
00096 #endif