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