00001 #ifndef mu2e_artdaq_core_Overlays_ArtFragmentReader_hh
00002 #define mu2e_artdaq_core_Overlays_ArtFragmentReader_hh
00003
00005
00006
00007
00008
00009
00011
00012 #include "artdaq-core/Data/Fragment.hh"
00013 #include "mu2e-artdaq-core/Overlays/ArtFragment.hh"
00014
00015 #include <iostream>
00016 #include "trace.h"
00017
00018 namespace mu2e {
00019 class ArtFragmentReader;
00020 }
00021
00022 class mu2e::ArtFragmentReader: public mu2e::ArtFragment {
00023 public:
00024
00025 ArtFragmentReader(artdaq::Fragment const & f) : ArtFragment(f) {};
00026
00027
00028 adc_t DBH_ByteCount(adc_t const *pos);
00029 bool DBH_Valid(adc_t const *pos);
00030 adc_t DBH_ROCID(adc_t const *pos);
00031 adc_t DBH_RingID(adc_t const *pos);
00032 adc_t DBH_PacketType(adc_t const *pos);
00033 adc_t DBH_PacketCount(adc_t const *pos);
00034 uint64_t DBH_Timestamp(adc_t const *pos);
00035 adc_t DBH_TimestampLow(adc_t const *pos);
00036 adc_t DBH_TimestampMedium(adc_t const *pos);
00037 adc_t DBH_TimestampHigh(adc_t const *pos);
00038 adc_t DBH_Status(adc_t const *pos);
00039 adc_t DBH_FormatVersion(adc_t const *pos);
00040 adc_t DBH_EVBMode(adc_t const *pos);
00041 adc_t DBH_SubsystemID(adc_t const *pos);
00042 adc_t DBH_DTCID(adc_t const *pos);
00043
00044
00045 adc_t DBT_StrawIndex(adc_t const *pos);
00046 uint32_t DBT_TDC0(adc_t const *pos);
00047 uint32_t DBT_TDC1(adc_t const *pos);
00048 std::vector<adc_t> DBT_Waveform(adc_t const *pos);
00049
00050
00051 adc_t DBC_CrystalID(adc_t const *pos);
00052 adc_t DBC_apdID(adc_t const *pos);
00053 adc_t DBC_Time(adc_t const *pos);
00054 adc_t DBC_NumSamples(adc_t const *pos);
00055 std::vector<adc_t> DBC_Waveform(adc_t const *pos);
00056
00057 };
00058
00060
00062
00063 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_ByteCount(adc_t const *pos) {
00064 return *(pos+0);
00065 }
00066
00067 bool mu2e::ArtFragmentReader::DBH_Valid(adc_t const *pos) {
00068 return (*(pos+1) >> 15) & 0x0001;
00069 }
00070
00071 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_ROCID(adc_t const *pos) {
00072 return *(pos+1) & 0x000F;
00073 }
00074
00075 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_RingID(adc_t const *pos) {
00076 return (*(pos+1) >> 8) & 0x0007;
00077 }
00078
00079 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_PacketType(adc_t const *pos) {
00080 return (*(pos+1) >> 4) & 0x000F;
00081 }
00082
00083 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_PacketCount(adc_t const *pos) {
00084 return *(pos+2) & 0x07FF;
00085 }
00086
00087 uint64_t mu2e::ArtFragmentReader::DBH_Timestamp(adc_t const *pos) {
00088 return uint64_t(*(pos+3)) + (uint64_t(*(pos+4)) << 16) + (uint64_t(*(pos+5)) << 32);
00089 }
00090
00091 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_TimestampLow(adc_t const *pos) {
00092 return *(pos+3);
00093 }
00094
00095 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_TimestampMedium(adc_t const *pos) {
00096 return *(pos+4);
00097 }
00098
00099 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_TimestampHigh(adc_t const *pos) {
00100 return *(pos+5);
00101 }
00102
00103 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_Status(adc_t const *pos) {
00104 return *(pos+6) & 0x00FF;
00105 }
00106
00107 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_FormatVersion(adc_t const *pos) {
00108 return *(pos+6) >> 8;
00109 }
00110
00111 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_EVBMode(adc_t const *pos) {
00112 return *(pos+7) >> 8;
00113 }
00114
00115 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_SubsystemID(adc_t const *pos) {
00116 return (*(pos+7) >> 6) & 0x0003;
00117 }
00118
00119 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_DTCID(adc_t const *pos) {
00120 return *(pos+7) & 0x003F;
00121 }
00122
00124
00126 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_StrawIndex(adc_t const *pos) {
00127 return *(pos+8+0);
00128 }
00129
00130 uint32_t mu2e::ArtFragmentReader::DBT_TDC0(adc_t const *pos) {
00131 return ((uint32_t(*(pos+8+2)) & 0x00FF) << 16) + uint32_t(*(pos+8+1));
00132 }
00133
00134 uint32_t mu2e::ArtFragmentReader::DBT_TDC1(adc_t const *pos) {
00135 return (uint32_t(*(pos+8+3)) << 8) + uint32_t(*(pos+8+2) >> 8);
00136 }
00137
00138 std::vector<mu2e::ArtFragmentReader::adc_t> mu2e::ArtFragmentReader::DBT_Waveform(adc_t const *pos) {
00139 std::vector<adc_t> waveform;
00140 for(size_t i=0; i<12; i++) {
00141 waveform.push_back(*(pos+8+4+i));
00142 }
00143 return waveform;
00144 }
00145
00147
00149
00150 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_CrystalID(adc_t const *pos) {
00151 return *(pos+8+0) & 0x0FFF;
00152 }
00153
00154 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_apdID(adc_t const *pos) {
00155 return *(pos+8+0) >> 12;
00156 }
00157
00158 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_Time(adc_t const *pos) {
00159 return *(pos+8+1);
00160 }
00161
00162 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_NumSamples(adc_t const *pos) {
00163 return *(pos+8+2);
00164 }
00165
00166 std::vector<mu2e::ArtFragmentReader::adc_t> mu2e::ArtFragmentReader::DBC_Waveform(adc_t const *pos) {
00167 std::vector<adc_t> waveform;
00168 for(size_t i=0; i<DBC_NumSamples(pos); i++) {
00169 waveform.push_back(*(pos+8+3+i));
00170 }
00171 return waveform;
00172 }
00173
00174
00175
00176
00177
00178 #endif
00179