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 uint32_t DBT_TOT0(adc_t const *pos);
00049 uint32_t DBT_TOT1(adc_t const *pos);
00050
00051 std::vector<adc_t> DBT_Waveform(adc_t const *pos);
00052
00053
00054 adc_t DBC_CrystalID(adc_t const *pos);
00055 adc_t DBC_apdID(adc_t const *pos);
00056 adc_t DBC_Time(adc_t const *pos);
00057 adc_t DBC_NumSamples(adc_t const *pos);
00058 std::vector<adc_t> DBC_Waveform(adc_t const *pos);
00059
00060 };
00061
00063
00065
00066 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_ByteCount(adc_t const *pos) {
00067 return *(pos+0);
00068 }
00069
00070 bool mu2e::ArtFragmentReader::DBH_Valid(adc_t const *pos) {
00071 return (*(pos+1) >> 15) & 0x0001;
00072 }
00073
00074 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_ROCID(adc_t const *pos) {
00075 return *(pos+1) & 0x000F;
00076 }
00077
00078 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_RingID(adc_t const *pos) {
00079 return (*(pos+1) >> 8) & 0x0007;
00080 }
00081
00082 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_PacketType(adc_t const *pos) {
00083 return (*(pos+1) >> 4) & 0x000F;
00084 }
00085
00086 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_PacketCount(adc_t const *pos) {
00087 return *(pos+2) & 0x07FF;
00088 }
00089
00090 uint64_t mu2e::ArtFragmentReader::DBH_Timestamp(adc_t const *pos) {
00091 return uint64_t(*(pos+3)) + (uint64_t(*(pos+4)) << 16) + (uint64_t(*(pos+5)) << 32);
00092 }
00093
00094 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_TimestampLow(adc_t const *pos) {
00095 return *(pos+3);
00096 }
00097
00098 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_TimestampMedium(adc_t const *pos) {
00099 return *(pos+4);
00100 }
00101
00102 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_TimestampHigh(adc_t const *pos) {
00103 return *(pos+5);
00104 }
00105
00106 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_Status(adc_t const *pos) {
00107 return *(pos+6) & 0x00FF;
00108 }
00109
00110 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_FormatVersion(adc_t const *pos) {
00111 return *(pos+6) >> 8;
00112 }
00113
00114 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_EVBMode(adc_t const *pos) {
00115 return *(pos+7) >> 8;
00116 }
00117
00118 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_SubsystemID(adc_t const *pos) {
00119 return (*(pos+7) >> 6) & 0x0003;
00120 }
00121
00122 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_DTCID(adc_t const *pos) {
00123 return *(pos+7) & 0x003F;
00124 }
00125
00127
00129 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_StrawIndex(adc_t const *pos) {
00130 return *(pos+8+0);
00131 }
00132
00133 uint32_t mu2e::ArtFragmentReader::DBT_TDC0(adc_t const *pos) {
00134 return (uint32_t(*(pos+8+1)) & 0xFFFF);
00135 }
00136
00137 uint32_t mu2e::ArtFragmentReader::DBT_TDC1(adc_t const *pos) {
00138 return (uint32_t(*(pos+8+2)) & 0xFFFF);
00139 }
00140
00141
00142 uint32_t mu2e::ArtFragmentReader::DBT_TOT0(adc_t const *pos) {
00143 return (uint32_t(*(pos+8+3)) & 0x00FF) ;
00144 }
00145
00146 uint32_t mu2e::ArtFragmentReader::DBT_TOT1(adc_t const *pos) {
00147 return ( (uint32_t(*(pos+8+3)) >> 8) & 0x00FF) ;
00148 }
00149
00150 std::vector<mu2e::ArtFragmentReader::adc_t> mu2e::ArtFragmentReader::DBT_Waveform(adc_t const *pos) {
00151 std::vector<adc_t> waveform;
00152
00153
00154
00155 for (size_t i = 0; i < 12; i+=4){
00156 waveform.push_back(*(pos+8+4+i) & 0x0FFF );
00157 waveform.push_back(((*(pos+8+4+i+1) & 0x00FF) << 4) | (*(pos+8+4+i) >> 12) );
00158 waveform.push_back(((*(pos+8+4+i+2) & 0x000F) << 8) | (*(pos+8+4+i+1) >> 8));
00159 waveform.push_back((*(pos+8+4+i+2) >> 4) );
00160 }
00161
00162
00163
00164
00165
00166
00167
00168 return waveform;
00169 }
00170
00172
00174
00175 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_CrystalID(adc_t const *pos) {
00176 return *(pos+8+0) & 0x0FFF;
00177 }
00178
00179 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_apdID(adc_t const *pos) {
00180 return *(pos+8+0) >> 12;
00181 }
00182
00183 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_Time(adc_t const *pos) {
00184 return *(pos+8+1);
00185 }
00186
00187 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_NumSamples(adc_t const *pos) {
00188 return *(pos+8+2);
00189 }
00190
00191 std::vector<mu2e::ArtFragmentReader::adc_t> mu2e::ArtFragmentReader::DBC_Waveform(adc_t const *pos) {
00192 std::vector<adc_t> waveform;
00193 for(size_t i=0; i<DBC_NumSamples(pos); i++) {
00194 waveform.push_back(*(pos+8+3+i));
00195 }
00196 return waveform;
00197 }
00198
00199
00200
00201
00202
00203 #endif
00204