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
00017 namespace mu2e {
00018 class ArtFragmentReader;
00019 }
00020
00021 class mu2e::ArtFragmentReader: public mu2e::ArtFragment {
00022 public:
00023
00024 ArtFragmentReader(artdaq::Fragment const & f) : ArtFragment(f) {};
00025
00026
00027 adc_t DBH_ByteCount(adc_t const *pos);
00028 bool DBH_Valid(adc_t const *pos);
00029 adc_t DBH_ROCID(adc_t const *pos);
00030 adc_t DBH_PacketType(adc_t const *pos);
00031 adc_t DBH_PacketCount(adc_t const *pos);
00032 uint64_t DBH_Timestamp(adc_t const *pos);
00033 adc_t DBH_TimestampLow(adc_t const *pos);
00034 adc_t DBH_TimestampMedium(adc_t const *pos);
00035 adc_t DBH_TimestampHigh(adc_t const *pos);
00036 adc_t DBH_Status(adc_t const *pos);
00037 adc_t DBH_FormatVersion(adc_t const *pos);
00038 adc_t DBH_EVBMode(adc_t const *pos);
00039 adc_t DBH_SubsystemID(adc_t const *pos);
00040 adc_t DBH_DTCID(adc_t const *pos);
00041
00042
00043 adc_t DBT_StrawIndex(adc_t const *pos);
00044 adc_t DBT_TDC0(adc_t const *pos);
00045 adc_t DBT_TDC1(adc_t const *pos);
00046 adc_t DBT_TOT0(adc_t const *pos);
00047 adc_t DBT_TOT1(adc_t const *pos);
00048 std::array<adc_t,15> DBT_Waveform(adc_t const *pos);
00049 adc_t DBT_Flags(adc_t const *pos);
00050
00051
00052 adc_t DBC_CrystalID(adc_t const *pos);
00053 adc_t DBC_apdID(adc_t const *pos);
00054 adc_t DBC_Time(adc_t const *pos);
00055 adc_t DBC_NumSamples(adc_t const *pos);
00056 adc_t DBC_PeakSampleIdx(adc_t const *pos);
00057 std::vector<int> DBC_Waveform(adc_t const *pos);
00058
00059 };
00060
00062
00064
00065 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_ByteCount(adc_t const *pos) {
00066 return *(pos+0);
00067 }
00068
00069 bool mu2e::ArtFragmentReader::DBH_Valid(adc_t const *pos) {
00070 return (*(pos+1) >> 15) & 0x0001;
00071 }
00072
00073 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_ROCID(adc_t const *pos) {
00074 return *(pos+1) & 0x000F;
00075 }
00076
00077 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_PacketType(adc_t const *pos) {
00078 return (*(pos+1) >> 4) & 0x000F;
00079 }
00080
00081 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_PacketCount(adc_t const *pos) {
00082 return *(pos+2) & 0x07FF;
00083 }
00084
00085 uint64_t mu2e::ArtFragmentReader::DBH_Timestamp(adc_t const *pos) {
00086 return uint64_t(*(pos+3)) + (uint64_t(*(pos+4)) << 16) + (uint64_t(*(pos+5)) << 32);
00087 }
00088
00089 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_TimestampLow(adc_t const *pos) {
00090 return *(pos+3);
00091 }
00092
00093 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_TimestampMedium(adc_t const *pos) {
00094 return *(pos+4);
00095 }
00096
00097 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_TimestampHigh(adc_t const *pos) {
00098 return *(pos+5);
00099 }
00100
00101 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_Status(adc_t const *pos) {
00102 return *(pos+6) & 0x00FF;
00103 }
00104
00105 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_FormatVersion(adc_t const *pos) {
00106 return *(pos+6) >> 8;
00107 }
00108
00109 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_EVBMode(adc_t const *pos) {
00110 return *(pos+7) >> 8;
00111 }
00112
00113 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_SubsystemID(adc_t const *pos) {
00114 return (*(pos+7) >> 6) & 0x0003;
00115 }
00116
00117 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_DTCID(adc_t const *pos) {
00118 return *(pos+7) & 0x003F;
00119 }
00120
00122
00124 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_StrawIndex(adc_t const *pos) {
00125 return *(pos+8+0);
00126 }
00127
00128 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_TDC0(adc_t const *pos) {
00129 return (uint32_t(*(pos+8+1)) & 0xFFFF);
00130 }
00131
00132 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_TDC1(adc_t const *pos) {
00133 return (uint32_t(*(pos+8+2)) & 0xFFFF);
00134 }
00135
00136
00137 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_TOT0(adc_t const *pos) {
00138 return (uint32_t(*(pos+8+3)) & 0x00FF) ;
00139 }
00140
00141 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_TOT1(adc_t const *pos) {
00142 return ( (uint32_t(*(pos+8+3)) >> 8) & 0x00FF) ;
00143 }
00144
00145 std::array<mu2e::ArtFragmentReader::adc_t,15> mu2e::ArtFragmentReader::DBT_Waveform(adc_t const *pos) {
00146 std::array<adc_t,15> waveform;
00147
00148
00149
00150
00151 for (size_t i = 0; i < 4; i+=1){
00152 waveform[0 + i*4] = *(pos+8+4+i*3) & 0x0FFF ;
00153 waveform[1 + i*4] = ((*(pos+8+4+i*3+1) & 0x00FF) << 4) | (*(pos+8+4+i*3) >> 12) ;
00154 waveform[2 + i*4] = ((*(pos+8+4+i*3+2) & 0x000F) << 8) | (*(pos+8+4+i*3+1) >> 8) ;
00155 if(i<3) {
00156 waveform[3 + i*4] = (*(pos+8+4+i*3+2) >> 4) ;
00157 }
00158 }
00159
00160 return waveform;
00161 }
00162
00163 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_Flags(adc_t const *pos) {
00164
00165 return (*(pos+8+15) >> 8);
00166 }
00167
00168
00170
00172
00173 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_CrystalID(adc_t const *pos) {
00174 return *(pos+8+0) & 0x0FFF;
00175 }
00176
00177 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_apdID(adc_t const *pos) {
00178 return *(pos+8+0) >> 12;
00179 }
00180
00181 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_Time(adc_t const *pos) {
00182 return *(pos+8+1);
00183 }
00184
00185 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_NumSamples(adc_t const *pos) {
00186 return *(pos+8+2) & 0x00FF;
00187 }
00188
00189 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_PeakSampleIdx(adc_t const *pos) {
00190 return *(pos+8+2) >> 8;
00191 }
00192
00193 std::vector<int> mu2e::ArtFragmentReader::DBC_Waveform(adc_t const *pos) {
00194 std::vector<int> waveform;
00195 for(size_t i=0; i<DBC_NumSamples(pos); i++) {
00196 waveform.push_back(*(pos+8+3+i));
00197 }
00198 return waveform;
00199 }
00200
00201
00202
00203
00204
00205 #endif
00206