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
00016 #include <iostream>
00017
00018 namespace mu2e {
00019 class ArtFragmentReader;
00020
00021 std::ostream &operator<<(std::ostream &, ArtFragmentReader const &);
00022 }
00023
00024 class mu2e::ArtFragmentReader : public mu2e::ArtFragment
00025 {
00026 public:
00027 ArtFragmentReader(artdaq::Fragment const &f)
00028 : ArtFragment(f){};
00029
00030
00031 adc_t DBH_ByteCount(adc_t const *pos);
00032 bool DBH_Valid(adc_t const *pos);
00033 adc_t DBH_ROCID(adc_t const *pos);
00034 adc_t DBH_PacketType(adc_t const *pos);
00035 adc_t DBH_PacketCount(adc_t const *pos);
00036 uint64_t DBH_Timestamp(adc_t const *pos);
00037 adc_t DBH_TimestampLow(adc_t const *pos);
00038 adc_t DBH_TimestampMedium(adc_t const *pos);
00039 adc_t DBH_TimestampHigh(adc_t const *pos);
00040 adc_t DBH_Status(adc_t const *pos);
00041 adc_t DBH_FormatVersion(adc_t const *pos);
00042 adc_t DBH_EVBMode(adc_t const *pos);
00043 adc_t DBH_SubsystemID(adc_t const *pos);
00044 adc_t DBH_DTCID(adc_t const *pos);
00045
00046
00047 adc_t DBT_StrawIndex(adc_t const *pos);
00048 adc_t DBT_TDC0(adc_t const *pos);
00049 adc_t DBT_TDC1(adc_t const *pos);
00050 adc_t DBT_TOT0(adc_t const *pos);
00051 adc_t DBT_TOT1(adc_t const *pos);
00052 std::array<adc_t, 15> DBT_Waveform(adc_t const *pos);
00053 adc_t DBT_Flags(adc_t const *pos);
00054
00055
00056 adc_t DBC_CrystalID(adc_t const *pos);
00057 adc_t DBC_apdID(adc_t const *pos);
00058 adc_t DBC_Time(adc_t const *pos);
00059 adc_t DBC_NumSamples(adc_t const *pos);
00060 adc_t DBC_PeakSampleIdx(adc_t const *pos);
00061 std::vector<int> DBC_Waveform(adc_t const *pos);
00062
00063
00064 adc_t DBVR_ControllerID(adc_t const *pos);
00065 adc_t DBVR_PacketType(adc_t const *pos);
00066 adc_t DBVR_EventWordCount(adc_t const *pos);
00067 adc_t DBVR_ActiveFEBFlags0(adc_t const *pos);
00068 adc_t DBVR_ActiveFEBFlags1(adc_t const *pos);
00069 adc_t DBVR_ActiveFEBFlags2(adc_t const *pos);
00070 adc_t DBVR_TriggerCount(adc_t const *pos);
00071 adc_t DBVR_EventType(adc_t const *pos);
00072 adc_t DBVR_ErrorFlags(adc_t const *pos);
00073
00074 adc_t DBVR_NumHits(adc_t const *pos);
00075
00076
00077 adc_t DBV_sipmID(adc_t const *pos, size_t hitIdx);
00078
00079 std::array<unsigned int, 8> DBV_ADCs(adc_t const *pos, size_t hitIdx);
00080 adc_t DBV_startTDC(adc_t const *pos, size_t hitIdx);
00081 };
00082
00084
00086
00087 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_ByteCount(adc_t const *pos)
00088 {
00089 return *(pos + 0);
00090 }
00091
00092 bool mu2e::ArtFragmentReader::DBH_Valid(adc_t const *pos)
00093 {
00094 return (*(pos + 1) >> 15) & 0x0001;
00095 }
00096
00097 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_ROCID(adc_t const *pos)
00098 {
00099 return *(pos + 1) & 0x000F;
00100 }
00101
00102 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_PacketType(adc_t const *pos)
00103 {
00104 return (*(pos + 1) >> 4) & 0x000F;
00105 }
00106
00107 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_PacketCount(adc_t const *pos)
00108 {
00109 return *(pos + 2) & 0x07FF;
00110 }
00111
00112 uint64_t mu2e::ArtFragmentReader::DBH_Timestamp(adc_t const *pos)
00113 {
00114 return uint64_t(*(pos + 3)) + (uint64_t(*(pos + 4)) << 16) + (uint64_t(*(pos + 5)) << 32);
00115 }
00116
00117 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_TimestampLow(adc_t const *pos)
00118 {
00119 return *(pos + 3);
00120 }
00121
00122 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_TimestampMedium(adc_t const *pos)
00123 {
00124 return *(pos + 4);
00125 }
00126
00127 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_TimestampHigh(adc_t const *pos)
00128 {
00129 return *(pos + 5);
00130 }
00131
00132 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_Status(adc_t const *pos)
00133 {
00134 return *(pos + 6) & 0x00FF;
00135 }
00136
00137 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_FormatVersion(adc_t const *pos)
00138 {
00139 return *(pos + 6) >> 8;
00140 }
00141
00142 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_EVBMode(adc_t const *pos)
00143 {
00144 return *(pos + 7) >> 8;
00145 }
00146
00147 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_SubsystemID(adc_t const *pos)
00148 {
00149 return (*(pos + 7) >> 6) & 0x0003;
00150 }
00151
00152 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBH_DTCID(adc_t const *pos)
00153 {
00154 return *(pos + 7) & 0x003F;
00155 }
00156
00158
00160 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_StrawIndex(adc_t const *pos)
00161 {
00162 return *(pos + 8 + 0);
00163 }
00164
00165 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_TDC0(adc_t const *pos)
00166 {
00167 return (uint32_t(*(pos + 8 + 1)) & 0xFFFF);
00168 }
00169
00170 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_TDC1(adc_t const *pos)
00171 {
00172 return (uint32_t(*(pos + 8 + 2)) & 0xFFFF);
00173 }
00174
00175 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_TOT0(adc_t const *pos)
00176 {
00177 return (uint32_t(*(pos + 8 + 3)) & 0x00FF);
00178 }
00179
00180 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_TOT1(adc_t const *pos)
00181 {
00182 return ((uint32_t(*(pos + 8 + 3)) >> 8) & 0x00FF);
00183 }
00184
00185 std::array<mu2e::ArtFragmentReader::adc_t, 15> mu2e::ArtFragmentReader::DBT_Waveform(adc_t const *pos)
00186 {
00187 std::array<adc_t, 15> waveform;
00188
00189
00190
00191
00192 for (size_t i = 0; i < 4; i += 1) {
00193 waveform[0 + i * 4] = *(pos + 8 + 4 + i * 3) & 0x0FFF;
00194 waveform[1 + i * 4] = ((*(pos + 8 + 4 + i * 3 + 1) & 0x00FF) << 4) | (*(pos + 8 + 4 + i * 3) >> 12);
00195 waveform[2 + i * 4] = ((*(pos + 8 + 4 + i * 3 + 2) & 0x000F) << 8) | (*(pos + 8 + 4 + i * 3 + 1) >> 8);
00196 if (i < 3) {
00197 waveform[3 + i * 4] = (*(pos + 8 + 4 + i * 3 + 2) >> 4);
00198 }
00199 }
00200
00201 return waveform;
00202 }
00203
00204 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBT_Flags(adc_t const *pos)
00205 {
00206 return (*(pos + 8 + 15) >> 8);
00207 }
00208
00210
00212
00213 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_CrystalID(adc_t const *pos)
00214 {
00215 return *(pos + 8 + 0) & 0x0FFF;
00216 }
00217
00218 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_apdID(adc_t const *pos)
00219 {
00220 return *(pos + 8 + 0) >> 12;
00221 }
00222
00223 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_Time(adc_t const *pos)
00224 {
00225 return *(pos + 8 + 1);
00226 }
00227
00228 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_NumSamples(adc_t const *pos)
00229 {
00230 return *(pos + 8 + 2) & 0x00FF;
00231 }
00232
00233 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBC_PeakSampleIdx(adc_t const *pos)
00234 {
00235 return *(pos + 8 + 2) >> 8;
00236 }
00237
00238 std::vector<int> mu2e::ArtFragmentReader::DBC_Waveform(adc_t const *pos)
00239 {
00240 std::vector<int> waveform(DBC_NumSamples(pos));
00241 for (size_t i = 0; i < waveform.size(); i++) {
00242 waveform[i] = *(pos + 8 + 3 + i);
00243 }
00244 return waveform;
00245 }
00246
00248
00250
00251 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBVR_ControllerID(adc_t const *pos)
00252 {
00253 return *(pos + 8 + 0) >> 8;
00254 }
00255
00256 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBVR_PacketType(adc_t const *pos)
00257 {
00258 return *(pos + 8 + 0) & 0x00FF;
00259 }
00260
00261 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBVR_EventWordCount(adc_t const *pos)
00262 {
00263 return *(pos + 8 + 1);
00264 }
00265
00266 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBVR_ActiveFEBFlags0(adc_t const *pos)
00267 {
00268 return *(pos + 8 + 3) & 0x00FF;
00269 }
00270
00271 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBVR_ActiveFEBFlags1(adc_t const *pos)
00272 {
00273 return *(pos + 8 + 3) >> 8;
00274 }
00275
00276 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBVR_ActiveFEBFlags2(adc_t const *pos)
00277 {
00278 return *(pos + 8 + 2) & 0x00FF;
00279 }
00280
00281 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBVR_TriggerCount(adc_t const *pos)
00282 {
00283 return *(pos + 8 + 5);
00284 }
00285
00286 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBVR_EventType(adc_t const *pos)
00287 {
00288 return *(pos + 8 + 7) >> 8;
00289 }
00290
00291 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBVR_ErrorFlags(adc_t const *pos)
00292 {
00293 return *(pos + 8 + 7) & 0x00FF;
00294 }
00295
00296 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBVR_NumHits(adc_t const *pos)
00297 {
00298
00299 adc_t numHits = (*(pos + 8 + 1) - 16) / 12;
00300
00301
00302 if(numHits>0) {
00303 if(*(pos + 8 + 8 + 6*(numHits-1) + 1) == 0) {
00304 numHits = numHits - 1;
00305 }
00306 }
00307
00308 return numHits;
00309 }
00310
00312
00314
00315
00316
00317
00318 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBV_sipmID(adc_t const *pos, size_t hitIdx)
00319 {
00320 return *(pos + 16 + hitIdx * 6 + 0);
00321 }
00322
00323
00324
00325
00326
00327
00328 std::array<unsigned int, 8> mu2e::ArtFragmentReader::DBV_ADCs(adc_t const *pos, size_t hitIdx)
00329 {
00330 std::array<unsigned int, 8> ADCs;
00331 for (size_t i = 0; i < 8; i += 2) {
00332 ADCs[i] = *(pos + 16 + hitIdx * 6 + 2 + i / 2) & 0x00FF;
00333 ADCs[i + 1] = *(pos + 16 + hitIdx * 6 + 2 + i / 2) >> 8;
00334 }
00335 return ADCs;
00336 }
00337
00338 mu2e::ArtFragmentReader::adc_t mu2e::ArtFragmentReader::DBV_startTDC(adc_t const *pos, size_t hitIdx)
00339 {
00340 return *(pos + 16 + hitIdx * 6 + 1) & 0x00FF;
00341 }
00342
00343 #endif