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 ArtFragmentReader(artdaq::Fragment const &f) : ArtFragment(f){};
00024
00025
00026 adc_t DBH_ByteCount(adc_t const *pos);
00027 bool DBH_Valid(adc_t const *pos);
00028 adc_t DBH_ROCID(adc_t const *pos);
00029 adc_t DBH_PacketType(adc_t const *pos);
00030 adc_t DBH_PacketCount(adc_t const *pos);
00031 uint64_t DBH_Timestamp(adc_t const *pos);
00032 adc_t DBH_TimestampLow(adc_t const *pos);
00033 adc_t DBH_TimestampMedium(adc_t const *pos);
00034 adc_t DBH_TimestampHigh(adc_t const *pos);
00035 adc_t DBH_Status(adc_t const *pos);
00036 adc_t DBH_FormatVersion(adc_t const *pos);
00037 adc_t DBH_EVBMode(adc_t const *pos);
00038 adc_t DBH_SubsystemID(adc_t const *pos);
00039 adc_t DBH_DTCID(adc_t const *pos);
00040
00041
00042 adc_t DBT_StrawIndex(adc_t const *pos);
00043 adc_t DBT_TDC0(adc_t const *pos);
00044 adc_t DBT_TDC1(adc_t const *pos);
00045 adc_t DBT_TOT0(adc_t const *pos);
00046 adc_t DBT_TOT1(adc_t const *pos);
00047 std::array<adc_t, 15> DBT_Waveform(adc_t const *pos);
00048 adc_t DBT_Flags(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 adc_t DBC_PeakSampleIdx(adc_t const *pos);
00056 std::vector<int> DBC_Waveform(adc_t const *pos);
00057 };
00058
00060
00062
00063 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_ByteCount(adc_t const *pos) { return *(pos + 0); }
00064
00065 bool mu2e::ArtFragmentReader::DBH_Valid(adc_t const *pos) { return (*(pos + 1) >> 15) & 0x0001; }
00066
00067 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_ROCID(adc_t const *pos) {
00068 return *(pos + 1) & 0x000F;
00069 }
00070
00071 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_PacketType(adc_t const *pos) {
00072 return (*(pos + 1) >> 4) & 0x000F;
00073 }
00074
00075 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_PacketCount(adc_t const *pos) {
00076 return *(pos + 2) & 0x07FF;
00077 }
00078
00079 uint64_t mu2e::ArtFragmentReader::DBH_Timestamp(adc_t const *pos) {
00080 return uint64_t(*(pos + 3)) + (uint64_t(*(pos + 4)) << 16) + (uint64_t(*(pos + 5)) << 32);
00081 }
00082
00083 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_TimestampLow(adc_t const *pos) { return *(pos + 3); }
00084
00085 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_TimestampMedium(adc_t const *pos) { return *(pos + 4); }
00086
00087 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_TimestampHigh(adc_t const *pos) { return *(pos + 5); }
00088
00089 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_Status(adc_t const *pos) {
00090 return *(pos + 6) & 0x00FF;
00091 }
00092
00093 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_FormatVersion(adc_t const *pos) { return *(pos + 6) >> 8; }
00094
00095 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_EVBMode(adc_t const *pos) { return *(pos + 7) >> 8; }
00096
00097 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_SubsystemID(adc_t const *pos) {
00098 return (*(pos + 7) >> 6) & 0x0003;
00099 }
00100
00101 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_DTCID(adc_t const *pos) {
00102 return *(pos + 7) & 0x003F;
00103 }
00104
00106
00108 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_StrawIndex(adc_t const *pos) { return *(pos + 8 + 0); }
00109
00110 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_TDC0(adc_t const *pos) {
00111 return (uint32_t(*(pos + 8 + 1)) & 0xFFFF);
00112 }
00113
00114 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_TDC1(adc_t const *pos) {
00115 return (uint32_t(*(pos + 8 + 2)) & 0xFFFF);
00116 }
00117
00118 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_TOT0(adc_t const *pos) {
00119 return (uint32_t(*(pos + 8 + 3)) & 0x00FF);
00120 }
00121
00122 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_TOT1(adc_t const *pos) {
00123 return ((uint32_t(*(pos + 8 + 3)) >> 8) & 0x00FF);
00124 }
00125
00126 std::array<mu2e::ArtFragmentReader::adc_t, 15> mu2e::ArtFragmentReader::DBT_Waveform(adc_t const *pos) {
00127 std::array<adc_t, 15> waveform;
00128
00129
00130
00131
00132 for (size_t i = 0; i < 4; i += 1) {
00133 waveform[0 + i * 4] = *(pos + 8 + 4 + i * 3) & 0x0FFF;
00134 waveform[1 + i * 4] = ((*(pos + 8 + 4 + i * 3 + 1) & 0x00FF) << 4) | (*(pos + 8 + 4 + i * 3) >> 12);
00135 waveform[2 + i * 4] = ((*(pos + 8 + 4 + i * 3 + 2) & 0x000F) << 8) | (*(pos + 8 + 4 + i * 3 + 1) >> 8);
00136 if (i < 3) {
00137 waveform[3 + i * 4] = (*(pos + 8 + 4 + i * 3 + 2) >> 4);
00138 }
00139 }
00140
00141 return waveform;
00142 }
00143
00144 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_Flags(adc_t const *pos) { return (*(pos + 8 + 15) >> 8); }
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) { return *(pos + 8 + 0) >> 12; }
00155
00156 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_Time(adc_t const *pos) { return *(pos + 8 + 1); }
00157
00158 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_NumSamples(adc_t const *pos) {
00159 return *(pos + 8 + 2) & 0x00FF;
00160 }
00161
00162 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_PeakSampleIdx(adc_t const *pos) {
00163 return *(pos + 8 + 2) >> 8;
00164 }
00165
00166 std::vector<int> mu2e::ArtFragmentReader::DBC_Waveform(adc_t const *pos) {
00167 std::vector<int> waveform(DBC_NumSamples(pos));
00168 for (size_t i = 0; i < waveform.size(); i++) {
00169 waveform[i] = *(pos + 8 + 3 + i);
00170 }
00171 return waveform;
00172 }
00173
00174 #endif